* Load a service, handling dependencies
(serviceName: string)
| 120 | * Load a service, handling dependencies |
| 121 | */ |
| 122 | async load<T>(serviceName: string): Promise<T> { |
| 123 | const factory = this.factories.get(serviceName); |
| 124 | if (!factory) { |
| 125 | const error = new Error( |
| 126 | `No factory registered for service '${serviceName}'`, |
| 127 | ); |
| 128 | this.setServiceError(serviceName, error); |
| 129 | throw error; |
| 130 | } |
| 131 | |
| 132 | // Check if already loading |
| 133 | const current = this.services.get(serviceName); |
| 134 | if (current?.state === "loading") { |
| 135 | return this.get<T>(serviceName); |
| 136 | } |
| 137 | |
| 138 | logger.debug(`Loading service: ${serviceName}`); |
| 139 | this.setServiceState(serviceName, "loading"); |
| 140 | |
| 141 | try { |
| 142 | // Load dependencies first |
| 143 | const deps = this.dependencies.get(serviceName) || []; |
| 144 | await Promise.all(deps.map((dep) => this.load(dep))); |
| 145 | |
| 146 | // Load the service |
| 147 | const value = await factory(); |
| 148 | |
| 149 | this.setServiceValue(serviceName, value); |
| 150 | logger.debug(`Service loaded successfully: ${serviceName}`); |
| 151 | |
| 152 | return value; |
| 153 | } catch (error: any) { |
| 154 | logger.debug(`Failed to load service '${serviceName}':`, error); |
| 155 | this.setServiceError(serviceName, error); |
| 156 | throw error; |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | /** |
| 161 | * Reload a service (and all transitive dependents) |
no test coverage detected