diff --git a/docs/backend-system/architecture/02-backends.md b/docs/backend-system/architecture/02-backends.md index c1cb210f1a..4c9857df86 100644 --- a/docs/backend-system/architecture/02-backends.md +++ b/docs/backend-system/architecture/02-backends.md @@ -45,7 +45,7 @@ The `Backend.start()` method returns a `BackendStartupResult` with detailed succ ```ts backend.start( - result => { + ({ result }) => { console.log(`Backend startup result: ${JSON.stringify(result, null, 2)}`); }, error => { diff --git a/packages/backend-app-api/report.api.md b/packages/backend-app-api/report.api.md index 78f4e1abde..62b46b93e6 100644 --- a/packages/backend-app-api/report.api.md +++ b/packages/backend-app-api/report.api.md @@ -18,7 +18,9 @@ export interface Backend { }>, ): void; // (undocumented) - start(): Promise; + start(): Promise<{ + result: BackendStartupResult; + }>; // (undocumented) stop(): Promise; } @@ -35,8 +37,8 @@ export class BackendStartupError extends CustomErrorBase { // @public export interface BackendStartupResult { beginAt: Date; + outcome: 'success' | 'failure'; plugins: PluginStartupResult[]; - result: 'success' | 'failure'; resultAt: Date; } diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts index f5e4b80417..1c0bf5a0ef 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.test.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.test.ts @@ -1298,7 +1298,7 @@ describe('BackendInitializer', () => { }), ); - const result = await init.start(); + const { result } = await init.start(); expect(result.plugins).toHaveLength(2); expect(result.plugins[0]).toMatchObject({ @@ -1503,7 +1503,7 @@ describe('BackendInitializer', () => { }), ); - const result = await init.start(); + const { result } = await init.start(); expect(result.plugins).toHaveLength(2); expect(result.plugins[0]).toMatchObject({ @@ -1574,7 +1574,7 @@ describe('BackendInitializer', () => { }), ); - const result = await init.start(); + const { result } = await init.start(); expect(result.plugins).toHaveLength(1); expect(result.plugins[0]).toMatchObject({ @@ -1667,7 +1667,7 @@ describe('BackendInitializer', () => { }), ); - const result = await init.start(); + const { result } = await init.start(); expect(result.plugins[0].modules).toHaveLength(3); expect(result.plugins[0].modules[0]).toMatchObject({ @@ -1698,7 +1698,7 @@ describe('BackendInitializer', () => { }), ); - const result = await init.start(); + const { result } = await init.start(); expect(result.plugins).toHaveLength(1); expect(result.plugins[0]).toMatchObject({ @@ -1823,7 +1823,7 @@ describe('BackendInitializer', () => { }), ); - const result = await init.start(); + const { result } = await init.start(); expect(result.plugins).toHaveLength(1); expect(result.plugins[0].pluginId).toBe('plugin1'); diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 83d5da72cd..c86fb0b29c 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -150,7 +150,7 @@ function createRootInstanceMetadataServiceFactory( } export class BackendInitializer { - #startPromise?: Promise; + #startPromise?: Promise<{ result: BackendStartupResult }>; #stopPromise?: Promise; #registrations = new Array(); #extensionPoints = new Map(); @@ -226,7 +226,7 @@ export class BackendInitializer { } } - async start(): Promise { + async start(): Promise<{ result: BackendStartupResult }> { if (this.#startPromise) { throw new Error('Backend has already started'); } @@ -240,7 +240,7 @@ export class BackendInitializer { return await this.#startPromise; } - async #doStart(): Promise { + async #doStart(): Promise<{ result: BackendStartupResult }> { this.#serviceRegistry.checkForCircularDeps(); for (const feature of this.#registeredFeatures) { @@ -432,16 +432,16 @@ export class BackendInitializer { ); }); - const startupResult = resultCollector.finalize(); - if (startupResult.result === 'failure') { - throw new BackendStartupError(startupResult); + const result = resultCollector.finalize(); + if (result.outcome === 'failure') { + throw new BackendStartupError(result); } // Once all plugins and modules have been initialized, we can signal that the backend has started up successfully const lifecycleService = await this.#getRootLifecycleImpl(); await lifecycleService.startup(); - return startupResult; + return { result }; } // It's fine to call .stop() multiple times, which for example can happen with manual stop + process exit diff --git a/packages/backend-app-api/src/wiring/BackstageBackend.ts b/packages/backend-app-api/src/wiring/BackstageBackend.ts index a101a03375..79ee55780f 100644 --- a/packages/backend-app-api/src/wiring/BackstageBackend.ts +++ b/packages/backend-app-api/src/wiring/BackstageBackend.ts @@ -34,7 +34,7 @@ export class BackstageBackend implements Backend { } } - async start(): Promise { + async start(): Promise<{ result: BackendStartupResult }> { return await this.#initializer.start(); } diff --git a/packages/backend-app-api/src/wiring/createInitializationResultCollector.ts b/packages/backend-app-api/src/wiring/createInitializationResultCollector.ts index 4dca92ef58..a3faa455ff 100644 --- a/packages/backend-app-api/src/wiring/createInitializationResultCollector.ts +++ b/packages/backend-app-api/src/wiring/createInitializationResultCollector.ts @@ -170,7 +170,7 @@ export function createInitializationResultCollector(options: { return { beginAt, resultAt: new Date(), - result: hasDisallowedFailures ? 'failure' : 'success', + outcome: hasDisallowedFailures ? 'failure' : 'success', plugins: pluginResults, }; }, diff --git a/packages/backend-app-api/src/wiring/types.ts b/packages/backend-app-api/src/wiring/types.ts index fcb092a8c9..5782021656 100644 --- a/packages/backend-app-api/src/wiring/types.ts +++ b/packages/backend-app-api/src/wiring/types.ts @@ -26,7 +26,7 @@ import { */ export interface Backend { add(feature: BackendFeature | Promise<{ default: BackendFeature }>): void; - start(): Promise; + start(): Promise<{ result: BackendStartupResult }>; stop(): Promise; } @@ -124,7 +124,7 @@ export interface BackendStartupResult { */ plugins: PluginStartupResult[]; /** - * The result of the backend startup. + * The outcome of the backend startup. */ - result: 'success' | 'failure'; + outcome: 'success' | 'failure'; }