{"version":3,"file":"plugin-lifecycle.service.mjs","names":[],"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\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,cAA4C,OAAO,SAAiC,CAClF,0BACA,EACE,QAAQ,OAAO,IAAI,aAAa;CAC9B,MAAM,gBAAgB,OAAO,IAAI,qBAAK,IAAI,KAAmC,CAAC;AAE9E,QAAO;EACL,WAAgC,WAC9B,IAAI,OAAO,gBAAgB,YACzB,IAAI,IAAI,QAAQ,CAAC,IAAI,OAAuC,CAC7D;EAEH,aAAa,WACX,IAAI,OAAO,gBAAgB,YAAY;GACrC,MAAM,SAAS,IAAI,IAAI,QAAQ;AAC/B,UAAO,OAAO,OAAO;AACrB,UAAO;IACP;EAEJ,WAAW,WACT,OAAO,IAAI,aAAa;AAEtB,UAAO,IAAI,OAAO,gBAAgB,YAAY;IAC5C,MAAM,SAAS,IAAI,IAAI,QAAQ;AAC/B,WAAO,OAAO,OAAO;AACrB,WAAO;KACP;AAGF,UAAO,OAAO,OACX,UAAU,CACV,KACC,OAAO,UAAU,UACf,qBACE,OACA,OAAO,OAAO,IACd,QACA,mBACA,MACD,CACF,CACF;IACH;EAEJ,eACE,OAAO,IAAI,aAAa;GACtB,MAAM,UAAU,OAAO,IAAI,IAAI,cAAc;AAE7C,UAAO,OAAO,QACZ,UACC,WACC,OAAO,IAAI,aAAa;AACtB,WAAO,OAAO,OACX,UAAU,CACV,KACC,OAAO,UAAU,UACf,OAAO,WAAW,6BAA6B,OAAO,OAAO,MAAM,MAAM,CAC1E,CACF;AACH,WAAO,MAAM,MAAM,OAAO,OAAO,KAAK,QAAQ,OAAU,CAAC,CAAC,KACxD,OAAO,UAAU,UACf,OAAO,WACL,oCAAoC,OAAO,OAAO,MAClD,MACD,CACF,CACF;KACD,EACJ,EAAE,aAAa,aAAa,CAC7B;AAED,UAAO,IAAI,IAAI,+BAAe,IAAI,KAAK,CAAC;IACxC,CAAC,KAAK,OAAO,UAAU,UAAU,OAAO,WAAW,yBAAyB,MAAM,CAAC,CAAC;EACzF;EACD,EACH,CACF,CAAC"}