every-plugin
Version:
132 lines (130 loc) • 5.81 kB
JavaScript
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