{"version":3,"file":"service-initializer.mjs","names":["InjectableType","DIError","ServiceInitializer","injectors","instantiateService","ctx","record","args","undefined","type","Class","instantiateClass","Factory","instantiateFactory","unknown","error","initializationError","target","name","tryLoad","wrapSyncInit","original","provideFactoryContext","result","instance","promises","injectState","length","results","Promise","allSettled","some","status","Error","newRes","console","onServiceInit","addDestroyListener","onServiceDestroy","builder","create"],"sources":["../../../../src/internal/core/service-initializer.mts"],"sourcesContent":["import type { FactoryRecord } from '../../token/registry.mjs'\nimport type { Injectors } from '../../utils/index.mjs'\nimport type { ServiceInitializationContext } from '../context/service-initialization-context.mjs'\n\nimport { InjectableType } from '../../enums/index.mjs'\nimport { DIError } from '../../errors/index.mjs'\n\n/**\n * Creates service instances from registry records.\n *\n * Handles both class-based (@Injectable) and factory-based (@Factory) services,\n * managing the instantiation lifecycle including lifecycle hook invocation.\n */\nexport class ServiceInitializer {\n  constructor(private readonly injectors: Injectors) {}\n\n  /**\n   * Instantiates a service based on its registry record.\n   * @param ctx The factory context for dependency injection\n   * @param record The factory record from the registry\n   * @param args Optional arguments for the service\n   * @returns Promise resolving to [undefined, instance] or [error]\n   */\n  async instantiateService<T>(\n    ctx: ServiceInitializationContext,\n    record: FactoryRecord<T, any>,\n    args: any = undefined,\n  ): Promise<[undefined, T] | [DIError]> {\n    try {\n      switch (record.type) {\n        case InjectableType.Class:\n          return this.instantiateClass(ctx, record, args)\n        case InjectableType.Factory:\n          return this.instantiateFactory(ctx, record, args)\n        default:\n          throw DIError.unknown(\n            `[ServiceInitializer] Unknown service type: ${record.type}`,\n          )\n      }\n    } catch (error) {\n      return [\n        error instanceof DIError\n          ? error\n          : DIError.initializationError(record.target.name, error as Error),\n      ]\n    }\n  }\n\n  /**\n   * Instantiates a class-based service (Injectable decorator).\n   * @param ctx The factory context for dependency injection\n   * @param record The factory record from the registry\n   * @param args Optional arguments for the service constructor\n   * @returns Promise resolving to [undefined, instance] or [error]\n   */\n  private async instantiateClass<T>(\n    ctx: ServiceInitializationContext,\n    record: FactoryRecord<T, any>,\n    args: any,\n  ): Promise<[undefined, T] | [DIError]> {\n    try {\n      const tryLoad = this.injectors.wrapSyncInit(() => {\n        const original = this.injectors.provideFactoryContext(\n          ctx as ServiceInitializationContext,\n        )\n        let result = new record.target(...(args ? [args] : []))\n        this.injectors.provideFactoryContext(original)\n        return result\n      })\n\n      let [instance, promises, injectState] = tryLoad()\n      if (promises.length > 0) {\n        const results = await Promise.allSettled(promises)\n        if (results.some((result) => result.status === 'rejected')) {\n          throw DIError.initializationError(\n            record.target.name,\n            new Error('Service cannot be instantiated'),\n          )\n        }\n        const newRes = tryLoad(injectState)\n        instance = newRes[0]\n        promises = newRes[1]\n      }\n\n      if (promises.length > 0) {\n        console.error(\n          `[ServiceInitializer] ${record.target.name} has problem with it's definition.\n\n       One or more of the dependencies are registered as a InjectableScope.Transient and are used with inject.\n\n       Please use asyncInject instead of inject to load those dependencies.`,\n        )\n        throw DIError.initializationError(\n          record.target.name,\n          new Error('Service cannot be instantiated'),\n        )\n      }\n\n      // Handle lifecycle hooks\n      if ('onServiceInit' in instance) {\n        await (instance as any).onServiceInit()\n      }\n      if ('onServiceDestroy' in instance) {\n        ctx.addDestroyListener(async () => {\n          await (instance as any).onServiceDestroy()\n        })\n      }\n\n      return [undefined, instance]\n    } catch (error) {\n      return [\n        error instanceof DIError\n          ? error\n          : DIError.initializationError(record.target.name, error as Error),\n      ]\n    }\n  }\n\n  /**\n   * Instantiates a factory-based service (Factory decorator).\n   * @param ctx The factory context for dependency injection\n   * @param record The factory record from the registry\n   * @param args Optional arguments for the factory\n   * @returns Promise resolving to [undefined, instance] or [error]\n   */\n  private async instantiateFactory<T>(\n    ctx: ServiceInitializationContext,\n    record: FactoryRecord<T, any>,\n    args: any,\n  ): Promise<[undefined, T] | [DIError]> {\n    try {\n      const tryLoad = this.injectors.wrapSyncInit(() => {\n        const original = this.injectors.provideFactoryContext(ctx)\n        let result = new record.target()\n        this.injectors.provideFactoryContext(original)\n        return result\n      })\n\n      let [builder, promises, injectState] = tryLoad()\n      if (promises.length > 0) {\n        const results = await Promise.allSettled(promises)\n        if (results.some((result) => result.status === 'rejected')) {\n          throw DIError.initializationError(\n            record.target.name,\n            new Error('Service cannot be instantiated'),\n          )\n        }\n        const newRes = tryLoad(injectState)\n        builder = newRes[0]\n        promises = newRes[1]\n      }\n\n      if (promises.length > 0) {\n        console.error(\n          `[ServiceInitializer] ${record.target.name} has problem with it's definition.\n\n       One or more of the dependencies are registered as a InjectableScope.Transient and are used with inject.\n\n       Please use asyncInject instead of inject to load those dependencies.`,\n        )\n        throw DIError.initializationError(\n          record.target.name,\n          new Error('Service cannot be instantiated'),\n        )\n      }\n\n      if (typeof builder.create !== 'function') {\n        throw DIError.initializationError(\n          record.target.name,\n          new Error('Factory does not implement the create method'),\n        )\n      }\n\n      const instance = await builder.create(ctx, args)\n      return [undefined, instance]\n    } catch (error) {\n      return [\n        error instanceof DIError\n          ? error\n          : DIError.initializationError(record.target.name, error as Error),\n      ]\n    }\n  }\n}\n"],"mappings":"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"}