every-plugin
Version:
1 lines • 4.58 kB
Source Map (JSON)
{"version":3,"file":"plugin-lifecycle.service.cjs","names":["Effect","Ref","toPluginRuntimeError","Scope","Exit"],"sources":["../../../src/runtime/services/plugin-lifecycle.service.ts"],"sourcesContent":["import { Effect, Exit, Ref, Scope } from \"effect\";\nimport type { AnyPlugin, InitializedPlugin } from \"../../types\";\nimport { toPluginRuntimeError } from \"../errors\";\n\nexport class PluginLifecycleService extends Effect.Service<PluginLifecycleService>()(\n \"PluginLifecycleService\",\n {\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\n .shutdown()\n .pipe(\n Effect.mapError((error) =>\n toPluginRuntimeError(\n error,\n plugin.plugin.id,\n undefined,\n \"shutdown-plugin\",\n false,\n ),\n ),\n );\n }),\n\n cleanup: () =>\n Effect.gen(function* () {\n const plugins = yield* Ref.get(activePlugins);\n if (typeof process !== \"undefined\" && process.env?.EVERY_PLUGIN_DEBUG_SCOPES === \"1\") {\n yield* Effect.logWarning(\n `[PluginLifecycle] cleaning up ${plugins.size} active plugin(s)`,\n );\n }\n\n yield* Effect.forEach(\n plugins,\n (plugin) =>\n Effect.gen(function* () {\n yield* plugin.plugin\n .shutdown()\n .pipe(\n Effect.catchAll((error) =>\n Effect.logWarning(`Failed to shutdown plugin ${plugin.plugin.id}`, error),\n ),\n );\n yield* Scope.close(plugin.scope, Exit.succeed(undefined)).pipe(\n Effect.catchAll((error) =>\n Effect.logWarning(\n `Failed to close scope for plugin ${plugin.plugin.id}`,\n error,\n ),\n ),\n );\n }),\n { concurrency: \"unbounded\" },\n );\n\n yield* Ref.set(activePlugins, new Set());\n }).pipe(Effect.catchAll((error) => Effect.logWarning(\"Plugin cleanup failed\", error))),\n };\n }),\n },\n) {}\n"],"mappings":";;;;AAIA,IAAa,yBAAb,cAA4CA,cAAO,QAAgC,CAAC,CAClF,0BACA,EACE,QAAQA,cAAO,IAAI,aAAa;CAC9B,MAAM,gBAAgB,OAAOC,WAAI,qBAAK,IAAI,IAAkC,CAAC;CAE7E,OAAO;EACL,WAAgC,WAC9BA,WAAI,OAAO,gBAAgB,YACzB,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,MAAsC,CAC7D;EAEF,aAAa,WACXA,WAAI,OAAO,gBAAgB,YAAY;GACrC,MAAM,SAAS,IAAI,IAAI,OAAO;GAC9B,OAAO,OAAO,MAAM;GACpB,OAAO;EACT,CAAC;EAEH,WAAW,WACTD,cAAO,IAAI,aAAa;GAEtB,OAAOC,WAAI,OAAO,gBAAgB,YAAY;IAC5C,MAAM,SAAS,IAAI,IAAI,OAAO;IAC9B,OAAO,OAAO,MAAM;IACpB,OAAO;GACT,CAAC;GAGD,OAAO,OAAO,OACX,SAAS,CAAC,CACV,KACCD,cAAO,UAAU,UACfE,oCACE,OACA,OAAO,OAAO,IACd,QACA,mBACA,KACF,CACF,CACF;EACJ,CAAC;EAEH,eACEF,cAAO,IAAI,aAAa;GACtB,MAAM,UAAU,OAAOC,WAAI,IAAI,aAAa;GAC5C,IAAI,OAAO,YAAY,eAAe,QAAQ,KAAK,8BAA8B,KAC/E,OAAOD,cAAO,WACZ,iCAAiC,QAAQ,KAAK,kBAChD;GAGF,OAAOA,cAAO,QACZ,UACC,WACCA,cAAO,IAAI,aAAa;IACtB,OAAO,OAAO,OACX,SAAS,CAAC,CACV,KACCA,cAAO,UAAU,UACfA,cAAO,WAAW,6BAA6B,OAAO,OAAO,MAAM,KAAK,CAC1E,CACF;IACF,OAAOG,aAAM,MAAM,OAAO,OAAOC,YAAK,QAAQ,MAAS,CAAC,CAAC,CAAC,KACxDJ,cAAO,UAAU,UACfA,cAAO,WACL,oCAAoC,OAAO,OAAO,MAClD,KACF,CACF,CACF;GACF,CAAC,GACH,EAAE,aAAa,YAAY,CAC7B;GAEA,OAAOC,WAAI,IAAI,+BAAe,IAAI,IAAI,CAAC;EACzC,CAAC,CAAC,CAAC,KAAKD,cAAO,UAAU,UAAUA,cAAO,WAAW,yBAAyB,KAAK,CAAC,CAAC;CACzF;AACF,CAAC,EACH,CACF,CAAC,CAAC,CAAC"}