effect-orpc 0.2.2 → 0.3.0
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 +198 -77
- package/dist/{chunk-VOWRLWZZ.js → chunk-IJP6L2XR.js} +6 -2
- package/dist/chunk-IJP6L2XR.js.map +1 -0
- package/dist/index.js +736 -266
- package/dist/index.js.map +1 -1
- package/dist/node.js +4 -3
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
- package/src/contract.ts +34 -2
- package/src/effect-builder.ts +277 -24
- package/src/effect-procedure.ts +203 -9
- package/src/effect-runtime.ts +453 -21
- package/src/extension/create-node-proxy.ts +17 -1
- package/src/extension/state.ts +13 -15
- package/src/fiber-context-bridge.ts +13 -0
- package/src/node.ts +2 -1
- package/src/runtime-source.ts +18 -0
- package/src/tagged-error.ts +0 -9
- package/src/tests/contract.test.ts +24 -0
- package/src/tests/effect-builder.test.ts +506 -3
- package/src/tests/node-side-effect.test.ts +80 -0
- package/src/tests/parity.effect-builder.test.ts +10 -3
- package/src/tests/parity.effect-procedure.test.ts +24 -8
- package/src/tests/shared.ts +1 -25
- package/src/types/effect-builder-surface.ts +116 -0
- package/src/types/effect-procedure-surface.ts +98 -1
- package/src/types/index.ts +292 -1
- package/src/types/variants.ts +346 -13
- package/dist/chunk-VOWRLWZZ.js.map +0 -1
package/dist/node.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
installFiberContextBridge
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IJP6L2XR.js";
|
|
4
4
|
|
|
5
5
|
// src/node.ts
|
|
6
6
|
import { AsyncLocalStorage } from "async_hooks";
|
|
7
7
|
import { Effect } from "effect";
|
|
8
8
|
var fiberRefsStorage = new AsyncLocalStorage();
|
|
9
9
|
var bridge = {
|
|
10
|
-
getCurrentFiberRefs: () => fiberRefsStorage.getStore()
|
|
10
|
+
getCurrentFiberRefs: () => fiberRefsStorage.getStore(),
|
|
11
|
+
runWithFiberRefs: (fiberRefs, fn) => fiberRefsStorage.run(fiberRefs, fn)
|
|
11
12
|
};
|
|
12
13
|
installFiberContextBridge(bridge);
|
|
13
14
|
function withFiberContext(fn) {
|
|
14
15
|
return Effect.flatMap(
|
|
15
16
|
Effect.getFiberRefs,
|
|
16
|
-
(fiberRefs) => Effect.promise(() =>
|
|
17
|
+
(fiberRefs) => Effect.promise(() => bridge.runWithFiberRefs(fiberRefs, fn))
|
|
17
18
|
);
|
|
18
19
|
}
|
|
19
20
|
export {
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/node.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { FiberRefs } from \"effect\";\nimport { Effect } from \"effect\";\n\nimport {\n installFiberContextBridge,\n type FiberContextBridge,\n} from \"./fiber-context-bridge\";\n\nconst fiberRefsStorage = new AsyncLocalStorage<FiberRefs.FiberRefs>();\n\nconst bridge: FiberContextBridge = {\n getCurrentFiberRefs: () => fiberRefsStorage.getStore(),\n};\n\ninstallFiberContextBridge(bridge);\n\nexport function withFiberContext<T>(fn: () => Promise<T>): Effect.Effect<T> {\n return Effect.flatMap(Effect.getFiberRefs, (fiberRefs) =>\n Effect.promise(() =>
|
|
1
|
+
{"version":3,"sources":["../src/node.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { FiberRefs } from \"effect\";\nimport { Effect } from \"effect\";\n\nimport {\n installFiberContextBridge,\n type FiberContextBridge,\n} from \"./fiber-context-bridge\";\n\nconst fiberRefsStorage = new AsyncLocalStorage<FiberRefs.FiberRefs>();\n\nconst bridge: FiberContextBridge = {\n getCurrentFiberRefs: () => fiberRefsStorage.getStore(),\n runWithFiberRefs: (fiberRefs, fn) => fiberRefsStorage.run(fiberRefs, fn),\n};\n\ninstallFiberContextBridge(bridge);\n\nexport function withFiberContext<T>(fn: () => Promise<T>): Effect.Effect<T> {\n return Effect.flatMap(Effect.getFiberRefs, (fiberRefs) =>\n Effect.promise(() => bridge.runWithFiberRefs!(fiberRefs, fn)),\n );\n}\n"],"mappings":";;;;;AAAA,SAAS,yBAAyB;AAGlC,SAAS,cAAc;AAOvB,IAAM,mBAAmB,IAAI,kBAAuC;AAEpE,IAAM,SAA6B;AAAA,EACjC,qBAAqB,MAAM,iBAAiB,SAAS;AAAA,EACrD,kBAAkB,CAAC,WAAW,OAAO,iBAAiB,IAAI,WAAW,EAAE;AACzE;AAEA,0BAA0B,MAAM;AAEzB,SAAS,iBAAoB,IAAwC;AAC1E,SAAO,OAAO;AAAA,IAAQ,OAAO;AAAA,IAAc,CAAC,cAC1C,OAAO,QAAQ,MAAM,OAAO,iBAAkB,WAAW,EAAE,CAAC;AAAA,EAC9D;AACF;","names":[]}
|
package/package.json
CHANGED
package/src/contract.ts
CHANGED
|
@@ -27,13 +27,15 @@ import type {
|
|
|
27
27
|
} from "@orpc/server";
|
|
28
28
|
import { implement } from "@orpc/server";
|
|
29
29
|
import type { IntersectPick } from "@orpc/shared";
|
|
30
|
-
import type { ManagedRuntime } from "effect";
|
|
30
|
+
import type { Layer, ManagedRuntime } from "effect";
|
|
31
31
|
|
|
32
32
|
import { addSpanStackTrace } from "./effect-builder";
|
|
33
33
|
import { enhanceEffectRouter } from "./effect-enhance-router";
|
|
34
34
|
import { EffectDecoratedProcedure } from "./effect-procedure";
|
|
35
35
|
import { createEffectProcedureHandler } from "./effect-runtime";
|
|
36
36
|
import { effectContractSymbol, getEffectContractErrorMap } from "./eoc";
|
|
37
|
+
import type { EffectRuntimeSource } from "./runtime-source";
|
|
38
|
+
import { toManagedRuntime } from "./runtime-source";
|
|
37
39
|
import type { EffectErrorMap } from "./tagged-error";
|
|
38
40
|
import { effectErrorMapToErrorMap } from "./tagged-error";
|
|
39
41
|
import type { EffectErrorMapToErrorMap, EffectProcedureHandler } from "./types";
|
|
@@ -463,6 +465,21 @@ function wrapContractNode<
|
|
|
463
465
|
>;
|
|
464
466
|
}
|
|
465
467
|
|
|
468
|
+
export function implementEffect<
|
|
469
|
+
TContract extends AnyContractRouter,
|
|
470
|
+
TRequirementsProvided,
|
|
471
|
+
TRuntimeError,
|
|
472
|
+
>(
|
|
473
|
+
contract: TContract,
|
|
474
|
+
layer: Layer.Layer<TRequirementsProvided, TRuntimeError, never>,
|
|
475
|
+
): EffectImplementer<
|
|
476
|
+
TContract,
|
|
477
|
+
Record<never, never>,
|
|
478
|
+
Record<never, never>,
|
|
479
|
+
TRequirementsProvided,
|
|
480
|
+
TRuntimeError
|
|
481
|
+
>;
|
|
482
|
+
|
|
466
483
|
export function implementEffect<
|
|
467
484
|
TContract extends AnyContractRouter,
|
|
468
485
|
TRequirementsProvided,
|
|
@@ -476,11 +493,26 @@ export function implementEffect<
|
|
|
476
493
|
Record<never, never>,
|
|
477
494
|
TRequirementsProvided,
|
|
478
495
|
TRuntimeError
|
|
496
|
+
>;
|
|
497
|
+
|
|
498
|
+
export function implementEffect<
|
|
499
|
+
TContract extends AnyContractRouter,
|
|
500
|
+
TRequirementsProvided,
|
|
501
|
+
TRuntimeError,
|
|
502
|
+
>(
|
|
503
|
+
contract: TContract,
|
|
504
|
+
source: EffectRuntimeSource<TRequirementsProvided, TRuntimeError>,
|
|
505
|
+
): EffectImplementer<
|
|
506
|
+
TContract,
|
|
507
|
+
Record<never, never>,
|
|
508
|
+
Record<never, never>,
|
|
509
|
+
TRequirementsProvided,
|
|
510
|
+
TRuntimeError
|
|
479
511
|
> {
|
|
480
512
|
return wrapContractNode(
|
|
481
513
|
contract,
|
|
482
514
|
implement(contract),
|
|
483
|
-
|
|
515
|
+
toManagedRuntime(source),
|
|
484
516
|
) as EffectImplementer<
|
|
485
517
|
TContract,
|
|
486
518
|
Record<never, never>,
|
package/src/effect-builder.ts
CHANGED
|
@@ -7,11 +7,15 @@ import type {
|
|
|
7
7
|
} from "@orpc/contract";
|
|
8
8
|
import type { Context, Router } from "@orpc/server";
|
|
9
9
|
import { Builder, fallbackConfig, lazy } from "@orpc/server";
|
|
10
|
-
import
|
|
10
|
+
import { Layer, ManagedRuntime } from "effect";
|
|
11
11
|
|
|
12
12
|
import { enhanceEffectRouter } from "./effect-enhance-router";
|
|
13
13
|
import { EffectDecoratedProcedure } from "./effect-procedure";
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
createEffectPipelineMiddleware,
|
|
16
|
+
createEffectProcedureHandler,
|
|
17
|
+
isEffectMiddleware,
|
|
18
|
+
} from "./effect-runtime";
|
|
15
19
|
import {
|
|
16
20
|
createNodeProxy,
|
|
17
21
|
unhandled,
|
|
@@ -23,6 +27,8 @@ import {
|
|
|
23
27
|
unwrapEffectUpstream,
|
|
24
28
|
type EffectProxyTarget,
|
|
25
29
|
} from "./extension/state";
|
|
30
|
+
import type { EffectRuntimeSource } from "./runtime-source";
|
|
31
|
+
import { toManagedRuntime } from "./runtime-source";
|
|
26
32
|
import type { EffectErrorMap, MergedEffectErrorMap } from "./tagged-error";
|
|
27
33
|
import { effectErrorMapToErrorMap } from "./tagged-error";
|
|
28
34
|
import type {
|
|
@@ -43,6 +49,9 @@ const builderVirtualDescriptors = {
|
|
|
43
49
|
errors: { enumerable: false },
|
|
44
50
|
handler: { enumerable: false },
|
|
45
51
|
lazy: { enumerable: false },
|
|
52
|
+
middleware: { enumerable: false },
|
|
53
|
+
provide: { enumerable: false },
|
|
54
|
+
provideOptional: { enumerable: false },
|
|
46
55
|
router: { enumerable: false },
|
|
47
56
|
traced: { enumerable: false },
|
|
48
57
|
} as const;
|
|
@@ -51,6 +60,9 @@ const builderVirtualKeys = [
|
|
|
51
60
|
"~effect",
|
|
52
61
|
"errors",
|
|
53
62
|
"effect",
|
|
63
|
+
"middleware",
|
|
64
|
+
"provide",
|
|
65
|
+
"provideOptional",
|
|
54
66
|
"traced",
|
|
55
67
|
"handler",
|
|
56
68
|
"router",
|
|
@@ -96,6 +108,8 @@ function getEffectBuilderDef(
|
|
|
96
108
|
effectErrorMap: context.state.effectErrorMap,
|
|
97
109
|
runtime: context.state.runtime,
|
|
98
110
|
spanConfig: context.state.spanConfig,
|
|
111
|
+
effectSteps: context.state.effectSteps,
|
|
112
|
+
effectHandler: context.state.effectHandler,
|
|
99
113
|
};
|
|
100
114
|
}
|
|
101
115
|
|
|
@@ -109,11 +123,55 @@ function wrapBuilderLike(
|
|
|
109
123
|
effectErrorMap: state.effectErrorMap,
|
|
110
124
|
runtime: state.runtime,
|
|
111
125
|
spanConfig: state.spanConfig,
|
|
126
|
+
effectSteps: state.effectSteps,
|
|
127
|
+
effectHandler: state.effectHandler,
|
|
112
128
|
},
|
|
113
129
|
unwrapEffectUpstream(builder),
|
|
114
130
|
);
|
|
115
131
|
}
|
|
116
132
|
|
|
133
|
+
function appendEffectStep(
|
|
134
|
+
state: NodeProxyContext<EffectBuilderTarget, AnyBuilderLike>["state"],
|
|
135
|
+
step: NonNullable<
|
|
136
|
+
NodeProxyContext<
|
|
137
|
+
EffectBuilderTarget,
|
|
138
|
+
AnyBuilderLike
|
|
139
|
+
>["state"]["effectSteps"]
|
|
140
|
+
>[number],
|
|
141
|
+
): NodeProxyContext<EffectBuilderTarget, AnyBuilderLike>["state"] {
|
|
142
|
+
return {
|
|
143
|
+
...state,
|
|
144
|
+
effectSteps: [...(state.effectSteps ?? []), step],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function flushEffectSteps(
|
|
149
|
+
builder: AnyBuilderLike,
|
|
150
|
+
state: NodeProxyContext<EffectBuilderTarget, AnyBuilderLike>["state"],
|
|
151
|
+
): {
|
|
152
|
+
builder: AnyBuilderLike;
|
|
153
|
+
state: NodeProxyContext<EffectBuilderTarget, AnyBuilderLike>["state"];
|
|
154
|
+
} {
|
|
155
|
+
if (!state.effectSteps?.length) {
|
|
156
|
+
return { builder, state };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const middleware = createEffectPipelineMiddleware({
|
|
160
|
+
effectErrorMap: state.effectErrorMap,
|
|
161
|
+
runtime: state.runtime,
|
|
162
|
+
steps: state.effectSteps,
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
builder: Reflect.apply(Reflect.get(builder, "use", builder), builder, [
|
|
166
|
+
middleware,
|
|
167
|
+
]) as AnyBuilderLike,
|
|
168
|
+
state: {
|
|
169
|
+
...state,
|
|
170
|
+
effectSteps: undefined,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
117
175
|
function createEffectBuilderProxy(
|
|
118
176
|
target: EffectBuilderTarget,
|
|
119
177
|
): EffectBuilderTarget {
|
|
@@ -166,13 +224,20 @@ function createEffectBuilderProxy(
|
|
|
166
224
|
>[0],
|
|
167
225
|
) => {
|
|
168
226
|
const defaultCaptureStackTrace = addSpanStackTrace();
|
|
227
|
+
const effectHandler = {
|
|
228
|
+
defaultCaptureStackTrace,
|
|
229
|
+
effectFn,
|
|
230
|
+
spanConfig: state.spanConfig,
|
|
231
|
+
};
|
|
169
232
|
return new EffectDecoratedProcedure({
|
|
170
233
|
...effectDef,
|
|
234
|
+
effectHandler,
|
|
171
235
|
handler: async (opts) => {
|
|
172
236
|
return createEffectProcedureHandler({
|
|
173
237
|
defaultCaptureStackTrace,
|
|
174
238
|
effectErrorMap: state.effectErrorMap,
|
|
175
239
|
effectFn,
|
|
240
|
+
effectSteps: state.effectSteps,
|
|
176
241
|
runtime: state.runtime,
|
|
177
242
|
spanConfig: state.spanConfig,
|
|
178
243
|
})(opts as any);
|
|
@@ -180,6 +245,82 @@ function createEffectBuilderProxy(
|
|
|
180
245
|
});
|
|
181
246
|
};
|
|
182
247
|
});
|
|
248
|
+
case "middleware":
|
|
249
|
+
return getOrCreateVirtualMethod(context, prop, () => {
|
|
250
|
+
return (middleware: any) => {
|
|
251
|
+
if (isEffectMiddleware(middleware)) {
|
|
252
|
+
const effectMiddleware = createEffectPipelineMiddleware({
|
|
253
|
+
effectErrorMap: state.effectErrorMap,
|
|
254
|
+
runtime: state.runtime,
|
|
255
|
+
steps: [
|
|
256
|
+
...(state.effectSteps ?? []),
|
|
257
|
+
{ _tag: "middleware" as const, middleware },
|
|
258
|
+
],
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
return Reflect.apply(
|
|
262
|
+
Reflect.get(source, "middleware", source),
|
|
263
|
+
source,
|
|
264
|
+
[effectMiddleware],
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return Reflect.apply(
|
|
269
|
+
Reflect.get(source, "middleware", source),
|
|
270
|
+
source,
|
|
271
|
+
[middleware],
|
|
272
|
+
);
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
case "provide":
|
|
276
|
+
return getOrCreateVirtualMethod(context, prop, () => {
|
|
277
|
+
return (tagOrLayer: any, provider?: any) => {
|
|
278
|
+
return wrapBuilderLike(
|
|
279
|
+
source,
|
|
280
|
+
appendEffectStep(
|
|
281
|
+
state,
|
|
282
|
+
Layer.isLayer(tagOrLayer)
|
|
283
|
+
? { _tag: "provideLayer", layer: tagOrLayer }
|
|
284
|
+
: { _tag: "provide", provider, tag: tagOrLayer },
|
|
285
|
+
),
|
|
286
|
+
);
|
|
287
|
+
};
|
|
288
|
+
});
|
|
289
|
+
case "provideOptional":
|
|
290
|
+
return getOrCreateVirtualMethod(context, prop, () => {
|
|
291
|
+
return (tag: any, provider: any) => {
|
|
292
|
+
return wrapBuilderLike(
|
|
293
|
+
source,
|
|
294
|
+
appendEffectStep(state, {
|
|
295
|
+
_tag: "provideOptional",
|
|
296
|
+
provider,
|
|
297
|
+
tag,
|
|
298
|
+
}),
|
|
299
|
+
);
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
case "use":
|
|
303
|
+
return getOrCreateVirtualMethod(context, prop, () => {
|
|
304
|
+
return (middleware: any, ...rest: unknown[]) => {
|
|
305
|
+
if (isEffectMiddleware(middleware) && rest.length === 0) {
|
|
306
|
+
return wrapBuilderLike(
|
|
307
|
+
source,
|
|
308
|
+
appendEffectStep(state, {
|
|
309
|
+
_tag: "middleware",
|
|
310
|
+
middleware,
|
|
311
|
+
}),
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const flushed = flushEffectSteps(source, state);
|
|
316
|
+
const nextBuilder: AnyBuilderLike = Reflect.apply(
|
|
317
|
+
Reflect.get(flushed.builder, "use", flushed.builder),
|
|
318
|
+
flushed.builder,
|
|
319
|
+
[middleware, ...rest],
|
|
320
|
+
);
|
|
321
|
+
return wrapBuilderLike(nextBuilder, flushed.state);
|
|
322
|
+
};
|
|
323
|
+
});
|
|
183
324
|
case "traced":
|
|
184
325
|
return getOrCreateVirtualMethod(context, prop, () => {
|
|
185
326
|
return (spanName: string) =>
|
|
@@ -457,6 +598,32 @@ export class EffectBuilder<
|
|
|
457
598
|
TRequirementsProvided,
|
|
458
599
|
TRuntimeError
|
|
459
600
|
>["use"];
|
|
601
|
+
/**
|
|
602
|
+
* Provides a request-scoped Effect service to downstream procedures.
|
|
603
|
+
*/
|
|
604
|
+
declare provide: EffectBuilderSurface<
|
|
605
|
+
TInitialContext,
|
|
606
|
+
TCurrentContext,
|
|
607
|
+
TInputSchema,
|
|
608
|
+
TOutputSchema,
|
|
609
|
+
TEffectErrorMap,
|
|
610
|
+
TMeta,
|
|
611
|
+
TRequirementsProvided,
|
|
612
|
+
TRuntimeError
|
|
613
|
+
>["provide"];
|
|
614
|
+
/**
|
|
615
|
+
* Optionally provides a request-scoped Effect service to downstream procedures.
|
|
616
|
+
*/
|
|
617
|
+
declare provideOptional: EffectBuilderSurface<
|
|
618
|
+
TInitialContext,
|
|
619
|
+
TCurrentContext,
|
|
620
|
+
TInputSchema,
|
|
621
|
+
TOutputSchema,
|
|
622
|
+
TEffectErrorMap,
|
|
623
|
+
TMeta,
|
|
624
|
+
TRequirementsProvided,
|
|
625
|
+
TRuntimeError
|
|
626
|
+
>["provideOptional"];
|
|
460
627
|
/**
|
|
461
628
|
* Sets or updates the metadata.
|
|
462
629
|
* The provided metadata is spared-merged with any existing metadata.
|
|
@@ -659,9 +826,12 @@ export class EffectBuilder<
|
|
|
659
826
|
>,
|
|
660
827
|
builder?: AnyBuilderLike,
|
|
661
828
|
) {
|
|
662
|
-
const { runtime, spanConfig, effectErrorMap, ...orpcDef } =
|
|
829
|
+
const { runtime, spanConfig, effectErrorMap, effectSteps, ...orpcDef } =
|
|
830
|
+
def;
|
|
663
831
|
|
|
664
832
|
attachEffectState(this, builder ?? new Builder(orpcDef), {
|
|
833
|
+
effectSteps,
|
|
834
|
+
effectHandler: def.effectHandler,
|
|
665
835
|
effectErrorMap,
|
|
666
836
|
runtime,
|
|
667
837
|
spanConfig,
|
|
@@ -672,23 +842,76 @@ export class EffectBuilder<
|
|
|
672
842
|
}
|
|
673
843
|
|
|
674
844
|
/**
|
|
675
|
-
* Creates an Effect-aware procedure builder with the specified
|
|
845
|
+
* Creates an Effect-aware procedure builder with the specified Layer.
|
|
676
846
|
* Uses the default builder shape from `@orpc/server`.
|
|
677
847
|
*
|
|
678
|
-
* @param
|
|
848
|
+
* @param layer - The Layer that provides services for Effect procedures
|
|
679
849
|
* @returns An EffectBuilder instance for creating Effect-native procedures
|
|
680
850
|
*
|
|
681
851
|
* @example
|
|
682
852
|
* ```ts
|
|
683
853
|
* import { makeEffectORPC } from '@orpc/effect'
|
|
684
|
-
* import { Effect, Layer
|
|
854
|
+
* import { Effect, Layer } from 'effect'
|
|
685
855
|
*
|
|
686
|
-
* const
|
|
687
|
-
* const effectOs = makeEffectORPC(runtime)
|
|
856
|
+
* const effectOs = makeEffectORPC(Layer.empty)
|
|
688
857
|
*
|
|
689
858
|
* const hello = effectOs.effect(() => Effect.succeed('Hello!'))
|
|
690
859
|
* ```
|
|
691
860
|
*/
|
|
861
|
+
export function makeEffectORPC(): EffectBuilder<
|
|
862
|
+
Context,
|
|
863
|
+
Context,
|
|
864
|
+
Schema<unknown, unknown>,
|
|
865
|
+
Schema<unknown, unknown>,
|
|
866
|
+
Record<never, never>,
|
|
867
|
+
Record<never, never>,
|
|
868
|
+
never,
|
|
869
|
+
never
|
|
870
|
+
>;
|
|
871
|
+
|
|
872
|
+
export function makeEffectORPC<
|
|
873
|
+
TBuilder extends AnyBuilderLike<
|
|
874
|
+
TInputSchema,
|
|
875
|
+
TOutputSchema,
|
|
876
|
+
TErrorMap,
|
|
877
|
+
TMeta
|
|
878
|
+
>,
|
|
879
|
+
TInputSchema extends AnySchema,
|
|
880
|
+
TOutputSchema extends AnySchema,
|
|
881
|
+
TErrorMap extends ErrorMap,
|
|
882
|
+
TMeta extends Meta,
|
|
883
|
+
>(
|
|
884
|
+
builder: TBuilder,
|
|
885
|
+
): EffectBuilder<
|
|
886
|
+
InferBuilderInitialContext<TBuilder>,
|
|
887
|
+
InferBuilderCurrentContext<TBuilder>,
|
|
888
|
+
InferBuilderInputSchema<TBuilder>,
|
|
889
|
+
InferBuilderOutputSchema<TBuilder>,
|
|
890
|
+
InferBuilderErrorMap<TBuilder>,
|
|
891
|
+
InferBuilderMeta<TBuilder>,
|
|
892
|
+
never,
|
|
893
|
+
never
|
|
894
|
+
>;
|
|
895
|
+
|
|
896
|
+
export function makeEffectORPC<TRequirementsProvided, TRuntimeError>(
|
|
897
|
+
layer: Layer.Layer<TRequirementsProvided, TRuntimeError, never>,
|
|
898
|
+
): EffectBuilder<
|
|
899
|
+
Context,
|
|
900
|
+
Context,
|
|
901
|
+
Schema<unknown, unknown>,
|
|
902
|
+
Schema<unknown, unknown>,
|
|
903
|
+
Record<never, never>,
|
|
904
|
+
Record<never, never>,
|
|
905
|
+
TRequirementsProvided,
|
|
906
|
+
TRuntimeError
|
|
907
|
+
>;
|
|
908
|
+
|
|
909
|
+
/**
|
|
910
|
+
* Creates an Effect-aware procedure builder with the specified ManagedRuntime.
|
|
911
|
+
* Uses the default builder shape from `@orpc/server`.
|
|
912
|
+
*
|
|
913
|
+
* @param runtime - The ManagedRuntime that provides services for Effect procedures
|
|
914
|
+
*/
|
|
692
915
|
export function makeEffectORPC<TRequirementsProvided, TRuntimeError>(
|
|
693
916
|
runtime: ManagedRuntime.ManagedRuntime<TRequirementsProvided, TRuntimeError>,
|
|
694
917
|
): EffectBuilder<
|
|
@@ -704,9 +927,9 @@ export function makeEffectORPC<TRequirementsProvided, TRuntimeError>(
|
|
|
704
927
|
|
|
705
928
|
/**
|
|
706
929
|
* Creates an Effect-aware procedure builder by wrapping an existing oRPC Builder
|
|
707
|
-
* with the specified
|
|
930
|
+
* with the specified Layer.
|
|
708
931
|
*
|
|
709
|
-
* @param
|
|
932
|
+
* @param layer - The Layer that provides services for Effect procedures
|
|
710
933
|
* @param builder - The oRPC Builder instance to wrap (e.g., a customized `os`)
|
|
711
934
|
* @returns An EffectBuilder instance that extends the original builder with Effect support
|
|
712
935
|
*
|
|
@@ -714,14 +937,13 @@ export function makeEffectORPC<TRequirementsProvided, TRuntimeError>(
|
|
|
714
937
|
* ```ts
|
|
715
938
|
* import { makeEffectORPC } from '@orpc/effect'
|
|
716
939
|
* import { os } from '@orpc/server'
|
|
717
|
-
* import { Effect, Layer
|
|
940
|
+
* import { Effect, Layer } from 'effect'
|
|
718
941
|
*
|
|
719
942
|
* // Create a customized builder
|
|
720
943
|
* const authedOs = os.use(authMiddleware)
|
|
721
944
|
*
|
|
722
945
|
* // Wrap it with Effect support
|
|
723
|
-
* const
|
|
724
|
-
* const effectOs = makeEffectORPC(runtime, authedOs)
|
|
946
|
+
* const effectOs = makeEffectORPC(UserServiceLive, authedOs)
|
|
725
947
|
*
|
|
726
948
|
* const getUser = effectOs
|
|
727
949
|
* .input(z.object({ id: z.string() }))
|
|
@@ -747,7 +969,7 @@ export function makeEffectORPC<
|
|
|
747
969
|
TRequirementsProvided,
|
|
748
970
|
TRuntimeError,
|
|
749
971
|
>(
|
|
750
|
-
|
|
972
|
+
layer: Layer.Layer<TRequirementsProvided, TRuntimeError, never>,
|
|
751
973
|
builder: TBuilder,
|
|
752
974
|
): EffectBuilder<
|
|
753
975
|
InferBuilderInitialContext<TBuilder>,
|
|
@@ -760,21 +982,52 @@ export function makeEffectORPC<
|
|
|
760
982
|
TRuntimeError
|
|
761
983
|
>;
|
|
762
984
|
|
|
763
|
-
|
|
985
|
+
/**
|
|
986
|
+
* Creates an Effect-aware procedure builder by wrapping an existing oRPC Builder
|
|
987
|
+
* with the specified ManagedRuntime.
|
|
988
|
+
*
|
|
989
|
+
* @param runtime - The ManagedRuntime that provides services for Effect procedures
|
|
990
|
+
* @param builder - The oRPC Builder instance to wrap (e.g., a customized `os`)
|
|
991
|
+
*/
|
|
992
|
+
export function makeEffectORPC<
|
|
993
|
+
TBuilder extends AnyBuilderLike<
|
|
994
|
+
TInputSchema,
|
|
995
|
+
TOutputSchema,
|
|
996
|
+
TErrorMap,
|
|
997
|
+
TMeta
|
|
998
|
+
>,
|
|
999
|
+
TInputSchema extends AnySchema,
|
|
1000
|
+
TOutputSchema extends AnySchema,
|
|
1001
|
+
TErrorMap extends ErrorMap,
|
|
1002
|
+
TMeta extends Meta,
|
|
1003
|
+
TRequirementsProvided,
|
|
1004
|
+
TRuntimeError,
|
|
1005
|
+
>(
|
|
764
1006
|
runtime: ManagedRuntime.ManagedRuntime<TRequirementsProvided, TRuntimeError>,
|
|
765
|
-
builder
|
|
1007
|
+
builder: TBuilder,
|
|
766
1008
|
): EffectBuilder<
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
1009
|
+
InferBuilderInitialContext<TBuilder>,
|
|
1010
|
+
InferBuilderCurrentContext<TBuilder>,
|
|
1011
|
+
InferBuilderInputSchema<TBuilder>,
|
|
1012
|
+
InferBuilderOutputSchema<TBuilder>,
|
|
1013
|
+
InferBuilderErrorMap<TBuilder>,
|
|
1014
|
+
InferBuilderMeta<TBuilder>,
|
|
773
1015
|
TRequirementsProvided,
|
|
774
1016
|
TRuntimeError
|
|
775
|
-
|
|
776
|
-
|
|
1017
|
+
>;
|
|
1018
|
+
|
|
1019
|
+
export function makeEffectORPC(
|
|
1020
|
+
source?: EffectRuntimeSource<any, any> | AnyBuilderLike,
|
|
1021
|
+
builder?: AnyBuilderLike,
|
|
1022
|
+
): any {
|
|
1023
|
+
const sourceIsBuilder = source !== undefined && isBuilderLike(source);
|
|
1024
|
+
const resolvedBuilder = sourceIsBuilder
|
|
1025
|
+
? source
|
|
1026
|
+
: (builder ?? emptyBuilder());
|
|
777
1027
|
const effectErrorMap = getEffectErrorMap(resolvedBuilder);
|
|
1028
|
+
const runtime = toManagedRuntime(
|
|
1029
|
+
sourceIsBuilder || source === undefined ? Layer.empty : source,
|
|
1030
|
+
);
|
|
778
1031
|
return new EffectBuilder(
|
|
779
1032
|
{
|
|
780
1033
|
...resolvedBuilder["~orpc"],
|