every-plugin 0.5.0 → 0.5.1
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/{chunk-zltIcp7o.cjs → _virtual/rolldown_runtime.cjs} +3 -18
- package/dist/{chunk-QQAxy9l9.mjs → _virtual/rolldown_runtime.mjs} +1 -1
- package/dist/build/rspack/dev-server-middleware.cjs +201 -0
- package/dist/build/rspack/dev-server-middleware.cjs.map +1 -0
- package/dist/build/rspack/dev-server-middleware.mjs +200 -0
- package/dist/build/rspack/dev-server-middleware.mjs.map +1 -0
- package/dist/build/rspack/index.cjs +2 -362
- package/dist/build/rspack/index.d.cts +2 -20
- package/dist/build/rspack/index.d.mts +2 -20
- package/dist/build/rspack/index.mjs +2 -360
- package/dist/build/rspack/module-federation.cjs +47 -0
- package/dist/build/rspack/module-federation.cjs.map +1 -0
- package/dist/build/rspack/module-federation.mjs +47 -0
- package/dist/build/rspack/module-federation.mjs.map +1 -0
- package/dist/build/rspack/plugin.cjs +90 -0
- package/dist/build/rspack/plugin.cjs.map +1 -0
- package/dist/build/rspack/plugin.d.cts +20 -0
- package/dist/build/rspack/plugin.d.cts.map +1 -0
- package/dist/build/rspack/plugin.d.mts +20 -0
- package/dist/build/rspack/plugin.d.mts.map +1 -0
- package/dist/build/rspack/plugin.mjs +89 -0
- package/dist/build/rspack/plugin.mjs.map +1 -0
- package/dist/build/rspack/utils.cjs +41 -0
- package/dist/build/rspack/utils.cjs.map +1 -0
- package/dist/build/rspack/utils.mjs +38 -0
- package/dist/build/rspack/utils.mjs.map +1 -0
- package/dist/errors.cjs +62 -3
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +75 -3
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.mts +75 -3
- package/dist/errors.d.mts.map +1 -0
- package/dist/errors.mjs +62 -3
- package/dist/errors.mjs.map +1 -0
- package/dist/index.cjs +8 -55
- package/dist/index.d.cts +6 -5
- package/dist/index.d.mts +6 -5
- package/dist/index.mjs +5 -51
- package/dist/orpc.cjs +1 -1
- package/dist/{package-DyTuSutr.cjs → package.cjs} +22 -7
- package/dist/package.cjs.map +1 -0
- package/dist/{package-CaRYwbRi.mjs → package.mjs} +22 -5
- package/dist/package.mjs.map +1 -0
- package/dist/plugin.cjs +48 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +62 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +62 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +47 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/runtime/errors.cjs +45 -0
- package/dist/runtime/errors.cjs.map +1 -0
- package/dist/runtime/errors.d.cts +27 -0
- package/dist/runtime/errors.d.cts.map +1 -0
- package/dist/runtime/errors.d.mts +27 -0
- package/dist/runtime/errors.d.mts.map +1 -0
- package/dist/runtime/errors.mjs +41 -0
- package/dist/runtime/errors.mjs.map +1 -0
- package/dist/runtime/index.cjs +157 -5
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +43 -5
- package/dist/runtime/index.d.cts.map +1 -0
- package/dist/runtime/index.d.mts +43 -5
- package/dist/runtime/index.d.mts.map +1 -0
- package/dist/runtime/index.mjs +155 -4
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/runtime/services/module-federation.service.cjs +143 -0
- package/dist/runtime/services/module-federation.service.cjs.map +1 -0
- package/dist/runtime/services/module-federation.service.d.cts +15 -0
- package/dist/runtime/services/module-federation.service.d.cts.map +1 -0
- package/dist/runtime/services/module-federation.service.d.mts +15 -0
- package/dist/runtime/services/module-federation.service.d.mts.map +1 -0
- package/dist/runtime/services/module-federation.service.mjs +143 -0
- package/dist/runtime/services/module-federation.service.mjs.map +1 -0
- package/dist/runtime/services/normalize.cjs +22 -2
- package/dist/runtime/services/normalize.cjs.map +1 -0
- package/dist/runtime/services/normalize.d.cts +21 -2
- package/dist/runtime/services/normalize.d.cts.map +1 -0
- package/dist/runtime/services/normalize.d.mts +21 -2
- package/dist/runtime/services/normalize.d.mts.map +1 -0
- package/dist/runtime/services/normalize.mjs +21 -2
- package/dist/runtime/services/normalize.mjs.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.cjs +33 -0
- package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.cts +17 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.mts +17 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.mjs +32 -0
- package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -0
- package/dist/runtime/services/plugin-loader.service.cjs +125 -0
- package/dist/runtime/services/plugin-loader.service.cjs.map +1 -0
- package/dist/runtime/services/plugin-loader.service.d.cts +54 -0
- package/dist/runtime/services/plugin-loader.service.d.cts.map +1 -0
- package/dist/runtime/services/plugin-loader.service.d.mts +54 -0
- package/dist/runtime/services/plugin-loader.service.d.mts.map +1 -0
- package/dist/runtime/services/plugin-loader.service.mjs +121 -0
- package/dist/runtime/services/plugin-loader.service.mjs.map +1 -0
- package/dist/runtime/services/plugin.service.cjs +33 -0
- package/dist/runtime/services/plugin.service.cjs.map +1 -0
- package/dist/runtime/services/plugin.service.d.cts +42 -0
- package/dist/runtime/services/plugin.service.d.cts.map +1 -0
- package/dist/runtime/services/plugin.service.d.mts +42 -0
- package/dist/runtime/services/plugin.service.d.mts.map +1 -0
- package/dist/runtime/services/plugin.service.mjs +32 -0
- package/dist/runtime/services/plugin.service.mjs.map +1 -0
- package/dist/runtime/services/secrets.service.cjs +50 -0
- package/dist/runtime/services/secrets.service.cjs.map +1 -0
- package/dist/runtime/services/secrets.service.d.cts +16 -0
- package/dist/runtime/services/secrets.service.d.cts.map +1 -0
- package/dist/runtime/services/secrets.service.d.mts +16 -0
- package/dist/runtime/services/secrets.service.d.mts.map +1 -0
- package/dist/runtime/services/secrets.service.mjs +48 -0
- package/dist/runtime/services/secrets.service.mjs.map +1 -0
- package/dist/runtime/validation.cjs +18 -0
- package/dist/runtime/validation.cjs.map +1 -0
- package/dist/runtime/validation.mjs +17 -0
- package/dist/runtime/validation.mjs.map +1 -0
- package/dist/testing/index.cjs +2 -4
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +4 -4
- package/dist/testing/index.d.mts +4 -4
- package/dist/testing/index.mjs +1 -3
- package/dist/testing/index.mjs.map +1 -1
- package/dist/types.cjs +0 -0
- package/dist/types.d.cts +261 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +261 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/zod-core.cjs +9 -0
- package/dist/zod-core.d.cts +1 -0
- package/dist/zod-core.d.mts +1 -0
- package/dist/zod-core.mjs +3 -0
- package/dist/zod.cjs +13 -1
- package/dist/zod.cjs.map +1 -0
- package/dist/zod.d.cts +8 -2
- package/dist/zod.d.cts.map +1 -0
- package/dist/zod.d.mts +8 -2
- package/dist/zod.d.mts.map +1 -0
- package/dist/zod.mjs +9 -2
- package/dist/zod.mjs.map +1 -0
- package/package.json +17 -2
- package/dist/build/rspack/index.cjs.map +0 -1
- package/dist/build/rspack/index.d.cts.map +0 -1
- package/dist/build/rspack/index.d.mts.map +0 -1
- package/dist/build/rspack/index.mjs.map +0 -1
- package/dist/errors-9sNpYLv5.d.mts +0 -75
- package/dist/errors-9sNpYLv5.d.mts.map +0 -1
- package/dist/errors-CVnoPl9v.cjs +0 -68
- package/dist/errors-CVnoPl9v.cjs.map +0 -1
- package/dist/errors-D7keKf7a.mjs +0 -63
- package/dist/errors-D7keKf7a.mjs.map +0 -1
- package/dist/errors-DKPPPYYT.d.cts +0 -75
- package/dist/errors-DKPPPYYT.d.cts.map +0 -1
- package/dist/fetch-8DauUFDh.mjs +0 -335
- package/dist/fetch-8DauUFDh.mjs.map +0 -1
- package/dist/fetch-CrBvwsZ4.cjs +0 -336
- package/dist/fetch-CrBvwsZ4.cjs.map +0 -1
- package/dist/index-Bu2wtZrA.d.mts +0 -463
- package/dist/index-Bu2wtZrA.d.mts.map +0 -1
- package/dist/index-DtTqwV4f.d.cts +0 -462
- package/dist/index-DtTqwV4f.d.cts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/normalize-BW7kk8Lk.d.cts +0 -21
- package/dist/normalize-BW7kk8Lk.d.cts.map +0 -1
- package/dist/normalize-D4Qh0wVk.cjs +0 -28
- package/dist/normalize-D4Qh0wVk.cjs.map +0 -1
- package/dist/normalize-D7nae0Hn.mjs +0 -22
- package/dist/normalize-D7nae0Hn.mjs.map +0 -1
- package/dist/normalize-eB_j86fm.d.mts +0 -21
- package/dist/normalize-eB_j86fm.d.mts.map +0 -1
- package/dist/package-CaRYwbRi.mjs.map +0 -1
- package/dist/package-DyTuSutr.cjs.map +0 -1
- package/dist/plugins-C6MGKdD-.mjs +0 -790
- package/dist/plugins-C6MGKdD-.mjs.map +0 -1
- package/dist/plugins-DNaNtkG7.cjs +0 -791
- package/dist/plugins-DNaNtkG7.cjs.map +0 -1
- package/dist/runtime-BNcFgWDG.cjs +0 -558
- package/dist/runtime-BNcFgWDG.cjs.map +0 -1
- package/dist/runtime-CAWcnrAk.mjs +0 -547
- package/dist/runtime-CAWcnrAk.mjs.map +0 -1
- package/dist/standard-CkH8zNkx.mjs +0 -584
- package/dist/standard-CkH8zNkx.mjs.map +0 -1
- package/dist/standard-v75BC6Z5.cjs +0 -685
- package/dist/standard-v75BC6Z5.cjs.map +0 -1
- package/dist/zod-A7Pti5IV.d.cts +0 -4
- package/dist/zod-A7Pti5IV.d.cts.map +0 -1
- package/dist/zod-BVo51kgJ.mjs +0 -10
- package/dist/zod-BVo51kgJ.mjs.map +0 -1
- package/dist/zod-DYghWCz1.cjs +0 -14
- package/dist/zod-DYghWCz1.cjs.map +0 -1
- package/dist/zod-Zw8dlP3j.d.mts +0 -4
- package/dist/zod-Zw8dlP3j.d.mts.map +0 -1
|
@@ -1,547 +0,0 @@
|
|
|
1
|
-
import { i as __toESM } from "./chunk-QQAxy9l9.mjs";
|
|
2
|
-
import { t as getNormalizedRemoteName } from "./normalize-D7nae0Hn.mjs";
|
|
3
|
-
import { t as require_package } from "./package-CaRYwbRi.mjs";
|
|
4
|
-
import { Cause, Context, Data, Effect, Exit, Hash, Layer, ManagedRuntime, Option, Ref, Scope } from "effect";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
import { createRouterClient } from "@orpc/server";
|
|
7
|
-
import { ORPCError } from "@orpc/contract";
|
|
8
|
-
import { betterFetch } from "@better-fetch/fetch";
|
|
9
|
-
import { createInstance, getInstance } from "@module-federation/enhanced/runtime";
|
|
10
|
-
import { setGlobalFederationInstance } from "@module-federation/runtime-core";
|
|
11
|
-
|
|
12
|
-
//#region src/runtime/errors.ts
|
|
13
|
-
var PluginRuntimeError = class extends Data.TaggedError("PluginRuntimeError") {};
|
|
14
|
-
var ModuleFederationError = class extends Data.TaggedError("ModuleFederationError") {};
|
|
15
|
-
var ValidationError = class extends Data.TaggedError("ValidationError") {};
|
|
16
|
-
const isRetryableORPCCode = (code) => {
|
|
17
|
-
switch (code) {
|
|
18
|
-
case "TOO_MANY_REQUESTS":
|
|
19
|
-
case "SERVICE_UNAVAILABLE":
|
|
20
|
-
case "BAD_GATEWAY":
|
|
21
|
-
case "GATEWAY_TIMEOUT":
|
|
22
|
-
case "TIMEOUT": return true;
|
|
23
|
-
default: return false;
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
const wrapORPCError = (orpcError, pluginId, procedureName, operation) => {
|
|
27
|
-
return new PluginRuntimeError({
|
|
28
|
-
pluginId,
|
|
29
|
-
operation,
|
|
30
|
-
procedureName,
|
|
31
|
-
retryable: isRetryableORPCCode(orpcError.code),
|
|
32
|
-
cause: orpcError
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
const toPluginRuntimeError = (error, pluginId, procedureName, operation, defaultRetryable = false) => {
|
|
36
|
-
if (error instanceof ORPCError) return wrapORPCError(error, pluginId, procedureName, operation);
|
|
37
|
-
if (error instanceof PluginRuntimeError) return error;
|
|
38
|
-
return new PluginRuntimeError({
|
|
39
|
-
pluginId,
|
|
40
|
-
operation,
|
|
41
|
-
procedureName,
|
|
42
|
-
retryable: defaultRetryable,
|
|
43
|
-
cause: error instanceof Error ? error : new Error(String(error))
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
//#endregion
|
|
48
|
-
//#region src/runtime/services/module-federation.service.ts
|
|
49
|
-
var import_package = /* @__PURE__ */ __toESM(require_package(), 1);
|
|
50
|
-
const createModuleFederationInstance = Effect.cached(Effect.sync(() => {
|
|
51
|
-
try {
|
|
52
|
-
let instance = getInstance();
|
|
53
|
-
if (!instance) {
|
|
54
|
-
instance = createInstance({
|
|
55
|
-
name: "host",
|
|
56
|
-
remotes: [],
|
|
57
|
-
shared: {
|
|
58
|
-
"every-plugin": {
|
|
59
|
-
version: import_package.default.version,
|
|
60
|
-
shareConfig: {
|
|
61
|
-
singleton: true,
|
|
62
|
-
requiredVersion: `^${import_package.default.version}`,
|
|
63
|
-
eager: true,
|
|
64
|
-
strictVersion: false
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
effect: {
|
|
68
|
-
version: import_package.default.dependencies.effect,
|
|
69
|
-
shareConfig: {
|
|
70
|
-
singleton: true,
|
|
71
|
-
requiredVersion: "^3.18.0",
|
|
72
|
-
eager: true,
|
|
73
|
-
strictVersion: false
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
zod: {
|
|
77
|
-
version: import_package.default.dependencies.zod,
|
|
78
|
-
shareConfig: {
|
|
79
|
-
singleton: true,
|
|
80
|
-
requiredVersion: "^4.1.0",
|
|
81
|
-
eager: true,
|
|
82
|
-
strictVersion: false
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
"@orpc/contract": {
|
|
86
|
-
version: import_package.default.dependencies["@orpc/contract"],
|
|
87
|
-
shareConfig: {
|
|
88
|
-
singleton: true,
|
|
89
|
-
requiredVersion: "^1.8.0",
|
|
90
|
-
eager: true,
|
|
91
|
-
strictVersion: false
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
"@orpc/server": {
|
|
95
|
-
version: import_package.default.dependencies["@orpc/server"],
|
|
96
|
-
shareConfig: {
|
|
97
|
-
singleton: true,
|
|
98
|
-
requiredVersion: "^1.8.0",
|
|
99
|
-
eager: true,
|
|
100
|
-
strictVersion: false
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
setGlobalFederationInstance(instance);
|
|
106
|
-
}
|
|
107
|
-
return instance;
|
|
108
|
-
} catch (error) {
|
|
109
|
-
throw new Error(`Failed to initialize Module Federation: ${error}`);
|
|
110
|
-
}
|
|
111
|
-
}));
|
|
112
|
-
var ModuleFederationService = class extends Effect.Service()("ModuleFederationService", { effect: Effect.gen(function* () {
|
|
113
|
-
const mf = yield* Effect.flatten(createModuleFederationInstance);
|
|
114
|
-
return {
|
|
115
|
-
registerRemote: (pluginId, url) => Effect.gen(function* () {
|
|
116
|
-
console.log(`[MF] Registering ${pluginId}`);
|
|
117
|
-
const manifestUrl = url.endsWith("/") ? `${url}mf-manifest.json` : `${url}/mf-manifest.json`;
|
|
118
|
-
const { error: manifestError } = yield* Effect.tryPromise({
|
|
119
|
-
try: () => betterFetch(manifestUrl, { method: "HEAD" }),
|
|
120
|
-
catch: (error) => error
|
|
121
|
-
});
|
|
122
|
-
let entryUrl;
|
|
123
|
-
let isManifestMode = false;
|
|
124
|
-
if (!manifestError) {
|
|
125
|
-
entryUrl = manifestUrl;
|
|
126
|
-
isManifestMode = true;
|
|
127
|
-
console.log(`[MF] Using MF 2.0 manifest mode for ${pluginId}`);
|
|
128
|
-
} else {
|
|
129
|
-
console.log(`[MF] ⚠️ Manifest not found, falling back to MF 1.5 mode for ${pluginId}`);
|
|
130
|
-
entryUrl = url;
|
|
131
|
-
isManifestMode = false;
|
|
132
|
-
}
|
|
133
|
-
const remoteName = isManifestMode ? pluginId : getNormalizedRemoteName(pluginId);
|
|
134
|
-
yield* Effect.try({
|
|
135
|
-
try: () => mf.registerRemotes([{
|
|
136
|
-
name: remoteName,
|
|
137
|
-
entry: entryUrl,
|
|
138
|
-
...isManifestMode && { alias: pluginId }
|
|
139
|
-
}]),
|
|
140
|
-
catch: (error) => new ModuleFederationError({
|
|
141
|
-
pluginId,
|
|
142
|
-
remoteUrl: url,
|
|
143
|
-
cause: error instanceof Error ? error : new Error(String(error))
|
|
144
|
-
})
|
|
145
|
-
});
|
|
146
|
-
console.log(`[MF] ✅ Registered ${pluginId} (${isManifestMode ? "MF 2.0" : "MF 1.5"})`);
|
|
147
|
-
}),
|
|
148
|
-
loadRemoteConstructor: (pluginId, url) => Effect.gen(function* () {
|
|
149
|
-
const remoteName = getNormalizedRemoteName(pluginId);
|
|
150
|
-
console.log(`[MF] Loading remote ${remoteName}`);
|
|
151
|
-
const modulePath = `${remoteName}/plugin`;
|
|
152
|
-
return yield* Effect.tryPromise({
|
|
153
|
-
try: async () => {
|
|
154
|
-
const container = await mf.loadRemote(modulePath);
|
|
155
|
-
if (!container) throw new Error(`No container returned for ${modulePath}`);
|
|
156
|
-
const Constructor = typeof container === "function" ? container : container.default ? container.default : Object.values(container).find((exp) => typeof exp === "function" && exp.prototype?.constructor === exp);
|
|
157
|
-
if (!Constructor || typeof Constructor !== "function") {
|
|
158
|
-
const containerInfo = typeof container === "object" ? `Available exports: ${Object.keys(container).join(", ")}` : `Container type: ${typeof container}`;
|
|
159
|
-
throw new Error(`No valid plugin constructor found for '${pluginId}'.\nSupported patterns:\n - export const YourPlugin = createPlugin({...})\n - export default createPlugin({...})\n${containerInfo}`);
|
|
160
|
-
}
|
|
161
|
-
if (!Constructor.binding) {
|
|
162
|
-
const containerInfo = typeof container === "object" ? `Found exports: ${Object.keys(container).join(", ")}` : `Container type: ${typeof container}`;
|
|
163
|
-
throw new Error(`Invalid plugin constructor for '${pluginId}'. The exported value must be created with createPlugin(). Found a function but it's missing the required 'binding' property.\n${containerInfo}`);
|
|
164
|
-
}
|
|
165
|
-
console.log(`[MF] ✅ Loaded constructor for ${pluginId}`);
|
|
166
|
-
return Constructor;
|
|
167
|
-
},
|
|
168
|
-
catch: (error) => new ModuleFederationError({
|
|
169
|
-
pluginId,
|
|
170
|
-
remoteUrl: url,
|
|
171
|
-
cause: error instanceof Error ? error : new Error(String(error))
|
|
172
|
-
})
|
|
173
|
-
});
|
|
174
|
-
})
|
|
175
|
-
};
|
|
176
|
-
}) }) {};
|
|
177
|
-
|
|
178
|
-
//#endregion
|
|
179
|
-
//#region src/runtime/services/plugin-lifecycle.service.ts
|
|
180
|
-
var PluginLifecycleService = class extends Effect.Service()("PluginLifecycleService", { effect: Effect.gen(function* () {
|
|
181
|
-
const activePlugins = yield* Ref.make(/* @__PURE__ */ new Set());
|
|
182
|
-
return {
|
|
183
|
-
register: (plugin) => Ref.update(activePlugins, (plugins) => new Set(plugins).add(plugin)),
|
|
184
|
-
unregister: (plugin) => Ref.update(activePlugins, (plugins) => {
|
|
185
|
-
const newSet = new Set(plugins);
|
|
186
|
-
newSet.delete(plugin);
|
|
187
|
-
return newSet;
|
|
188
|
-
}),
|
|
189
|
-
shutdown: (plugin) => Effect.gen(function* () {
|
|
190
|
-
yield* Ref.update(activePlugins, (plugins) => {
|
|
191
|
-
const newSet = new Set(plugins);
|
|
192
|
-
newSet.delete(plugin);
|
|
193
|
-
return newSet;
|
|
194
|
-
});
|
|
195
|
-
yield* plugin.plugin.shutdown().pipe(Effect.mapError((error) => toPluginRuntimeError(error, plugin.plugin.id, void 0, "shutdown-plugin", false)));
|
|
196
|
-
}),
|
|
197
|
-
cleanup: () => Effect.gen(function* () {
|
|
198
|
-
const plugins = yield* Ref.get(activePlugins);
|
|
199
|
-
yield* Effect.forEach(plugins, (plugin) => plugin.plugin.shutdown().pipe(Effect.mapError((error) => toPluginRuntimeError(error, plugin.plugin.id, void 0, "cleanup-shutdown", false)), Effect.catchAll((error) => Effect.logError(`Failed to shutdown plugin ${plugin.plugin.id} during cleanup`, error, { pluginId: plugin.plugin.id }))), { concurrency: "unbounded" });
|
|
200
|
-
yield* Ref.set(activePlugins, /* @__PURE__ */ new Set());
|
|
201
|
-
}).pipe(Effect.catchAll(() => Effect.void))
|
|
202
|
-
};
|
|
203
|
-
}) }) {};
|
|
204
|
-
|
|
205
|
-
//#endregion
|
|
206
|
-
//#region src/runtime/validation.ts
|
|
207
|
-
const validate = (schema, data, pluginId, stage) => Effect.gen(function* () {
|
|
208
|
-
const result = schema.safeParse(data);
|
|
209
|
-
if (result.success) return result.data;
|
|
210
|
-
return yield* Effect.fail(new ValidationError({
|
|
211
|
-
pluginId,
|
|
212
|
-
stage,
|
|
213
|
-
zodError: result.error
|
|
214
|
-
}));
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
//#endregion
|
|
218
|
-
//#region src/runtime/services/secrets.service.ts
|
|
219
|
-
const configSchema = z.object({ secrets: z.record(z.string(), z.unknown()) }).loose();
|
|
220
|
-
var SecretsConfigTag = class extends Context.Tag("SecretsConfig")() {};
|
|
221
|
-
var SecretsService = class extends Effect.Service()("SecretsService", { effect: Effect.gen(function* () {
|
|
222
|
-
const secrets = yield* SecretsConfigTag;
|
|
223
|
-
const hydrateValue = (value) => {
|
|
224
|
-
if (typeof value === "string") {
|
|
225
|
-
let result = value;
|
|
226
|
-
for (const [key, secretValue] of Object.entries(secrets)) {
|
|
227
|
-
const pattern = new RegExp(`{{${key}}}`, "g");
|
|
228
|
-
result = result.replace(pattern, String(secretValue));
|
|
229
|
-
}
|
|
230
|
-
return result;
|
|
231
|
-
}
|
|
232
|
-
if (Array.isArray(value)) return value.map(hydrateValue);
|
|
233
|
-
if (value && typeof value === "object") {
|
|
234
|
-
if (value.constructor === Object || value.constructor === void 0) {
|
|
235
|
-
const hydrated$1 = {};
|
|
236
|
-
for (const [key, val] of Object.entries(value)) hydrated$1[key] = hydrateValue(val);
|
|
237
|
-
return hydrated$1;
|
|
238
|
-
}
|
|
239
|
-
const hydrated = Object.create(Object.getPrototypeOf(value));
|
|
240
|
-
for (const [key, val] of Object.entries(value)) hydrated[key] = hydrateValue(val);
|
|
241
|
-
return hydrated;
|
|
242
|
-
}
|
|
243
|
-
return value;
|
|
244
|
-
};
|
|
245
|
-
return { hydrateSecrets: (config) => Effect.gen(function* () {
|
|
246
|
-
const parseResult = configSchema.parse(config);
|
|
247
|
-
try {
|
|
248
|
-
return hydrateValue(parseResult);
|
|
249
|
-
} catch (error) {
|
|
250
|
-
return yield* Effect.fail(new PluginRuntimeError({
|
|
251
|
-
operation: "hydrate-secrets",
|
|
252
|
-
cause: error instanceof Error ? error : new Error(String(error)),
|
|
253
|
-
retryable: false
|
|
254
|
-
}));
|
|
255
|
-
}
|
|
256
|
-
}) };
|
|
257
|
-
}) }) {};
|
|
258
|
-
|
|
259
|
-
//#endregion
|
|
260
|
-
//#region src/runtime/services/plugin-loader.service.ts
|
|
261
|
-
var PluginRegistryTag = class extends Context.Tag("PluginRegistry")() {};
|
|
262
|
-
var PluginMapTag = class extends Context.Tag("PluginMap")() {};
|
|
263
|
-
var RegistryService = class extends Effect.Service()("RegistryService", { effect: Effect.gen(function* () {
|
|
264
|
-
const registry = yield* PluginRegistryTag;
|
|
265
|
-
const pluginMap = yield* PluginMapTag;
|
|
266
|
-
return {
|
|
267
|
-
get: (pluginId) => Effect.gen(function* () {
|
|
268
|
-
const entry = registry[pluginId];
|
|
269
|
-
if (!entry) return yield* Effect.fail(new PluginRuntimeError({
|
|
270
|
-
pluginId,
|
|
271
|
-
operation: "validate-plugin-id",
|
|
272
|
-
cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} not found in registry`),
|
|
273
|
-
retryable: false
|
|
274
|
-
}));
|
|
275
|
-
if ("module" in entry) return {
|
|
276
|
-
constructor: entry.module,
|
|
277
|
-
metadata: {
|
|
278
|
-
remoteUrl: entry.remote || "",
|
|
279
|
-
version: entry.version,
|
|
280
|
-
description: entry.description
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
return {
|
|
284
|
-
constructor: null,
|
|
285
|
-
metadata: {
|
|
286
|
-
remoteUrl: entry.remote,
|
|
287
|
-
version: entry.version,
|
|
288
|
-
description: entry.description
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
}),
|
|
292
|
-
getModule: (pluginId) => Effect.succeed(pluginMap[pluginId] || null)
|
|
293
|
-
};
|
|
294
|
-
}) }) {};
|
|
295
|
-
var PluginLoaderService = class extends Effect.Service()("PluginLoaderService", { effect: Effect.gen(function* () {
|
|
296
|
-
const moduleFederationService = yield* ModuleFederationService;
|
|
297
|
-
const secretsService = yield* SecretsService;
|
|
298
|
-
const registryService = yield* RegistryService;
|
|
299
|
-
const resolveUrl = (baseUrl, version) => version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
|
|
300
|
-
return {
|
|
301
|
-
loadPlugin: (pluginId) => Effect.gen(function* () {
|
|
302
|
-
const entry = yield* registryService.get(pluginId);
|
|
303
|
-
if (entry.constructor) {
|
|
304
|
-
yield* Effect.logDebug("Loading plugin from direct module", { pluginId });
|
|
305
|
-
return {
|
|
306
|
-
ctor: entry.constructor,
|
|
307
|
-
metadata: entry.metadata
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
const url = resolveUrl(entry.metadata.remoteUrl);
|
|
311
|
-
yield* moduleFederationService.registerRemote(pluginId, url).pipe(Effect.mapError((error) => toPluginRuntimeError(error, pluginId, void 0, "register-remote", true)));
|
|
312
|
-
yield* Effect.logDebug("Loading plugin from remote", {
|
|
313
|
-
pluginId,
|
|
314
|
-
url
|
|
315
|
-
});
|
|
316
|
-
return {
|
|
317
|
-
ctor: yield* moduleFederationService.loadRemoteConstructor(pluginId, url).pipe(Effect.mapError((error) => toPluginRuntimeError(error, pluginId, void 0, "load-remote", false))),
|
|
318
|
-
metadata: entry.metadata
|
|
319
|
-
};
|
|
320
|
-
}),
|
|
321
|
-
instantiatePlugin: (pluginId, loadedPlugin) => Effect.gen(function* () {
|
|
322
|
-
const instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(Effect.mapError((error) => toPluginRuntimeError(error, pluginId, void 0, "instantiate-plugin", false)));
|
|
323
|
-
instance.id = pluginId;
|
|
324
|
-
return {
|
|
325
|
-
plugin: instance,
|
|
326
|
-
metadata: loadedPlugin.metadata
|
|
327
|
-
};
|
|
328
|
-
}),
|
|
329
|
-
initializePlugin: (pluginInstance, config) => Effect.gen(function* () {
|
|
330
|
-
const { plugin } = pluginInstance;
|
|
331
|
-
const validatedVariables = yield* validate(plugin.configSchema.variables, config.variables, plugin.id, "config").pipe(Effect.mapError((validationError) => new PluginRuntimeError({
|
|
332
|
-
pluginId: plugin.id,
|
|
333
|
-
operation: "validate-config",
|
|
334
|
-
cause: validationError.zodError,
|
|
335
|
-
retryable: false
|
|
336
|
-
})));
|
|
337
|
-
const validatedSecrets = yield* validate(plugin.configSchema.secrets, config.secrets, plugin.id, "config").pipe(Effect.mapError((validationError) => new PluginRuntimeError({
|
|
338
|
-
pluginId: plugin.id,
|
|
339
|
-
operation: "validate-secrets",
|
|
340
|
-
cause: validationError.zodError,
|
|
341
|
-
retryable: false
|
|
342
|
-
})));
|
|
343
|
-
const hydratedConfig = yield* secretsService.hydrateSecrets({
|
|
344
|
-
variables: validatedVariables,
|
|
345
|
-
secrets: validatedSecrets
|
|
346
|
-
});
|
|
347
|
-
const _variables = yield* validate(plugin.configSchema.variables, hydratedConfig.variables, plugin.id, "config").pipe(Effect.mapError((validationError) => new PluginRuntimeError({
|
|
348
|
-
pluginId: plugin.id,
|
|
349
|
-
operation: "validate-hydrated-config",
|
|
350
|
-
cause: validationError.zodError,
|
|
351
|
-
retryable: false
|
|
352
|
-
})));
|
|
353
|
-
const scope = yield* Scope.make();
|
|
354
|
-
const context = yield* plugin.initialize({
|
|
355
|
-
variables: _variables,
|
|
356
|
-
secrets: hydratedConfig.secrets
|
|
357
|
-
}).pipe(Effect.provideService(Scope.Scope, scope), Effect.mapError((error) => toPluginRuntimeError(error, plugin.id, void 0, "initialize-plugin", false)));
|
|
358
|
-
return {
|
|
359
|
-
plugin,
|
|
360
|
-
metadata: pluginInstance.metadata,
|
|
361
|
-
config: {
|
|
362
|
-
variables: _variables,
|
|
363
|
-
secrets: hydratedConfig.secrets
|
|
364
|
-
},
|
|
365
|
-
context,
|
|
366
|
-
scope
|
|
367
|
-
};
|
|
368
|
-
})
|
|
369
|
-
};
|
|
370
|
-
}) }) {};
|
|
371
|
-
|
|
372
|
-
//#endregion
|
|
373
|
-
//#region src/runtime/services/plugin.service.ts
|
|
374
|
-
var PluginService = class PluginService extends Effect.Service()("PluginService", { scoped: Effect.gen(function* () {
|
|
375
|
-
const loader = yield* PluginLoaderService;
|
|
376
|
-
const lifecycle = yield* PluginLifecycleService;
|
|
377
|
-
return {
|
|
378
|
-
loadPlugin: loader.loadPlugin,
|
|
379
|
-
instantiatePlugin: loader.instantiatePlugin,
|
|
380
|
-
initializePlugin: loader.initializePlugin,
|
|
381
|
-
shutdownPlugin: (plugin) => Effect.gen(function* () {
|
|
382
|
-
yield* plugin.plugin.shutdown().pipe(Effect.catchAll(() => Effect.void));
|
|
383
|
-
yield* Scope.close(plugin.scope, Exit.succeed(void 0));
|
|
384
|
-
yield* lifecycle.unregister(plugin);
|
|
385
|
-
}),
|
|
386
|
-
cleanup: lifecycle.cleanup
|
|
387
|
-
};
|
|
388
|
-
}) }) {
|
|
389
|
-
static Live = (registry, secrets, pluginMap = {}) => {
|
|
390
|
-
const contextLayer = Layer.mergeAll(Layer.succeed(PluginRegistryTag, registry), Layer.succeed(SecretsConfigTag, secrets), Layer.succeed(PluginMapTag, pluginMap));
|
|
391
|
-
const servicesLayer = Layer.mergeAll(ModuleFederationService.Default, SecretsService.Default, RegistryService.Default, PluginLifecycleService.Default).pipe(Layer.provide(contextLayer));
|
|
392
|
-
return PluginService.Default.pipe(Layer.provide(PluginLoaderService.Default), Layer.provide(servicesLayer));
|
|
393
|
-
};
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
//#endregion
|
|
397
|
-
//#region src/runtime/index.ts
|
|
398
|
-
var PluginRuntime = class {
|
|
399
|
-
["__registryType"];
|
|
400
|
-
pluginCache = /* @__PURE__ */ new Map();
|
|
401
|
-
constructor(runtime, registry) {
|
|
402
|
-
this.runtime = runtime;
|
|
403
|
-
this.registry = registry;
|
|
404
|
-
}
|
|
405
|
-
generateCacheKey(pluginId, config) {
|
|
406
|
-
return `${pluginId}:${Hash.structure(config).toString()}`;
|
|
407
|
-
}
|
|
408
|
-
validatePluginId(pluginId) {
|
|
409
|
-
if (!(pluginId in this.registry)) return Effect.fail(new PluginRuntimeError({
|
|
410
|
-
pluginId: String(pluginId),
|
|
411
|
-
operation: "validate-plugin-id",
|
|
412
|
-
cause: /* @__PURE__ */ new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),
|
|
413
|
-
retryable: false
|
|
414
|
-
}));
|
|
415
|
-
return Effect.succeed(String(pluginId));
|
|
416
|
-
}
|
|
417
|
-
async runPromise(effect) {
|
|
418
|
-
const exit = await this.runtime.runPromiseExit(effect);
|
|
419
|
-
if (Exit.isFailure(exit)) {
|
|
420
|
-
const error = Cause.failureOption(exit.cause);
|
|
421
|
-
if (Option.isSome(error)) throw error.value;
|
|
422
|
-
throw Cause.squash(exit.cause);
|
|
423
|
-
}
|
|
424
|
-
return exit.value;
|
|
425
|
-
}
|
|
426
|
-
async usePlugin(pluginId, config) {
|
|
427
|
-
const cacheKey = this.generateCacheKey(pluginId, config);
|
|
428
|
-
let cachedPlugin = this.pluginCache.get(cacheKey);
|
|
429
|
-
if (!cachedPlugin) {
|
|
430
|
-
const operation = Effect.gen(this, function* () {
|
|
431
|
-
const pluginService = yield* PluginService;
|
|
432
|
-
const validatedId = yield* this.validatePluginId(pluginId);
|
|
433
|
-
const ctor = yield* pluginService.loadPlugin(validatedId);
|
|
434
|
-
const instance = yield* pluginService.instantiatePlugin(pluginId, ctor);
|
|
435
|
-
return yield* pluginService.initializePlugin(instance, config);
|
|
436
|
-
}).pipe(Effect.provide(this.runtime));
|
|
437
|
-
cachedPlugin = Effect.cached(operation).pipe(Effect.flatten);
|
|
438
|
-
this.pluginCache.set(cacheKey, cachedPlugin);
|
|
439
|
-
}
|
|
440
|
-
const initialized = await this.runPromise(cachedPlugin);
|
|
441
|
-
const router = initialized.plugin.createRouter(initialized.context);
|
|
442
|
-
return {
|
|
443
|
-
router,
|
|
444
|
-
client: createRouterClient(router),
|
|
445
|
-
metadata: initialized.metadata,
|
|
446
|
-
initialized
|
|
447
|
-
};
|
|
448
|
-
}
|
|
449
|
-
async loadPlugin(pluginId) {
|
|
450
|
-
const effect = Effect.gen(function* () {
|
|
451
|
-
return yield* (yield* PluginService).loadPlugin(pluginId);
|
|
452
|
-
});
|
|
453
|
-
return this.runPromise(effect);
|
|
454
|
-
}
|
|
455
|
-
async instantiatePlugin(pluginId, loadedPlugin) {
|
|
456
|
-
const effect = Effect.gen(function* () {
|
|
457
|
-
return yield* (yield* PluginService).instantiatePlugin(pluginId, loadedPlugin);
|
|
458
|
-
});
|
|
459
|
-
return this.runPromise(effect);
|
|
460
|
-
}
|
|
461
|
-
async initializePlugin(instance, config) {
|
|
462
|
-
const effect = Effect.gen(function* () {
|
|
463
|
-
return yield* (yield* PluginService).initializePlugin(instance, config);
|
|
464
|
-
});
|
|
465
|
-
return this.runPromise(effect);
|
|
466
|
-
}
|
|
467
|
-
async shutdown() {
|
|
468
|
-
const effect = Effect.gen(function* () {
|
|
469
|
-
yield* (yield* PluginService).cleanup();
|
|
470
|
-
});
|
|
471
|
-
return this.runPromise(effect);
|
|
472
|
-
}
|
|
473
|
-
async evictPlugin(pluginId, config) {
|
|
474
|
-
const cacheKey = this.generateCacheKey(pluginId, config);
|
|
475
|
-
const effect = Effect.gen(this, function* () {
|
|
476
|
-
const pluginService = yield* PluginService;
|
|
477
|
-
const cachedPlugin = this.pluginCache.get(cacheKey);
|
|
478
|
-
if (cachedPlugin) {
|
|
479
|
-
this.pluginCache.delete(cacheKey);
|
|
480
|
-
const pluginResult = yield* cachedPlugin.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
481
|
-
if (pluginResult) yield* pluginService.shutdownPlugin(pluginResult).pipe(Effect.catchAll(() => Effect.void));
|
|
482
|
-
}
|
|
483
|
-
}).pipe(Effect.catchAll(() => Effect.void));
|
|
484
|
-
return this.runPromise(effect);
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
/**
|
|
488
|
-
* Normalizes a remote URL to ensure it points to remoteEntry.js
|
|
489
|
-
* If the URL doesn't end with a file extension, appends /remoteEntry.js
|
|
490
|
-
*/
|
|
491
|
-
function normalizeRemoteUrl(url) {
|
|
492
|
-
if (!url) return url;
|
|
493
|
-
if (url.endsWith(".js")) return url;
|
|
494
|
-
return `${url.endsWith("/") ? url.slice(0, -1) : url}/remoteEntry.js`;
|
|
495
|
-
}
|
|
496
|
-
/**
|
|
497
|
-
* Extract plugin map (module constructors) from registry entries
|
|
498
|
-
*/
|
|
499
|
-
function extractPluginMap(registry) {
|
|
500
|
-
const pluginMap = {};
|
|
501
|
-
for (const [pluginId, entry] of Object.entries(registry)) if ("module" in entry && entry.module) pluginMap[pluginId] = entry.module;
|
|
502
|
-
return pluginMap;
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Normalize registry entries - ensure remote URLs are properly formatted
|
|
506
|
-
*/
|
|
507
|
-
function normalizeRegistry(registry) {
|
|
508
|
-
const normalized = {};
|
|
509
|
-
for (const [pluginId, entry] of Object.entries(registry)) if ("module" in entry) normalized[pluginId] = {
|
|
510
|
-
...entry,
|
|
511
|
-
remote: entry.remote ? normalizeRemoteUrl(entry.remote) : void 0
|
|
512
|
-
};
|
|
513
|
-
else normalized[pluginId] = {
|
|
514
|
-
...entry,
|
|
515
|
-
remote: normalizeRemoteUrl(entry.remote)
|
|
516
|
-
};
|
|
517
|
-
return normalized;
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* Creates a plugin runtime with support for both module and remote plugin entries.
|
|
521
|
-
*
|
|
522
|
-
* @example
|
|
523
|
-
* ```typescript
|
|
524
|
-
* // With module entries (types inferred automatically)
|
|
525
|
-
* const runtime = createPluginRuntime({
|
|
526
|
-
* registry: {
|
|
527
|
-
* telegram: { module: TelegramPlugin },
|
|
528
|
-
* gopher: { remote: "https://cdn.example.com/gopher/remoteEntry.js" }
|
|
529
|
-
* },
|
|
530
|
-
* secrets: { API_KEY: "..." }
|
|
531
|
-
* });
|
|
532
|
-
*
|
|
533
|
-
* // Types are automatically inferred from module entries!
|
|
534
|
-
* const { client } = await runtime.usePlugin("telegram", config);
|
|
535
|
-
* ```
|
|
536
|
-
*/
|
|
537
|
-
function createPluginRuntime(config) {
|
|
538
|
-
const secrets = config.secrets || {};
|
|
539
|
-
const normalizedRegistry = normalizeRegistry(config.registry);
|
|
540
|
-
const pluginMap = extractPluginMap(config.registry);
|
|
541
|
-
const layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);
|
|
542
|
-
return new PluginRuntime(ManagedRuntime.make(layer), normalizedRegistry);
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
//#endregion
|
|
546
|
-
export { createPluginRuntime as n, PluginRuntime as t };
|
|
547
|
-
//# sourceMappingURL=runtime-CAWcnrAk.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-CAWcnrAk.mjs","names":["pkg","entryUrl: string","hydrated: Record<string, unknown>","hydrated","runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>"],"sources":["../src/runtime/errors.ts","../src/runtime/services/module-federation.service.ts","../src/runtime/services/plugin-lifecycle.service.ts","../src/runtime/validation.ts","../src/runtime/services/secrets.service.ts","../src/runtime/services/plugin-loader.service.ts","../src/runtime/services/plugin.service.ts","../src/runtime/index.ts"],"sourcesContent":["import { ORPCError } from \"@orpc/contract\";\nimport { Data } from \"effect\";\nimport type { z } from \"zod\";\n\nexport class PluginRuntimeError extends Data.TaggedError(\"PluginRuntimeError\")<{\n\treadonly pluginId?: string;\n\treadonly operation?: string;\n\treadonly procedureName?: string;\n\treadonly cause?: Error;\n\treadonly retryable: boolean;\n}> { }\n\nexport class ModuleFederationError extends Data.TaggedError(\n\t\"ModuleFederationError\",\n)<{\n\treadonly pluginId: string;\n\treadonly remoteUrl: string;\n\treadonly cause?: Error;\n}> { }\n\nexport class ValidationError extends Data.TaggedError(\"ValidationError\")<{\n\treadonly pluginId: string;\n\treadonly stage: \"config\" | \"input\" | \"output\" | \"state\";\n\treadonly zodError: z.ZodError;\n}> { }\n\n// Helper to determine if an oRPC error code is retryable\nexport const isRetryableORPCCode = (code: string): boolean => {\n\tswitch (code) {\n\t\tcase 'TOO_MANY_REQUESTS':\n\t\tcase 'SERVICE_UNAVAILABLE':\n\t\tcase 'BAD_GATEWAY':\n\t\tcase 'GATEWAY_TIMEOUT':\n\t\tcase 'TIMEOUT':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n// Convert ORPC errors from plugin procedures to PluginRuntimeError\nexport const wrapORPCError = (\n\torpcError: ORPCError<string, unknown>,\n\tpluginId?: string,\n\tprocedureName?: string,\n\toperation?: string\n): PluginRuntimeError => {\n\treturn new PluginRuntimeError({\n\t\tpluginId,\n\t\toperation,\n\t\tprocedureName,\n\t\tretryable: isRetryableORPCCode(orpcError.code),\n\t\tcause: orpcError as Error\n\t});\n};\n\n// Universal error converter for the runtime\nexport const toPluginRuntimeError = (\n\terror: unknown,\n\tpluginId?: string,\n\tprocedureName?: string,\n\toperation?: string,\n\tdefaultRetryable = false\n): PluginRuntimeError => {\n\tif (error instanceof ORPCError) {\n\t\treturn wrapORPCError(error, pluginId, procedureName, operation);\n\t}\n\n\tif (error instanceof PluginRuntimeError) {\n\t\treturn error; // Already converted\n\t}\n\n\treturn new PluginRuntimeError({\n\t\tpluginId,\n\t\toperation,\n\t\tprocedureName,\n\t\tretryable: defaultRetryable,\n\t\tcause: error instanceof Error ? error : new Error(String(error))\n\t});\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport {\n\tcreateInstance,\n\tgetInstance,\n} from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Effect } from \"effect\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { getNormalizedRemoteName } from \"./normalize\";\n\ntype RemoteModule = \n | (new () => AnyPlugin)\n | { default: new () => AnyPlugin };\n\nimport pkg from \"../../../package.json\";\n\nconst createModuleFederationInstance = Effect.cached(\n\tEffect.sync(() => {\n\t\ttry {\n\t\t\tlet instance = getInstance();\n\n\t\t\tif (!instance) {\n\t\t\t\tinstance = createInstance({\n\t\t\t\t\tname: \"host\",\n\t\t\t\t\tremotes: [],\n\t\t\t\t\tshared: {\n\t\t\t\t\t\t\"every-plugin\": {\n\t\t\t\t\t\t\tversion: pkg.version,\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: `^${pkg.version}`,\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow bidirectional version compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\teffect: {\n\t\t\t\t\t\t\tversion: pkg.dependencies.effect,\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^3.18.0\", // Allow any 3.18.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tzod: {\n\t\t\t\t\t\t\tversion: pkg.dependencies.zod,\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^4.1.0\", // Allow any 4.1.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"@orpc/contract\": {\n\t\t\t\t\t\t\tversion: pkg.dependencies[\"@orpc/contract\"],\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^1.8.0\", // Allow any 1.8.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"@orpc/server\": {\n\t\t\t\t\t\t\tversion: pkg.dependencies[\"@orpc/server\"],\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^1.8.0\", // Allow any 1.8.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tsetGlobalFederationInstance(instance);\n\t\t\t}\n\n\t\t\treturn instance;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to initialize Module Federation: ${error}`);\n\t\t}\n\t}),\n);\n\nexport class ModuleFederationService extends Effect.Service<ModuleFederationService>()(\"ModuleFederationService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst mf = yield* Effect.flatten(createModuleFederationInstance);\n\n\t\treturn {\n\t\t\tregisterRemote: (pluginId: string, url: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconsole.log(`[MF] Registering ${pluginId}`);\n\n\t\t\t\t\tconst manifestUrl = url.endsWith('/')\n\t\t\t\t\t\t? `${url}mf-manifest.json`\n\t\t\t\t\t\t: `${url}/mf-manifest.json`;\n\n\t\t\t\t\t// Check if manifest is available (MF 2.0 with manifests)\n\t\t\t\t\tconst { error: manifestError } = yield* Effect.tryPromise({\n\t\t\t\t\t\ttry: () => betterFetch(manifestUrl, { method: \"HEAD\" }),\n\t\t\t\t\t\tcatch: (error) => error, // Don't fail yet, try fallback\n\t\t\t\t\t});\n\n\t\t\t\t\tlet entryUrl: string;\n\t\t\t\t\tlet isManifestMode = false;\n\n\t\t\t\t\tif (!manifestError) {\n\t\t\t\t\t\t// MF 2.0 manifest mode - use manifest URL\n\t\t\t\t\t\tentryUrl = manifestUrl;\n\t\t\t\t\t\tisManifestMode = true;\n\t\t\t\t\t\tconsole.log(`[MF] Using MF 2.0 manifest mode for ${pluginId}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to MF 1.5 direct mode - assume URL points to remoteEntry.js\n\t\t\t\t\t\tconsole.log(`[MF] ⚠️ Manifest not found, falling back to MF 1.5 mode for ${pluginId}`);\n\t\t\t\t\t\tentryUrl = url;\n\t\t\t\t\t\tisManifestMode = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For MF 2.0, the name can be the pluginId (alias)\n\t\t\t\t\t// The manifest will contain the actual container name\n\t\t\t\t\tconst remoteName = isManifestMode ? pluginId : getNormalizedRemoteName(pluginId);\n\n\t\t\t\t\tyield* Effect.try({\n\t\t\t\t\t\ttry: () => mf.registerRemotes([{\n\t\t\t\t\t\t\tname: remoteName,\n\t\t\t\t\t\t\tentry: entryUrl,\n\t\t\t\t\t\t\t...(isManifestMode && { alias: pluginId }) // Explicit alias for clarity\n\t\t\t\t\t\t}]),\n\t\t\t\t\t\tcatch: (error): ModuleFederationError =>\n\t\t\t\t\t\t\tnew ModuleFederationError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tremoteUrl: url,\n\t\t\t\t\t\t\t\tcause:\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\n\t\t\t\t\tconsole.log(`[MF] ✅ Registered ${pluginId} (${isManifestMode ? 'MF 2.0' : 'MF 1.5'})`);\n\t\t\t\t}),\n\n\t\t\tloadRemoteConstructor: (pluginId: string, url: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst remoteName = getNormalizedRemoteName(pluginId);\n\t\t\t\t\tconsole.log(`[MF] Loading remote ${remoteName}`);\n\t\t\t\t\tconst modulePath = `${remoteName}/plugin`;\n\n\t\t\t\t\treturn yield* Effect.tryPromise({\n\t\t\t\t\t\ttry: async () => {\n\n\t\t\t\t\t\t\tconst container = await mf.loadRemote<RemoteModule>(modulePath);\n\t\t\t\t\t\t\tif (!container) {\n\t\t\t\t\t\t\t\tthrow new Error(`No container returned for ${modulePath}`);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Support multiple export patterns: direct function, default export, named exports\n\t\t\t\t\t\t\tconst Constructor =\n\t\t\t\t\t\t\t\ttypeof container === \"function\"\n\t\t\t\t\t\t\t\t\t? container // Direct function export\n\t\t\t\t\t\t\t\t\t: container.default\n\t\t\t\t\t\t\t\t\t? container.default // Default export\n\t\t\t\t\t\t\t\t\t: Object.values(container).find( // Named export fallback\n\t\t\t\t\t\t\t\t\t\t\t(exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp\n\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!Constructor || typeof Constructor !== \"function\") {\n\t\t\t\t\t\t\t\tconst containerInfo = typeof container === \"object\"\n\t\t\t\t\t\t\t\t\t? `Available exports: ${Object.keys(container).join(', ')}`\n\t\t\t\t\t\t\t\t\t: `Container type: ${typeof container}`;\n\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`No valid plugin constructor found for '${pluginId}'.\\n` +\n\t\t\t\t\t\t\t\t\t`Supported patterns:\\n` +\n\t\t\t\t\t\t\t\t\t` - export const YourPlugin = createPlugin({...})\\n` +\n\t\t\t\t\t\t\t\t\t` - export default createPlugin({...})\\n` +\n\t\t\t\t\t\t\t\t\t`${containerInfo}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Validate it looks like a plugin constructor (has binding property)\n\t\t\t\t\t\t\tif (!(Constructor as any).binding) {\n\t\t\t\t\t\t\t\tconst containerInfo = typeof container === \"object\"\n\t\t\t\t\t\t\t\t\t? `Found exports: ${Object.keys(container).join(', ')}`\n\t\t\t\t\t\t\t\t\t: `Container type: ${typeof container}`;\n\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Invalid plugin constructor for '${pluginId}'. ` +\n\t\t\t\t\t\t\t\t\t`The exported value must be created with createPlugin(). ` +\n\t\t\t\t\t\t\t\t\t`Found a function but it's missing the required 'binding' property.\\n` +\n\t\t\t\t\t\t\t\t\t`${containerInfo}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconsole.log(`[MF] ✅ Loaded constructor for ${pluginId}`);\n\t\t\t\t\t\t\treturn Constructor;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcatch: (error): ModuleFederationError =>\n\t\t\t\t\t\t\tnew ModuleFederationError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tremoteUrl: url,\n\t\t\t\t\t\t\t\tcause:\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t};\n\t}),\n}) {}\n","import { Effect, Ref } from \"effect\";\nimport type { AnyPlugin, InitializedPlugin } from \"../../types\";\nimport { toPluginRuntimeError } from \"../errors\";\n\nexport class PluginLifecycleService extends Effect.Service<PluginLifecycleService>()(\"PluginLifecycleService\", {\n effect: Effect.gen(function* () {\n const activePlugins = yield* Ref.make(new Set<InitializedPlugin<AnyPlugin>>());\n\n return {\n register: <T extends AnyPlugin>(plugin: InitializedPlugin<T>) =>\n Ref.update(activePlugins, plugins =>\n new Set(plugins).add(plugin as InitializedPlugin<AnyPlugin>)\n ),\n\n unregister: (plugin: InitializedPlugin<AnyPlugin>) =>\n Ref.update(activePlugins, plugins => {\n const newSet = new Set(plugins);\n newSet.delete(plugin);\n return newSet;\n }),\n\n shutdown: (plugin: InitializedPlugin<AnyPlugin>) =>\n Effect.gen(function* () {\n // Remove from active plugins\n yield* Ref.update(activePlugins, plugins => {\n const newSet = new Set(plugins);\n newSet.delete(plugin);\n return newSet;\n });\n\n // Shutdown the plugin\n yield* plugin.plugin.shutdown().pipe(\n Effect.mapError(error =>\n toPluginRuntimeError(error, plugin.plugin.id, undefined, \"shutdown-plugin\", false)\n )\n );\n }),\n\n cleanup: () =>\n Effect.gen(function* () {\n const plugins = yield* Ref.get(activePlugins);\n\n // Shutdown all active plugins concurrently\n yield* Effect.forEach(\n plugins,\n plugin =>\n plugin.plugin.shutdown().pipe(\n Effect.mapError(error =>\n toPluginRuntimeError(error, plugin.plugin.id, undefined, \"cleanup-shutdown\", false)\n ),\n Effect.catchAll(error =>\n Effect.logError(\n `Failed to shutdown plugin ${plugin.plugin.id} during cleanup`,\n error,\n { pluginId: plugin.plugin.id }\n )\n )\n ),\n { concurrency: \"unbounded\" }\n );\n\n // Clear the active plugins set\n yield* Ref.set(activePlugins, new Set());\n }).pipe(\n Effect.catchAll(() => Effect.void) // Convert errors to void for cleanup\n ),\n };\n }),\n}) { }\n","import { Effect } from \"effect\";\nimport type { z } from \"zod\";\nimport { ValidationError } from \"./errors\";\n\nexport const validate = <T>(\n\tschema: z.ZodSchema<T>,\n\tdata: unknown,\n\tpluginId: string,\n\tstage: \"config\" | \"input\" | \"output\" | \"state\",\n): Effect.Effect<T, ValidationError> =>\n\tEffect.gen(function* () {\n\t\tconst result = schema.safeParse(data);\n\t\tif (result.success) {\n\t\t\treturn result.data;\n\t\t}\n\t\treturn yield* Effect.fail(\n\t\t\tnew ValidationError({\n\t\t\t\tpluginId,\n\t\t\t\tstage,\n\t\t\t\tzodError: result.error,\n\t\t\t}),\n\t\t);\n\t});\n","import { Context, Effect } from \"effect\";\nimport { z } from \"zod\";\nimport type { SecretsConfig } from \"../../types\";\nimport { PluginRuntimeError } from \"../errors\";\n\nconst configSchema = z.object({\n\tsecrets: z.record(z.string(), z.unknown())\n}).loose();\n\nexport class SecretsConfigTag extends Context.Tag(\"SecretsConfig\")<\n\tSecretsConfigTag,\n\tSecretsConfig\n>() { }\n\nexport class SecretsService extends Effect.Service<SecretsService>()(\"SecretsService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst secrets = yield* SecretsConfigTag;\n\n\t\tconst hydrateValue = (value: unknown): unknown => {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tlet result = value;\n\t\t\t\tfor (const [key, secretValue] of Object.entries(secrets)) {\n\t\t\t\t\tconst pattern = new RegExp(`{{${key}}}`, \"g\");\n\t\t\t\t\tresult = result.replace(pattern, String(secretValue));\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.map(hydrateValue);\n\t\t\t}\n\n\t\t\tif (value && typeof value === 'object') {\n\t\t\t\tconst isPlainObject = value.constructor === Object || value.constructor === undefined;\n\t\t\t\t\n\t\t\t\tif (isPlainObject) {\n\t\t\t\t\tconst hydrated: Record<string, unknown> = {};\n\t\t\t\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\t\t\t\thydrated[key] = hydrateValue(val);\n\t\t\t\t\t}\n\t\t\t\t\treturn hydrated;\n\t\t\t\t}\n\n\t\t\t\tconst hydrated = Object.create(Object.getPrototypeOf(value));\n\t\t\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\t\t\thydrated[key] = hydrateValue(val);\n\t\t\t\t}\n\t\t\t\treturn hydrated;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t};\n\n\t\treturn {\n\t\t\thydrateSecrets: <T>(config: T) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst parseResult = configSchema.parse(config);\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn hydrateValue(parseResult) as T;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\toperation: \"hydrate-secrets\",\n\t\t\t\t\t\t\t\tcause:\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t};\n\t}),\n}) { }\n","import type { InferSchemaInput, InferSchemaOutput } from \"@orpc/contract\";\nimport { Context, Effect, Scope } from \"effect\";\nimport type { z } from \"zod\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginInstance,\n\tPluginMetadata,\n\tPluginRegistry\n} from \"../../types\";\nimport { PluginRuntimeError, toPluginRuntimeError } from \"../errors\";\nimport { validate } from \"../validation\";\nimport { ModuleFederationService } from \"./module-federation.service\";\nimport { SecretsService } from \"./secrets.service\";\n\nexport class PluginRegistryTag extends Context.Tag(\"PluginRegistry\")<\n\tPluginRegistryTag,\n\tPluginRegistry\n>() { }\n\nexport class PluginMapTag extends Context.Tag(\"PluginMap\")<\n\tPluginMapTag,\n\tRecord<string, AnyPluginConstructor>\n>() { }\n\nexport class RegistryService extends Effect.Service<RegistryService>()(\"RegistryService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst registry = yield* PluginRegistryTag;\n\t\tconst pluginMap = yield* PluginMapTag;\n\n\t\treturn {\n\t\t\tget: (pluginId: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst entry = registry[pluginId];\n\t\t\t\t\t\n\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\t\t\t\t\tcause: new Error(`Plugin ${pluginId} not found in registry`),\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\"module\" in entry) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tconstructor: entry.module,\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\tremoteUrl: entry.remote || \"\",\n\t\t\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\t\t\t} as PluginMetadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tconstructor: null,\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tremoteUrl: entry.remote,\n\t\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\t\t} as PluginMetadata,\n\t\t\t\t\t};\n\t\t\t\t}),\n\n\t\t\tgetModule: (pluginId: string) =>\n\t\t\t\tEffect.succeed(pluginMap[pluginId] || null),\n\t\t};\n\t}),\n}) { }\n\nexport class PluginLoaderService extends Effect.Service<PluginLoaderService>()(\"PluginLoaderService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst moduleFederationService = yield* ModuleFederationService;\n\t\tconst secretsService = yield* SecretsService;\n\t\tconst registryService = yield* RegistryService;\n\n\t\tconst resolveUrl = (baseUrl: string, version?: string): string =>\n\t\t\tversion && version !== \"latest\"\n\t\t\t\t? baseUrl.replace(\"@latest\", `@${version}`)\n\t\t\t\t: baseUrl;\n\n\t\treturn {\n\t\t\tloadPlugin: (pluginId: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst entry = yield* registryService.get(pluginId);\n\n\t\t\t\t\tif (entry.constructor) {\n\t\t\t\t\t\tyield* Effect.logDebug(\"Loading plugin from direct module\", { pluginId });\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tctor: entry.constructor,\n\t\t\t\t\t\t\tmetadata: entry.metadata,\n\t\t\t\t\t\t} satisfies LoadedPlugin;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst url = resolveUrl(entry.metadata.remoteUrl);\n\n\t\t\t\t\tyield* moduleFederationService.registerRemote(pluginId, url).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, pluginId, undefined, \"register-remote\", true),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tyield* Effect.logDebug(\"Loading plugin from remote\", { pluginId, url });\n\n\t\t\t\t\tconst ctor = yield* moduleFederationService.loadRemoteConstructor(pluginId, url).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, pluginId, undefined, \"load-remote\", false),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tctor,\n\t\t\t\t\t\tmetadata: entry.metadata,\n\t\t\t\t\t} satisfies LoadedPlugin;\n\t\t\t\t}),\n\n\t\t\tinstantiatePlugin: <T extends AnyPlugin>(\n\t\t\t\tpluginId: string,\n\t\t\t\tloadedPlugin: LoadedPlugin<T>,\n\t\t\t) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\"instantiate-plugin\",\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t(instance.id as string) = pluginId;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tplugin: instance,\n\t\t\t\t\t\tmetadata: loadedPlugin.metadata,\n\t\t\t\t\t} satisfies PluginInstance<T>;\n\t\t\t\t}),\n\n\t\t\tinitializePlugin: <T extends AnyPlugin>(\n\t\t\t\tpluginInstance: PluginInstance<T>,\n\t\t\t\tconfig: { variables: InferSchemaInput<T[\"configSchema\"][\"variables\"]>; secrets: InferSchemaInput<T[\"configSchema\"][\"secrets\"]> },\n\t\t\t) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst { plugin } = pluginInstance;\n\n\t\t\t\t\t// Validate and hydrate config\n\t\t\t\t\tconst validatedVariables = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.variables as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"variables\"]>>,\n\t\t\t\t\t\tconfig.variables,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-config\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate secrets\n\t\t\t\t\tconst validatedSecrets = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.secrets as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"secrets\"]>>,\n\t\t\t\t\t\tconfig.secrets,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-secrets\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Hydrate secrets in variables\n\t\t\t\t\tconst hydratedConfig = yield* secretsService.hydrateSecrets({\n\t\t\t\t\t\tvariables: validatedVariables,\n\t\t\t\t\t\tsecrets: validatedSecrets,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst _variables = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.variables as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"variables\"]>>,\n\t\t\t\t\t\thydratedConfig.variables,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-hydrated-config\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create a long-lived scope for this plugin instance\n\t\t\t\t\tconst scope = yield* Scope.make();\n\n\t\t\t\t\t// Initialize plugin within the scope\n\t\t\t\t\tconst context = yield* plugin.initialize({ variables: _variables, secrets: hydratedConfig.secrets }).pipe(\n\t\t\t\t\t\tEffect.provideService(Scope.Scope, scope),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, plugin.id, undefined, \"initialize-plugin\", false),\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tplugin,\n\t\t\t\t\t\tmetadata: pluginInstance.metadata,\n\t\t\t\t\t\tconfig: { variables: _variables, secrets: hydratedConfig.secrets },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tscope,\n\t\t\t\t\t} satisfies InitializedPlugin<T>;\n\t\t\t\t}),\n\t\t};\n\t}),\n}) {\n}\n","import { Effect, Exit, Layer, Scope } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInitializedPlugin,\n\tPluginRegistry,\n\tSecretsConfig\n} from \"../../types\";\nimport { ModuleFederationService } from \"./module-federation.service\";\nimport { PluginLifecycleService } from \"./plugin-lifecycle.service\";\nimport { PluginLoaderService, PluginMapTag, PluginRegistryTag, RegistryService } from \"./plugin-loader.service\";\nimport { SecretsConfigTag, SecretsService } from \"./secrets.service\";\n\nexport class PluginService extends Effect.Service<PluginService>()(\"PluginService\", {\n\tscoped: Effect.gen(function* () {\n\t\tconst loader = yield* PluginLoaderService;\n\t\tconst lifecycle = yield* PluginLifecycleService;\n\n\t\treturn {\n\t\t\tloadPlugin: loader.loadPlugin,\n\t\t\tinstantiatePlugin: loader.instantiatePlugin,\n\t\t\tinitializePlugin: loader.initializePlugin,\n\t\t\tshutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t// Shutdown the plugin first (graceful cleanup)\n\t\t\t\t\tyield* plugin.plugin.shutdown().pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\n\t\t\t\t\t// Close the plugin scope to interrupt fibers and release resources\n\t\t\t\t\tyield* Scope.close(plugin.scope, Exit.succeed(undefined));\n\n\t\t\t\t\t// Unregister from lifecycle tracking\n\t\t\t\t\tyield* lifecycle.unregister(plugin);\n\t\t\t\t}),\n\t\t\tcleanup: lifecycle.cleanup,\n\t\t};\n\t}),\n}) {\n\tstatic Live = (registry: PluginRegistry, secrets: SecretsConfig, pluginMap: Record<string, AnyPluginConstructor> = {}) => {\n\t\tconst contextLayer = Layer.mergeAll(\n\t\t\tLayer.succeed(PluginRegistryTag, registry),\n\t\t\tLayer.succeed(SecretsConfigTag, secrets),\n\t\t\tLayer.succeed(PluginMapTag, pluginMap),\n\t\t);\n\n\t\tconst servicesLayer = Layer.mergeAll(\n\t\t\tModuleFederationService.Default,\n\t\t\tSecretsService.Default,\n\t\t\tRegistryService.Default,\n\t\t\tPluginLifecycleService.Default,\n\t\t).pipe(\n\t\t\tLayer.provide(contextLayer)\n\t\t);\n\n\t\treturn PluginService.Default.pipe(\n\t\t\tLayer.provide(PluginLoaderService.Default),\n\t\t\tLayer.provide(servicesLayer)\n\t\t);\n\t}\n}\n","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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"}
|