effect-cf 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@ The low-level Worker entrypoint factory is exported as `Worker.make`. It returns
10
10
 
11
11
  Worker fetch handlers can return either web `Response` values or Effect `HttpServerResponse` values. `Worker.make` renders `HttpServerResponse` back to a web `Response` at the Cloudflare boundary, so application handlers can stay in Effect HTTP primitives.
12
12
 
13
- Use `requestLayer` on `Worker.make` for per-request services such as auth/session context, tenant metadata, request IDs, or request-local clients. The request layer scope is the handler evaluation scope: it closes when the handler produces a `Response`, not when a streaming response body is later consumed by the platform.
13
+ Request-scoped app services belong in the implementation layer that owns request semantics, such as `HttpRouter` middleware, RPC middleware, or explicit `Effect.provide(...)` inside a custom fetch effect. `Worker.make` stays focused on Cloudflare boundary services: `NativeRequest`, `HttpServerRequest`, `WorkerEnvironment`, `ExecutionContext`, and `WorkerContext`.
14
14
 
15
15
  For modules that need an `ExportedHandler` object instead of a `WorkerEntrypoint` class, use `Worker.makeFetchHandler`. This helper is fetch-only and intentionally does not accept Worker RPC methods.
16
16
 
package/dist/index.d.mts CHANGED
@@ -807,7 +807,7 @@ type BoundaryHandlers<ROut, Self extends Definition$2.Any> = { readonly [Key in
807
807
  /**
808
808
  * Worker constructor options for a specific RPC definition.
809
809
  */
810
- interface Options$2<ROut, Self extends Definition$2.Any, RRequest = never, RequestLayerError = never> extends Omit<WorkerOptions<ROut, Handlers$2<ROut, Self>, RRequest, RequestLayerError>, "rpc"> {
810
+ interface Options$2<ROut, Self extends Definition$2.Any> extends Omit<WorkerOptions<ROut, Handlers$2<ROut, Self>>, "rpc"> {
811
811
  readonly rpc: Handlers$2<ROut, Self>;
812
812
  }
813
813
  /**
@@ -815,7 +815,7 @@ interface Options$2<ROut, Self extends Definition$2.Any, RRequest = never, Reque
815
815
  */
816
816
  declare const method$2: typeof method$4;
817
817
  declare const make$3: <Id extends string, const MethodsShape extends Methods>(id: Id, methods: MethodsShape & NoReservedMethods<MethodsShape, ReservedMethodName$2>) => Definition$2<Id, MethodsShape> & {
818
- make: <ROut, LayerError, RRequest = never, RequestLayerError = never>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>, RRequest, RequestLayerError>) => WorkerClass<BoundaryHandlers<ROut, Definition$2<Id, MethodsShape>>, ROut>;
818
+ make: <ROut, LayerError>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>>) => WorkerClass<BoundaryHandlers<ROut, Definition$2<Id, MethodsShape>>, ROut>;
819
819
  Binding: <Self>() => <BindingId extends string>(bindingId: BindingId, binding: Omit<ServiceBindingDefinition<Definition$2<Id, MethodsShape>>, "definition">) => _$effect_Context0.ServiceClass<Self, BindingId, ServiceBindingClient<[Api$2<Definition$2<Id, MethodsShape>>] extends [never] ? Definition$2<Id, MethodsShape> extends infer T ? T extends Definition$2<Id, MethodsShape> ? T extends Definition$4.Any ? ServerApi$3<T> : never : never : never : Api$2<Definition$2<Id, MethodsShape>>>> & {
820
820
  "effect-cf/Binding": "effect-cf/Binding";
821
821
  binding: string;
@@ -842,7 +842,7 @@ declare const make$3: <Id extends string, const MethodsShape extends Methods>(id
842
842
  };
843
843
  };
844
844
  declare const Tag$2: <_Self>() => <Id extends string, const MethodsShape extends Methods>(id: Id, methods: MethodsShape & NoReservedMethods<MethodsShape, ReservedMethodName$2>) => (abstract new () => object) & (Definition$2<Id, MethodsShape> & {
845
- make: <ROut, LayerError, RRequest = never, RequestLayerError = never>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>, RRequest, RequestLayerError>) => WorkerClass<BoundaryHandlers<ROut, Definition$2<Id, MethodsShape>>, ROut>;
845
+ make: <ROut, LayerError>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>>) => WorkerClass<BoundaryHandlers<ROut, Definition$2<Id, MethodsShape>>, ROut>;
846
846
  Binding: <Self>() => <BindingId extends string>(bindingId: BindingId, binding: Omit<ServiceBindingDefinition<Definition$2<Id, MethodsShape>>, "definition">) => _$effect_Context0.ServiceClass<Self, BindingId, ServiceBindingClient<[Api$2<Definition$2<Id, MethodsShape>>] extends [never] ? Definition$2<Id, MethodsShape> extends infer T ? T extends Definition$2<Id, MethodsShape> ? T extends Definition$4.Any ? ServerApi$3<T> : never : never : never : Api$2<Definition$2<Id, MethodsShape>>>> & {
847
847
  "effect-cf/Binding": "effect-cf/Binding";
848
848
  binding: string;
@@ -869,7 +869,7 @@ declare const Tag$2: <_Self>() => <Id extends string, const MethodsShape extends
869
869
  };
870
870
  });
871
871
  declare const Worker: <_Self>() => <Id extends string, const MethodsShape extends Methods>(id: Id, methods: MethodsShape & NoReservedMethods<MethodsShape, ReservedMethodName$2>) => (abstract new () => object) & (Definition$2<Id, MethodsShape> & {
872
- make: <ROut, LayerError, RRequest = never, RequestLayerError = never>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>, RRequest, RequestLayerError>) => WorkerClass<BoundaryHandlers<ROut, Definition$2<Id, MethodsShape>>, ROut>;
872
+ make: <ROut, LayerError>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>>) => WorkerClass<BoundaryHandlers<ROut, Definition$2<Id, MethodsShape>>, ROut>;
873
873
  Binding: <Self>() => <BindingId extends string>(bindingId: BindingId, binding: Omit<ServiceBindingDefinition<Definition$2<Id, MethodsShape>>, "definition">) => _$effect_Context0.ServiceClass<Self, BindingId, ServiceBindingClient<[Api$2<Definition$2<Id, MethodsShape>>] extends [never] ? Definition$2<Id, MethodsShape> extends infer T ? T extends Definition$2<Id, MethodsShape> ? T extends Definition$4.Any ? ServerApi$3<T> : never : never : never : Api$2<Definition$2<Id, MethodsShape>>>> & {
874
874
  "effect-cf/Binding": "effect-cf/Binding";
875
875
  binding: string;
@@ -1021,18 +1021,11 @@ type WorkerRpcHandler<ROut, A = unknown> = Effect.Effect<A, unknown, WorkerRpcCo
1021
1021
  type WorkerRpc<ROut> = Record<string, (...args: Array<any>) => WorkerRpcHandler<ROut>>;
1022
1022
  type WorkerRpcShape<Rpc extends WorkerRpc<ROut>, ROut> = { readonly [Key in keyof Rpc]: Rpc[Key] extends ((...args: infer Args) => Effect.Effect<infer A, unknown, WorkerRpcContext<ROut>>) ? (...args: Args) => Promise<A> : never };
1023
1023
  type RpcHandlers$1<ROut, Api> = { readonly [Key in keyof Api as Key extends keyof WorkerEntrypoint ? never : Key extends string ? Key extends ReservedMethodName ? never : [Api[Key]] extends [never] ? never : Api[Key] extends ((...args: Array<any>) => Promise<unknown>) ? Key : never : never]: Api[Key] extends ((...args: infer Args) => Promise<infer A>) ? (...args: Args) => WorkerRpcHandler<ROut, A> : never };
1024
- interface WorkerOptions<ROut, Rpc extends WorkerRpc<ROut>, RRequest = never, RequestLayerError = never> {
1025
- readonly fetch?: Effect.Effect<WorkerFetchSuccess, unknown, WorkerFetchContext<ROut | RRequest>>;
1026
- /**
1027
- * Per-request services provided while evaluating the fetch handler.
1028
- *
1029
- * This scope closes when the handler produces a `Response`; it is not kept
1030
- * open until a streaming response body is consumed by the platform.
1031
- */
1032
- readonly requestLayer?: Layer.Layer<RRequest, RequestLayerError, WorkerFetchContext<ROut>>;
1024
+ interface WorkerOptions<ROut, Rpc extends WorkerRpc<ROut>> {
1025
+ readonly fetch?: Effect.Effect<WorkerFetchSuccess, unknown, WorkerFetchContext<ROut>>;
1033
1026
  readonly rpc?: Rpc;
1034
1027
  }
1035
- type FetchWorkerOptions<ROut, RRequest = never, RequestLayerError = never> = Omit<WorkerOptions<ROut, Record<never, never>, RRequest, RequestLayerError>, "rpc"> & {
1028
+ type FetchWorkerOptions<ROut> = Omit<WorkerOptions<ROut, Record<never, never>>, "rpc"> & {
1036
1029
  readonly rpc?: never;
1037
1030
  };
1038
1031
  type WorkerClass<Rpc extends WorkerRpc<ROut>, ROut> = new (ctx: globalThis.ExecutionContext, env: WorkerEnv) => WorkerEntrypoint<WorkerEnv> & {
@@ -1042,10 +1035,10 @@ interface FetchHandler<Env extends WorkerEnv = WorkerEnv> {
1042
1035
  readonly fetch: (request: Request, env: Env, ctx: globalThis.ExecutionContext) => Promise<Response>;
1043
1036
  }
1044
1037
  declare const renderHttpResponse: <A extends HttpServerResponse.HttpServerResponse, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<Response, E, R>;
1045
- declare const make$2: <ROut, LayerError, const Rpc extends WorkerRpc<ROut> = Record<never, never>, RRequest = never, RequestLayerError = never>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: WorkerOptions<ROut, Rpc, RRequest, RequestLayerError>) => WorkerClass<Rpc, ROut>;
1046
- declare const makeFetchHandler: <ROut, LayerError, RRequest = never, RequestLayerError = never, Env extends WorkerEnv = WorkerEnv>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: FetchWorkerOptions<ROut, RRequest, RequestLayerError>) => FetchHandler<Env>;
1038
+ declare const make$2: <ROut, LayerError, const Rpc extends WorkerRpc<ROut> = Record<never, never>>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: WorkerOptions<ROut, Rpc>) => WorkerClass<Rpc, ROut>;
1039
+ declare const makeFetchHandler: <ROut, LayerError, Env extends WorkerEnv = WorkerEnv>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: FetchWorkerOptions<ROut>) => FetchHandler<Env>;
1047
1040
  declare const Tag$1: <_Self>() => <Id extends string, const MethodsShape extends Methods>(id: Id, methods: MethodsShape & NoReservedMethods<MethodsShape, ReservedMethodName$2>) => (abstract new () => object) & (Definition$2<Id, MethodsShape> & {
1048
- make: <ROut, LayerError, RRequest = never, RequestLayerError = never>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>, RRequest, RequestLayerError>) => WorkerClass<{ readonly [Key in keyof MethodsShape]: (...args: Array<unknown>) => WorkerRpcHandler<ROut, _$effect_Schema0.Codec.Encoded<MethodsShape[Key]["success"]>> }, ROut>;
1041
+ make: <ROut, LayerError>(layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>, options: Options$2<ROut, Definition$2<Id, MethodsShape>>) => WorkerClass<{ readonly [Key in keyof MethodsShape]: (...args: Array<unknown>) => WorkerRpcHandler<ROut, _$effect_Schema0.Codec.Encoded<MethodsShape[Key]["success"]>> }, ROut>;
1049
1042
  Binding: <Self>() => <BindingId extends string>(bindingId: BindingId, binding: Omit<ServiceBindingDefinition<Definition$2<Id, MethodsShape>>, "definition">) => Context.ServiceClass<Self, BindingId, ServiceBindingClient<[Api$2<Definition$2<Id, MethodsShape>>] extends [never] ? Definition$2<Id, MethodsShape> extends infer T ? T extends Definition$2<Id, MethodsShape> ? T extends Definition$4.Any ? ServerApi$3<T> : never : never : never : Api$2<Definition$2<Id, MethodsShape>>>> & {
1050
1043
  "effect-cf/Binding": "effect-cf/Binding";
1051
1044
  binding: string;
@@ -1080,7 +1073,7 @@ declare namespace Definition$1 {
1080
1073
  type ServerApi$2<Self extends Definition$2.Any> = ServerApi$3<Self>;
1081
1074
  type Api$1<Self extends Definition$2.Any> = Api$2<Self>;
1082
1075
  type Handlers$1<ROut, Self extends Definition$2.Any> = Handlers$2<ROut, Self>;
1083
- type Options$1<ROut, Self extends Definition$2.Any, RRequest = never, RequestLayerError = never> = Options$2<ROut, Self, RRequest, RequestLayerError>;
1076
+ type Options$1<ROut, Self extends Definition$2.Any> = Options$2<ROut, Self>;
1084
1077
  type HandlerEffect$1<ROut, Self extends Definition$2.Any, Key extends keyof Self["methods"]> = HandlerEffect$2<ROut, Self, Key>;
1085
1078
  declare namespace DurableObject_d_exports {
1086
1079
  export { Api, Definition, DurableObjectClass, DurableObjectHandler, DurableObjectOptions, DurableObjectRpc, DurableObjectRpcShape, HandlerEffect, Handlers, Options, RpcHandlers, ServerApi$1 as ServerApi, Tag, implement, make$1 as make, method };
package/dist/index.mjs CHANGED
@@ -484,9 +484,7 @@ const make$3 = (layer, options) => {
484
484
  const fetchHandler = options.fetch;
485
485
  if (fetchHandler === void 0) return Promise.resolve(new Response("Not Found", { status: 404 }));
486
486
  const requestServices = Layer.mergeAll(Layer.succeed(NativeRequest, request), Layer.succeed(HttpServerRequest.HttpServerRequest, HttpServerRequest.fromWeb(request)));
487
- const fetchEffect = renderFetchSuccess(fetchHandler);
488
- const requestEffect = options.requestLayer === void 0 ? fetchEffect : fetchEffect.pipe(Effect.provide(options.requestLayer));
489
- return this[RunSymbol$1](requestEffect.pipe(Effect.provide(requestServices)));
487
+ return this[RunSymbol$1](renderFetchSuccess(fetchHandler).pipe(Effect.provide(requestServices)));
490
488
  }
491
489
  }
492
490
  defineEntrypointRpcMethods("Worker", EffectWorker.prototype, options.rpc, reservedMethodNames$2, (self, effect) => self[RunSymbol$1](effect));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-cf",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Effect-native primitives for Cloudflare Workers and bindings.",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/Worker.ts CHANGED
@@ -167,27 +167,12 @@ export type RpcHandlers<ROut, Api> = {
167
167
  : never;
168
168
  };
169
169
 
170
- export interface WorkerOptions<
171
- ROut,
172
- Rpc extends WorkerRpc<ROut>,
173
- RRequest = never,
174
- RequestLayerError = never,
175
- > {
176
- readonly fetch?: Effect.Effect<WorkerFetchSuccess, unknown, WorkerFetchContext<ROut | RRequest>>;
177
- /**
178
- * Per-request services provided while evaluating the fetch handler.
179
- *
180
- * This scope closes when the handler produces a `Response`; it is not kept
181
- * open until a streaming response body is consumed by the platform.
182
- */
183
- readonly requestLayer?: Layer.Layer<RRequest, RequestLayerError, WorkerFetchContext<ROut>>;
170
+ export interface WorkerOptions<ROut, Rpc extends WorkerRpc<ROut>> {
171
+ readonly fetch?: Effect.Effect<WorkerFetchSuccess, unknown, WorkerFetchContext<ROut>>;
184
172
  readonly rpc?: Rpc;
185
173
  }
186
174
 
187
- export type FetchWorkerOptions<ROut, RRequest = never, RequestLayerError = never> = Omit<
188
- WorkerOptions<ROut, Record<never, never>, RRequest, RequestLayerError>,
189
- "rpc"
190
- > & {
175
+ export type FetchWorkerOptions<ROut> = Omit<WorkerOptions<ROut, Record<never, never>>, "rpc"> & {
191
176
  readonly rpc?: never;
192
177
  };
193
178
 
@@ -226,15 +211,9 @@ const renderFetchSuccess = <E, R>(
226
211
  ),
227
212
  );
228
213
 
229
- export const make = <
230
- ROut,
231
- LayerError,
232
- const Rpc extends WorkerRpc<ROut> = Record<never, never>,
233
- RRequest = never,
234
- RequestLayerError = never,
235
- >(
214
+ export const make = <ROut, LayerError, const Rpc extends WorkerRpc<ROut> = Record<never, never>>(
236
215
  layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>,
237
- options: WorkerOptions<ROut, Rpc, RRequest, RequestLayerError>,
216
+ options: WorkerOptions<ROut, Rpc>,
238
217
  ): WorkerClass<Rpc, ROut> => {
239
218
  class EffectWorker extends CloudflareWorkerEntrypoint<WorkerEnv> {
240
219
  readonly runtime: ManagedRuntime.ManagedRuntime<RuntimeContext<ROut>, LayerError>;
@@ -281,14 +260,9 @@ export const make = <
281
260
  Layer.succeed(NativeRequest, request),
282
261
  Layer.succeed(HttpServerRequest.HttpServerRequest, HttpServerRequest.fromWeb(request)),
283
262
  );
284
- const fetchEffect = renderFetchSuccess(fetchHandler);
285
- const requestEffect =
286
- options.requestLayer === undefined
287
- ? fetchEffect
288
- : fetchEffect.pipe(Effect.provide(options.requestLayer));
289
263
 
290
264
  return this[RunSymbol](
291
- requestEffect.pipe(Effect.provide(requestServices)) as Effect.Effect<
265
+ renderFetchSuccess(fetchHandler).pipe(Effect.provide(requestServices)) as Effect.Effect<
292
266
  Response,
293
267
  unknown,
294
268
  RuntimeContext<ROut> | Scope.Scope
@@ -308,15 +282,9 @@ export const make = <
308
282
  return Entrypoint.assumeEntrypointClass<WorkerClass<Rpc, ROut>>(EffectWorker);
309
283
  };
310
284
 
311
- export const makeFetchHandler = <
312
- ROut,
313
- LayerError,
314
- RRequest = never,
315
- RequestLayerError = never,
316
- Env extends WorkerEnv = WorkerEnv,
317
- >(
285
+ export const makeFetchHandler = <ROut, LayerError, Env extends WorkerEnv = WorkerEnv>(
318
286
  layer: Layer.Layer<ROut, LayerError, ExecutionContext | WorkerContext | WorkerEnvironment>,
319
- options: FetchWorkerOptions<ROut, RRequest, RequestLayerError>,
287
+ options: FetchWorkerOptions<ROut>,
320
288
  ): FetchHandler<Env> => {
321
289
  const WorkerClass = make(layer, options);
322
290
 
@@ -350,12 +318,10 @@ export type Handlers<
350
318
  Self extends WorkerDefinition.Definition.Any,
351
319
  > = WorkerDefinition.Handlers<ROut, Self>;
352
320
 
353
- export type Options<
321
+ export type Options<ROut, Self extends WorkerDefinition.Definition.Any> = WorkerDefinition.Options<
354
322
  ROut,
355
- Self extends WorkerDefinition.Definition.Any,
356
- RRequest = never,
357
- RequestLayerError = never,
358
- > = WorkerDefinition.Options<ROut, Self, RRequest, RequestLayerError>;
323
+ Self
324
+ >;
359
325
 
360
326
  export type HandlerEffect<
361
327
  ROut,
@@ -74,13 +74,8 @@ type BoundaryHandlers<ROut, Self extends Definition.Any> = {
74
74
  /**
75
75
  * Worker constructor options for a specific RPC definition.
76
76
  */
77
- export interface Options<
78
- ROut,
79
- Self extends Definition.Any,
80
- RRequest = never,
81
- RequestLayerError = never,
82
- > extends Omit<
83
- WorkerEntrypoint.WorkerOptions<ROut, Handlers<ROut, Self>, RRequest, RequestLayerError>,
77
+ export interface Options<ROut, Self extends Definition.Any> extends Omit<
78
+ WorkerEntrypoint.WorkerOptions<ROut, Handlers<ROut, Self>>,
84
79
  "rpc"
85
80
  > {
86
81
  readonly rpc: Handlers<ROut, Self>;
@@ -113,13 +108,13 @@ const makeDefinition = <Id extends string, const MethodsShape extends RpcDefinit
113
108
  const definition: SelfDefinition = RpcDefinition.make(id, methods);
114
109
 
115
110
  return Object.assign(definition, {
116
- make: <ROut, LayerError, RRequest = never, RequestLayerError = never>(
111
+ make: <ROut, LayerError>(
117
112
  layer: Layer.Layer<
118
113
  ROut,
119
114
  LayerError,
120
115
  WorkerEntrypoint.ExecutionContext | WorkerEntrypoint.WorkerContext | WorkerEnvironment
121
116
  >,
122
- options: Options<ROut, SelfDefinition, RRequest, RequestLayerError>,
117
+ options: Options<ROut, SelfDefinition>,
123
118
  ) =>
124
119
  WorkerEntrypoint.make(layer, {
125
120
  ...options,