diff --git a/src/__tests__/server.test.ts b/src/__tests__/server.test.ts index a8bf109..0856812 100644 --- a/src/__tests__/server.test.ts +++ b/src/__tests__/server.test.ts @@ -26,6 +26,7 @@ describe('runServer', () => { let mockHttpHandle: HttpServerHandle; let mockClose: jest.Mock; let processOnSpy: jest.SpyInstance; + let processOffSpy: jest.SpyInstance; beforeEach(() => { jest.clearAllMocks(); @@ -51,8 +52,9 @@ describe('runServer', () => { MockStartHttpTransport.mockResolvedValue(mockHttpHandle); - // Spy on process.on method + // Spy on process methods processOnSpy = jest.spyOn(process, 'on').mockImplementation(); + processOffSpy = jest.spyOn(process, 'off'); // Mock process.exit to prevent Jest from exiting jest.spyOn(process, 'exit').mockImplementation((() => {}) as never); @@ -60,6 +62,7 @@ describe('runServer', () => { afterEach(() => { processOnSpy.mockRestore(); + processOffSpy.mockRestore(); // Note: We don't call jest.restoreAllMocks() here as it would clear module mocks // The memoization cache persists across tests, which is expected behavior }); @@ -175,6 +178,7 @@ describe('runServer', () => { await serverInstance.stop(); + expect(processOffSpy).toHaveBeenCalledWith('SIGINT', expect.any(Function)); expect(serverInstance.isRunning()).toBe(false); expect({ events: MockLog.info.mock.calls diff --git a/src/server.ts b/src/server.ts index 704a80e..ff5b05d 100644 --- a/src/server.ts +++ b/src/server.ts @@ -129,6 +129,7 @@ const runServer = async (options: ServerOptions = getOptions(), { let transport: StdioServerTransport | null = null; let httpHandle: HttpServerHandle | null = null; let unsubscribeServerLogger: (() => void) | null = null; + let sigintHandler: (() => void) | null = null; let running = false; let onLogSetup: ServerOnLog = () => () => {}; @@ -144,6 +145,11 @@ const runServer = async (options: ServerOptions = getOptions(), { httpHandle = null; } + if (sigintHandler) { + process.off('SIGINT', sigintHandler); + sigintHandler = null; + } + log.debug('...closing Server'); await server?.close(); running = false; @@ -246,10 +252,11 @@ const runServer = async (options: ServerOptions = getOptions(), { }))); }); - if (enableSigint) { - process.on('SIGINT', () => { + if (enableSigint && !sigintHandler) { + sigintHandler = () => { void stopServer(); - }); + }; + process.on('SIGINT', sigintHandler); } if (options.isHttp) {