mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-21 06:12:17 +03:00
sql.js's Emscripten WASM build leaves pending libuv async-handle teardown work in flight after a statement has run. gracefulShutdown.ts's shutdown closure called process.exit(0) in the same tick as the cleanup promise resolving, tearing the event loop down before that teardown settled. On Windows, libuv's async-handle close path asserts !(handle->flags & UV_HANDLE_CLOSING) when this happens, aborting the process (exit 127); Linux's unix backend has no equivalent assertion, which is why this was invisible on CI. Deferring process.exit(0) by one macrotask (setTimeout(..., 0)) mirrors the pattern already used throughout 9router's own shutdown call sites and gives sql.js's pending libuv work a chance to settle first. Regression test: tests/unit/graceful-shutdown-deferred-exit-13306.test.ts pins the ordering contract (process.exit(0) must not fire in the same microtask turn cleanup() resolves in). The Windows abort itself cannot be reproduced on Linux CI — see the PR body for the required live Windows validation.