UNPKG

every-plugin

Version:
35 lines (33 loc) 1.75 kB
import { toPluginRuntimeError } from "../errors.mjs"; import { Effect, Exit, Ref, Scope } from "effect"; //#region src/runtime/services/plugin-lifecycle.service.ts var PluginLifecycleService = class extends Effect.Service()("PluginLifecycleService", { effect: Effect.gen(function* () { const activePlugins = yield* Ref.make(/* @__PURE__ */ new Set()); return { register: (plugin) => Ref.update(activePlugins, (plugins) => new Set(plugins).add(plugin)), unregister: (plugin) => Ref.update(activePlugins, (plugins) => { const newSet = new Set(plugins); newSet.delete(plugin); return newSet; }), shutdown: (plugin) => Effect.gen(function* () { yield* Ref.update(activePlugins, (plugins) => { const newSet = new Set(plugins); newSet.delete(plugin); return newSet; }); yield* plugin.plugin.shutdown().pipe(Effect.mapError((error) => toPluginRuntimeError(error, plugin.plugin.id, void 0, "shutdown-plugin", false))); }), cleanup: () => Effect.gen(function* () { const plugins = yield* Ref.get(activePlugins); yield* Effect.forEach(plugins, (plugin) => Effect.gen(function* () { yield* plugin.plugin.shutdown().pipe(Effect.catchAll((error) => Effect.logWarning(`Failed to shutdown plugin ${plugin.plugin.id}`, error))); yield* Scope.close(plugin.scope, Exit.succeed(void 0)).pipe(Effect.catchAll((error) => Effect.logWarning(`Failed to close scope for plugin ${plugin.plugin.id}`, error))); }), { concurrency: "unbounded" }); yield* Ref.set(activePlugins, /* @__PURE__ */ new Set()); }).pipe(Effect.catchAll((error) => Effect.logWarning("Plugin cleanup failed", error))) }; }) }) {}; //#endregion export { PluginLifecycleService }; //# sourceMappingURL=plugin-lifecycle.service.mjs.map