diff --git a/.changeset/empty-mugs-watch.md b/.changeset/empty-mugs-watch.md new file mode 100644 index 000000000..5533a9f75 --- /dev/null +++ b/.changeset/empty-mugs-watch.md @@ -0,0 +1,5 @@ +--- +"@effect-app/infra": minor +--- + +improve: constructor vs request dependencies diff --git a/packages/infra/src/api/routing2.ts b/packages/infra/src/api/routing2.ts index e3b2d6beb..729a7669f 100644 --- a/packages/infra/src/api/routing2.ts +++ b/packages/infra/src/api/routing2.ts @@ -12,7 +12,7 @@ import type * as HttpApp from "@effect/platform/HttpApp" import { Rpc, RpcRouter } from "@effect/rpc" import { Serializable } from "@effect/schema" import type { NonEmptyArray } from "effect-app" -import { Cause, Chunk, Context, Effect, FiberRef, Layer, Predicate, S, Scope, Stream, Tracer } from "effect-app" +import { Cause, Chunk, Context, Effect, FiberRef, flow, Layer, Predicate, S, Scope, Stream, Tracer } from "effect-app" import type { GetEffectContext, RPCContextMap } from "effect-app/client/req" import type { HttpServerError } from "effect-app/http" import { HttpMiddleware, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect-app/http" @@ -408,7 +408,12 @@ export const makeRouter = ]: Rpc.Rpc>> }[keyof Filter] + >, + { [k in keyof TLayers]: Layer.Layer.Success }[number] + > > = (class Router extends HttpRouter.Tag(meta.moduleName + "Router")() {}) as any const layer = r.use((router) => @@ -439,13 +444,7 @@ export const makeRouter = }[number], - | { [k in keyof TLayers]: Layer.Layer.Context }[number] - | Exclude< - RPCRouteR< - { [K in keyof Filter]: Rpc.Rpc>> }[keyof Filter] - >, - { [k in keyof TLayers]: Layer.Layer.Success }[number] - > + { [k in keyof TLayers]: Layer.Layer.Context }[number] > // Effect.Effect, never, UserRouter> @@ -529,6 +528,9 @@ export const makeRouter = = T extends HttpRouter.HttpRouter ? R : never + type HE = T extends HttpRouter.HttpRouter ? E : never + type RequestHandlersTest = { [key: string]: { Router: { router: Effect, any, any> } @@ -536,25 +538,47 @@ export const makeRouter = (handlers: T) { + function matchAll( + handlers: T, + requestLayer: Layer.Layer + ) { const routers = typedValuesOf(handlers) - const r = HttpRouter - .Default + const rootRouter = class extends HttpRouter.Tag("RootRouter")< + "RootRouter", + HR>, + HE> + >() {} + + const r = rootRouter .use((router) => Effect.gen(function*() { for (const route of routers) { - yield* router.mount(("/rpc/" + route.moduleName) as any, yield* route.Router.router) + yield* router.mount( + ("/rpc/" + route.moduleName) as any, + yield* route + .Router + .router + .pipe(Effect.map(HttpRouter.use(flow(Effect.provide(requestLayer))))) as any + ) } }) ) .pipe(Layer.provide(routers.map((r) => r.routes).flat() as unknown as NonEmptyArray)) - return r as Layer.Layer< - never, - Layer.Layer.Error, - Layer.Layer.Context - > + return { + layer: r as Layer.Layer< + never, + Layer.Layer.Error, + Layer.Layer.Context + >, + Router: rootRouter as any as HttpRouter.HttpRouter.TagClass< + "RootRouter", + "RootRouter", + HE>, + R | Exclude>, A> + > + } } return { matchAll, matchFor }