every-plugin
Version:
35 lines (33 loc) • 1.75 kB
JavaScript
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