@lossless.org/nosqldb 9.0.1 → 10.1.1

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.
Files changed (42) hide show
  1. package/dist_rust/rustdb_linux_amd64 +0 -0
  2. package/dist_rust/rustdb_linux_amd64.tsrust-build.json +4 -4
  3. package/dist_rust/rustdb_linux_amd64_musl +0 -0
  4. package/dist_rust/rustdb_linux_amd64_musl.tsrust-build.json +4 -4
  5. package/dist_rust/rustdb_linux_arm64 +0 -0
  6. package/dist_rust/rustdb_linux_arm64.tsrust-build.json +4 -4
  7. package/dist_rust/rustdb_linux_arm64_musl +0 -0
  8. package/dist_rust/rustdb_linux_arm64_musl.tsrust-build.json +4 -4
  9. package/dist_rust/rustdb_macos_amd64 +0 -0
  10. package/dist_rust/rustdb_macos_amd64.tsrust-build.json +4 -4
  11. package/dist_rust/rustdb_macos_arm64 +0 -0
  12. package/dist_rust/rustdb_macos_arm64.tsrust-build.json +4 -4
  13. package/dist_ts/00_commitinfo_data.js +2 -2
  14. package/dist_ts/ts_local/classes.localnosqldb.d.ts +15 -5
  15. package/dist_ts/ts_local/classes.localnosqldb.js +119 -11
  16. package/dist_ts/ts_nosqldb/file-storage-startup.d.ts +1 -1
  17. package/dist_ts/ts_nosqldb/file-storage-startup.js +4 -2
  18. package/dist_ts/ts_nosqldb/index.d.ts +3 -0
  19. package/dist_ts/ts_nosqldb/index.js +2 -1
  20. package/dist_ts/ts_nosqldb/rust-db-bridge.d.ts +10 -0
  21. package/dist_ts/ts_nosqldb/rust-db-bridge.js +37 -5
  22. package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.d.ts +1 -1
  23. package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.js +2 -1
  24. package/dist_ts/ts_nosqldb/service-types.d.ts +4 -0
  25. package/dist_ts/ts_nosqldb/service-types.js +1 -1
  26. package/dist_ts/ts_nosqldb/stopped-storage.d.ts +69 -0
  27. package/dist_ts/ts_nosqldb/stopped-storage.js +44 -0
  28. package/dist_ts/ts_nosqldb/storage-root-alignment.d.ts +58 -0
  29. package/dist_ts/ts_nosqldb/storage-root-alignment.js +129 -0
  30. package/dist_ts/ts_nosqldb/storage-root-relocation.js +12 -10
  31. package/package.json +1 -1
  32. package/readme.md +176 -13
  33. package/ts/00_commitinfo_data.ts +1 -1
  34. package/ts/ts_local/classes.localnosqldb.ts +123 -15
  35. package/ts/ts_nosqldb/file-storage-startup.ts +3 -2
  36. package/ts/ts_nosqldb/index.ts +13 -0
  37. package/ts/ts_nosqldb/rust-db-bridge.ts +52 -4
  38. package/ts/ts_nosqldb/server/classes.nosqldbserver.ts +2 -1
  39. package/ts/ts_nosqldb/service-types.ts +4 -0
  40. package/ts/ts_nosqldb/stopped-storage.ts +108 -0
  41. package/ts/ts_nosqldb/storage-root-alignment.ts +176 -0
  42. package/ts/ts_nosqldb/storage-root-relocation.ts +9 -7
@@ -0,0 +1,129 @@
1
+ import * as plugins from './plugins.js';
2
+ import { normalizeLocalNoSqlDbStoppedStorageRootRelocationInput } from './storage-root-relocation.js';
3
+ import { NoSqlDbStoppedOperationError, normalizeStoppedStorageRootInspectionInput, } from './stopped-storage.js';
4
+ function fail(code) { throw new NoSqlDbStoppedOperationError(code); }
5
+ const data = (value, required, optional = []) => {
6
+ if (!value || Object.getPrototypeOf(value) !== Object.prototype)
7
+ return false;
8
+ const keys = Reflect.ownKeys(value);
9
+ if (keys.some(key => typeof key !== 'string' || ![...required, ...optional].includes(key)))
10
+ return false;
11
+ return required.every(key => keys.includes(key)) && keys.every(key => {
12
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
13
+ return descriptor.enumerable && 'value' in descriptor;
14
+ });
15
+ };
16
+ const sha = (value) => typeof value === 'string' && /^[0-9a-f]{64}$/.test(value);
17
+ const decimal = (value) => typeof value === 'string'
18
+ && /^(0|[1-9][0-9]{0,19})$/.test(value) && BigInt(value) <= 18446744073709551615n;
19
+ const lineage = (value) => typeof value === 'string' && value.length > 0
20
+ && plugins.buffer.Buffer.byteLength(value) <= 256 && !/\p{Cc}/u.test(value);
21
+ const digest = (domain, payload) => plugins.crypto.createHash('sha256')
22
+ .update(domain).update(JSON.stringify(payload)).digest('hex');
23
+ export const normalizeStoppedStorageRootAlignmentInput = (value) => {
24
+ if (!data(value, ['folderPath', 'receiptPath', 'alignmentId', 'identityPolicy', 'attestLineageNeverFenced'], ['expect', 'acknowledgeUnverifiedCopy', 'dryRun']))
25
+ fail('INVALID_REQUEST');
26
+ try {
27
+ normalizeStoppedStorageRootInspectionInput({ folderPath: value.folderPath });
28
+ normalizeStoppedStorageRootInspectionInput({ folderPath: value.receiptPath });
29
+ normalizeLocalNoSqlDbStoppedStorageRootRelocationInput({ sourceFolderPath: value.folderPath,
30
+ destinationFolderPath: value.receiptPath, relocationId: value.alignmentId });
31
+ }
32
+ catch {
33
+ fail('INVALID_REQUEST');
34
+ }
35
+ if (value.identityPolicy !== 'fork' || value.attestLineageNeverFenced !== true
36
+ || (value.dryRun !== undefined && typeof value.dryRun !== 'boolean'))
37
+ fail('INVALID_REQUEST');
38
+ let expect;
39
+ if (value.expect !== undefined) {
40
+ const pins = value.expect;
41
+ if (value.acknowledgeUnverifiedCopy !== undefined || !data(pins, ['groupId', 'timelineId', 'lsn', 'recordsSha256'], ['providerRootId'])
42
+ || !lineage(pins.groupId) || !lineage(pins.timelineId) || !decimal(pins.lsn) || pins.lsn === '0'
43
+ || !sha(pins.recordsSha256) || (pins.providerRootId !== undefined && !sha(pins.providerRootId)))
44
+ fail('INVALID_REQUEST');
45
+ expect = { groupId: pins.groupId, timelineId: pins.timelineId, lsn: pins.lsn, recordsSha256: pins.recordsSha256,
46
+ ...(pins.providerRootId === undefined ? {} : { providerRootId: pins.providerRootId }) };
47
+ }
48
+ else if (value.acknowledgeUnverifiedCopy !== true)
49
+ fail('INVALID_REQUEST');
50
+ return { folderPath: value.folderPath, receiptPath: value.receiptPath, alignmentId: value.alignmentId,
51
+ identityPolicy: 'fork', attestLineageNeverFenced: true,
52
+ ...(expect ? { expect } : { acknowledgeUnverifiedCopy: true }), ...(value.dryRun ? { dryRun: true } : {}) };
53
+ };
54
+ export const storageRootAlignmentRequestDigest = (request) => digest('smartdb.storage-root-alignment.request.v1\0', [request.folderPath, request.receiptPath, request.alignmentId,
55
+ request.identityPolicy, request.attestLineageNeverFenced, request.expect ? [request.expect.groupId,
56
+ request.expect.timelineId, request.expect.lsn, request.expect.recordsSha256, request.expect.providerRootId ?? null] : null,
57
+ request.acknowledgeUnverifiedCopy ?? null]);
58
+ const receiptFields = ['format', 'status', 'alignmentId', 'folderPath', 'receiptPath', 'requestSha256',
59
+ 'previousProviderRootId', 'providerRootId', 'bindingChange', 'groupId', 'timelineId', 'sourceLsn', 'alignedLsn', 'records',
60
+ 'sourceRecordsSha256', 'alignedRecordsSha256', 'preservedRecordsSha256', 'pinned'];
61
+ const eligibleGenerations = (value) => {
62
+ if (!data(value, ['manifest', 'onDisk']) || !decimal(value.manifest) || !Array.isArray(value.onDisk)
63
+ || !value.onDisk.length || !value.onDisk.includes(value.manifest))
64
+ return false;
65
+ const manifest = BigInt(value.manifest);
66
+ return value.onDisk.every(generation => decimal(generation) && BigInt(generation) <= manifest);
67
+ };
68
+ const eligibleInspection = (value, request) => {
69
+ if (!data(value, ['status', 'bindingState', 'bindingChange', 'storagePurpose', 'profileSchema', 'providerRootId',
70
+ 'groupId', 'timelineId', 'lsn', 'records', 'recordsSha256', 'recordsWithoutFencingProfileSha256', 'authUsers',
71
+ 'authority', 'generations', 'alignmentEligible', 'reasons', 'physicalAdmissionViolations'])
72
+ || value.status !== 'audited' || value.alignmentEligible !== true || value.storagePurpose !== 'production'
73
+ || ![1, 4].includes(value.profileSchema) || !sha(value.providerRootId) || !sha(value.recordsSha256)
74
+ || !sha(value.recordsWithoutFencingProfileSha256) || !lineage(value.groupId) || !lineage(value.timelineId)
75
+ || !decimal(value.lsn) || value.lsn === '0' || !decimal(value.records) || value.records === '0' || value.authUsers !== '0'
76
+ || !['none', 'path', 'inode', 'path+inode'].includes(value.bindingChange)
77
+ || value.bindingState !== (value.bindingChange === 'none' ? 'matching' : 'foreign')
78
+ || !data(value.authority, ['resourceFences', 'receipts', 'publicationHolds', 'activeAllocations', 'retiredAllocations',
79
+ 'allocationReplays', 'activeGrants', 'importStages']) || Object.values(value.authority).some(count => count !== '0')
80
+ || !eligibleGenerations(value.generations)
81
+ || !Array.isArray(value.reasons) || value.reasons.length || !Array.isArray(value.physicalAdmissionViolations)
82
+ || value.physicalAdmissionViolations.length)
83
+ return false;
84
+ const pins = request.expect;
85
+ return !pins || (value.groupId === pins.groupId && value.timelineId === pins.timelineId && value.lsn === pins.lsn
86
+ && value.recordsSha256 === pins.recordsSha256 && (pins.providerRootId === undefined || value.providerRootId === pins.providerRootId));
87
+ };
88
+ export const normalizeStoppedStorageRootAlignmentResult = (value, request) => {
89
+ if (!value || typeof value !== 'object' || !('status' in value))
90
+ fail('RECOVERY_REQUIRED');
91
+ if (value.status === 'eligible' || value.status === 'already-bound') {
92
+ if (!data(value, value.status === 'eligible' ? ['status', 'inspection'] : ['status', 'inspection', 'bindingChange']))
93
+ fail('RECOVERY_REQUIRED');
94
+ const record = value;
95
+ const inspection = record.inspection;
96
+ if (!eligibleInspection(inspection, request)
97
+ || (value.status === 'eligible' && !request.dryRun)
98
+ || (value.status === 'already-bound' && (record.bindingChange !== 'none' || inspection.bindingState !== 'matching')))
99
+ fail('RECOVERY_REQUIRED');
100
+ return value;
101
+ }
102
+ if (!data(value, [...receiptFields, 'receiptSha256']))
103
+ fail('RECOVERY_REQUIRED');
104
+ const receipt = value;
105
+ if (receipt.format !== 'smartdb.storage-root-alignment.receipt.v1' || receipt.status !== 'aligned'
106
+ || receipt.alignmentId !== request.alignmentId || receipt.folderPath !== request.folderPath || receipt.receiptPath !== request.receiptPath
107
+ || receipt.requestSha256 !== storageRootAlignmentRequestDigest(request) || receipt.pinned !== (request.expect !== undefined)
108
+ || ![receipt.previousProviderRootId, receipt.providerRootId, receipt.sourceRecordsSha256, receipt.alignedRecordsSha256,
109
+ receipt.preservedRecordsSha256, receipt.receiptSha256].every(sha)
110
+ || receipt.previousProviderRootId === receipt.providerRootId || !lineage(receipt.groupId) || !lineage(receipt.timelineId)
111
+ || !['path', 'inode', 'path+inode'].includes(receipt.bindingChange)
112
+ || !decimal(receipt.sourceLsn) || receipt.sourceLsn === '0' || !decimal(receipt.alignedLsn)
113
+ || BigInt(receipt.sourceLsn) + 1n !== BigInt(receipt.alignedLsn) || !decimal(receipt.records) || receipt.records === '0'
114
+ || receipt.receiptSha256 !== digest('smartdb.storage-root-alignment.receipt.v1\0', receiptFields.map(key => receipt[key])))
115
+ fail('RECOVERY_REQUIRED');
116
+ if (request.expect && (receipt.groupId !== request.expect.groupId || receipt.timelineId !== request.expect.timelineId
117
+ || receipt.sourceLsn !== request.expect.lsn || receipt.sourceRecordsSha256 !== request.expect.recordsSha256
118
+ || (request.expect.providerRootId !== undefined && receipt.previousProviderRootId !== request.expect.providerRootId)))
119
+ fail('RECOVERY_REQUIRED');
120
+ return { ...receipt };
121
+ };
122
+ export const normalizeStoppedStorageRootAlignmentAbortResult = (value, request) => {
123
+ if (!data(value, ['status', 'alignmentId', 'folderPath', 'receiptPath'])
124
+ || (value.status !== 'aborted' && value.status !== 'not-pending') || value.alignmentId !== request.alignmentId
125
+ || value.folderPath !== request.folderPath || value.receiptPath !== request.receiptPath)
126
+ fail('RECOVERY_REQUIRED');
127
+ return value;
128
+ };
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1yb290LWFsaWdubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX25vc3FsZGIvc3RvcmFnZS1yb290LWFsaWdubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsc0RBQXNELEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RyxPQUFPLEVBQ0wsNEJBQTRCLEVBQUUsMENBQTBDLEdBRXpFLE1BQU0sc0JBQXNCLENBQUM7QUFvRDlCLFNBQVMsSUFBSSxDQUFDLElBQTZDLElBQVcsTUFBTSxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNySCxNQUFNLElBQUksR0FBRyxDQUFDLEtBQWMsRUFBRSxRQUFrQixFQUFFLFdBQXFCLEVBQUUsRUFBb0MsRUFBRTtJQUM3RyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxN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
@@ -173,7 +173,6 @@ export const normalizeLocalNoSqlDbStoppedStorageRootRelocationReceipt = (valueAr
173
173
  export const assertNoLocalNoSqlDbStorageRootRelocationWorkspace = async (storagePathArg) => {
174
174
  const storagePath = plugins.path.resolve(storagePathArg);
175
175
  const internalPath = plugins.path.join(storagePath, '.__rustdb_internal');
176
- const workspacePath = plugins.path.join(internalPath, 'storage-root-relocation');
177
176
  try {
178
177
  const storage = await plugins.fs.stat(storagePath);
179
178
  if (!storage.isDirectory()) {
@@ -196,16 +195,19 @@ export const assertNoLocalNoSqlDbStorageRootRelocationWorkspace = async (storage
196
195
  return;
197
196
  throw new Error('NoSQLDB storage-root relocation workspace inspection is ambiguous');
198
197
  }
199
- try {
200
- await plugins.fs.lstat(workspacePath);
201
- }
202
- catch (error) {
203
- if (error.code === 'ENOENT')
204
- return;
205
- throw new Error('NoSQLDB storage-root relocation workspace inspection is ambiguous');
198
+ for (const operation of ['relocation', 'alignment']) {
199
+ const workspacePath = plugins.path.join(internalPath, `storage-root-${operation}`);
200
+ try {
201
+ await plugins.fs.lstat(workspacePath);
202
+ }
203
+ catch (error) {
204
+ if (error.code === 'ENOENT')
205
+ continue;
206
+ throw new Error(`NoSQLDB storage-root ${operation} workspace inspection is ambiguous`);
207
+ }
208
+ throw new Error(`NoSQLDB storage-root ${operation} recovery must complete before startup`);
206
209
  }
207
- throw new Error('NoSQLDB storage-root relocation recovery must complete before startup');
208
210
  };
209
211
  export const isLocalNoSqlDbStorageRootRelocationErrorCode = (valueArg) => typeof valueArg === 'string'
210
212
  && localNoSqlDbStorageRootRelocationErrorCodes.includes(valueArg);
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1yb290LXJlbG9jYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19ub3NxbGRiL3N0b3JhZ2Utcm9vdC1yZWxvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLDJDQUEyQyxHQUFHO0lBQ3pELGlCQUFpQjtJQUNqQixhQUFhO0lBQ2IsTUFBTTtJQUNOLFdBQVc7SUFDWCxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxJQUFJO0lBQ0osbUJBQW1CO0NBQ1gsQ0FBQztBQXdCWCxNQUFNLE9BQU8sc0NBQXVDLFNBQVEsS0FBSztJQUcvRCxZQUFtQixPQUFvRDtRQUNyRSxLQUFLLENBQUMsNERBQTRELE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLElBQUksR0FBRyx3Q0FBd0MsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsY0FBYztDQUNOLENBQUM7QUFDWCxNQUFNLHFCQUFxQixHQUFHO0lBQzVCLFFBQVE7SUFDUixTQUFTO0lBQ1QsY0FBYztJQUNkLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLHVCQUF1QjtDQUNmLENBQUM7QUFDWCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQUNwQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUNyQyxNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsOENBQThDLENBQUM7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
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1yb290LXJlbG9jYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19ub3NxbGRiL3N0b3JhZ2Utcm9vdC1yZWxvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLDJDQUEyQyxHQUFHO0lBQ3pELGlCQUFpQjtJQUNqQixhQUFhO0lBQ2IsTUFBTTtJQUNOLFdBQVc7SUFDWCxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxJQUFJO0lBQ0osbUJBQW1CO0NBQ1gsQ0FBQztBQXdCWCxNQUFNLE9BQU8sc0NBQXVDLFNBQVEsS0FBSztJQUcvRCxZQUFtQixPQUFvRDtRQUNyRSxLQUFLLENBQUMsNERBQTRELE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLElBQUksR0FBRyx3Q0FBd0MsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsY0FBYztDQUNOLENBQUM7QUFDWCxNQUFNLHFCQUFxQixHQUFHO0lBQzVCLFFBQVE7SUFDUixTQUFTO0lBQ1QsY0FBYztJQUNkLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLHVCQUF1QjtDQUNmLENBQUM7QUFDWCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQUNwQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUNyQyxNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsOENBQThDLENBQUM7QUFFM0UsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsT0FBb0QsRUFDWixFQUFFLENBQzFDLElBQUksc0NBQXNDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFdEQsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixRQUFpQixFQUNqQixPQUEwQixFQUNXLEVBQUU7SUFDdkMsSUFDRSxPQUFPLFFBQVEsS0FBSyxRQUFRO1dBQ3pCLFFBQVEsS0FBSyxJQUFJO1dBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1dBQ3ZCLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFDdkQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsSUFDRSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNO1dBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDcEYsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUM5QixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsT0FBTyxVQUFVLEtBQUssU0FBUztlQUMxQixVQUFVLENBQUMsVUFBVTtlQUNyQixNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQWdCLEVBQVcsRUFBRTtJQUMvRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksSUFBSSxHQUFHLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDakQsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDO2FBQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBVyxFQUFFO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1RCxPQUFPLFFBQVEsS0FBSyxFQUFFO1dBQ2pCLFFBQVEsS0FBSyxJQUFJO1dBQ2pCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7V0FDN0MsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBVSxFQUFFO0lBQ3hELElBQ0UsT0FBTyxRQUFRLEtBQUssUUFBUTtXQUN6QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztXQUNsQyxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQztXQUNyQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUNuRSxDQUFDO1FBQ0QsTUFBTSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxJQUFJLFlBQVksR0FBRyxDQUFDLElBQUksWUFBWSxHQUFHLHNCQUFzQixFQUFFLENBQUM7UUFDOUQsTUFBTSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RSxJQUNFLGVBQWUsR0FBRyxDQUFDO1dBQ2hCLGVBQWUsR0FBRyxzQkFBc0I7V0FDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVU7V0FDbEQsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUM7V0FDdkMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDckUsQ0FBQztRQUNELE1BQU0sZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNEQUFzRCxHQUFHLENBQ3BFLFFBQXdELEVBQ1IsRUFBRTtJQUNsRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbEYsSUFDRSxnQkFBZ0IsS0FBSyxxQkFBcUI7V0FDdkMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDO1dBQ3JELFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxFQUN4RCxDQUFDO1FBQ0QsTUFBTSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFDRSxPQUFPLFFBQVEsQ0FBQyxZQUFZLEtBQUssUUFBUTtXQUN0QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyx3QkFBd0I7V0FDMUYsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUNoRSxDQUFDO1FBQ0QsTUFBTSxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTztRQUNMLGdCQUFnQjtRQUNoQixxQkFBcUI7UUFDckIsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO0tBQ3BDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUNwQixVQUFtRixFQUMzRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU07S0FDeEIsVUFBVSxDQUFDLFFBQVEsQ0FBQztLQUNwQixNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDO0tBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztLQUMxQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFakIsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FDdEUsT0FBTyxRQUFRLEtBQUssUUFBUTtPQUN6QiwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO09BQ3pDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLElBQUksUUFBUSxJQUFJLGlCQUFpQixDQUFDLENBQUM7QUFFN0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFFBQWlCLEVBQXNCLEVBQUUsQ0FDbEUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSx3REFBd0QsR0FBRyxDQUN0RSxRQUFpQixFQUNqQixRQUF3RCxFQUNOLEVBQUU7SUFDcEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7UUFDN0QsTUFBTSxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBdUUsQ0FBQztJQUN4RixJQUNFLE9BQU8sQ0FBQyxNQUFNLEtBQUssNENBQTRDO1dBQzVELE9BQU8sQ0FBQyxPQUFPLEtBQUssQ0FBQztXQUNyQixPQUFPLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxZQUFZO1dBQzlDLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLENBQUMsZ0JBQWdCO1dBQ3RELE9BQU8sQ0FBQyxxQkFBcUIsS0FBSyxRQUFRLENBQUMscUJBQXFCO1dBQ2hFLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztXQUMxQyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztXQUNqRCxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztXQUNoRCxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7V0FDekMsT0FBTyxDQUFDLHFCQUFxQixLQUFLLElBQUksRUFDekMsQ0FBQztRQUNELE1BQU0sZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQ2xDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7UUFDMUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQjtRQUNwRCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7UUFDdEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtRQUM1QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1FBQzFDLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxxQkFBcUI7S0FDNkIsQ0FBQztJQUNwRixJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0QsTUFBTSxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDcEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0RBQWtELEdBQUcsS0FBSyxFQUNyRSxjQUFzQixFQUNQLEVBQUU7SUFDakIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBVSxFQUFFLENBQUM7UUFDN0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGdCQUFnQixTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFLLEtBQStCLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixTQUFTLG9DQUFvQyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFNBQVMsd0NBQXdDLENBQUMsQ0FBQztJQUM3RixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNENBQTRDLEdBQUcsQ0FDMUQsUUFBaUIsRUFDd0MsRUFBRSxDQUMzRCxPQUFPLFFBQVEsS0FBSyxRQUFRO09BQ3pCLDJDQUEyQyxDQUFDLFFBQVEsQ0FDckQsUUFBdUQsQ0FDeEQsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lossless.org/nosqldb",
3
- "version": "9.0.1",
3
+ "version": "10.1.1",
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.md CHANGED
@@ -365,39 +365,76 @@ accepts `folderPath`, `socketPath`, `binaryPath` and the same `auth` options.
365
365
 
366
366
  #### Native query and maintenance efficiency
367
367
 
368
- Bounded synchronous reads share a retained generation lease. Filesystem ownership
369
- and generation bindings are validated before and after the batch; mutation,
370
- durability, cancellation and close checks remain enforced.
368
+ Bounded synchronous reads, including principal resolution, publication authority
369
+ and query setup, share a retained generation lease. Filesystem ownership and
370
+ generation bindings are validated before and after the batch; mutation,
371
+ durability, cancellation and close checks remain enforced. No lease or resolved
372
+ authorization is reused across requests or asynchronous suspensions.
373
+
374
+ Compound indexes combine leading equality fields with a range on the next field.
375
+ For example, `{ serverId: 1, timestamp: 1 }` seeks directly into the requested
376
+ server's time interval. Inclusive/exclusive endpoints, descending components,
377
+ trailing fields and reverse pagination retain their normal semantics. The full
378
+ predicate is still checked for every selected candidate.
371
379
 
372
380
  For a query whose filter references only `_id` and whose projection is exactly
373
381
  `{ _id: 1 }`, the native primary index can supply the original BSON identity
374
382
  without loading the document payload. Range endpoints, order, skip, limit and
375
383
  cursor pagination retain their normal semantics. The engine verifies the index
376
- and unique-owner values, the document frame's existence and the matching commit
377
- versions. A covered read does not checksum an unrequested document payload.
378
- Older records whose identity was not committed with their current document use
379
- the normal bounded body read; ordinary writes refresh the covering identity.
384
+ and unique-owner values, the document frame's existence, and either matching
385
+ commit versions or a storage-owned SHA-256 certificate of the exact BSON `_id`.
386
+ Updates that keep the same identity leave the primary owner and its certificate
387
+ unchanged, avoiding an extra index rewrite. Numeric BSON width changes update
388
+ the certificate and primary identity atomically with the body. A covered read
389
+ does not checksum an unrequested document payload. Older records without a
390
+ usable identity proof use the normal bounded body read; the next actual write
391
+ adds the certificate.
380
392
  Secondary-index projections and predicates requiring other fields retain normal
381
393
  document reads. No application cache or configuration flag is required.
382
394
 
395
+ Concurrent wire `insert`, `update`, `delete` and `findAndModify` commands can share
396
+ one durability flush. Each command keeps its own commit marker and retry outcome.
397
+ Only the private write group sees provisional roots; readers and replies see
398
+ results after the final flush. The queue holds at most 16 jobs, adds no deliberate
399
+ delay, and ends each group after 16 jobs or 64 MiB of appended data (one admitted
400
+ command can cross that byte threshold). Authority, session and input-resource
401
+ lifetimes remain held through durability. History publication also waits for the
402
+ flush. DDL, transactions, index builds, imports and maintenance retain their
403
+ existing independently durable publication paths.
404
+
405
+ **Storage compatibility:** version 10 adds a 40-byte certified document-ordinal
406
+ record alongside the legacy 8-byte ordinal. It reads existing stores directly;
407
+ startup and reads perform no format rewrite. After version 10 writes certified
408
+ records, use version 10 or later to reopen that store. Older binaries reject the
409
+ new record representation. Keep a pre-upgrade backup if a binary downgrade is
410
+ required. The K2 pages, commit markers and recovery protocol are unchanged.
411
+
383
412
  Maintenance batches catalog work and parks completed reclamation and no-TTL
384
413
  sweeps until the committed position changes. Session cleanup skips its metadata
385
414
  scan until a session can expire. Compaction uses the persisted generation anchor
386
415
  as its baseline, so reopening an already-compacted root does not rewrite it.
387
416
  Compaction runs separately from TTL maintenance, observes shutdown cancellation,
388
417
  and does not restart a large copy because a short maintenance deadline elapsed.
389
- The existing native storage format is preserved.
418
+ These maintenance optimizations preserve the existing generation and commit formats.
390
419
 
391
- #### Current-format-only file startup
420
+ #### File startup admission
392
421
 
393
422
  `INoSqlDbServerOptions.fileStorageStartup` and
394
- `ILocalNoSqlDbOptions.fileStorageStartup` accept only
395
- `'current-format-only'`, which is also the default for file storage.
423
+ `ILocalNoSqlDbOptions.fileStorageStartup` accept `'current-format-only'`
424
+ (the default) or `'existing-only'` for file storage.
396
425
  The exported type is `TNoSqlDbFileStorageStartup`. Invalid values, including
397
426
  `'migrate'`, reject at construction. Selecting the policy with memory storage
398
427
  also rejects.
399
428
 
400
- Startup accepts a fresh root or a current native root. Foreign, old, mixed and
429
+ Default startup accepts a fresh root or a current native root. Use
430
+ `fileStorageStartup: 'existing-only'` when the database must already exist:
431
+ missing paths, empty directories and identity-only roots without committed
432
+ initialization fail instead of creating an empty database. The native owner
433
+ enforces this policy; no TypeScript existence check or fallback can create a
434
+ new root. Older binaries reject the new option rather than silently ignoring it.
435
+ Rehearsal startup retains its separate current-format-only configuration.
436
+
437
+ Foreign, old, mixed and
401
438
  orphaned migration staging layouts are rejected without conversion. TypeScript
402
439
  performs no storage writes before starting the engine. Native format admission
403
440
  uses the owning detector; the exclusive native file-root lease is acquired before
@@ -900,6 +937,8 @@ underlying server and bridge are constructed by `LocalNoSqlDb.start()`.
900
937
  | `getServer()` | `NoSqlDbServer` | Access the underlying server |
901
938
  | `running` | `boolean` | Whether the server is running |
902
939
  | `LocalNoSqlDb.relocateStoppedStorageRoot(input, options?)` | `Promise<ILocalNoSqlDbStoppedStorageRootRelocationReceipt>` | Atomically relocate one eligible stopped Linux or macOS file-storage root and retain a source receipt |
940
+ | `LocalNoSqlDb.alignStoppedStorageRoot(input, options?)` | `Promise<TLocalNoSqlDbStoppedStorageRootAlignmentResult>` | Adopt an eligible stopped copy as an independent provider |
941
+ | `LocalNoSqlDb.abortStoppedStorageRootAlignment(input, options?)` | `Promise<ILocalNoSqlDbStoppedStorageRootAlignmentAbortResult>` | Abort an exact incomplete alignment append |
903
942
  | `LocalNoSqlDb.inspectOfflineStringValue(input, options?)` | `Promise<TLocalNoSqlDbOfflineStringValueInspectionResult>` | Read one exact top-level string value from stopped file storage without starting or mutating the engine |
904
943
  | `LocalNoSqlDb.inspectOfflinePhysicalNamespaces(input, options?)` | `Promise<ILocalNoSqlDbOfflinePhysicalNamespaceInspectionResult>` | Validate stopped physical file storage and return only deterministic database and collection names |
905
944
 
@@ -948,10 +987,134 @@ Relocation supports stopped current native production roots with or without auth
948
987
 
949
988
  The operation durably records one immutable native append plan and reserves the receipt before changing the path binding. It retains exclusive ownership through the append, atomic directory/receipt exchange and confirmed journal cleanup. If a call returns `RECOVERY_REQUIRED`, stop startup attempts and retry the exact normalized source path, destination path and `relocationId` with the same native-capable NoSQLDB version. Startup rejects any relocation-workspace occupancy and never mutates or recovers it. Do not delete, rename, edit or replace either path between attempts. Native relocation does not accept unfinished journals from the removed Bitcask engine.
950
989
 
951
- An exact completed replay returns the same receipt only while the destination remains the current root. A later successful relocation leaves another receipt at that destination path and supersedes the earlier replay topology; retry the later operation instead. Manual copy or rename remains unsupported and continues to fail provider path/inode fencing.
990
+ An exact completed replay returns the same receipt only while the destination remains the current root. A later successful relocation leaves another receipt at that destination path and supersedes the earlier replay topology; retry the later operation instead. Manual copy or rename fails provider path/inode fencing. `alignStoppedStorageRoot` can adopt an eligible copy as an independent fork under the stricter policy below; it does not move production authority.
952
991
 
953
992
  Failures are exposed as `LocalNoSqlDbStorageRootRelocationError` with a code-only union: `INVALID_REQUEST`, `UNSUPPORTED`, `BUSY`, `NOT_FOUND`, `DESTINATION_CONFLICT`, `IDENTITY_MISMATCH`, `STATE_CORRUPT`, `SOURCE_CHANGED`, `CAPACITY`, `CANCELLED`, `IO`, or `RECOVERY_REQUIRED`. Errors and receipts contain no credential or document material. Transport ambiguity after dispatch is `RECOVERY_REQUIRED`; exact retry is the recovery action. An explicit native cancellation or I/O error can also leave private recovery state, which the identical request can finish after the sidecar has confirmed exit.
954
993
 
994
+ #### Stopped storage-root alignment
995
+
996
+ **Never start a copied or restored root before alignment.** Ordinary serving
997
+ startup may recover a torn tail before rejecting its foreign binding. Stop the
998
+ source, inspect it for pins, copy it while it remains stopped, and align the copy
999
+ before its first start. Pins cannot prove that an unverified backup is complete;
1000
+ a file truncated exactly at a commit boundary can still be internally consistent.
1001
+
1002
+ Version 1 requires current production file storage, a clean committed tail, no
1003
+ generation newer than the manifest, no auth users, and no fencing, allocation,
1004
+ publication-hold, grant or import-stage authority. The complete catalog, auth,
1005
+ index, transaction-outcome and fencing audits must pass. Rehearsals, memory
1006
+ storage, unknown files (including `.DS_Store`/AppleDouble), symlinks, hard links
1007
+ and unsafe ownership or modes are refused. The operation never repairs them.
1008
+ The attestation covers **every copy of the lineage**, not just the local root.
1009
+
1010
+ ```typescript
1011
+ import { LocalNoSqlDb } from '@lossless.org/nosqldb';
1012
+
1013
+ // Run against the source after stopping it; retain these pins through the copy.
1014
+ const source = await LocalNoSqlDb.inspectStoppedStorageRoot({ folderPath: '/srv/source/db' });
1015
+ if (source.status !== 'audited' || !source.alignmentEligible) throw new Error('Source is ineligible');
1016
+ const request = {
1017
+ folderPath: '/srv/destination/db',
1018
+ receiptPath: '/srv/destination/adoption.json',
1019
+ alignmentId: 'laptop-move-1',
1020
+ identityPolicy: 'fork' as const,
1021
+ attestLineageNeverFenced: true as const,
1022
+ expect: { groupId: source.groupId, timelineId: source.timelineId, lsn: source.lsn,
1023
+ recordsSha256: source.recordsSha256, providerRootId: source.providerRootId },
1024
+ };
1025
+ // /srv/destination is an existing mode-0700 directory owned by the service user.
1026
+ const preview = await LocalNoSqlDb.alignStoppedStorageRoot({ ...request, dryRun: true });
1027
+ const result = await LocalNoSqlDb.alignStoppedStorageRoot(request, { timeoutMs: 60_000 });
1028
+ ```
1029
+
1030
+ All paths must be canonical absolute paths. `receiptPath` is required, outside
1031
+ the root on the same filesystem, with an existing private parent. An unrelated
1032
+ existing file is never overwritten. Use the relocation identifier rules for
1033
+ `alignmentId`. Supply either `expect` from the stopped source or explicit
1034
+ `acknowledgeUnverifiedCopy: true` when no source pins survive, never both.
1035
+ `binaryPath`, `timeoutMs` and `signal` select the engine and bound the operation.
1036
+
1037
+ The following archive recipe was qualified from macOS arm64 APFS to Linux
1038
+ x86_64 ext4 and XFS. Run as the service user, with the source stopped throughout,
1039
+ and retain its inspection pins separately. Start with a new private destination
1040
+ parent; preserve the private file/directory modes and do not include filesystem
1041
+ metadata sidecars. On macOS use the exact canonical case and Unicode spelling;
1042
+ alternate spellings are refused rather than treated as portable aliases.
1043
+
1044
+ ```sh
1045
+ # macOS: /absolute/source-parent/db is stopped and inspected.
1046
+ COPYFILE_DISABLE=1 tar --no-xattrs -czf /absolute/db-copy.tar.gz -C /absolute/source-parent db
1047
+ # After transferring the archive to Linux, as the destination service user:
1048
+ mkdir -m 700 /absolute/destination-parent
1049
+ tar --no-same-owner -xzf /absolute/db-copy.tar.gz -C /absolute/destination-parent
1050
+ # Run alignStoppedStorageRoot with the retained source pins before any start.
1051
+ ```
1052
+
1053
+ A dry run returns `eligible` with inspected evidence. An eligible root already
1054
+ bound to its location returns `already-bound` with `bindingChange: 'none'`.
1055
+ Neither creates a workspace or receipt. Alignment appends exactly one fresh
1056
+ schema-1 fencing profile: a new `providerRootId`, live physical binding and
1057
+ LSN+1. Every other record's bytes and version remain unchanged. `groupId` and
1058
+ `timelineId` remain lineage identifiers; they are **not** the new provider identity.
1059
+ The immutable receipt records both provider IDs, both LSNs, source/aligned full
1060
+ digests, preserved-record digest and request/receipt SHA-256 commitments. Retain it.
1061
+ A pre-reserved receipt proves completion only together with its matching target
1062
+ profile and lineage. Exact retries verify that evidence and return the same
1063
+ receipt, including after subsequent writes with the same target profile.
1064
+
1065
+ Alignment failures throw `NoSqlDbStoppedOperationError` with a code-only `code`.
1066
+ On `RECOVERY_REQUIRED`, keep the exact request and all files unchanged and retry
1067
+ alignment with the same capable engine. Its private workspace excludes ordinary
1068
+ startup and retains the exact append plan through crashes and partial writes.
1069
+ Do not delete or edit the workspace or receipt. `BUSY` means an owner still holds
1070
+ the root; `IDENTITY_MISMATCH` or `SOURCE_CHANGED` requires investigating changed
1071
+ pins or files. `UNSUPPORTED` indicates an ineligible root or older engine;
1072
+ stopped inspection provides bounded eligibility reasons. Other code-only errors
1073
+ include `INVALID_REQUEST`, `NOT_FOUND`, `DESTINATION_CONFLICT`, `STATE_CORRUPT`,
1074
+ `CAPACITY`, `CANCELLED` and `IO`.
1075
+
1076
+ `abortStoppedStorageRootAlignment(request, options?)` accepts the identical
1077
+ request and only rolls back an exact **incomplete** planned append. A complete
1078
+ append must finish alignment. If permissions changed after interruption, restore
1079
+ the required ownership and modes first. Abort permits changed timestamps while
1080
+ still checking original inodes, the full inventory, original bytes and append
1081
+ prefix. It durably records abort, truncates/fsyncs, removes its exact reserved
1082
+ receipt and cleans up. Retry abort after an interrupted abort; alignment cannot
1083
+ override that decision. An absent workspace returns `not-pending`.
1084
+
1085
+ Older 8.0.2 engines reject pending workspaces with “startup rejects existing
1086
+ file-provider bookkeeping”. Finish or abort with the newer engine; deleting the
1087
+ workspace is not a fix. A v8-produced fixture remains readable by v8 after this
1088
+ one-profile append. This does **not** allow downgrading v10-created catalogs.
1089
+ Qualification results and study corrections are recorded in the repository's
1090
+ [alignment design note](https://code.foss.global/lossless.org/nosqldb/src/branch/main/alignment.md).
1091
+
1092
+ #### Stopped Storage-Root Inspection
1093
+
1094
+ `LocalNoSqlDb.inspectStoppedStorageRoot({ folderPath }, { timeoutMs?, signal?, binaryPath? })`
1095
+ audits an existing stopped source or copy without initializing or repairing it.
1096
+ Use a canonical absolute path. The outer and native ownership locks remain held
1097
+ through the complete record-owner audit. A running engine returns `BUSY`.
1098
+
1099
+ An `audited` result includes the recorded provider identity, live binding state,
1100
+ lineage (`groupId`/`timelineId`), decimal-string LSN and counts, full-record and
1101
+ profile-excluded SHA-256 digests, generation inventory and alignment eligibility.
1102
+ It counts allocation replays as well as fences, receipts, holds and allocations.
1103
+ The audit accepts no active grants or import stages. Auth users or authority
1104
+ history make a fully audited root ineligible for independent-fork alignment.
1105
+
1106
+ An `unavailable` result contains bounded advisory reasons and no trusted logical
1107
+ identity, digests or partial counts. It indicates physical-admission or owner-audit
1108
+ failure; it is not evidence that a copy is safe. Reading may affect filesystem
1109
+ access times, but never changes data, modes, ownership or modification timestamps.
1110
+
1111
+ All stopped inspection and relocation methods accept `binaryPath` to select an
1112
+ exact executable. Unsupported management methods in older engines report
1113
+ `UNSUPPORTED`; interrupted dispatched mutations still require recovery. Health
1114
+ also exposes `providerRootId` and the current decimal-string `lsn`, and non-null
1115
+ resource fence summaries expose `providerRootId`. These fields are optional in
1116
+ the TypeScript interfaces for older engine binaries.
1117
+
955
1118
  #### Offline String-Value Inspection
956
1119
 
957
1120
  `LocalNoSqlDb.inspectOfflineStringValue(input, options?)` reads one string from a
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@lossless.org/nosqldb',
6
- version: '9.0.1',
6
+ version: '10.1.1',
7
7
  description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
8
8
  }