diff --git a/packages/matter-server/src/MatterServer.ts b/packages/matter-server/src/MatterServer.ts index d708dd66..920e40ff 100644 --- a/packages/matter-server/src/MatterServer.ts +++ b/packages/matter-server/src/MatterServer.ts @@ -78,6 +78,8 @@ let config: ConfigStorage; let legacyData: LegacyData; let legacyDataWriter: LegacyDataWriter | undefined; let fileLoggerClose: (() => Promise) | undefined; +let stopping = false; +let startCompleted: Promise = Promise.resolve(); async function start() { // Set up file logging additionally to the console if configured @@ -190,6 +192,19 @@ async function start() { } async function stop() { + if (stopping) { + return; + } + stopping = true; + + // Wait for start() to finish (or fail) before tearing down, so we don't + // race against in-flight initialization that could re-create resources. + try { + await startCompleted; + } catch { + // start() failed - that's fine, we still need to clean up + } + try { await server?.stop(); } catch (err) { @@ -229,8 +244,10 @@ async function stop() { } } -start().catch(async err => { - console.error(err); +startCompleted = start().catch(async err => { + if (!stopping) { + console.error(err); + } await config?.close(); }); diff --git a/packages/ws-controller/src/controller/ControllerCommandHandler.ts b/packages/ws-controller/src/controller/ControllerCommandHandler.ts index ce3def0d..52462bb9 100644 --- a/packages/ws-controller/src/controller/ControllerCommandHandler.ts +++ b/packages/ws-controller/src/controller/ControllerCommandHandler.ts @@ -273,10 +273,10 @@ export class ControllerCommandHandler { } async close() { + await this.#customClusterPoller.stop(); if (!this.#started) { return; } - await this.#customClusterPoller.stop(); return this.#controller.close(); }