diff --git a/packages/backend-app-api/src/wiring/ServiceRegistry.test.ts b/packages/backend-app-api/src/wiring/ServiceRegistry.test.ts index c75167ea3b..2c17606a16 100644 --- a/packages/backend-app-api/src/wiring/ServiceRegistry.test.ts +++ b/packages/backend-app-api/src/wiring/ServiceRegistry.test.ts @@ -276,4 +276,20 @@ describe('ServiceRegistry', () => { "Failed to instantiate service '1' for 'catalog' because the factory function threw an error, Error: error in plugin catalog", ); }); + + it('should decorate error messages thrown by default factory loaders', async () => { + const ref = createServiceRef({ + id: '1', + defaultFactory() { + throw new Error('default factory error'); + }, + }); + + const registry = new ServiceRegistry([]); + const factory = registry.get(ref)!; + + await expect(factory('catalog')).rejects.toThrow( + "Failed to instantiate service '1' because the default factory loader threw an error, Error: default factory error", + ); + }); }); diff --git a/packages/backend-app-api/src/wiring/ServiceRegistry.ts b/packages/backend-app-api/src/wiring/ServiceRegistry.ts index fc79bad14a..5592a0f0eb 100644 --- a/packages/backend-app-api/src/wiring/ServiceRegistry.ts +++ b/packages/backend-app-api/src/wiring/ServiceRegistry.ts @@ -48,11 +48,21 @@ export class ServiceRegistry { if (!factory) { let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!); if (!loadedFactory) { - loadedFactory = defaultFactory!(ref) as Promise; + loadedFactory = Promise.resolve().then( + () => defaultFactory!(ref) as Promise, + ); this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory); } // NOTE: This await is safe as long as #providedFactories is not mutated. - factory = await loadedFactory; + factory = await loadedFactory.catch(error => { + throw new Error( + `Failed to instantiate service '${ + ref.id + }' because the default factory loader threw an error, ${stringifyError( + error, + )}`, + ); + }); } let implementation = this.#implementations.get(factory);