every-plugin 0.6.2 → 0.8.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.
Files changed (63) hide show
  1. package/dist/_virtual/rolldown_runtime.cjs +17 -7
  2. package/dist/_virtual/rolldown_runtime.mjs +17 -7
  3. package/dist/build/rspack/dev-server-middleware.cjs +1 -1
  4. package/dist/build/rspack/dev-server-middleware.cjs.map +1 -1
  5. package/dist/build/rspack/dev-server-middleware.mjs +1 -1
  6. package/dist/build/rspack/dev-server-middleware.mjs.map +1 -1
  7. package/dist/build/rspack/module-federation.cjs +0 -5
  8. package/dist/build/rspack/module-federation.cjs.map +1 -1
  9. package/dist/build/rspack/module-federation.mjs +0 -5
  10. package/dist/build/rspack/module-federation.mjs.map +1 -1
  11. package/dist/build/rspack/plugin.cjs +2 -1
  12. package/dist/build/rspack/plugin.cjs.map +1 -1
  13. package/dist/build/rspack/plugin.mjs +2 -1
  14. package/dist/build/rspack/plugin.mjs.map +1 -1
  15. package/dist/errors.cjs +75 -51
  16. package/dist/errors.cjs.map +1 -1
  17. package/dist/errors.d.cts +8 -0
  18. package/dist/errors.d.cts.map +1 -1
  19. package/dist/errors.d.mts +8 -0
  20. package/dist/errors.d.mts.map +1 -1
  21. package/dist/errors.mjs +75 -51
  22. package/dist/errors.mjs.map +1 -1
  23. package/dist/package.cjs +10 -10
  24. package/dist/package.cjs.map +1 -1
  25. package/dist/package.mjs +10 -10
  26. package/dist/package.mjs.map +1 -1
  27. package/dist/plugin.cjs +11 -10
  28. package/dist/plugin.cjs.map +1 -1
  29. package/dist/plugin.d.cts +16 -14
  30. package/dist/plugin.d.cts.map +1 -1
  31. package/dist/plugin.d.mts +17 -15
  32. package/dist/plugin.d.mts.map +1 -1
  33. package/dist/plugin.mjs +11 -10
  34. package/dist/plugin.mjs.map +1 -1
  35. package/dist/runtime/index.cjs +7 -5
  36. package/dist/runtime/index.cjs.map +1 -1
  37. package/dist/runtime/index.d.cts +1 -1
  38. package/dist/runtime/index.d.cts.map +1 -1
  39. package/dist/runtime/index.d.mts +1 -1
  40. package/dist/runtime/index.d.mts.map +1 -1
  41. package/dist/runtime/index.mjs +7 -5
  42. package/dist/runtime/index.mjs.map +1 -1
  43. package/dist/runtime/services/module-federation.service.cjs +24 -33
  44. package/dist/runtime/services/module-federation.service.cjs.map +1 -1
  45. package/dist/runtime/services/module-federation.service.d.cts +2 -3
  46. package/dist/runtime/services/module-federation.service.d.cts.map +1 -1
  47. package/dist/runtime/services/module-federation.service.d.mts +2 -3
  48. package/dist/runtime/services/module-federation.service.d.mts.map +1 -1
  49. package/dist/runtime/services/module-federation.service.mjs +24 -33
  50. package/dist/runtime/services/module-federation.service.mjs.map +1 -1
  51. package/dist/runtime/services/plugin-loader.service.d.cts +1 -1
  52. package/dist/runtime/services/plugin-loader.service.d.cts.map +1 -1
  53. package/dist/runtime/services/plugin-loader.service.d.mts +1 -1
  54. package/dist/runtime/services/plugin-loader.service.d.mts.map +1 -1
  55. package/dist/runtime/services/plugin.service.d.cts +1 -1
  56. package/dist/runtime/services/plugin.service.d.mts +1 -1
  57. package/dist/runtime/services/secrets.service.cjs +1 -1
  58. package/dist/runtime/services/secrets.service.mjs +1 -1
  59. package/dist/types.d.cts +29 -21
  60. package/dist/types.d.cts.map +1 -1
  61. package/dist/types.d.mts +29 -21
  62. package/dist/types.d.mts.map +1 -1
  63. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.cts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAQA;AAAsC,KAA1B,eAA0B,CAAA,UAAA,SAAA,EAAA,UAAqB,SAArB,CAAA,GAAA;EAAqB,SAAA,EAC/C,CAD+C;EAC/C,OAAA,EACF,CADE;CACF;;AAMV;;AAEoB,UAFH,uBAEG,CAAA,kBADD,iBACC,EAAA,mBAAA,SAAA,EAAA,iBACF,SADE,EAAA,iBAEF,SAFE,GAEQ,MAFR,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACF,MAAA,EAGV,MAHU,CAGH,SAHG,EAGQ,UAHR,EAGoB,QAHpB,EAG8B,QAH9B,CAAA;EACA,OAAA,EAAA;IAAU,QAAA,EAIhB,SAJgB;IAEb,SAAA,EAGF,UAHE;IAAW,OAAA,EAIf,QAJe;IAAY,OAAA,EAK3B,QAL2B;EAAU,CAAA;;;;;AAKrC,UAOM,MAPN,CAAA,kBAQQ,iBARR,EAAA,mBASS,SATT,EAAA,iBAUO,SAVP,EAAA,iBAWO,SAXP,GAWiB,MAXjB,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EAAQ,SAAA,EAAA,EAAA,MAAA;EAOF,SAAM,QAAA,EAOH,SAPG;EACJ,SAAA,YAAA,EAOK,eAPL,CAOqB,UAPrB,EAOiC,QAPjC,CAAA;EACC,UAAA,CAAA,MAAA,EAAA;IACF,SAAA,EASK,iBATL,CASuB,UATvB,CAAA;IACA,OAAA,EAQ6C,iBAR7C,CAQ+D,QAR/D,CAAA;EAAU,CAAA,CAAA,EASxB,MAAA,CAAO,MATiB,CASV,QATU,EAAA,OAAA,EASS,KAAA,CAAM,KATf,CAAA;EAGR,QAAA,EAAA,EAQP,MAAA,CAAO,MARA,CAAA,IAAA,EAAA,KAAA,CAAA;EACoB;;;;;;EAIuB,YAAA,CAAA,OAAA,EAWxC,QAXwC,CAAA,EAW7B,MAX6B,CAWtB,SAXsB,EAAA,GAAA,CAAA;;;;;AAWxC,iBAMP,YANO,CAAA,UAOZ,SAPY,EAAA,UAQZ,SARY,EAAA,kBASJ,iBATI,EAAA,iBAUL,SAVK,GAUK,MAVL,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA,MAAA,EAAA;EAAkB,SAAA,EAY7B,CAZ6B;EAAP,OAAA,EAaxB,CAbwB;EAAM,QAAA,EAc7B,SAd6B;EAMxB,UAAA,CAAA,EAAA,CAAA,MAAY,EAAA;IACjB,SAAA,EASY,iBATZ,CAS8B,CAT9B,CAAA;IACA,OAAA,EAQ2C,iBAR3C,CAQ6D,CAR7D,CAAA;EACQ,CAAA,EAAA,GAQb,MAAA,CAAO,MARM,CAQC,QARD,EAQW,KARX,EAQkB,KAAA,CAAM,KARxB,CAAA;EACD,YAAA,EAAA,CAAA,OAAA,EASP,QATO,EAAA,OAAA,EAUP,WAVO,CAUK,SAVL,EAUgB,QAVhB,EAU0B,QAV1B,CAAA,EAAA,GAWZ,MAXY,CAWL,SAXK,EAAA,GAAA,CAAA;EAAU,QAAA,CAAA,EAAA,CAAA,GAAA,EAYV,QAZU,EAAA,GAYG,MAAA,CAAO,MAZV,CAAA,IAAA,EAYuB,KAZvB,EAAA,KAAA,CAAA;CAEhB,CAAA,EAwEiB,uBAxEjB,CAwEyC,SAxEzC,EAwEoD,CAxEpD,EAwEuD,CAxEvD,EAwE0D,QAxE1D,CAAA"}
1
+ {"version":3,"file":"plugin.d.cts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAQA;AAAsC,KAA1B,eAA0B,CAAA,UAAA,SAAA,EAAA,UAAqB,SAArB,EAAA,wBAAwD,SAAxD,CAAA,GAAA;EAAqB,SAAA,EAC/C,CAD+C;EAAmC,OAAA,EAEpF,CAFoF;EAClF,OAAA,EAEF,eAFE;CACF;;;AAOV;AACmB,UADF,uBACE,CAAA,kBAAA,iBAAA,EAAA,mBACC,SADD,EAAA,iBAED,SAFC,EAAA,wBAGM,SAHN,EAAA,cAIJ,SAJI,GAIM,MAJN,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACC,MAAA,EAKZ,MALY,CAKL,SALK,EAKM,UALN,EAKkB,QALlB,EAK4B,eAL5B,EAK6C,KAL7C,CAAA;EACF,OAAA,EAAA;IACO,QAAA,EAKb,SALa;IACV,SAAA,EAKF,UALE;IAAU,OAAA,EAMd,QANc;IAEV,OAAA,EAKJ,eALI;EAAW,CAAA;;;;;AAEd,UAUK,MAVL,CAAA,kBAWO,iBAXP,EAAA,mBAYQ,SAZR,EAAA,iBAaM,SAbN,EAAA,wBAca,SAdb,EAAA,cAeG,SAfH,GAea,MAfb,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACC,SAAA,EAAA,EAAA,MAAA;EACF,SAAA,QAAA,EAgBS,SAhBT;EACA,SAAA,YAAA,EAgBa,eAhBb,CAgB6B,UAhB7B,EAgByC,QAhBzC,EAgBmD,eAhBnD,CAAA;EAAe,UAAA,CAAA,MAAA,EAAA;IAOT,SAAM,EAaA,iBAbA,CAakB,UAblB,CAAA;IACJ,OAAA,EAY4C,iBAZ5C,CAY8D,QAZ9D,CAAA;EACC,CAAA,CAAA,EAYhB,MAAA,CAAO,MAZS,CAYF,KAZE,EAAA,OAAA,EAYc,KAAA,CAAM,KAZpB,CAAA;EACF,QAAA,EAAA,EAaL,MAAA,CAAO,MAbF,CAAA,IAAA,EAAA,KAAA,CAAA;EACO;;;;;;EAKqC,YAAA,CAAA,IAAA,EAe1C,KAf0C,CAAA,EAelC,MAfkC,CAe3B,SAf2B,EAAA,GAAA,CAAA;;;;;AAIC,iBAiB/C,YAjB+C,CAAA,UAkBpD,SAlBoD,EAAA,UAmBpD,SAnBoD,EAAA,wBAoBtC,SApBsC,EAAA,kBAqB5C,iBArB4C,EAAA,cAsBhD,SAtBgD,GAsBtC,MAtBsC,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA,MAAA,EAAA;EAC7C,SAAA,EAuBN,CAvBM;EAAgB,OAAM,EAwB9B,CAxB8B;EAApC,OAAO,EAyBD,eAzBC;EAEE,QAAO,EAwBT,SAxBS;EAQA,UAAA,CAAA,EAAA,CAAA,MAAA,EAAA;IAAe,SAAA,EAkBZ,iBAlBY,CAkBM,CAlBN,CAAA;IAAP,OAAA,EAkB0B,iBAlB1B,CAkB4C,CAlB5C,CAAA;EAAM,CAAA,EAAA,GAmB5B,MAAA,CAAO,MAnBqB,CAmBd,KAnBc,EAmBP,KAnBO,EAmBA,KAAA,CAAM,KAnBN,CAAA;EAMlB,YAAA,EAAA,CAAY,IAAA,EAepB,KAfoB,EAAA,OAAA,EAgBjB,WAhBiB,CAgBL,SAhBK,EAgBM,iBAhBN,CAgBwB,eAhBxB,CAAA,EAgB0C,iBAhB1C,CAgB4D,eAhB5D,CAAA,CAAA,EAAA,GAiBtB,MAjBsB,CAiBf,SAjBe,EAAA,GAAA,CAAA;EACjB,QAAA,CAAA,EAAA,CAAA,IAAA,EAiBQ,KAjBR,EAAA,GAiBkB,MAAA,CAAO,MAjBzB,CAAA,IAAA,EAiBsC,KAjBtC,EAAA,KAAA,CAAA;CACA,CAAA,EA+EkB,uBA/ElB,CA+E0C,SA/E1C,EA+EqD,CA/ErD,EA+EwD,CA/ExD,EA+E2D,eA/E3D,EA+E4E,KA/E5E,CAAA"}
package/dist/plugin.d.mts CHANGED
@@ -1,5 +1,5 @@
1
+ import { Context, Implementer, Router } from "@orpc/server";
1
2
  import { Effect, Scope } from "effect";
2
- import { Context as Context$1, Implementer, Router } from "@orpc/server";
3
3
  import { AnyContractRouter, AnySchema, InferSchemaOutput } from "@orpc/contract";
4
4
 
5
5
  //#region src/plugin.d.ts
@@ -7,56 +7,58 @@ import { AnyContractRouter, AnySchema, InferSchemaOutput } from "@orpc/contract"
7
7
  /**
8
8
  * Helper type that correctly constructs the config schema type
9
9
  */
10
- type PluginConfigFor<V extends AnySchema, S extends AnySchema> = {
10
+ type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema> = {
11
11
  variables: V;
12
12
  secrets: S;
13
+ context: TRequestContext;
13
14
  };
14
15
  /**
15
16
  * Loaded plugin with static binding property
16
17
  */
17
- interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TContext extends Context$1 = Record<never, never>> {
18
- new (): Plugin<TContract, TVariables, TSecrets, TContext>;
18
+ interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema, TDeps extends Context = Record<never, never>> {
19
+ new (): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>;
19
20
  binding: {
20
21
  contract: TContract;
21
22
  variables: TVariables;
22
23
  secrets: TSecrets;
23
- context: TContext;
24
+ context: TRequestContext;
24
25
  };
25
26
  }
26
27
  /**
27
28
  * Plugin interface
28
29
  */
29
- interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TContext extends Context$1 = Record<never, never>> {
30
+ interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema, TDeps extends Context = Record<never, never>> {
30
31
  readonly id: string;
31
32
  readonly contract: TContract;
32
- readonly configSchema: PluginConfigFor<TVariables, TSecrets>;
33
+ readonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>;
33
34
  initialize(config: {
34
35
  variables: InferSchemaOutput<TVariables>;
35
36
  secrets: InferSchemaOutput<TSecrets>;
36
- }): Effect.Effect<TContext, unknown, Scope.Scope>;
37
+ }): Effect.Effect<TDeps, unknown, Scope.Scope>;
37
38
  shutdown(): Effect.Effect<void, never>;
38
39
  /**
39
40
  * Creates the strongly-typed oRPC router for this plugin.
40
41
  * The router's procedure types are inferred directly from the contract.
41
- * @param context The initialized plugin context
42
+ * @param deps The initialized plugin dependencies
42
43
  * @returns A router with procedures matching the plugin's contract
43
44
  */
44
- createRouter(context: TContext): Router<TContract, any>;
45
+ createRouter(deps: TDeps): Router<TContract, any>;
45
46
  }
46
47
  /**
47
48
  * Factory function to create plugins
48
49
  */
49
- declare function createPlugin<V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter, TContext extends Context$1 = Record<never, never>>(config: {
50
+ declare function createPlugin<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema, TContract extends AnyContractRouter, TDeps extends Context = Record<never, never>>(config: {
50
51
  variables: V;
51
52
  secrets: S;
53
+ context: TRequestContext;
52
54
  contract: TContract;
53
55
  initialize?: (config: {
54
56
  variables: InferSchemaOutput<V>;
55
57
  secrets: InferSchemaOutput<S>;
56
- }) => Effect.Effect<TContext, Error, Scope.Scope>;
57
- createRouter: (context: TContext, builder: Implementer<TContract, TContext, TContext>) => Router<TContract, any>;
58
- shutdown?: (ctx: TContext) => Effect.Effect<void, Error, never>;
59
- }): LoadedPluginWithBinding<TContract, V, S, TContext>;
58
+ }) => Effect.Effect<TDeps, Error, Scope.Scope>;
59
+ createRouter: (deps: TDeps, builder: Implementer<TContract, InferSchemaOutput<TRequestContext>, InferSchemaOutput<TRequestContext>>) => Router<TContract, any>;
60
+ shutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>;
61
+ }): LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>;
60
62
  //#endregion
61
63
  export { LoadedPluginWithBinding, Plugin, PluginConfigFor, createPlugin };
62
64
  //# sourceMappingURL=plugin.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.mts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAQA;AAAsC,KAA1B,eAA0B,CAAA,UAAA,SAAA,EAAA,UAAqB,SAArB,CAAA,GAAA;EAAqB,SAAA,EAC/C,CAD+C;EAC/C,OAAA,EACF,CADE;CACF;;AAMV;;AAEoB,UAFH,uBAEG,CAAA,kBADD,iBACC,EAAA,mBAAA,SAAA,EAAA,iBACF,SADE,EAAA,iBAEF,SAFE,GAEQ,MAFR,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACF,MAAA,EAGV,MAHU,CAGH,SAHG,EAGQ,UAHR,EAGoB,QAHpB,EAG8B,QAH9B,CAAA;EACA,OAAA,EAAA;IAAU,QAAA,EAIhB,SAJgB;IAEb,SAAA,EAGF,UAHE;IAAW,OAAA,EAIf,QAJe;IAAY,OAAA,EAK3B,QAL2B;EAAU,CAAA;;;;;AAKrC,UAOM,MAPN,CAAA,kBAQQ,iBARR,EAAA,mBASS,SATT,EAAA,iBAUO,SAVP,EAAA,iBAWO,SAXP,GAWiB,MAXjB,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EAAQ,SAAA,EAAA,EAAA,MAAA;EAOF,SAAM,QAAA,EAOH,SAPG;EACJ,SAAA,YAAA,EAOK,eAPL,CAOqB,UAPrB,EAOiC,QAPjC,CAAA;EACC,UAAA,CAAA,MAAA,EAAA;IACF,SAAA,EASK,iBATL,CASuB,UATvB,CAAA;IACA,OAAA,EAQ6C,iBAR7C,CAQ+D,QAR/D,CAAA;EAAU,CAAA,CAAA,EASxB,MAAA,CAAO,MATiB,CASV,QATU,EAAA,OAAA,EASS,KAAA,CAAM,KATf,CAAA;EAGR,QAAA,EAAA,EAQP,MAAA,CAAO,MARA,CAAA,IAAA,EAAA,KAAA,CAAA;EACoB;;;;;;EAIuB,YAAA,CAAA,OAAA,EAWxC,QAXwC,CAAA,EAW7B,MAX6B,CAWtB,SAXsB,EAAA,GAAA,CAAA;;;;;AAWxC,iBAMP,YANO,CAAA,UAOZ,SAPY,EAAA,UAQZ,SARY,EAAA,kBASJ,iBATI,EAAA,iBAUL,SAVK,GAUK,MAVL,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA,MAAA,EAAA;EAAkB,SAAA,EAY7B,CAZ6B;EAAP,OAAA,EAaxB,CAbwB;EAAM,QAAA,EAc7B,SAd6B;EAMxB,UAAA,CAAA,EAAA,CAAA,MAAY,EAAA;IACjB,SAAA,EASY,iBATZ,CAS8B,CAT9B,CAAA;IACA,OAAA,EAQ2C,iBAR3C,CAQ6D,CAR7D,CAAA;EACQ,CAAA,EAAA,GAQb,MAAA,CAAO,MARM,CAQC,QARD,EAQW,KARX,EAQkB,KAAA,CAAM,KARxB,CAAA;EACD,YAAA,EAAA,CAAA,OAAA,EASP,QATO,EAAA,OAAA,EAUP,WAVO,CAUK,SAVL,EAUgB,QAVhB,EAU0B,QAV1B,CAAA,EAAA,GAWZ,MAXY,CAWL,SAXK,EAAA,GAAA,CAAA;EAAU,QAAA,CAAA,EAAA,CAAA,GAAA,EAYV,QAZU,EAAA,GAYG,MAAA,CAAO,MAZV,CAAA,IAAA,EAYuB,KAZvB,EAAA,KAAA,CAAA;CAEhB,CAAA,EAwEiB,uBAxEjB,CAwEyC,SAxEzC,EAwEoD,CAxEpD,EAwEuD,CAxEvD,EAwE0D,QAxE1D,CAAA"}
1
+ {"version":3,"file":"plugin.d.mts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAQA;AAAsC,KAA1B,eAA0B,CAAA,UAAA,SAAA,EAAA,UAAqB,SAArB,EAAA,wBAAwD,SAAxD,CAAA,GAAA;EAAqB,SAAA,EAC/C,CAD+C;EAAmC,OAAA,EAEpF,CAFoF;EAClF,OAAA,EAEF,eAFE;CACF;;;AAOV;AACmB,UADF,uBACE,CAAA,kBAAA,iBAAA,EAAA,mBACC,SADD,EAAA,iBAED,SAFC,EAAA,wBAGM,SAHN,EAAA,cAIJ,OAJI,GAIM,MAJN,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACC,MAAA,EAKZ,MALY,CAKL,SALK,EAKM,UALN,EAKkB,QALlB,EAK4B,eAL5B,EAK6C,KAL7C,CAAA;EACF,OAAA,EAAA;IACO,QAAA,EAKb,SALa;IACV,SAAA,EAKF,UALE;IAAU,OAAA,EAMd,QANc;IAEV,OAAA,EAKJ,eALI;EAAW,CAAA;;;;;AAEd,UAUK,MAVL,CAAA,kBAWO,iBAXP,EAAA,mBAYQ,SAZR,EAAA,iBAaM,SAbN,EAAA,wBAca,SAdb,EAAA,cAeG,OAfH,GAea,MAfb,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACC,SAAA,EAAA,EAAA,MAAA;EACF,SAAA,QAAA,EAgBS,SAhBT;EACA,SAAA,YAAA,EAgBa,eAhBb,CAgB6B,UAhB7B,EAgByC,QAhBzC,EAgBmD,eAhBnD,CAAA;EAAe,UAAA,CAAA,MAAA,EAAA;IAOT,SAAM,EAaA,iBAbA,CAakB,UAblB,CAAA;IACJ,OAAA,EAY4C,iBAZ5C,CAY8D,QAZ9D,CAAA;EACC,CAAA,CAAA,EAYhB,MAAA,CAAO,MAZS,CAYF,KAZE,EAAA,OAAA,EAYc,KAAA,CAAM,KAZpB,CAAA;EACF,QAAA,EAAA,EAaL,MAAA,CAAO,MAbF,CAAA,IAAA,EAAA,KAAA,CAAA;EACO;;;;;;EAKqC,YAAA,CAAA,IAAA,EAe1C,KAf0C,CAAA,EAelC,MAfkC,CAe3B,SAf2B,EAAA,GAAA,CAAA;;;;;AAIC,iBAiB/C,YAjB+C,CAAA,UAkBpD,SAlBoD,EAAA,UAmBpD,SAnBoD,EAAA,wBAoBtC,SApBsC,EAAA,kBAqB5C,iBArB4C,EAAA,cAsBhD,OAtBgD,GAsBtC,MAtBsC,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA,MAAA,EAAA;EAC7C,SAAA,EAuBN,CAvBM;EAAgB,OAAM,EAwB9B,CAxB8B;EAApC,OAAO,EAyBD,eAzBC;EAEE,QAAO,EAwBT,SAxBS;EAQA,UAAA,CAAA,EAAA,CAAA,MAAA,EAAA;IAAe,SAAA,EAkBZ,iBAlBY,CAkBM,CAlBN,CAAA;IAAP,OAAA,EAkB0B,iBAlB1B,CAkB4C,CAlB5C,CAAA;EAAM,CAAA,EAAA,GAmB5B,MAAA,CAAO,MAnBqB,CAmBd,KAnBc,EAmBP,KAnBO,EAmBA,KAAA,CAAM,KAnBN,CAAA;EAMlB,YAAA,EAAA,CAAY,IAAA,EAepB,KAfoB,EAAA,OAAA,EAgBjB,WAhBiB,CAgBL,SAhBK,EAgBM,iBAhBN,CAgBwB,eAhBxB,CAAA,EAgB0C,iBAhB1C,CAgB4D,eAhB5D,CAAA,CAAA,EAAA,GAiBtB,MAjBsB,CAiBf,SAjBe,EAAA,GAAA,CAAA;EACjB,QAAA,CAAA,EAAA,CAAA,IAAA,EAiBQ,KAjBR,EAAA,GAiBkB,MAAA,CAAO,MAjBzB,CAAA,IAAA,EAiBsC,KAjBtC,EAAA,KAAA,CAAA;CACA,CAAA,EA+EkB,uBA/ElB,CA+E0C,SA/E1C,EA+EqD,CA/ErD,EA+EwD,CA/ExD,EA+E2D,eA/E3D,EA+E4E,KA/E5E,CAAA"}
package/dist/plugin.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { Effect } from "effect";
2
1
  import { implement } from "@orpc/server";
2
+ import { Effect } from "effect";
3
3
 
4
4
  //#region src/plugin.ts
5
5
  /**
@@ -8,28 +8,29 @@ import { implement } from "@orpc/server";
8
8
  function createPlugin(config) {
9
9
  const configSchema = {
10
10
  variables: config.variables,
11
- secrets: config.secrets
11
+ secrets: config.secrets,
12
+ context: config.context
12
13
  };
13
14
  class CreatedPlugin {
14
15
  /** set during instantiation - registry key */
15
16
  id;
16
17
  contract = config.contract;
17
18
  configSchema = configSchema;
18
- _context = null;
19
+ _deps = null;
19
20
  initialize(pluginConfig) {
20
- return (config.initialize ?? (() => Effect.succeed({})))(pluginConfig).pipe(Effect.tap((ctx) => Effect.sync(() => {
21
- this._context = ctx;
22
- })), Effect.map(() => this._context), Effect.mapError((error) => error));
21
+ return (config.initialize ?? (() => Effect.succeed({})))(pluginConfig).pipe(Effect.tap((deps) => Effect.sync(() => {
22
+ this._deps = deps;
23
+ })), Effect.map(() => this._deps), Effect.mapError((error) => error));
23
24
  }
24
25
  shutdown() {
25
26
  const self = this;
26
27
  return Effect.gen(function* () {
27
- if (config.shutdown && self._context) yield* config.shutdown(self._context).pipe(Effect.catchAll(() => Effect.void));
28
+ if (config.shutdown && self._deps) yield* config.shutdown(self._deps).pipe(Effect.catchAll(() => Effect.void));
28
29
  });
29
30
  }
30
- createRouter(context) {
31
+ createRouter(deps) {
31
32
  const builder = implement(config.contract).$context();
32
- return config.createRouter(context, builder);
33
+ return config.createRouter(deps, builder);
33
34
  }
34
35
  }
35
36
  const PluginConstructor = CreatedPlugin;
@@ -37,7 +38,7 @@ function createPlugin(config) {
37
38
  contract: config.contract,
38
39
  variables: config.variables,
39
40
  secrets: config.secrets,
40
- context: {}
41
+ context: config.context
41
42
  };
42
43
  return PluginConstructor;
43
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":["configSchema: PluginConfigFor<V, S>"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { AnyContractRouter, AnySchema, InferSchemaOutput } from \"@orpc/contract\";\nimport type { Context, Implementer, Router } from \"@orpc/server\";\nimport { implement } from \"@orpc/server\";\nimport { Effect, type Scope } from \"effect\";\n\n/**\n * Helper type that correctly constructs the config schema type\n */\nexport type PluginConfigFor<V extends AnySchema, S extends AnySchema> = {\n\tvariables: V;\n\tsecrets: S;\n};\n\n/**\n * Loaded plugin with static binding property\n */\nexport interface LoadedPluginWithBinding<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTContext extends Context = Record<never, never>\n> {\n\tnew(): Plugin<TContract, TVariables, TSecrets, TContext>;\n\tbinding: {\n\t\tcontract: TContract;\n\t\tvariables: TVariables;\n\t\tsecrets: TSecrets;\n\t\tcontext: TContext;\n\t};\n}\n\n/**\n * Plugin interface\n */\nexport interface Plugin<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTContext extends Context = Record<never, never>\n> {\n\treadonly id: string;\n\treadonly contract: TContract;\n\treadonly configSchema: PluginConfigFor<TVariables, TSecrets>;\n\n\t// Plugin lifecycle\n\tinitialize(\n\t\tconfig: { variables: InferSchemaOutput<TVariables>; secrets: InferSchemaOutput<TSecrets> }\n\t): Effect.Effect<TContext, unknown, Scope.Scope>;\n\n\tshutdown(): Effect.Effect<void, never>;\n\n\t/**\n\t * Creates the strongly-typed oRPC router for this plugin.\n\t * The router's procedure types are inferred directly from the contract.\n\t * @param context The initialized plugin context\n\t * @returns A router with procedures matching the plugin's contract\n\t */\n\tcreateRouter(context: TContext): Router<TContract, any>;\n}\n\n/**\n * Factory function to create plugins\n */\nexport function createPlugin<\n\tV extends AnySchema,\n\tS extends AnySchema,\n\tTContract extends AnyContractRouter,\n\tTContext extends Context = Record<never, never>\n>(config: {\n\tvariables: V;\n\tsecrets: S;\n\tcontract: TContract;\n\tinitialize?: (\n\t\tconfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t) => Effect.Effect<TContext, Error, Scope.Scope>;\n\tcreateRouter: (\n\t\tcontext: TContext,\n\t\tbuilder: Implementer<TContract, TContext, TContext>\n\t) => Router<TContract, any>;\n\tshutdown?: (ctx: TContext) => Effect.Effect<void, Error, never>;\n}) {\n\tconst configSchema: PluginConfigFor<V, S> = {\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets\n\t};\n\n\tclass CreatedPlugin implements Plugin<TContract, V, S, TContext> {\n\t\t/** set during instantiation - registry key */\n\t\tid!: string;\n\t\treadonly contract = config.contract;\n\t\treadonly configSchema = configSchema;\n\n\t\tprivate _context: TContext | null = null;\n\n\t\tinitialize(\n\t\t\tpluginConfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t\t): Effect.Effect<TContext, unknown, Scope.Scope> {\n\t\t\tconst init = config.initialize ?? (() => Effect.succeed({} as TContext));\n\n\t\t\treturn init(pluginConfig).pipe(\n\t\t\t\tEffect.tap((ctx) => Effect.sync(() => { this._context = ctx; })),\n\t\t\t\tEffect.map(() => this._context as TContext),\n\t\t\t\tEffect.mapError((error) => error as unknown)\n\t\t\t);\n\t\t}\n\n\t\tshutdown(): Effect.Effect<void, never> {\n\t\t\tconst self = this;\n\t\t\treturn Effect.gen(function* () {\n\t\t\t\tif (config.shutdown && self._context) {\n\t\t\t\t\tyield* config.shutdown(self._context).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcreateRouter(context: TContext): Router<TContract, any> {\n\t\t\tconst builder = implement(config.contract).$context<TContext>();\n\t\t\tconst router = config.createRouter(context, builder);\n\t\t\treturn router as Router<TContract, any>;\n\t\t}\n\t}\n\n\tconst PluginConstructor = CreatedPlugin as unknown as {\n\t\tnew(): Plugin<TContract, V, S, TContext>;\n\t\tbinding: {\n\t\t\tcontract: TContract;\n\t\t\tvariables: V;\n\t\t\tsecrets: S;\n\t\t\tcontext: TContext;\n\t\t};\n\t};\n\n\tPluginConstructor.binding = {\n\t\tcontract: config.contract,\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: {} as TContext\n\t};\n\n\treturn PluginConstructor as LoadedPluginWithBinding<TContract, V, S, TContext>;\n}\n"],"mappings":";;;;;;;AA+DA,SAAgB,aAKd,QAYC;CACF,MAAMA,eAAsC;EAC3C,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB;CAED,MAAM,cAA2D;;EAEhE;EACA,AAAS,WAAW,OAAO;EAC3B,AAAS,eAAe;EAExB,AAAQ,WAA4B;EAEpC,WACC,cACgD;AAGhD,WAFa,OAAO,qBAAqB,OAAO,QAAQ,EAAE,CAAa,GAE3D,aAAa,CAAC,KACzB,OAAO,KAAK,QAAQ,OAAO,WAAW;AAAE,SAAK,WAAW;KAAO,CAAC,EAChE,OAAO,UAAU,KAAK,SAAqB,EAC3C,OAAO,UAAU,UAAU,MAAiB,CAC5C;;EAGF,WAAuC;GACtC,MAAM,OAAO;AACb,UAAO,OAAO,IAAI,aAAa;AAC9B,QAAI,OAAO,YAAY,KAAK,SAC3B,QAAO,OAAO,SAAS,KAAK,SAAS,CAAC,KACrC,OAAO,eAAe,OAAO,KAAK,CAClC;KAED;;EAGH,aAAa,SAA2C;GACvD,MAAM,UAAU,UAAU,OAAO,SAAS,CAAC,UAAoB;AAE/D,UADe,OAAO,aAAa,SAAS,QAAQ;;;CAKtD,MAAM,oBAAoB;AAU1B,mBAAkB,UAAU;EAC3B,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,EAAE;EACX;AAED,QAAO"}
1
+ {"version":3,"file":"plugin.mjs","names":["configSchema: PluginConfigFor<V, S, TRequestContext>"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { AnyContractRouter, AnySchema, InferSchemaOutput } from \"@orpc/contract\";\nimport type { Context, Implementer, Router } from \"@orpc/server\";\nimport { implement } from \"@orpc/server\";\nimport { Effect, type Scope } from \"effect\";\n\n/**\n * Helper type that correctly constructs the config schema type\n */\nexport type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema> = {\n\tvariables: V;\n\tsecrets: S;\n\tcontext: TRequestContext;\n};\n\n/**\n * Loaded plugin with static binding property\n */\nexport interface LoadedPluginWithBinding<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTRequestContext extends AnySchema,\n\tTDeps extends Context = Record<never, never>\n> {\n\tnew(): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>;\n\tbinding: {\n\t\tcontract: TContract;\n\t\tvariables: TVariables;\n\t\tsecrets: TSecrets;\n\t\tcontext: TRequestContext;\n\t};\n}\n\n/**\n * Plugin interface\n */\nexport interface Plugin<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTRequestContext extends AnySchema,\n\tTDeps extends Context = Record<never, never>\n> {\n\treadonly id: string;\n\treadonly contract: TContract;\n\treadonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>;\n\n\t// Plugin lifecycle\n\tinitialize(\n\t\tconfig: { variables: InferSchemaOutput<TVariables>; secrets: InferSchemaOutput<TSecrets> }\n\t): Effect.Effect<TDeps, unknown, Scope.Scope>;\n\n\tshutdown(): Effect.Effect<void, never>;\n\n\t/**\n\t * Creates the strongly-typed oRPC router for this plugin.\n\t * The router's procedure types are inferred directly from the contract.\n\t * @param deps The initialized plugin dependencies\n\t * @returns A router with procedures matching the plugin's contract\n\t */\n\tcreateRouter(deps: TDeps): Router<TContract, any>;\n}\n\n/**\n * Factory function to create plugins\n */\nexport function createPlugin<\n\tV extends AnySchema,\n\tS extends AnySchema,\n\tTRequestContext extends AnySchema,\n\tTContract extends AnyContractRouter,\n\tTDeps extends Context = Record<never, never>\n>(config: {\n\tvariables: V;\n\tsecrets: S;\n\tcontext: TRequestContext;\n\tcontract: TContract;\n\tinitialize?: (\n\t\tconfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t) => Effect.Effect<TDeps, Error, Scope.Scope>;\n\tcreateRouter: (\n\t\tdeps: TDeps,\n\t\tbuilder: Implementer<TContract, InferSchemaOutput<TRequestContext>, InferSchemaOutput<TRequestContext>>\n\t) => Router<TContract, any>;\n\tshutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>;\n}) {\n\tconst configSchema: PluginConfigFor<V, S, TRequestContext> = {\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: config.context\n\t};\n\n\tclass CreatedPlugin implements Plugin<TContract, V, S, TRequestContext, TDeps> {\n\t\t/** set during instantiation - registry key */\n\t\tid!: string;\n\t\treadonly contract = config.contract;\n\t\treadonly configSchema = configSchema;\n\n\t\tprivate _deps: TDeps | null = null;\n\n\t\tinitialize(\n\t\t\tpluginConfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t\t): Effect.Effect<TDeps, unknown, Scope.Scope> {\n\t\t\tconst init = config.initialize ?? (() => Effect.succeed({} as TDeps));\n\n\t\t\treturn init(pluginConfig).pipe(\n\t\t\t\tEffect.tap((deps) => Effect.sync(() => { this._deps = deps; })),\n\t\t\t\tEffect.map(() => this._deps as TDeps),\n\t\t\t\tEffect.mapError((error) => error as unknown)\n\t\t\t);\n\t\t}\n\n\t\tshutdown(): Effect.Effect<void, never> {\n\t\t\tconst self = this;\n\t\t\treturn Effect.gen(function* () {\n\t\t\t\tif (config.shutdown && self._deps) {\n\t\t\t\t\tyield* config.shutdown(self._deps).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcreateRouter(deps: TDeps): Router<TContract, any> {\n\t\t\tconst builder = implement(config.contract).$context<InferSchemaOutput<TRequestContext>>();\n\t\t\tconst router = config.createRouter(deps, builder);\n\t\t\treturn router as Router<TContract, any>;\n\t\t}\n\t}\n\n\tconst PluginConstructor = CreatedPlugin as unknown as {\n\t\tnew(): Plugin<TContract, V, S, TRequestContext, TDeps>;\n\t\tbinding: {\n\t\t\tcontract: TContract;\n\t\t\tvariables: V;\n\t\t\tsecrets: S;\n\t\t\tcontext: TRequestContext;\n\t\t};\n\t};\n\n\tPluginConstructor.binding = {\n\t\tcontract: config.contract,\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: config.context\n\t};\n\n\treturn PluginConstructor as LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>;\n}\n"],"mappings":";;;;;;;AAkEA,SAAgB,aAMd,QAaC;CACF,MAAMA,eAAuD;EAC5D,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB;CAED,MAAM,cAAyE;;EAE9E;EACA,AAAS,WAAW,OAAO;EAC3B,AAAS,eAAe;EAExB,AAAQ,QAAsB;EAE9B,WACC,cAC6C;AAG7C,WAFa,OAAO,qBAAqB,OAAO,QAAQ,EAAE,CAAU,GAExD,aAAa,CAAC,KACzB,OAAO,KAAK,SAAS,OAAO,WAAW;AAAE,SAAK,QAAQ;KAAQ,CAAC,EAC/D,OAAO,UAAU,KAAK,MAAe,EACrC,OAAO,UAAU,UAAU,MAAiB,CAC5C;;EAGF,WAAuC;GACtC,MAAM,OAAO;AACb,UAAO,OAAO,IAAI,aAAa;AAC9B,QAAI,OAAO,YAAY,KAAK,MAC3B,QAAO,OAAO,SAAS,KAAK,MAAM,CAAC,KAClC,OAAO,eAAe,OAAO,KAAK,CAClC;KAED;;EAGH,aAAa,MAAqC;GACjD,MAAM,UAAU,UAAU,OAAO,SAAS,CAAC,UAA8C;AAEzF,UADe,OAAO,aAAa,MAAM,QAAQ;;;CAKnD,MAAM,oBAAoB;AAU1B,mBAAkB,UAAU;EAC3B,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB;AAED,QAAO"}
@@ -1,8 +1,8 @@
1
1
  const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
2
  const require_errors = require('./errors.cjs');
3
3
  const require_plugin_service = require('./services/plugin.service.cjs');
4
- let effect = require("effect");
5
4
  let __orpc_server = require("@orpc/server");
5
+ let effect = require("effect");
6
6
 
7
7
  //#region src/runtime/index.ts
8
8
  var PluginRuntime = class {
@@ -48,10 +48,12 @@ var PluginRuntime = class {
48
48
  this.pluginCache.set(cacheKey, cachedPlugin);
49
49
  }
50
50
  const initialized = await this.runPromise(cachedPlugin);
51
- const router = initialized.plugin.createRouter(initialized.context);
51
+ const createClient = (context) => {
52
+ return (0, __orpc_server.createRouterClient)(initialized.plugin.createRouter(initialized.context), { context });
53
+ };
52
54
  return {
53
- router,
54
- client: (0, __orpc_server.createRouterClient)(router),
55
+ createClient,
56
+ router: initialized.plugin.createRouter(initialized.context),
55
57
  metadata: initialized.metadata,
56
58
  initialized
57
59
  };
@@ -141,7 +143,7 @@ function normalizeRegistry(registry) {
141
143
  * });
142
144
  *
143
145
  * // Types are automatically inferred from module entries!
144
- * const { client } = await runtime.usePlugin("telegram", config);
146
+ * const { router } = await runtime.usePlugin("telegram", config);
145
147
  * ```
146
148
  */
147
149
  function createPluginRuntime(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","Hash","Effect","PluginRuntimeError","effect","Exit","Cause","Option","PluginService","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>","ManagedRuntime"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load → Instantiate → Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\tconst client = createRouterClient(router);\n\n\t\treturn {\n\t\t\trouter: router as PluginRouterType<R[K]>,\n\t\t\tclient: client as PluginClientType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { client } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","Hash","Effect","PluginRuntimeError","effect","Exit","Cause","Option","PluginService","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>","ManagedRuntime"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load → Instantiate → Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\n\t\t// Create client factory that accepts request context\n\t\tconst createClient = (context?: any) => {\n\t\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\t\treturn createRouterClient(router, { context });\n\t\t};\n\n\t\treturn {\n\t\t\tcreateClient: createClient as any,\n\t\t\trouter: initialized.plugin.createRouter(initialized.context) as PluginRouterType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { router } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
@@ -34,7 +34,7 @@ declare class PluginRuntime<R = RegisteredPlugins> {
34
34
  * });
35
35
  *
36
36
  * // Types are automatically inferred from module entries!
37
- * const { client } = await runtime.usePlugin("telegram", config);
37
+ * const { router } = await runtime.usePlugin("telegram", config);
38
38
  * ```
39
39
  */
40
40
  declare function createPluginRuntime<TRegistry extends Record<string, PluginRegistryEntry>>(config: PluginRuntimeConfig<TRegistry>): PluginRuntime<InferRegistryFromEntries<TRegistry>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,MAkCM,CAlCN,GAAA,MAAA,CAAA,CAAA,QAAA,EAmChB,CAnCgB,CAAA,EAoCxB,OApCwB,CAoChB,YApCgB,CAoCH,gBApCG,CAoCc,CApCd,EAoCiB,CApCjB,CAAA,CAAA,CAAA;EAAE,iBAAA,CAAA,UAAA,MA4CW,CA5CX,GAAA,MAAA,CAAA,CAAA,QAAA,EA6ClB,CA7CkB,EAAA,YAAA,EA8Cd,YA9Cc,CA8CD,gBA9CC,CA8CgB,CA9ChB,EA8CmB,CA9CnB,CAAA,CAAA,CAAA,EA+C1B,OA/C0B,CA+ClB,cA/CkB,CA+CH,gBA/CG,CA+Cc,CA/Cd,EA+CiB,CA/CjB,CAAA,CAAA,CAAA;EAApB,gBAAA,CAAA,UAuDwB,SAvDxB,CAAA,CAAA,QAAA,EAwDE,cAxDF,CAwDiB,CAxDjB,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EA0DN,OA1DM,CA0DE,iBA1DF,CA0DoB,CA1DpB,CAAA,CAAA;EACkB,QAAA,CAAA,CAAA,EAiET,OAjES,CAAA,IAAA,CAAA;EAAG,WAAA,CAAA,UAAA,MAyEI,CAzEJ,GAAA,MAAA,CAAA,CAAA,QAAA,EA0EnB,CA1EmB,EAAA,MAAA,EA2ErB,iBA3EqB,CA2EH,CA3EG,CA2ED,CA3EC,CAAA,CAAA,CAAA,EA4E3B,OA5E2B,CAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;AA8C3B,iBA0HY,mBA1HZ,CAAA,kBA2He,MA3Hf,CAAA,MAAA,EA2H8B,mBA3H9B,CAAA,CAAA,CAAA,MAAA,EA6HK,mBA7HL,CA6HyB,SA7HzB,CAAA,CAAA,EA8HD,aA9HC,CA8Ha,wBA9Hb,CA8HsC,SA9HtC,CAAA,CAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,MAsCM,CAtCN,GAAA,MAAA,CAAA,CAAA,QAAA,EAuChB,CAvCgB,CAAA,EAwCxB,OAxCwB,CAwChB,YAxCgB,CAwCH,gBAxCG,CAwCc,CAxCd,EAwCiB,CAxCjB,CAAA,CAAA,CAAA;EAAE,iBAAA,CAAA,UAAA,MAgDW,CAhDX,GAAA,MAAA,CAAA,CAAA,QAAA,EAiDlB,CAjDkB,EAAA,YAAA,EAkDd,YAlDc,CAkDD,gBAlDC,CAkDgB,CAlDhB,EAkDmB,CAlDnB,CAAA,CAAA,CAAA,EAmD1B,OAnD0B,CAmDlB,cAnDkB,CAmDH,gBAnDG,CAmDc,CAnDd,EAmDiB,CAnDjB,CAAA,CAAA,CAAA;EAApB,gBAAA,CAAA,UA2DwB,SA3DxB,CAAA,CAAA,QAAA,EA4DE,cA5DF,CA4DiB,CA5DjB,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EA8DN,OA9DM,CA8DE,iBA9DF,CA8DoB,CA9DpB,CAAA,CAAA;EACkB,QAAA,CAAA,CAAA,EAqET,OArES,CAAA,IAAA,CAAA;EAAG,WAAA,CAAA,UAAA,MA6EI,CA7EJ,GAAA,MAAA,CAAA,CAAA,QAAA,EA8EnB,CA9EmB,EAAA,MAAA,EA+ErB,iBA/EqB,CA+EH,CA/EG,CA+ED,CA/EC,CAAA,CAAA,CAAA,EAgF3B,OAhF2B,CAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;AAkD3B,iBA0HY,mBA1HZ,CAAA,kBA2He,MA3Hf,CAAA,MAAA,EA2H8B,mBA3H9B,CAAA,CAAA,CAAA,MAAA,EA6HK,mBA7HL,CA6HyB,SA7HzB,CAAA,CAAA,EA8HD,aA9HC,CA8Ha,wBA9Hb,CA8HsC,SA9HtC,CAAA,CAAA"}
@@ -34,7 +34,7 @@ declare class PluginRuntime<R = RegisteredPlugins> {
34
34
  * });
35
35
  *
36
36
  * // Types are automatically inferred from module entries!
37
- * const { client } = await runtime.usePlugin("telegram", config);
37
+ * const { router } = await runtime.usePlugin("telegram", config);
38
38
  * ```
39
39
  */
40
40
  declare function createPluginRuntime<TRegistry extends Record<string, PluginRegistryEntry>>(config: PluginRuntimeConfig<TRegistry>): PluginRuntime<InferRegistryFromEntries<TRegistry>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,MAkCM,CAlCN,GAAA,MAAA,CAAA,CAAA,QAAA,EAmChB,CAnCgB,CAAA,EAoCxB,OApCwB,CAoChB,YApCgB,CAoCH,gBApCG,CAoCc,CApCd,EAoCiB,CApCjB,CAAA,CAAA,CAAA;EAAE,iBAAA,CAAA,UAAA,MA4CW,CA5CX,GAAA,MAAA,CAAA,CAAA,QAAA,EA6ClB,CA7CkB,EAAA,YAAA,EA8Cd,YA9Cc,CA8CD,gBA9CC,CA8CgB,CA9ChB,EA8CmB,CA9CnB,CAAA,CAAA,CAAA,EA+C1B,OA/C0B,CA+ClB,cA/CkB,CA+CH,gBA/CG,CA+Cc,CA/Cd,EA+CiB,CA/CjB,CAAA,CAAA,CAAA;EAApB,gBAAA,CAAA,UAuDwB,SAvDxB,CAAA,CAAA,QAAA,EAwDE,cAxDF,CAwDiB,CAxDjB,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EA0DN,OA1DM,CA0DE,iBA1DF,CA0DoB,CA1DpB,CAAA,CAAA;EACkB,QAAA,CAAA,CAAA,EAiET,OAjES,CAAA,IAAA,CAAA;EAAG,WAAA,CAAA,UAAA,MAyEI,CAzEJ,GAAA,MAAA,CAAA,CAAA,QAAA,EA0EnB,CA1EmB,EAAA,MAAA,EA2ErB,iBA3EqB,CA2EH,CA3EG,CA2ED,CA3EC,CAAA,CAAA,CAAA,EA4E3B,OA5E2B,CAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;AA8C3B,iBA0HY,mBA1HZ,CAAA,kBA2He,MA3Hf,CAAA,MAAA,EA2H8B,mBA3H9B,CAAA,CAAA,CAAA,MAAA,EA6HK,mBA7HL,CA6HyB,SA7HzB,CAAA,CAAA,EA8HD,aA9HC,CA8Ha,wBA9Hb,CA8HsC,SA9HtC,CAAA,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,MAsCM,CAtCN,GAAA,MAAA,CAAA,CAAA,QAAA,EAuChB,CAvCgB,CAAA,EAwCxB,OAxCwB,CAwChB,YAxCgB,CAwCH,gBAxCG,CAwCc,CAxCd,EAwCiB,CAxCjB,CAAA,CAAA,CAAA;EAAE,iBAAA,CAAA,UAAA,MAgDW,CAhDX,GAAA,MAAA,CAAA,CAAA,QAAA,EAiDlB,CAjDkB,EAAA,YAAA,EAkDd,YAlDc,CAkDD,gBAlDC,CAkDgB,CAlDhB,EAkDmB,CAlDnB,CAAA,CAAA,CAAA,EAmD1B,OAnD0B,CAmDlB,cAnDkB,CAmDH,gBAnDG,CAmDc,CAnDd,EAmDiB,CAnDjB,CAAA,CAAA,CAAA;EAApB,gBAAA,CAAA,UA2DwB,SA3DxB,CAAA,CAAA,QAAA,EA4DE,cA5DF,CA4DiB,CA5DjB,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EA8DN,OA9DM,CA8DE,iBA9DF,CA8DoB,CA9DpB,CAAA,CAAA;EACkB,QAAA,CAAA,CAAA,EAqET,OArES,CAAA,IAAA,CAAA;EAAG,WAAA,CAAA,UAAA,MA6EI,CA7EJ,GAAA,MAAA,CAAA,CAAA,QAAA,EA8EnB,CA9EmB,EAAA,MAAA,EA+ErB,iBA/EqB,CA+EH,CA/EG,CA+ED,CA/EC,CAAA,CAAA,CAAA,EAgF3B,OAhF2B,CAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;AAkD3B,iBA0HY,mBA1HZ,CAAA,kBA2He,MA3Hf,CAAA,MAAA,EA2H8B,mBA3H9B,CAAA,CAAA,CAAA,MAAA,EA6HK,mBA7HL,CA6HyB,SA7HzB,CAAA,CAAA,EA8HD,aA9HC,CA8Ha,wBA9Hb,CA8HsC,SA9HtC,CAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { PluginRuntimeError } from "./errors.mjs";
2
2
  import { PluginService } from "./services/plugin.service.mjs";
3
- import { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from "effect";
4
3
  import { createRouterClient } from "@orpc/server";
4
+ import { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from "effect";
5
5
 
6
6
  //#region src/runtime/index.ts
7
7
  var PluginRuntime = class {
@@ -47,10 +47,12 @@ var PluginRuntime = class {
47
47
  this.pluginCache.set(cacheKey, cachedPlugin);
48
48
  }
49
49
  const initialized = await this.runPromise(cachedPlugin);
50
- const router = initialized.plugin.createRouter(initialized.context);
50
+ const createClient = (context) => {
51
+ return createRouterClient(initialized.plugin.createRouter(initialized.context), { context });
52
+ };
51
53
  return {
52
- router,
53
- client: createRouterClient(router),
54
+ createClient,
55
+ router: initialized.plugin.createRouter(initialized.context),
54
56
  metadata: initialized.metadata,
55
57
  initialized
56
58
  };
@@ -140,7 +142,7 @@ function normalizeRegistry(registry) {
140
142
  * });
141
143
  *
142
144
  * // Types are automatically inferred from module entries!
143
- * const { client } = await runtime.usePlugin("telegram", config);
145
+ * const { router } = await runtime.usePlugin("telegram", config);
144
146
  * ```
145
147
  */
146
148
  function createPluginRuntime(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load → Instantiate → Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\tconst client = createRouterClient(router);\n\n\t\treturn {\n\t\t\trouter: router as PluginRouterType<R[K]>,\n\t\t\tclient: client as PluginClientType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { client } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load → Instantiate → Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\n\t\t// Create client factory that accepts request context\n\t\tconst createClient = (context?: any) => {\n\t\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\t\treturn createRouterClient(router, { context });\n\t\t};\n\n\t\treturn {\n\t\t\tcreateClient: createClient as any,\n\t\t\trouter: initialized.plugin.createRouter(initialized.context) as PluginRouterType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { router } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
@@ -7,6 +7,10 @@ let __module_federation_enhanced_runtime = require("@module-federation/enhanced/
7
7
  let __module_federation_runtime_core = require("@module-federation/runtime-core");
8
8
 
9
9
  //#region src/runtime/services/module-federation.service.ts
10
+ function getMajorVersionRange(version$1) {
11
+ const match = version$1.match(/^[\^~]?(\d+)/);
12
+ return `^${match ? match[1] : "0"}.0.0`;
13
+ }
10
14
  const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync(() => {
11
15
  try {
12
16
  let instance = (0, __module_federation_enhanced_runtime.getInstance)();
@@ -19,8 +23,8 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
19
23
  version: require_package.version,
20
24
  shareConfig: {
21
25
  singleton: true,
22
- requiredVersion: `^${require_package.version}`,
23
- eager: true,
26
+ requiredVersion: getMajorVersionRange(require_package.version),
27
+ eager: false,
24
28
  strictVersion: false
25
29
  }
26
30
  },
@@ -28,8 +32,8 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
28
32
  version: require_package.dependencies.effect,
29
33
  shareConfig: {
30
34
  singleton: true,
31
- requiredVersion: "^3.18.0",
32
- eager: true,
35
+ requiredVersion: getMajorVersionRange(require_package.dependencies.effect),
36
+ eager: false,
33
37
  strictVersion: false
34
38
  }
35
39
  },
@@ -37,8 +41,8 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
37
41
  version: require_package.dependencies.zod,
38
42
  shareConfig: {
39
43
  singleton: true,
40
- requiredVersion: "^4.1.0",
41
- eager: true,
44
+ requiredVersion: getMajorVersionRange(require_package.dependencies.zod),
45
+ eager: false,
42
46
  strictVersion: false
43
47
  }
44
48
  },
@@ -46,8 +50,8 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
46
50
  version: require_package.dependencies["@orpc/contract"],
47
51
  shareConfig: {
48
52
  singleton: true,
49
- requiredVersion: "^1.8.0",
50
- eager: true,
53
+ requiredVersion: getMajorVersionRange(require_package.dependencies["@orpc/contract"]),
54
+ eager: false,
51
55
  strictVersion: false
52
56
  }
53
57
  },
@@ -55,8 +59,8 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
55
59
  version: require_package.dependencies["@orpc/server"],
56
60
  shareConfig: {
57
61
  singleton: true,
58
- requiredVersion: "^1.8.0",
59
- eager: true,
62
+ requiredVersion: getMajorVersionRange(require_package.dependencies["@orpc/server"]),
63
+ eager: false,
60
64
  strictVersion: false
61
65
  }
62
66
  }
@@ -74,30 +78,11 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
74
78
  return {
75
79
  registerRemote: (pluginId, url) => effect.Effect.gen(function* () {
76
80
  console.log(`[MF] Registering ${pluginId}`);
77
- const manifestUrl = url.endsWith("/") ? `${url}mf-manifest.json` : `${url}/mf-manifest.json`;
78
- const manifestCheck = yield* effect.Effect.tryPromise({
79
- try: async () => {
80
- return (await fetch(manifestUrl, { method: "HEAD" })).ok;
81
- },
82
- catch: () => false
83
- });
84
- let entryUrl;
85
- let isManifestMode = false;
86
- if (manifestCheck) {
87
- entryUrl = manifestUrl;
88
- isManifestMode = true;
89
- console.log(`[MF] Using MF 2.0 manifest mode for ${pluginId}`);
90
- } else {
91
- console.log(`[MF] ⚠️ Manifest not found, falling back to MF 1.5 mode for ${pluginId}`);
92
- entryUrl = url;
93
- isManifestMode = false;
94
- }
95
- const remoteName = isManifestMode ? pluginId : require_runtime_services_normalize.getNormalizedRemoteName(pluginId);
81
+ const remoteName = require_runtime_services_normalize.getNormalizedRemoteName(pluginId);
96
82
  yield* effect.Effect.try({
97
83
  try: () => mf.registerRemotes([{
98
84
  name: remoteName,
99
- entry: entryUrl,
100
- ...isManifestMode && { alias: pluginId }
85
+ entry: url
101
86
  }]),
102
87
  catch: (error) => new require_errors.ModuleFederationError({
103
88
  pluginId,
@@ -105,7 +90,7 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
105
90
  cause: error instanceof Error ? error : new Error(String(error))
106
91
  })
107
92
  });
108
- console.log(`[MF] ✅ Registered ${pluginId} (${isManifestMode ? "MF 2.0" : "MF 1.5"})`);
93
+ console.log(`[MF] ✅ Registered ${pluginId}`);
109
94
  }),
110
95
  loadRemoteConstructor: (pluginId, url) => effect.Effect.gen(function* () {
111
96
  const remoteName = require_runtime_services_normalize.getNormalizedRemoteName(pluginId);
@@ -115,7 +100,13 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
115
100
  try: async () => {
116
101
  const container = await mf.loadRemote(modulePath);
117
102
  if (!container) throw new Error(`No container returned for ${modulePath}`);
118
- const Constructor = typeof container === "function" ? container : container.default ? container.default : Object.values(container).find((exp) => typeof exp === "function" && exp.prototype?.constructor === exp);
103
+ let Constructor;
104
+ if (typeof container === "function") Constructor = container;
105
+ else if (container.default) Constructor = container.default;
106
+ else {
107
+ Constructor = Object.values(container).find((exp) => typeof exp === "function" && exp.binding !== void 0);
108
+ if (!Constructor) Constructor = Object.values(container).find((exp) => typeof exp === "function" && exp.prototype?.constructor === exp);
109
+ }
119
110
  if (!Constructor || typeof Constructor !== "function") {
120
111
  const containerInfo = typeof container === "object" ? `Available exports: ${Object.keys(container).join(", ")}` : `Container type: ${typeof container}`;
121
112
  throw new Error(`No valid plugin constructor found for '${pluginId}'.\nSupported patterns:\n - export const YourPlugin = createPlugin({...})\n - export default createPlugin({...})\n${containerInfo}`);