From 2f36acf7ca08851f149e76a72ac04d81e0ddf033 Mon Sep 17 00:00:00 2001 From: Dimitris Marlagkoutsos Date: Tue, 8 Sep 2026 17:45:05 +0200 Subject: [PATCH 1/2] fix(kernel-store): move to better-sqlite3 13, which survives teardown on Node 24.20 On Node 24.20.0, `better-sqlite3` 12.x aborts the process while it is shutting down: node::RemoveEnvironmentCleanupHook(Isolate*, CleanupHook, void*) at ../src/api/hooks.cc:142 Assertion failed: (env) != nullptr Statement::~Statement() [better_sqlite3.node] The destructor runs after the environment is gone and asserts on the way out. Everything it kills has already passed, so it reads as a worker dying rather than as a test failure, and vitest reports only that the fork exited. Not a missing `close`. The suites that hit it close their databases; a plain script, a vitest worker holding an open database, and one holding an open database plus a live worker thread are all clean on 24.20.0. It takes the whole kernel to provoke, and the same code on 24.18.0 is clean, which places it between the two Node releases rather than in this repository. The tests never ran into it because CI floats on `24.x` and had not run since 2026-09-03, when the runner still resolved that to 24.19.0. 13.x is a major, but it moves none of the surface this driver uses -- `prepare`, `run`, `get`, `all`, `iterate`, `pluck`, `transaction`, `exec`, `close` -- and its Node floor is the one this package already sets. Verified on 24.20.0: the unit suite, the integration suite, and the `kernel-node-runtime` e2e all run without the abort, and kernel-store passes on 22.23.2. Co-Authored-By: Claude Opus 5 (1M context) --- packages/kernel-store/CHANGELOG.md | 6 +++++ packages/kernel-store/package.json | 2 +- yarn.lock | 39 +++++++++--------------------- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/packages/kernel-store/CHANGELOG.md b/packages/kernel-store/CHANGELOG.md index 51e5eb1116..502a921823 100644 --- a/packages/kernel-store/CHANGELOG.md +++ b/packages/kernel-store/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **BREAKING:** Bump `better-sqlite3` from `^12.4.1` to `^13.0.3`, which requires Node 22 or later — the same floor this package already declares + - On Node 24.20.0, 12.x aborts the process during teardown: `Statement::~Statement` reaches `RemoveEnvironmentCleanupHook` after the environment is gone, and Node asserts. The tests it kills have already passed, so it surfaces as a worker dying rather than as a failure anyone can read + - Nothing in this package's driver changes. The 13.x major touches none of `prepare`, `run`, `get`, `all`, `iterate`, `pluck`, `transaction`, `exec`, or `close` + ### Fixed - `rollbackSavepoint` discards the enclosing transaction when `ROLLBACK TO` itself fails, instead of leaving the savepoint on its stack and the transaction open ([#1005](https://github.com/MetaMask/ocap-kernel/pull/1005)) diff --git a/packages/kernel-store/package.json b/packages/kernel-store/package.json index 51245d50fd..8b0ed94b04 100644 --- a/packages/kernel-store/package.json +++ b/packages/kernel-store/package.json @@ -79,7 +79,7 @@ "dependencies": { "@metamask/logger": "workspace:^", "@sqlite.org/sqlite-wasm": "^3.49.1-build3", - "better-sqlite3": "^12.4.1", + "better-sqlite3": "^13.0.3", "ses": "^1.14.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 436bb1784a..4335442ee0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2628,7 +2628,7 @@ __metadata: "@typescript-eslint/parser": "npm:^8.29.0" "@typescript-eslint/utils": "npm:^8.29.0" "@vitest/eslint-plugin": "npm:^1.6.14" - better-sqlite3: "npm:^12.4.1" + better-sqlite3: "npm:^13.0.3" depcheck: "npm:^1.4.7" eslint: "npm:^9.23.0" eslint-config-prettier: "npm:^10.1.1" @@ -7282,14 +7282,13 @@ __metadata: languageName: node linkType: hard -"better-sqlite3@npm:^12.4.1": - version: 12.4.6 - resolution: "better-sqlite3@npm:12.4.6" +"better-sqlite3@npm:^13.0.3": + version: 13.0.3 + resolution: "better-sqlite3@npm:13.0.3" dependencies: - bindings: "npm:^1.5.0" + node-addon-api: "npm:^8.0.0" node-gyp: "npm:latest" - prebuild-install: "npm:^7.1.1" - checksum: 10/383b1acc7c9f03e0677ab2aad5d3a44b4d36565396b1d10dfa5ebcf7840799afeb180c2b7c9813d7ffd1d5c92e497d5c9c52118fe7c5839987df87370df69943 + checksum: 10/035f8fa70784762fd73e1dbeb6f157186abb97705ff759b312cfb0dc1c675fd1c6b5378d2c036758000ce9da1d49bf61689531aa2718a7e32dc272c114a4c71f languageName: node linkType: hard @@ -7328,15 +7327,6 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.5.0": - version: 1.5.0 - resolution: "bindings@npm:1.5.0" - dependencies: - file-uri-to-path: "npm:1.0.0" - checksum: 10/593d5ae975ffba15fbbb4788fe5abd1e125afbab849ab967ab43691d27d6483751805d98cb92f7ac24a2439a8a8678cd0131c535d5d63de84e383b0ce2786133 - languageName: node - linkType: hard - "bl@npm:^4.0.3": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -9700,13 +9690,6 @@ __metadata: languageName: node linkType: hard -"file-uri-to-path@npm:1.0.0": - version: 1.0.0 - resolution: "file-uri-to-path@npm:1.0.0" - checksum: 10/b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -12515,12 +12498,12 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^8.3.0, node-addon-api@npm:^8.3.1": - version: 8.5.0 - resolution: "node-addon-api@npm:8.5.0" +"node-addon-api@npm:^8.0.0, node-addon-api@npm:^8.3.0, node-addon-api@npm:^8.3.1": + version: 8.9.2 + resolution: "node-addon-api@npm:8.9.2" dependencies: node-gyp: "npm:latest" - checksum: 10/9a893f4f835fbc3908e0070f7bcacf36e37fd06be8008409b104c30df4092a0d9a29927b3a74cdbc1d34338274ba4116d597a41f573e06c29538a1a70d07413f + checksum: 10/5354f9b53631d99a952408112d795f36782fd41c0ac073bd91814805fe931b619c743689d0cedcc310c0ae8392fc9b104b2852d28cce294236407ca57d01743e languageName: node linkType: hard @@ -13527,7 +13510,7 @@ __metadata: languageName: node linkType: hard -"prebuild-install@npm:^7.1.1, prebuild-install@npm:^7.1.3": +"prebuild-install@npm:^7.1.3": version: 7.1.3 resolution: "prebuild-install@npm:7.1.3" dependencies: From b79417aa021e89d258f4d8e43260f11317f84f95 Mon Sep 17 00:00:00 2001 From: Erik Marks Date: Fri, 18 Sep 2026 09:14:26 -0700 Subject: [PATCH 2/2] chore: Add PR reference to changelog --- packages/kernel-store/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kernel-store/CHANGELOG.md b/packages/kernel-store/CHANGELOG.md index 502a921823..3e53016655 100644 --- a/packages/kernel-store/CHANGELOG.md +++ b/packages/kernel-store/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- **BREAKING:** Bump `better-sqlite3` from `^12.4.1` to `^13.0.3`, which requires Node 22 or later — the same floor this package already declares +- **BREAKING:** Bump `better-sqlite3` from `^12.4.1` to `^13.0.3`, which requires Node 22 or later — the same floor this package already declares ([#1045](https://github.com/MetaMask/ocap-kernel/pull/1045)) - On Node 24.20.0, 12.x aborts the process during teardown: `Statement::~Statement` reaches `RemoveEnvironmentCleanupHook` after the environment is gone, and Node asserts. The tests it kills have already passed, so it surfaces as a worker dying rather than as a failure anyone can read - Nothing in this package's driver changes. The 13.x major touches none of `prepare`, `run`, `get`, `all`, `iterate`, `pluck`, `transaction`, `exec`, or `close`