From bd195c5c772ac1ee8df85f48f81cd7bc856ba0c6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 2 Jan 2023 15:57:20 +0100 Subject: [PATCH] backend-app-api: use root lifecycle service to shut down root http service Signed-off-by: Patrik Oldsberg --- .../implementations/rootHttpRouterService.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/backend-app-api/src/services/implementations/rootHttpRouterService.ts b/packages/backend-app-api/src/services/implementations/rootHttpRouterService.ts index d1c8643244..dae7474793 100644 --- a/packages/backend-app-api/src/services/implementations/rootHttpRouterService.ts +++ b/packages/backend-app-api/src/services/implementations/rootHttpRouterService.ts @@ -42,8 +42,9 @@ export const rootHttpRouterFactory = createServiceFactory({ service: coreServices.rootHttpRouter, deps: { config: coreServices.config, + lifecycle: coreServices.rootLifecycle, }, - async factory({ config }, options?: RootHttpRouterFactoryOptions) { + async factory({ config, lifecycle }, options?: RootHttpRouterFactoryOptions) { const indexPath = options?.indexPath ?? '/api/app'; const namedRouter = Router(); @@ -57,7 +58,26 @@ export const rootHttpRouterFactory = createServiceFactory({ service.addRouter('', namedRouter).addRouter('', indexRouter); - await service.start(); + const server = await service.start(); + // Stop method isn't part of the public API, let's fix that once we move the implementation here. + const stoppableServer = server as typeof server & { + stop: (cb: (error?: Error) => void) => void; + }; + + lifecycle.addShutdownHook({ + async fn() { + await new Promise((resolve, reject) => { + stoppableServer.stop((error?: Error) => { + if (error) { + reject(error); + } else { + resolve(); + } + }); + }); + }, + labels: { service: 'rootHttpRouter' }, + }); const existingPaths = new Array();