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/dist/node.js CHANGED
@@ -1,19 +1,20 @@
1
1
  import {
2
2
  installFiberContextBridge
3
- } from "./chunk-VOWRLWZZ.js";
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(() => fiberRefsStorage.run(fiberRefs, fn))
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(() => fiberRefsStorage.run(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;AACvD;AAEA,0BAA0B,MAAM;AAEzB,SAAS,iBAAoB,IAAwC;AAC1E,SAAO,OAAO;AAAA,IAAQ,OAAO;AAAA,IAAc,CAAC,cAC1C,OAAO,QAAQ,MAAM,iBAAiB,IAAI,WAAW,EAAE,CAAC;AAAA,EAC1D;AACF;","names":[]}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-orpc",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "keywords": [
5
5
  "effect",
6
6
  "orpc",
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
- runtime,
515
+ toManagedRuntime(source),
484
516
  ) as EffectImplementer<
485
517
  TContract,
486
518
  Record<never, never>,
@@ -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 type { ManagedRuntime } from "effect";
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 { createEffectProcedureHandler } from "./effect-runtime";
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 } = def;
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 ManagedRuntime.
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 runtime - The ManagedRuntime that provides services for Effect procedures
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, ManagedRuntime } from 'effect'
854
+ * import { Effect, Layer } from 'effect'
685
855
  *
686
- * const runtime = ManagedRuntime.make(Layer.empty)
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 ManagedRuntime.
930
+ * with the specified Layer.
708
931
  *
709
- * @param runtime - The ManagedRuntime that provides services for Effect procedures
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, ManagedRuntime } from 'effect'
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 runtime = ManagedRuntime.make(UserServiceLive)
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
- runtime: ManagedRuntime.ManagedRuntime<TRequirementsProvided, TRuntimeError>,
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
- export function makeEffectORPC<TRequirementsProvided, TRuntimeError>(
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?: AnyBuilderLike,
1007
+ builder: TBuilder,
766
1008
  ): EffectBuilder<
767
- any,
768
- any,
769
- any,
770
- any,
771
- any,
772
- any,
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
- const resolvedBuilder = builder ?? emptyBuilder();
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"],