UNPKG

every-plugin

Version:
132 lines (130 loc) 5.81 kB
const require_runtime = require('../../_virtual/_rolldown/runtime.cjs'); const require_errors = require('../errors.cjs'); const require_module_federation_service = require('./module-federation.service.cjs'); const require_validation = require('../validation.cjs'); const require_secrets_service = require('./secrets.service.cjs'); let effect = require("effect"); //#region src/runtime/services/plugin-loader.service.ts var PluginRegistryTag = class extends effect.Context.Tag("PluginRegistry")() {}; var PluginMapTag = class extends effect.Context.Tag("PluginMap")() {}; var RegistryService = class extends effect.Effect.Service()("RegistryService", { effect: effect.Effect.gen(function* () { const registry = yield* PluginRegistryTag; const pluginMap = yield* PluginMapTag; return { get: (pluginId) => effect.Effect.gen(function* () { const entry = registry[pluginId]; if (!entry) return yield* effect.Effect.fail(new require_errors.PluginRuntimeError({ pluginId, operation: "validate-plugin-id", cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} not found in registry`), retryable: false })); if ("module" in entry) return { constructor: entry.module, metadata: { remoteUrl: entry.remote || "", version: entry.version, description: entry.description } }; return { constructor: null, metadata: { remoteUrl: entry.remote, version: entry.version, description: entry.description } }; }), getModule: (pluginId) => effect.Effect.succeed(pluginMap[pluginId] || null) }; }) }) {}; var PluginLoaderService = class extends effect.Effect.Service()("PluginLoaderService", { effect: effect.Effect.gen(function* () { const moduleFederationService = yield* require_module_federation_service.ModuleFederationService; const secretsService = yield* require_secrets_service.SecretsService; const registryService = yield* RegistryService; const resolveUrl = (baseUrl, version) => version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl; return { loadPlugin: (pluginId) => effect.Effect.gen(function* () { const entry = yield* registryService.get(pluginId); if (entry.constructor) { yield* effect.Effect.logDebug("Loading plugin from direct module", { pluginId }); return { ctor: entry.constructor, metadata: entry.metadata }; } const url = entry.metadata.remoteUrl; if (!url) return yield* effect.Effect.fail(new require_errors.PluginRuntimeError({ pluginId, operation: "load-plugin", cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} has no module or remote URL configured`), retryable: false })); const resolvedUrl = resolveUrl(url); yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, pluginId, void 0, "register-remote", true))); yield* effect.Effect.logDebug("Loading plugin from remote", { pluginId, url: resolvedUrl }); return { ctor: yield* moduleFederationService.loadRemoteConstructor(pluginId, resolvedUrl).pipe(effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, pluginId, void 0, "load-remote", false))), metadata: entry.metadata }; }), instantiatePlugin: (pluginId, loadedPlugin) => effect.Effect.gen(function* () { const instance = yield* effect.Effect.try(() => new loadedPlugin.ctor()).pipe(effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, pluginId, void 0, "instantiate-plugin", false))); instance.id = pluginId; return { plugin: instance, metadata: loadedPlugin.metadata }; }), initializePlugin: (pluginInstance, config, plugins) => effect.Effect.gen(function* () { const { plugin } = pluginInstance; const validatedVariables = yield* require_validation.validate(plugin.configSchema.variables, config.variables, plugin.id, "config").pipe(effect.Effect.mapError((validationError) => new require_errors.PluginRuntimeError({ pluginId: plugin.id, operation: "validate-config", cause: validationError.zodError, retryable: false }))); const validatedSecrets = yield* require_validation.validate(plugin.configSchema.secrets, config.secrets, plugin.id, "config").pipe(effect.Effect.mapError((validationError) => new require_errors.PluginRuntimeError({ pluginId: plugin.id, operation: "validate-secrets", cause: validationError.zodError, retryable: false }))); const hydratedConfig = yield* secretsService.hydrateSecrets({ variables: validatedVariables, secrets: validatedSecrets }); const _variables = yield* require_validation.validate(plugin.configSchema.variables, hydratedConfig.variables, plugin.id, "config").pipe(effect.Effect.mapError((validationError) => new require_errors.PluginRuntimeError({ pluginId: plugin.id, operation: "validate-hydrated-config", cause: validationError.zodError, retryable: false }))); const scope = yield* effect.Scope.make(); const context = yield* plugin.initialize({ variables: _variables, secrets: hydratedConfig.secrets }, plugins ?? {}).pipe(effect.Effect.provideService(effect.Scope.Scope, scope), effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, plugin.id, void 0, "initialize-plugin", false))); return { plugin, metadata: pluginInstance.metadata, config: { variables: _variables, secrets: hydratedConfig.secrets }, context, scope }; }) }; }) }) {}; //#endregion exports.PluginLoaderService = PluginLoaderService; exports.PluginMapTag = PluginMapTag; exports.PluginRegistryTag = PluginRegistryTag; exports.RegistryService = RegistryService; //# sourceMappingURL=plugin-loader.service.cjs.map