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 +1 -1
- package/dist/index.d.mts +11 -18
- package/dist/index.mjs +1 -3
- package/package.json +1 -1
- package/src/Worker.ts +11 -45
- package/src/WorkerDefinition.ts +4 -9
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1025
|
-
readonly fetch?: Effect.Effect<WorkerFetchSuccess, unknown, WorkerFetchContext<ROut
|
|
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
|
|
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
|
|
1046
|
-
declare const makeFetchHandler: <ROut, LayerError,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
356
|
-
|
|
357
|
-
RequestLayerError = never,
|
|
358
|
-
> = WorkerDefinition.Options<ROut, Self, RRequest, RequestLayerError>;
|
|
323
|
+
Self
|
|
324
|
+
>;
|
|
359
325
|
|
|
360
326
|
export type HandlerEffect<
|
|
361
327
|
ROut,
|
package/src/WorkerDefinition.ts
CHANGED
|
@@ -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
|
|
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
|
|
117
|
+
options: Options<ROut, SelfDefinition>,
|
|
123
118
|
) =>
|
|
124
119
|
WorkerEntrypoint.make(layer, {
|
|
125
120
|
...options,
|