diff --git a/.changeset/gold-eggs-sin.md b/.changeset/gold-eggs-sin.md new file mode 100644 index 00000000000..aee1ca73677 --- /dev/null +++ b/.changeset/gold-eggs-sin.md @@ -0,0 +1,6 @@ +--- +"@effect/platform-node": minor +"@effect/rpc": minor +--- + +feat: add Scope support as context for RPC Middleware diff --git a/packages/platform-node/test/fixtures/rpc-schemas.ts b/packages/platform-node/test/fixtures/rpc-schemas.ts index cc112c08771..d55ff118109 100644 --- a/packages/platform-node/test/fixtures/rpc-schemas.ts +++ b/packages/platform-node/test/fixtures/rpc-schemas.ts @@ -90,11 +90,11 @@ const rpcCount = Metric.counter("rpc_middleware_count") const TimingLive = Layer.succeed( TimingMiddleware, TimingMiddleware.of((options) => - options.next.pipe( + Effect.addFinalizer((exit) => Effect.logInfo(exit)).pipe(Effect.zipRight(options.next.pipe( Effect.tap(Metric.increment(rpcSuccesses)), Effect.tapDefect(() => Metric.increment(rpcDefects)), Effect.ensuring(Metric.increment(rpcCount)) - ) + ))) ) ) diff --git a/packages/rpc/src/RpcMiddleware.ts b/packages/rpc/src/RpcMiddleware.ts index 45cb9b45a36..6e05c869907 100644 --- a/packages/rpc/src/RpcMiddleware.ts +++ b/packages/rpc/src/RpcMiddleware.ts @@ -33,7 +33,7 @@ export interface RpcMiddleware { readonly rpc: Rpc.AnyWithProps readonly payload: unknown readonly headers: Headers - }): Effect.Effect + }): Effect.Effect } /** @@ -46,8 +46,8 @@ export interface RpcMiddlewareWrap { readonly rpc: Rpc.AnyWithProps readonly payload: unknown readonly headers: Headers - readonly next: Effect.Effect - }): Effect.Effect + readonly next: Effect.Effect + }): Effect.Effect } /** diff --git a/packages/rpc/src/RpcServer.ts b/packages/rpc/src/RpcServer.ts index 610ec3f055d..c8d8367806c 100644 --- a/packages/rpc/src/RpcServer.ts +++ b/packages/rpc/src/RpcServer.ts @@ -246,7 +246,7 @@ export const makeNoSerialization: ( let responded = false let effect = Effect.uninterruptible(Effect.matchCauseEffect( - Effect.interruptible(applyMiddleware( + Effect.interruptible(Effect.scoped(applyMiddleware( rpc, context, client.id, @@ -255,7 +255,7 @@ export const makeNoSerialization: ( isStream ? streamEffect(client, request, streamOrEffect) : streamOrEffect as Effect.Effect - )), + ))), { onSuccess: (value) => { responded = true @@ -414,7 +414,7 @@ const applyMiddleware = ( clientId: number, payload: A, headers: Headers.Headers, - handler: Effect.Effect + handler: Effect.Effect ) => { if (rpc.middlewares.size === 0) { return handler