@push.rocks/smartdb 5.2.1 → 5.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "08cf9193c7f6ab682848b35f07b45a1c5894cb0d90cab207b68abe1eb87da0ef",
3
+ "binarySha256": "5540a957900ae9ffb3c4ac119e61b508126143e6db827208f8d4555180569a72",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdb",
6
- "projectVersion": "5.2.1",
7
- "gitCommit": "31b448f06189fc802c6416f1ce6cd85ef275cbe1",
6
+ "projectVersion": "5.2.3",
7
+ "gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-08-19T22:20:32.142Z",
9
+ "builtAt": "2026-08-22T22:52:46.361Z",
10
10
  "tsrustVersion": "1.10.0",
11
11
  "binary": "rustdb",
12
12
  "target": "linux_amd64"
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "f246ac1ea19eccabcc828bc5f2db6e2eae2ca0ba67e3fdc9f96177cafe39afe1",
3
+ "binarySha256": "81eccfcdbbb51956608e04a3dbac5a13278ea45ad73b756083d614693120b6ba",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdb",
6
- "projectVersion": "5.2.1",
7
- "gitCommit": "31b448f06189fc802c6416f1ce6cd85ef275cbe1",
6
+ "projectVersion": "5.2.3",
7
+ "gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-08-19T22:21:05.240Z",
9
+ "builtAt": "2026-08-22T22:53:24.138Z",
10
10
  "tsrustVersion": "1.10.0",
11
11
  "binary": "rustdb",
12
12
  "target": "linux_arm64"
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "6def4bb635b9993b1d1d8eca70e80500083cc66384f2c99dd39451327fcd027a",
3
+ "binarySha256": "ada67fe412512c8f3a1654f161278a86f4734d07fc45a1229f37d5e90d27de03",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdb",
6
- "projectVersion": "5.2.1",
7
- "gitCommit": "31b448f06189fc802c6416f1ce6cd85ef275cbe1",
6
+ "projectVersion": "5.2.3",
7
+ "gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-08-19T22:22:19.797Z",
9
+ "builtAt": "2026-08-22T22:54:32.399Z",
10
10
  "tsrustVersion": "1.10.0",
11
11
  "binary": "rustdb",
12
12
  "target": "macos_amd64"
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "adb7ae9f7fe8a8f791deaab94cac63a607f79890eaf3be64c273658a4c2b6584",
3
+ "binarySha256": "0b953034b6a3c24ed9bbb0c5e6d3500be88b76c3c6bca8765549edddb81ebdd1",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdb",
6
- "projectVersion": "5.2.1",
7
- "gitCommit": "31b448f06189fc802c6416f1ce6cd85ef275cbe1",
6
+ "projectVersion": "5.2.3",
7
+ "gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-08-19T22:23:06.048Z",
9
+ "builtAt": "2026-08-22T22:55:12.046Z",
10
10
  "tsrustVersion": "1.10.0",
11
11
  "binary": "rustdb",
12
12
  "target": "macos_arm64"
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdb',
6
- version: '5.2.1',
6
+ version: '5.2.3',
7
7
  description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFIQUFxSDtDQUNuSSxDQUFBIn0=
@@ -11,7 +11,6 @@ const FILE_MAGIC = Buffer.from('SMARTDB\0', 'ascii');
11
11
  const FORMAT_VERSION = 1;
12
12
  /** File type tags */
13
13
  const FILE_TYPE_DATA = 1;
14
- const FILE_TYPE_HINT = 3;
15
14
  /** File header total size */
16
15
  const FILE_HEADER_SIZE = 64;
17
16
  /** Per-record magic */
@@ -54,23 +53,6 @@ function encodeDataRecord(timestamp, key, value) {
54
53
  buf.writeUInt32LE(crc, 18);
55
54
  return buf;
56
55
  }
57
- function encodeHintEntry(key, offset, recordLen, valueLen, timestamp) {
58
- const keyBuf = Buffer.from(key, 'utf-8');
59
- const buf = Buffer.alloc(4 + keyBuf.length + 8 + 4 + 4 + 8);
60
- let pos = 0;
61
- buf.writeUInt32LE(keyBuf.length, pos);
62
- pos += 4;
63
- keyBuf.copy(buf, pos);
64
- pos += keyBuf.length;
65
- buf.writeBigUInt64LE(offset, pos);
66
- pos += 8;
67
- buf.writeUInt32LE(recordLen, pos);
68
- pos += 4;
69
- buf.writeUInt32LE(valueLen, pos);
70
- pos += 4;
71
- buf.writeBigUInt64LE(timestamp, pos);
72
- return buf;
73
- }
74
56
  // ---------------------------------------------------------------------------
75
57
  // CRC32 (matching crc32fast in Rust)
76
58
  // ---------------------------------------------------------------------------
@@ -167,7 +149,7 @@ const syncFile = async (filePathArg, signalArg) => {
167
149
  }, signalArg);
168
150
  };
169
151
  const assertPublishedMigrationComplete = async (collectionDirectoryArg) => {
170
- for (const fileName of ['data.rdb', 'keydir.hint', 'indexes.json']) {
152
+ for (const fileName of ['data.rdb', 'indexes.json']) {
171
153
  let fileStat;
172
154
  try {
173
155
  fileStat = await fs.lstat(path.join(collectionDirectoryArg, fileName));
@@ -183,6 +165,9 @@ const assertPublishedMigrationComplete = async (collectionDirectoryArg) => {
183
165
  }
184
166
  }
185
167
  };
168
+ // ---------------------------------------------------------------------------
169
+ // Migration: v0 (JSON) → v1 (Bitcask binary)
170
+ // ---------------------------------------------------------------------------
186
171
  /**
187
172
  * Migrate a storage directory from v0 (JSON-per-collection) to v1 (Bitcask binary).
188
173
  *
@@ -247,8 +232,6 @@ export async function migrateV0ToV1(storagePath, signalArg) {
247
232
  // File header
248
233
  const headerBuf = writeFileHeader(FILE_TYPE_DATA);
249
234
  await writeBuffer(dataFileHandle, headerBuf, signalArg);
250
- let currentOffset = BigInt(FILE_HEADER_SIZE);
251
- const keydir = new Map();
252
235
  const ts = BigInt(Date.now());
253
236
  for (const doc of docs) {
254
237
  signalArg?.throwIfAborted();
@@ -274,27 +257,9 @@ export async function migrateV0ToV1(storagePath, signalArg) {
274
257
  const valueBuf = Buffer.from(bsonBytes);
275
258
  const record = encodeDataRecord(ts, keyBuf, valueBuf);
276
259
  await writeBuffer(dataFileHandle, record, signalArg);
277
- keydir.set(idHex, {
278
- offset: currentOffset,
279
- recordLen: record.length,
280
- valueLen: valueBuf.length,
281
- timestamp: ts,
282
- });
283
- currentOffset += BigInt(record.length);
284
260
  }
285
261
  await dataFileHandle.sync();
286
262
  signalArg?.throwIfAborted();
287
- // Write keydir.hint
288
- const hintPath = path.join(stagingDir, 'keydir.hint');
289
- await withFileHandle(hintPath, 'wx', async (hintFileHandle) => {
290
- await writeBuffer(hintFileHandle, writeFileHeader(FILE_TYPE_HINT), signalArg);
291
- for (const [key, entry] of keydir) {
292
- signalArg?.throwIfAborted();
293
- await writeBuffer(hintFileHandle, encodeHintEntry(key, entry.offset, entry.recordLen, entry.valueLen, entry.timestamp), signalArg);
294
- }
295
- await hintFileHandle.sync();
296
- signalArg?.throwIfAborted();
297
- }, signalArg);
298
263
  }, signalArg);
299
264
  // Copy indexes.json if it exists
300
265
  if (await pathExists(indexJsonPath)) {
@@ -341,4 +306,4 @@ export async function migrateV0ToV1(storagePath, signalArg) {
341
306
  }
342
307
  return deletableFiles;
343
308
  }
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjBfdG9fdjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19taWdyYXRpb24vbWlncmF0b3JzL3YwX3RvX3YxLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qiw4RUFBOEU7QUFDOUUsdURBQXVEO0FBQ3ZELDhFQUE4RTtBQUU5RSxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsNkJBQTZCO0FBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixxQkFBcUI7QUFDckIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6Qiw2QkFBNkI7QUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsdUJBQXVCO0FBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUM1Qiw2QkFBNkI7QUFDN0IsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7QUFFbkQsOEVBQThFO0FBQzlFLDBCQUEwQjtBQUMxQiw4RUFBOEU7QUFFOUUsU0FBUyxlQUFlLENBQUMsUUFBZ0I7SUFDdkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixHQUFHLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMs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
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjBfdG9fdjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19taWdyYXRpb24vbWlncmF0b3JzL3YwX3RvX3YxLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qiw4RUFBOEU7QUFDOUUsdURBQXVEO0FBQ3ZELDhFQUE4RTtBQUU5RSxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsNkJBQTZCO0FBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixxQkFBcUI7QUFDckIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLDZCQUE2QjtBQUM3QixNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUM1Qix1QkFBdUI7QUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBQzVCLDZCQUE2QjtBQUM3QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtBQUVuRCw4RUFBOEU7QUFDOUUsMEJBQTBCO0FBQzFCLDhFQUE4RTtBQUU5RSxTQUFTLGVBQWUsQ0FBQyxRQUFnQjtJQUN2QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLEdBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxVQUFVLENBQUMs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartdb",
3
- "version": "5.2.1",
3
+ "version": "5.2.3",
4
4
  "private": false,
5
5
  "description": "A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.",
6
6
  "exports": {
package/readme.hints.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # smartdb hints
2
2
 
3
+ ## Authoritative File Recovery
4
+
5
+ - `data.rdb` is the sole runtime source for rebuilding KeyDir. The v1 `keydir.hint` format cannot prove completeness or data-generation identity, so existing regular hint files are tolerated for compatibility and diagnostics but their contents are never loaded as runtime state. New shutdowns, compactions, and v0-to-v1 migrations do not publish hints.
6
+ - `KeyDir::build_from_data_file()` streams every payload through CRC32 in fixed-size chunks before allocating its key and never allocates the declared value length. It may classify only a final prefix shorter than `RECORD_HEADER_SIZE` with matching record-magic bytes as an incomplete tail. A full header with a short payload and every checksum, magic, length, or UTF-8 key failure are corruption and must leave `data.rdb` unchanged.
7
+ - Compaction durably removes any legacy hint and syncs the collection directory before replacing `data.rdb`. This ordering forces SmartDB 5.2.1 and earlier to rebuild after downgrade even when the compacted file happens to have the hint's old recorded size.
8
+ - Startup maintenance may skip a publication-held database. Its first later storage access still performs the authoritative scan and fails unchanged on corruption; never infer validation of held data from listener startup alone.
9
+ - Every cancellation-unsafe maintenance, fencing, auth, or storage worker must own a clone of the retained storage-root capability through its final file/lock cleanup. Provider installation is a finite joined startup sweep; periodic maintenance starts only after listener setup has no remaining fallible step. `close()` joins maintenance, `RustDb::drop()` requests cooperative shutdown, and Unix socket cleanup is bound to the exact device/inode created by `bind()`.
10
+
3
11
  ## Stopped Storage-Root Relocation
4
12
 
5
13
  - `LocalSmartDb.relocateStoppedStorageRoot()` is the only supported path-changing operation. It uses a dedicated serialized mutating sidecar runner; do not route it through the disposable offline-inspection helper. A bridge whose termination is unconfirmed remains in the static cleanup gate, and no later relocation may spawn until cleanup succeeds.
package/readme.md CHANGED
@@ -398,7 +398,7 @@ const released = await server.commitDatabasePublication({
398
398
  });
399
399
  ```
400
400
 
401
- The held barrier survives restart and blocks wire commands, transactions, startup recovery, compaction, index restoration, and close-time hint writes for that database while unrelated databases remain available. Commit is exact and idempotent. A successful commit removes the raw capability from durable state and retains only protected verification material. Provider/root identity, durable fenced-mode markers, and bounded startup validation make copied, missing, corrupt, or legacy-active publication state fail closed. A higher fencing token compacts resolved older receipts, so long-lived coordinators do not exhaust receipt capacity.
401
+ The held barrier survives restart and blocks wire commands, transactions, startup recovery, compaction, and index restoration for that database while unrelated databases remain available. Commit is exact and idempotent. A successful commit removes the raw capability from durable state and retains only protected verification material. Provider/root identity, durable fenced-mode markers, and bounded startup validation make copied, missing, corrupt, or legacy-active publication state fail closed. A higher fencing token compacts resolved older receipts, so long-lived coordinators do not exhaust receipt capacity.
402
402
 
403
403
  Durable database publication holds and allocation fencing remain Linux-only. The macOS support described under stopped storage-root relocation does not enable these runtime mutation features.
404
404
 
@@ -682,7 +682,7 @@ const namespaces = await LocalSmartDb.inspectOfflinePhysicalNamespaces({
682
682
 
683
683
  The result is exactly `{ schemaVersion: 1, databases: Array<{ name, collections }> }`. Databases and each database's collections are sorted by physical name, empty database directories are retained, and no documents, index definitions, record identifiers, or values cross the management boundary.
684
684
 
685
- The accepted root must contain the current `.__rustdb_internal/storage-owner.lock`; legacy roots without that lock are rejected. The sidecar takes the shared owner lock, so an active engine causes the call to fail. Every reported collection must have the canonical complete profile of regular `data.rdb`, `wal.rdb`, and `indexes.json` files. A regular `keydir.hint` is optional and is treated only as an allowed cache file. Missing canonical files, unexpected collection entries, malformed index metadata, invalid data or WAL records, symlinks, cross-filesystem traversal, resource-limit exhaustion, and changes observed during inspection fail the complete operation. No partial result is returned and the storage tree is not mutated.
685
+ The accepted root must contain the current `.__rustdb_internal/storage-owner.lock`; legacy roots without that lock are rejected. The sidecar takes the shared owner lock, so an active engine causes the call to fail. Every reported collection must have the canonical complete profile of regular `data.rdb`, `wal.rdb`, and `indexes.json` files. A regular `keydir.hint` is optional and is treated only as an allowed legacy cache file; runtime recovery ignores its contents. Missing canonical files, unexpected collection entries, malformed index metadata, invalid data or WAL records, symlinks, cross-filesystem traversal, resource-limit exhaustion, and changes observed during inspection fail the complete operation. No partial result is returned and the storage tree is not mutated.
686
686
 
687
687
  Inspection performs two full bounded passes and returns only if their namespace results and retained filesystem observations agree. The entry, database, collection, index, file-byte, and record limits are enforced independently on each pass, so total validation work is at most twice the corresponding caller cap. The result-size cap applies to the single serialized result. This is a contract for the current owner-locked canonical SmartDB file-storage profile, not a claim of compatibility with arbitrary MongoDB layouts, legacy SmartDB roots, or unspecified future storage formats.
688
688
 
@@ -967,6 +967,28 @@ const names = await collection.distinct('name');
967
967
 
968
968
  Advertises MongoDB wire protocol versions 0–21. The documented command surface is tested with the official `mongodb` Node.js driver version 7.5.x.
969
969
 
970
+ OP_MSG parsing rejects unknown required flags, invalid CRC-32C checksums,
971
+ duplicate BSON keys, noncanonical array indexes, malformed section boundaries,
972
+ multiple body sections, duplicate or colliding document-sequence identifiers,
973
+ and missing or non-string `$db` fields. Unknown optional flags are ignored. A
974
+ message is limited to 48,000,000 bytes, each BSON document to 16,777,216 bytes,
975
+ and BSON nesting to 100 levels. One message may contain at most 128 sections,
976
+ 10,000 document-sequence documents, 100,000 BSON elements, and 100,000 BSON
977
+ document or array containers. The advertised `maxWriteBatchSize` is therefore
978
+ 10,000.
979
+
980
+ The `moreToCome` request flag is accepted only for the exact `endSessions` or
981
+ `killSessions` cleanup envelope: an `admin` command body containing only the
982
+ session array, `writeConcern: { w: 0 }`, and `$db: "admin"`, with no document
983
+ sequence. It executes without a transport response and leaves the connection
984
+ reusable. Every other `moreToCome` envelope closes before command routing or
985
+ response-owned resource creation.
986
+
987
+ Raw receive buffers and parsed requests are charged separately against a
988
+ process-wide 256 MiB encoded-byte admission budget. Large unread pipelines remain
989
+ charged and are compacted only at geometric utilization thresholds; the budget is
990
+ an encoded-input bound rather than a claim about exact allocator heap usage.
991
+
970
992
  ### Read and Write Concerns
971
993
 
972
994
  SmartDB 5.x does not implement MongoDB `readConcern` or `writeConcern`
@@ -1040,8 +1062,8 @@ The Bitcask-style file storage engine includes several reliability features:
1040
1062
  - **Write-ahead log (WAL)** — every write is logged before being applied, with crash recovery on restart; once committed entries grow past 16 MiB the WAL is checkpointed and truncated at runtime, so `wal.rdb` does not grow unbounded
1041
1063
  - **CRC32 checksums** — every record is integrity-checked on read
1042
1064
  - **Automatic compaction** — dead records are reclaimed when they exceed 50% of file size, runs on startup and after every write
1043
- - **Hint file staleness detection** — the hint file records the data file size at write time; if data.rdb changed since (e.g. crash after a delete), the engine falls back to a full scan to ensure tombstones are not lost
1044
- - **Torn-tail repair** — startup scans `data.rdb` to the last valid record, truncates invalid trailing bytes, and preserves all verified records after interrupted writes
1065
+ - **Authoritative streamed recovery** — collection initialization rebuilds KeyDir from the complete `data.rdb` record stream, verifies each CRC without allocating the declared value size, and never trusts legacy hint files as runtime state; publication-held databases defer this work until first access after release
1066
+ - **Conservative torn-header repair** — collection initialization truncates only a final sequence shorter than the fixed record header whose available record-magic bytes match; checksum, magic, length, UTF-8 key, and full-header short-payload failures stop initialization without changing `data.rdb`
1045
1067
  - **Stale socket cleanup** — orphaned `/tmp/smartdb-*.sock` files from crashed instances are automatically cleaned up on startup
1046
1068
 
1047
1069
  ### Data Integrity CLI 🔍
@@ -1058,14 +1080,14 @@ The Rust binary includes an offline integrity checker:
1058
1080
  # Database: mydb
1059
1081
  # Collection: users
1060
1082
  # Header: OK
1061
- # Records: 1,234 (1,200 live, 34 tombstones)
1062
- # Data size: 2.1 MB
1083
+ # Records: 1234 (1200 live, 34 tombstones)
1084
+ # Data size: 2097152 bytes
1063
1085
  # Duplicates: 0
1064
1086
  # CRC errors: 0
1065
- # Hint file: OK
1087
+ # Hint file: legacy cache (ignored)
1066
1088
  ```
1067
1089
 
1068
- Checks file headers, record CRC32 checksums, duplicate `_id` entries, and hint file consistency. Exit code 1 if any errors are found.
1090
+ Checks file headers, record CRC32 checksums, and duplicate `_id` entries. Existing hint files are reported as ignored legacy caches and do not determine data integrity. Exit code 1 if any authoritative-data errors are found.
1069
1091
 
1070
1092
  ---
1071
1093
 
package/readme.plan.md CHANGED
@@ -3,11 +3,22 @@
3
3
  Status: canonical direction, approved 2026-08-17. Reread before starting engine or
4
4
  managed-service work.
5
5
 
6
- Baseline: `@push.rocks/smartdb` 5.0.1. SmartDB is a Rust database engine with a
6
+ Baseline: `@push.rocks/smartdb` 5.2.2. SmartDB is a Rust database engine with a
7
7
  TypeScript lifecycle facade, a MongoDB wire-protocol command surface, file and
8
8
  memory storage, authentication, transactions, resource fencing, and official
9
9
  MongoDB Node.js driver integration.
10
10
 
11
+ Current execution status:
12
+
13
+ - the legal and provenance gate passed on 2026-08-22
14
+ - Phase 0 and the Phase 1 gate have not passed
15
+ - 5.x maintenance now treats `data.rdb` as authoritative, ignores unverifiable
16
+ legacy hint contents, streams CRC validation, and repairs only an incomplete
17
+ final record-header prefix
18
+ - strict runtime WAL recovery, ambiguous point-write reconciliation, crash-safe
19
+ ordinary DDL, debug-server security, and general crash/soak qualification remain
20
+ separate required slices
21
+
11
22
  ## Product objective
12
23
 
13
24
  Build SmartDB into a commercially operated, MongoDB-driver-compatible managed
@@ -120,7 +131,8 @@ and reproducible baseline measurements.
120
131
 
121
132
  - stop over-advertising MongoDB version, wire behavior, and batch limits
122
133
  - reject ignored concerns, options, commands, and successful administrative stubs
123
- - validate OP_MSG required flags, checksums, and no-response behavior
134
+ - completed slice (2026-08-22): validate OP_MSG required flags, CRC-32C
135
+ checksums, bounded framing, and exact no-response admission and execution
124
136
  - preserve complete BSON type and value identity for document and index keys
125
137
  - reconcile ambiguous point-write failures before returning control to callers
126
138
  - journal DDL and sync every required file and parent directory
@@ -8,10 +8,8 @@ own MIT license and are not repeated below.
8
8
 
9
9
  ## Component Inventory
10
10
 
11
- The package selects MIT wherever an upstream expression offers MIT as an
12
- alternative. The selected licenses for the remaining components are stated in
13
- the table. This inventory was generated from the lockfile with
14
- `cargo license --json`.
11
+ The selected license for each component is stated in the table. This inventory
12
+ was generated from the lockfile with `cargo license --json`.
15
13
 
16
14
  | Component | Version | Upstream expression | Selected license |
17
15
  | --- | --- | --- | --- |
@@ -40,6 +38,7 @@ the table. This inventory was generated from the lockfile with
40
38
  | clap_lex | 1.1.0 | Apache-2.0 OR MIT | MIT |
41
39
  | colorchoice | 1.0.5 | Apache-2.0 OR MIT | MIT |
42
40
  | cpufeatures | 0.2.17 | Apache-2.0 OR MIT | MIT |
41
+ | crc32c | 0.6.8 | Apache-2.0 OR MIT | Apache-2.0 |
43
42
  | crc32fast | 1.5.0 | Apache-2.0 OR MIT | MIT |
44
43
  | crossbeam-utils | 0.8.21 | Apache-2.0 OR MIT | MIT |
45
44
  | crypto-common | 0.1.7 | Apache-2.0 OR MIT | MIT |
@@ -111,6 +110,7 @@ the table. This inventory was generated from the lockfile with
111
110
  | regex-automata | 0.4.14 | Apache-2.0 OR MIT | MIT |
112
111
  | regex-syntax | 0.8.10 | Apache-2.0 OR MIT | MIT |
113
112
  | ring | 0.17.14 | Apache-2.0 AND ISC | Apache-2.0 AND ISC |
113
+ | rustc_version | 0.4.1 | Apache-2.0 OR MIT | MIT |
114
114
  | rustix | 1.1.4 | Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT | MIT |
115
115
  | rustls | 0.23.40 | Apache-2.0 OR ISC OR MIT | MIT |
116
116
  | rustls-pemfile | 2.2.0 | Apache-2.0 OR ISC OR MIT | MIT |
@@ -248,7 +248,7 @@ Copyright (c) 2016 Joe Wilm (utf8parse)
248
248
 
249
249
  Copyright (c) 2016 Joseph Birr-Pixton <jpixton@gmail.com> (rustls, rustls-pemfile)
250
250
 
251
- Copyright (c) 2016 The Rust Project Developers (lock_api, parking_lot, parking_lot_core, thread_local)
251
+ Copyright (c) 2016 The Rust Project Developers (lock_api, parking_lot, parking_lot_core, rustc_version, thread_local)
252
252
 
253
253
  Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com> (strsim)
254
254
 
@@ -374,7 +374,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
374
374
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
375
375
  SOFTWARE.
376
376
 
377
- ## Apache-2.0 Notice for ring
377
+ ## Apache-2.0 Notices
378
+
379
+ ### ring
378
380
 
379
381
  `ring` includes BoringSSL-derived, once_cell-derived, and fiat-crypto-derived
380
382
  code under the Apache License 2.0. The fiat-crypto-derived code carries this
@@ -741,6 +743,30 @@ the following restrictions:
741
743
  misrepresented as being the original software.
742
744
  3. This notice may not be removed or altered from any source distribution.
743
745
 
746
+ ## Zlib-derived Notice for crc32c
747
+
748
+ The `crc32c` component's `src/combine.rs` is based on the Zlib project's
749
+ `crc32.c` combine implementation and carries the following notice:
750
+
751
+ crc32.c -- compute the CRC-32 of a data stream
752
+ Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
753
+
754
+ This software is provided 'as-is', without any express or implied warranty. In
755
+ no event will the authors be held liable for any damages arising from the use of
756
+ this software.
757
+
758
+ Permission is granted to anyone to use this software for any purpose, including
759
+ commercial applications, and to alter it and redistribute it freely, subject to
760
+ the following restrictions:
761
+
762
+ 1. The origin of this software must not be misrepresented; you must not claim
763
+ that you wrote the original software. If you use this software in a product,
764
+ an acknowledgment in the product documentation would be appreciated but is
765
+ not required.
766
+ 2. Altered source versions must be plainly marked as such, and must not be
767
+ misrepresented as being the original software.
768
+ 3. This notice may not be removed or altered from any source distribution.
769
+
744
770
  ## Unicode License V3 for unicode-ident
745
771
 
746
772
  COPYRIGHT AND PERMISSION NOTICE
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdb',
6
- version: '5.2.1',
6
+ version: '5.2.3',
7
7
  description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
8
8
  }
@@ -13,7 +13,6 @@ const FILE_MAGIC = Buffer.from('SMARTDB\0', 'ascii');
13
13
  const FORMAT_VERSION = 1;
14
14
  /** File type tags */
15
15
  const FILE_TYPE_DATA = 1;
16
- const FILE_TYPE_HINT = 3;
17
16
  /** File header total size */
18
17
  const FILE_HEADER_SIZE = 64;
19
18
  /** Per-record magic */
@@ -63,19 +62,6 @@ function encodeDataRecord(timestamp: bigint, key: Buffer, value: Buffer): Buffer
63
62
  return buf;
64
63
  }
65
64
 
66
- function encodeHintEntry(key: string, offset: bigint, recordLen: number, valueLen: number, timestamp: bigint): Buffer {
67
- const keyBuf = Buffer.from(key, 'utf-8');
68
- const buf = Buffer.alloc(4 + keyBuf.length + 8 + 4 + 4 + 8);
69
- let pos = 0;
70
- buf.writeUInt32LE(keyBuf.length, pos); pos += 4;
71
- keyBuf.copy(buf, pos); pos += keyBuf.length;
72
- buf.writeBigUInt64LE(offset, pos); pos += 8;
73
- buf.writeUInt32LE(recordLen, pos); pos += 4;
74
- buf.writeUInt32LE(valueLen, pos); pos += 4;
75
- buf.writeBigUInt64LE(timestamp, pos);
76
- return buf;
77
- }
78
-
79
65
  // ---------------------------------------------------------------------------
80
66
  // CRC32 (matching crc32fast in Rust)
81
67
  // ---------------------------------------------------------------------------
@@ -214,7 +200,7 @@ const syncFile = async (filePathArg: string, signalArg?: AbortSignal): Promise<v
214
200
  const assertPublishedMigrationComplete = async (
215
201
  collectionDirectoryArg: string,
216
202
  ): Promise<void> => {
217
- for (const fileName of ['data.rdb', 'keydir.hint', 'indexes.json']) {
203
+ for (const fileName of ['data.rdb', 'indexes.json']) {
218
204
  let fileStat: Awaited<ReturnType<typeof fs.lstat>>;
219
205
  try {
220
206
  fileStat = await fs.lstat(path.join(collectionDirectoryArg, fileName));
@@ -239,13 +225,6 @@ const assertPublishedMigrationComplete = async (
239
225
  // Migration: v0 (JSON) → v1 (Bitcask binary)
240
226
  // ---------------------------------------------------------------------------
241
227
 
242
- interface IKeyDirEntry {
243
- offset: bigint;
244
- recordLen: number;
245
- valueLen: number;
246
- timestamp: bigint;
247
- }
248
-
249
228
  /**
250
229
  * Migrate a storage directory from v0 (JSON-per-collection) to v1 (Bitcask binary).
251
230
  *
@@ -320,8 +299,6 @@ export async function migrateV0ToV1(
320
299
  const headerBuf = writeFileHeader(FILE_TYPE_DATA);
321
300
  await writeBuffer(dataFileHandle, headerBuf, signalArg);
322
301
 
323
- let currentOffset = BigInt(FILE_HEADER_SIZE);
324
- const keydir: Map<string, IKeyDirEntry> = new Map();
325
302
  const ts = BigInt(Date.now());
326
303
 
327
304
  for (const doc of docs) {
@@ -348,40 +325,10 @@ export async function migrateV0ToV1(
348
325
  const record = encodeDataRecord(ts, keyBuf, valueBuf);
349
326
  await writeBuffer(dataFileHandle, record, signalArg);
350
327
 
351
- keydir.set(idHex, {
352
- offset: currentOffset,
353
- recordLen: record.length,
354
- valueLen: valueBuf.length,
355
- timestamp: ts,
356
- });
357
-
358
- currentOffset += BigInt(record.length);
359
328
  }
360
329
 
361
330
  await dataFileHandle.sync();
362
331
  signalArg?.throwIfAborted();
363
-
364
- // Write keydir.hint
365
- const hintPath = path.join(stagingDir, 'keydir.hint');
366
- await withFileHandle(hintPath, 'wx', async (hintFileHandle) => {
367
- await writeBuffer(hintFileHandle, writeFileHeader(FILE_TYPE_HINT), signalArg);
368
- for (const [key, entry] of keydir) {
369
- signalArg?.throwIfAborted();
370
- await writeBuffer(
371
- hintFileHandle,
372
- encodeHintEntry(
373
- key,
374
- entry.offset,
375
- entry.recordLen,
376
- entry.valueLen,
377
- entry.timestamp,
378
- ),
379
- signalArg,
380
- );
381
- }
382
- await hintFileHandle.sync();
383
- signalArg?.throwIfAborted();
384
- }, signalArg);
385
332
  }, signalArg);
386
333
 
387
334
  // Copy indexes.json if it exists