import * as Chunk from "effect/Chunk"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import { type Pipeable } from "effect/Pipeable"; import type * as Predicate from "effect/Predicate"; import * as Redacted from "effect/Redacted"; import type { Scope } from "effect/Scope"; import type { Covariant, NoInfer } from "effect/Types"; import type { Cookie } from "./Cookies.js"; import * as HttpApi from "./HttpApi.js"; import type * as HttpApiEndpoint from "./HttpApiEndpoint.js"; import type * as HttpApiGroup from "./HttpApiGroup.js"; import * as HttpApiMiddleware from "./HttpApiMiddleware.js"; import type * as HttpApiSecurity from "./HttpApiSecurity.js"; import * as HttpApp from "./HttpApp.js"; import * as HttpMiddleware from "./HttpMiddleware.js"; import * as HttpRouter from "./HttpRouter.js"; import * as HttpServer from "./HttpServer.js"; import * as HttpServerRequest from "./HttpServerRequest.js"; import * as HttpServerResponse from "./HttpServerResponse.js"; import * as OpenApi from "./OpenApi.js"; declare const Router_base: HttpRouter.HttpRouter.TagClass; /** * The router that the API endpoints are attached to. * * @since 1.0.0 * @category router */ export declare class Router extends Router_base { } /** * Create a top-level `HttpApi` layer. * * @since 1.0.0 * @category constructors */ export declare const api: (api: HttpApi.HttpApi) => Layer.Layer | R | HttpApiGroup.HttpApiGroup.ErrorContext>; /** * Build an `HttpApp` from an `HttpApi` instance, and serve it using an * `HttpServer`. * * Optionally, you can provide a middleware function that will be applied to * the `HttpApp` before serving. * * @since 1.0.0 * @category constructors */ export declare const serve: (middleware?: (httpApp: HttpApp.Default) => HttpApp.Default) => Layer.Layer | HttpApi.Api>; /** * Construct an `HttpApp` from an `HttpApi` instance. * * @since 1.0.0 * @category constructors */ export declare const httpApp: Effect.Effect, never, Router | HttpApi.Api | Middleware>; /** * @since 1.0.0 * @category constructors */ export declare const buildMiddleware: (api: HttpApi.HttpApi) => Effect.Effect<(effect: Effect.Effect) => Effect.Effect>; /** * Construct an http web handler from an `HttpApi` instance. * * **Example** * * ```ts * import { HttpApi, HttpApiBuilder, HttpServer } from "@effect/platform" * import { Layer } from "effect" * * class MyApi extends HttpApi.make("api") {} * * const MyApiLive = HttpApiBuilder.api(MyApi) * * const { dispose, handler } = HttpApiBuilder.toWebHandler( * Layer.mergeAll( * MyApiLive, * // you could also use NodeHttpServer.layerContext, depending on your * // server's platform * HttpServer.layerContext * ) * ) * ``` * * @since 1.0.0 * @category constructors */ export declare const toWebHandler: (layer: Layer.Layer, options?: { readonly middleware?: (httpApp: HttpApp.Default) => HttpApp.Default; readonly memoMap?: Layer.MemoMap; }) => { readonly handler: (request: Request, context?: Context.Context | undefined) => Promise; readonly dispose: () => Promise; }; /** * @since 1.0.0 * @category handlers */ export declare const HandlersTypeId: unique symbol; /** * @since 1.0.0 * @category handlers */ export type HandlersTypeId = typeof HandlersTypeId; /** * Represents a handled `HttpApi`. * * @since 1.0.0 * @category handlers */ export interface Handlers extends Pipeable { readonly [HandlersTypeId]: { _Endpoints: Covariant; }; readonly group: HttpApiGroup.HttpApiGroup.AnyWithProps; readonly handlers: Chunk.Chunk>; /** * Add the implementation for an `HttpApiEndpoint` to a `Handlers` group. */ handle, R1>(name: Name, handler: HttpApiEndpoint.HttpApiEndpoint.HandlerWithName, options?: { readonly uninterruptible?: boolean | undefined; } | undefined): Handlers>, Provides>, HttpApiEndpoint.HttpApiEndpoint.ExcludeName>; /** * Add the implementation for an `HttpApiEndpoint` to a `Handlers` group. * This version of the api allows you to return the full response object. */ handleRaw, R1>(name: Name, handler: HttpApiEndpoint.HttpApiEndpoint.HandlerRawWithName, options?: { readonly uninterruptible?: boolean | undefined; } | undefined): Handlers>, Provides>, HttpApiEndpoint.HttpApiEndpoint.ExcludeName>; } /** * @since 1.0.0 * @category handlers */ export declare namespace Handlers { /** * @since 1.0.0 * @category handlers */ interface Any { readonly [HandlersTypeId]: any; } /** * @since 1.0.0 * @category handlers */ type Middleware = (self: HttpRouter.Route.Middleware) => HttpApp.Default; /** * @since 1.0.0 * @category handlers */ type Item = { readonly endpoint: HttpApiEndpoint.HttpApiEndpoint.Any; readonly handler: HttpApiEndpoint.HttpApiEndpoint.Handler; readonly withFullRequest: boolean; readonly uninterruptible: boolean; }; /** * @since 1.0.0 * @category handlers */ type FromGroup = Handlers, HttpApiMiddleware.HttpApiMiddleware.ExtractProvides | HttpApiGroup.HttpApiGroup.Provides, never, HttpApiGroup.HttpApiGroup.Endpoints>; /** * @since 1.0.0 * @category handlers */ type ValidateReturn = A extends (Handlers | Effect.Effect, infer _EX, infer _RX>) ? [_Endpoints] extends [never] ? A : `Endpoint not handled: ${HttpApiEndpoint.HttpApiEndpoint.Name<_Endpoints>}` : `Must return the implemented handlers`; /** * @since 1.0.0 * @category handlers */ type Error = A extends Effect.Effect, infer _EX, infer _RX> ? _EX : never; /** * @since 1.0.0 * @category handlers */ type Context = A extends Handlers ? _R : A extends Effect.Effect, infer _EX, infer _RX> ? _R | _RX : never; } /** * Create a `Layer` that will implement all the endpoints in an `HttpApi`. * * An unimplemented `Handlers` instance is passed to the `build` function, which * you can use to add handlers to the group. * * You can implement endpoints using the `handlers.handle` api. * * @since 1.0.0 * @category handlers */ export declare const group: , Return>(api: HttpApi.HttpApi, groupName: Name, build: (handlers: Handlers.FromGroup>) => Handlers.ValidateReturn) => Layer.Layer, Handlers.Error, Exclude | HttpApiGroup.HttpApiGroup.MiddlewareWithName, Scope>>; /** * Create a `Handler` for a single endpoint. * * @since 1.0.0 * @category handlers */ export declare const handler: ["name"], R>(_api: HttpApi.HttpApi, _groupName: GroupName, _name: Name, f: HttpApiEndpoint.HttpApiEndpoint.HandlerWithName, Name, ApiError | HttpApiGroup.HttpApiGroup.ErrorWithName, R>) => HttpApiEndpoint.HttpApiEndpoint.HandlerWithName, Name, ApiError | HttpApiGroup.HttpApiGroup.ErrorWithName, R>; declare const Middleware_base: Context.TagClass Effect.Effect; readonly retrieve: Effect.Effect; }>; /** * @since 1.0.0 * @category middleware */ export declare class Middleware extends Middleware_base { /** * @since 1.0.0 */ static readonly layer: Layer.Layer; } /** * @since 1.0.0 * @category global */ export type MiddlewareFn = (httpApp: HttpApp.Default) => HttpApp.Default; /** * Create an `HttpApi` level middleware `Layer`. * * @since 1.0.0 * @category middleware */ export declare const middleware: { /** * Create an `HttpApi` level middleware `Layer`. * * @since 1.0.0 * @category middleware */ (middleware: MiddlewareFn | Effect.Effect, EX, RX>, options?: { readonly withContext?: false | undefined; }): Layer.Layer>; /** * Create an `HttpApi` level middleware `Layer`. * * @since 1.0.0 * @category middleware */ (middleware: MiddlewareFn | Effect.Effect, EX, RX>, options: { readonly withContext: true; }): Layer.Layer | RX, Scope>>; /** * Create an `HttpApi` level middleware `Layer`. * * @since 1.0.0 * @category middleware */ (api: HttpApi.HttpApi, middleware: MiddlewareFn> | Effect.Effect>, EX, RX>, options?: { readonly withContext?: false | undefined; }): Layer.Layer>; /** * Create an `HttpApi` level middleware `Layer`. * * @since 1.0.0 * @category middleware */ (api: HttpApi.HttpApi, middleware: MiddlewareFn, R> | Effect.Effect, R>, EX, RX>, options: { readonly withContext: true; }): Layer.Layer | RX, Scope>>; }; /** * A CORS middleware layer that can be provided to the `HttpApiBuilder.serve` layer. * * @since 1.0.0 * @category middleware */ export declare const middlewareCors: (options?: { readonly allowedOrigins?: ReadonlyArray | Predicate.Predicate | undefined; readonly allowedMethods?: ReadonlyArray | undefined; readonly allowedHeaders?: ReadonlyArray | undefined; readonly exposedHeaders?: ReadonlyArray | undefined; readonly maxAge?: number | undefined; readonly credentials?: boolean | undefined; } | undefined) => Layer.Layer; /** * A middleware that adds an openapi.json endpoint to the API. * * @since 1.0.0 * @category middleware */ export declare const middlewareOpenApi: (options?: { readonly path?: HttpApiEndpoint.PathSegment | undefined; readonly additionalPropertiesStrategy?: OpenApi.AdditionalPropertiesStrategy | undefined; } | undefined) => Layer.Layer; /** * @since 1.0.0 * @category security */ export declare const securityDecode: (self: Security) => Effect.Effect, never, HttpServerRequest.HttpServerRequest | HttpServerRequest.ParsedSearchParams>; /** * Set a cookie from an `HttpApiSecurity.HttpApiKey` instance. * * You can use this api before returning a response from an endpoint handler. * * ```ts skip-type-checking * handlers.handle( * "authenticate", * (_) => HttpApiBuilder.securitySetCookie(security, "secret123") * ) * ``` * * @since 1.0.0 * @category middleware */ export declare const securitySetCookie: (self: HttpApiSecurity.ApiKey, value: string | Redacted.Redacted, options?: Cookie["options"]) => Effect.Effect; export {}; //# sourceMappingURL=HttpApiBuilder.d.ts.map