@lossless.org/nosqldb 8.0.0

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 (81) hide show
  1. package/.smartconfig.json +107 -0
  2. package/dist_rust/rustdb_linux_amd64 +0 -0
  3. package/dist_rust/rustdb_linux_amd64.tsrust-build.json +14 -0
  4. package/dist_rust/rustdb_linux_arm64 +0 -0
  5. package/dist_rust/rustdb_linux_arm64.tsrust-build.json +14 -0
  6. package/dist_rust/rustdb_macos_amd64 +0 -0
  7. package/dist_rust/rustdb_macos_amd64.tsrust-build.json +14 -0
  8. package/dist_rust/rustdb_macos_arm64 +0 -0
  9. package/dist_rust/rustdb_macos_arm64.tsrust-build.json +14 -0
  10. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  11. package/dist_ts/00_commitinfo_data.js +9 -0
  12. package/dist_ts/index.d.ts +8 -0
  13. package/dist_ts/index.js +10 -0
  14. package/dist_ts/ts_local/classes.localnosqldb.d.ts +119 -0
  15. package/dist_ts/ts_local/classes.localnosqldb.js +386 -0
  16. package/dist_ts/ts_local/index.d.ts +5 -0
  17. package/dist_ts/ts_local/index.js +3 -0
  18. package/dist_ts/ts_local/plugins.d.ts +1 -0
  19. package/dist_ts/ts_local/plugins.js +3 -0
  20. package/dist_ts/ts_nosqldb/classes.storagerehearsal.d.ts +19 -0
  21. package/dist_ts/ts_nosqldb/classes.storagerehearsal.js +122 -0
  22. package/dist_ts/ts_nosqldb/file-storage-options.d.ts +13 -0
  23. package/dist_ts/ts_nosqldb/file-storage-options.js +24 -0
  24. package/dist_ts/ts_nosqldb/file-storage-startup.d.ts +3 -0
  25. package/dist_ts/ts_nosqldb/file-storage-startup.js +6 -0
  26. package/dist_ts/ts_nosqldb/index.d.ts +14 -0
  27. package/dist_ts/ts_nosqldb/index.js +11 -0
  28. package/dist_ts/ts_nosqldb/offline-inspection.d.ts +72 -0
  29. package/dist_ts/ts_nosqldb/offline-inspection.js +282 -0
  30. package/dist_ts/ts_nosqldb/plugins.d.ts +7 -0
  31. package/dist_ts/ts_nosqldb/plugins.js +10 -0
  32. package/dist_ts/ts_nosqldb/resource-fencing.d.ts +39 -0
  33. package/dist_ts/ts_nosqldb/resource-fencing.js +271 -0
  34. package/dist_ts/ts_nosqldb/rust-db-bridge.d.ts +213 -0
  35. package/dist_ts/ts_nosqldb/rust-db-bridge.js +439 -0
  36. package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.d.ts +204 -0
  37. package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.js +456 -0
  38. package/dist_ts/ts_nosqldb/server/index.d.ts +3 -0
  39. package/dist_ts/ts_nosqldb/server/index.js +3 -0
  40. package/dist_ts/ts_nosqldb/service-types.d.ts +341 -0
  41. package/dist_ts/ts_nosqldb/service-types.js +62 -0
  42. package/dist_ts/ts_nosqldb/storage-rehearsal.d.ts +103 -0
  43. package/dist_ts/ts_nosqldb/storage-rehearsal.js +131 -0
  44. package/dist_ts/ts_nosqldb/storage-root-relocation.d.ts +27 -0
  45. package/dist_ts/ts_nosqldb/storage-root-relocation.js +211 -0
  46. package/dist_ts_debugserver/bundled.d.ts +4 -0
  47. package/dist_ts_debugserver/bundled.js +16 -0
  48. package/dist_ts_debugserver/classes.debugserver.d.ts +36 -0
  49. package/dist_ts_debugserver/classes.debugserver.js +95 -0
  50. package/dist_ts_debugserver/index.d.ts +2 -0
  51. package/dist_ts_debugserver/index.js +2 -0
  52. package/dist_ts_debugserver/plugins.d.ts +2 -0
  53. package/dist_ts_debugserver/plugins.js +3 -0
  54. package/dist_ts_debugui/index.d.ts +2 -0
  55. package/dist_ts_debugui/index.js +2 -0
  56. package/dist_ts_debugui/nosqldb-debugui.d.ts +62 -0
  57. package/dist_ts_debugui/nosqldb-debugui.js +1132 -0
  58. package/dist_ts_debugui/plugins.d.ts +1 -0
  59. package/dist_ts_debugui/plugins.js +2 -0
  60. package/license +21 -0
  61. package/package.json +82 -0
  62. package/readme.md +1733 -0
  63. package/third-party-notices.md +925 -0
  64. package/ts/00_commitinfo_data.ts +8 -0
  65. package/ts/index.ts +85 -0
  66. package/ts/ts_local/classes.localnosqldb.ts +500 -0
  67. package/ts/ts_local/index.ts +19 -0
  68. package/ts/ts_local/plugins.ts +1 -0
  69. package/ts/ts_nosqldb/classes.storagerehearsal.ts +109 -0
  70. package/ts/ts_nosqldb/file-storage-options.ts +33 -0
  71. package/ts/ts_nosqldb/file-storage-startup.ts +9 -0
  72. package/ts/ts_nosqldb/index.ts +104 -0
  73. package/ts/ts_nosqldb/offline-inspection.ts +375 -0
  74. package/ts/ts_nosqldb/plugins.ts +12 -0
  75. package/ts/ts_nosqldb/resource-fencing.ts +368 -0
  76. package/ts/ts_nosqldb/rust-db-bridge.ts +964 -0
  77. package/ts/ts_nosqldb/server/classes.nosqldbserver.ts +696 -0
  78. package/ts/ts_nosqldb/server/index.ts +4 -0
  79. package/ts/ts_nosqldb/service-types.ts +484 -0
  80. package/ts/ts_nosqldb/storage-rehearsal.ts +215 -0
  81. package/ts/ts_nosqldb/storage-root-relocation.ts +277 -0
@@ -0,0 +1,386 @@
1
+ import * as crypto from 'crypto';
2
+ import * as fs from 'fs/promises';
3
+ import * as net from 'net';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ import { NoSqlDbServer, } from '../ts_nosqldb/index.js';
7
+ import { RustDbBridge, rustDbBridgeStorageRootRelocation, } from '../ts_nosqldb/rust-db-bridge.js';
8
+ import { validateNoSqlDbStorageRehearsalStartup } from '../ts_nosqldb/storage-rehearsal.js';
9
+ import {} from '../ts_nosqldb/file-storage-startup.js';
10
+ import { normalizeNoSqlDbFileStorageOptions, } from '../ts_nosqldb/file-storage-options.js';
11
+ import { normalizeLocalNoSqlDbOfflinePhysicalNamespaceInspectionInput, normalizeLocalNoSqlDbOfflineInspectionInput, validateNoSqlDbManagementOperationOptions, } from '../ts_nosqldb/offline-inspection.js';
12
+ import { assertNoLocalNoSqlDbStorageRootRelocationWorkspace, isLocalNoSqlDbStorageRootRelocationErrorCode, LocalNoSqlDbStorageRootRelocationError, normalizeLocalNoSqlDbStoppedStorageRootRelocationInput, normalizeLocalNoSqlDbStoppedStorageRootRelocationReceipt, } from '../ts_nosqldb/storage-root-relocation.js';
13
+ /**
14
+ * LocalNoSqlDb - Lightweight local MongoDB-compatible database using Unix sockets
15
+ *
16
+ * This class wraps NoSqlDbServer and provides a simple interface for
17
+ * starting a local file-based database server. Returns connection
18
+ * info that you can use with any compatible driver instance.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { LocalNoSqlDb } from '@lossless.org/nosqldb';
23
+ * import { MongoClient } from 'mongodb';
24
+ *
25
+ * const db = new LocalNoSqlDb({ folderPath: './data' });
26
+ * const { connectionUri } = await db.start();
27
+ *
28
+ * // Connect with the driver
29
+ * const client = new MongoClient(connectionUri, { directConnection: true });
30
+ * await client.connect();
31
+ *
32
+ * // Use the client
33
+ * const collection = client.db('mydb').collection('users');
34
+ * await collection.insertOne({ name: 'Alice' });
35
+ *
36
+ * // When done
37
+ * await client.close();
38
+ * await db.stop();
39
+ * ```
40
+ */
41
+ export class LocalNoSqlDb {
42
+ static { this.storageRootRelocationGate = Promise.resolve(); }
43
+ constructor(options) {
44
+ this.server = null;
45
+ this.generatedSocketPath = null;
46
+ validateNoSqlDbStorageRehearsalStartup({ ...options, storage: 'file', storagePath: options.folderPath });
47
+ this.options = {
48
+ ...options,
49
+ ...normalizeNoSqlDbFileStorageOptions({ ...options, storage: 'file' }),
50
+ };
51
+ }
52
+ static createOfflineInspectionBridge() {
53
+ return new RustDbBridge();
54
+ }
55
+ static createStorageRootRelocationBridge() {
56
+ return new RustDbBridge();
57
+ }
58
+ static async withStorageRootRelocationGate(operationArg) {
59
+ const previous = LocalNoSqlDb.storageRootRelocationGate;
60
+ let release;
61
+ LocalNoSqlDb.storageRootRelocationGate = new Promise((resolveArg) => {
62
+ release = resolveArg;
63
+ });
64
+ await previous;
65
+ try {
66
+ return await operationArg();
67
+ }
68
+ finally {
69
+ release();
70
+ }
71
+ }
72
+ static remainingManagementTimeout(deadlineArg) {
73
+ if (deadlineArg === undefined)
74
+ return undefined;
75
+ const remaining = deadlineArg - Date.now();
76
+ if (remaining <= 0) {
77
+ throw new LocalNoSqlDbStorageRootRelocationError('IO');
78
+ }
79
+ return remaining;
80
+ }
81
+ /**
82
+ * Relocate one stopped current native file root, including authenticated
83
+ * roots, under continuous ownership. Preserve the returned source receipt;
84
+ * interrupted operations require the identical request to finish recovery.
85
+ */
86
+ static async relocateStoppedStorageRoot(inputArg, optionsArg) {
87
+ let input;
88
+ try {
89
+ input = normalizeLocalNoSqlDbStoppedStorageRootRelocationInput(inputArg);
90
+ validateNoSqlDbManagementOperationOptions(optionsArg);
91
+ }
92
+ catch (error) {
93
+ if (error instanceof LocalNoSqlDbStorageRootRelocationError)
94
+ throw error;
95
+ throw new LocalNoSqlDbStorageRootRelocationError('INVALID_REQUEST');
96
+ }
97
+ if (optionsArg?.signal?.aborted) {
98
+ throw new LocalNoSqlDbStorageRootRelocationError('IO');
99
+ }
100
+ if (process.platform !== 'linux' && process.platform !== 'darwin') {
101
+ throw new LocalNoSqlDbStorageRootRelocationError('UNSUPPORTED');
102
+ }
103
+ const deadline = optionsArg?.timeoutMs === undefined
104
+ ? undefined
105
+ : Date.now() + optionsArg.timeoutMs;
106
+ return LocalNoSqlDb.withStorageRootRelocationGate(async () => {
107
+ const retainedBridge = LocalNoSqlDb.storageRootRelocationBridge;
108
+ if (retainedBridge) {
109
+ try {
110
+ await retainedBridge.terminate({ gracePeriodMs: 0 });
111
+ }
112
+ catch {
113
+ throw new LocalNoSqlDbStorageRootRelocationError('RECOVERY_REQUIRED');
114
+ }
115
+ if (!retainedBridge.ownershipReleased) {
116
+ throw new LocalNoSqlDbStorageRootRelocationError('RECOVERY_REQUIRED');
117
+ }
118
+ if (LocalNoSqlDb.storageRootRelocationBridge === retainedBridge) {
119
+ LocalNoSqlDb.storageRootRelocationBridge = undefined;
120
+ }
121
+ }
122
+ let bridge;
123
+ let receipt;
124
+ let operationError;
125
+ try {
126
+ bridge = LocalNoSqlDb.createStorageRootRelocationBridge();
127
+ LocalNoSqlDb.storageRootRelocationBridge = bridge;
128
+ const spawnTimeout = LocalNoSqlDb.remainingManagementTimeout(deadline);
129
+ const spawned = await bridge.spawn({
130
+ ...(optionsArg?.signal ? { signal: optionsArg.signal } : {}),
131
+ ...(spawnTimeout === undefined ? {} : { timeoutMs: spawnTimeout }),
132
+ });
133
+ if (!spawned) {
134
+ throw new LocalNoSqlDbStorageRootRelocationError('IO');
135
+ }
136
+ const commandTimeout = LocalNoSqlDb.remainingManagementTimeout(deadline);
137
+ const result = await bridge[rustDbBridgeStorageRootRelocation](input, {
138
+ ...(optionsArg?.signal ? { signal: optionsArg.signal } : {}),
139
+ ...(commandTimeout === undefined ? {} : { timeoutMs: commandTimeout }),
140
+ });
141
+ receipt = normalizeLocalNoSqlDbStoppedStorageRootRelocationReceipt(result, input);
142
+ }
143
+ catch (error) {
144
+ if (error instanceof LocalNoSqlDbStorageRootRelocationError) {
145
+ operationError = error;
146
+ }
147
+ else {
148
+ const requestWasDispatched = error instanceof Error
149
+ && 'requestId' in error
150
+ && typeof error.requestId === 'string';
151
+ if (requestWasDispatched
152
+ && error instanceof Error
153
+ && 'responseErrorCode' in error
154
+ && isLocalNoSqlDbStorageRootRelocationErrorCode(error.responseErrorCode)) {
155
+ operationError = new LocalNoSqlDbStorageRootRelocationError(error.responseErrorCode);
156
+ }
157
+ else {
158
+ operationError = new LocalNoSqlDbStorageRootRelocationError(requestWasDispatched ? 'RECOVERY_REQUIRED' : 'IO');
159
+ }
160
+ }
161
+ }
162
+ if (bridge) {
163
+ try {
164
+ await bridge.terminate({ gracePeriodMs: 0 });
165
+ if (!bridge.ownershipReleased) {
166
+ throw new Error('termination was not confirmed');
167
+ }
168
+ if (LocalNoSqlDb.storageRootRelocationBridge === bridge) {
169
+ LocalNoSqlDb.storageRootRelocationBridge = undefined;
170
+ }
171
+ }
172
+ catch {
173
+ operationError = new LocalNoSqlDbStorageRootRelocationError('RECOVERY_REQUIRED');
174
+ }
175
+ }
176
+ if (operationError)
177
+ throw operationError;
178
+ if (!receipt) {
179
+ throw new LocalNoSqlDbStorageRootRelocationError('RECOVERY_REQUIRED');
180
+ }
181
+ return receipt;
182
+ });
183
+ }
184
+ static async runOfflineInspection(inputArg, optionsArg, normalizeInputArg, inspectArg) {
185
+ const validatedInput = normalizeInputArg(inputArg);
186
+ validateNoSqlDbManagementOperationOptions(optionsArg);
187
+ optionsArg?.signal?.throwIfAborted();
188
+ const input = normalizeInputArg({
189
+ ...validatedInput,
190
+ folderPath: path.resolve(validatedInput.folderPath),
191
+ });
192
+ const deadline = optionsArg?.timeoutMs === undefined
193
+ ? undefined
194
+ : Date.now() + optionsArg.timeoutMs;
195
+ const bridge = LocalNoSqlDb.createOfflineInspectionBridge();
196
+ let operationFailed = false;
197
+ let operationError;
198
+ let result;
199
+ try {
200
+ let spawnOptions = optionsArg;
201
+ if (deadline !== undefined) {
202
+ const remainingMs = deadline - Date.now();
203
+ if (remainingMs <= 0) {
204
+ throw new Error('NoSQLDB offline inspection timed out before sidecar spawn');
205
+ }
206
+ spawnOptions = {
207
+ signal: optionsArg?.signal,
208
+ timeoutMs: remainingMs,
209
+ };
210
+ }
211
+ if (!await bridge.spawn(spawnOptions)) {
212
+ throw new Error('nosqldb Rust binary not found. Set NOSQLDB_RUST_BINARY env var, ' +
213
+ 'install the platform package, or build locally with `tsrust`.');
214
+ }
215
+ let commandOptions = optionsArg;
216
+ if (deadline !== undefined) {
217
+ const remainingMs = deadline - Date.now();
218
+ if (remainingMs <= 0) {
219
+ throw new Error('NoSQLDB offline inspection timed out while starting the sidecar');
220
+ }
221
+ commandOptions = {
222
+ signal: optionsArg?.signal,
223
+ timeoutMs: remainingMs,
224
+ };
225
+ }
226
+ result = await inspectArg(bridge, input, commandOptions);
227
+ }
228
+ catch (error) {
229
+ operationFailed = true;
230
+ operationError = error;
231
+ }
232
+ try {
233
+ await bridge.terminate({ gracePeriodMs: 0 });
234
+ }
235
+ catch (terminationError) {
236
+ if (operationFailed) {
237
+ throw new AggregateError([operationError, terminationError], 'NoSQLDB offline inspection failed and sidecar termination was incomplete', { cause: operationError });
238
+ }
239
+ throw terminationError;
240
+ }
241
+ if (operationFailed) {
242
+ throw operationError;
243
+ }
244
+ return result;
245
+ }
246
+ /**
247
+ * Inspect physical database and collection names while the owning engine is stopped.
248
+ * This starts only the Rust management sidecar and never initializes storage.
249
+ */
250
+ static async inspectOfflinePhysicalNamespaces(inputArg, optionsArg) {
251
+ return LocalNoSqlDb.runOfflineInspection(inputArg, optionsArg, normalizeLocalNoSqlDbOfflinePhysicalNamespaceInspectionInput, (bridgeArg, input, commandOptions) => bridgeArg.inspectOfflinePhysicalNamespaces(input, commandOptions));
252
+ }
253
+ /**
254
+ * Inspect one exact string value while the owning LocalNoSqlDb engine is stopped.
255
+ * This starts only the Rust management sidecar and never initializes storage.
256
+ */
257
+ static async inspectOfflineStringValue(inputArg, optionsArg) {
258
+ return LocalNoSqlDb.runOfflineInspection(inputArg, optionsArg, normalizeLocalNoSqlDbOfflineInspectionInput, (bridgeArg, input, commandOptions) => bridgeArg.inspectOfflineStringValue(input, commandOptions));
259
+ }
260
+ /**
261
+ * Generate a unique socket path in /tmp
262
+ */
263
+ generateSocketPath() {
264
+ const randomId = crypto.randomBytes(8).toString('hex');
265
+ return path.join(os.tmpdir(), `nosqldb-${randomId}.sock`);
266
+ }
267
+ /**
268
+ * Check if a Unix socket is alive by attempting to connect.
269
+ */
270
+ static isSocketAlive(socketPath) {
271
+ return new Promise((resolve) => {
272
+ const client = net.createConnection({ path: socketPath }, () => {
273
+ client.destroy();
274
+ resolve(true);
275
+ });
276
+ client.on('error', () => {
277
+ resolve(false);
278
+ });
279
+ client.setTimeout(500, () => {
280
+ client.destroy();
281
+ resolve(false);
282
+ });
283
+ });
284
+ }
285
+ /**
286
+ * Remove stale nosqldb-*.sock files from /tmp.
287
+ * A socket is considered stale if connecting to it fails.
288
+ */
289
+ static async cleanStaleSockets() {
290
+ const tmpDir = os.tmpdir();
291
+ let entries;
292
+ try {
293
+ entries = await fs.readdir(tmpDir);
294
+ }
295
+ catch {
296
+ return;
297
+ }
298
+ const socketFiles = entries.filter((f) => f.startsWith('nosqldb-') && f.endsWith('.sock'));
299
+ for (const name of socketFiles) {
300
+ const fullPath = path.join(tmpDir, name);
301
+ try {
302
+ const stat = await fs.stat(fullPath);
303
+ if (!stat.isSocket())
304
+ continue;
305
+ const alive = await LocalNoSqlDb.isSocketAlive(fullPath);
306
+ if (!alive) {
307
+ await fs.unlink(fullPath);
308
+ }
309
+ }
310
+ catch {
311
+ // File may have been removed already; ignore
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Start the local NoSQLDB server and return connection info
317
+ */
318
+ async start() {
319
+ if (this.server) {
320
+ throw new Error('LocalNoSqlDb is already running');
321
+ }
322
+ // Use provided socket path or generate one
323
+ this.generatedSocketPath = this.options.socketPath ?? this.generateSocketPath();
324
+ this.server = new NoSqlDbServer({
325
+ binaryPath: this.options.binaryPath,
326
+ storageRehearsalId: this.options.storageRehearsalId,
327
+ auth: this.options.auth,
328
+ fileStorageStartup: this.options.fileStorageStartup,
329
+ socketPath: this.generatedSocketPath,
330
+ storage: 'file',
331
+ storagePath: this.options.folderPath,
332
+ });
333
+ await this.server.start();
334
+ return {
335
+ socketPath: this.generatedSocketPath,
336
+ connectionUri: this.server.getConnectionUri(),
337
+ };
338
+ }
339
+ /**
340
+ * Get connection info (throws if not started)
341
+ */
342
+ getConnectionInfo() {
343
+ if (!this.server || !this.generatedSocketPath) {
344
+ throw new Error('LocalNoSqlDb is not running. Call start() first.');
345
+ }
346
+ return {
347
+ socketPath: this.generatedSocketPath,
348
+ connectionUri: this.server.getConnectionUri(),
349
+ };
350
+ }
351
+ /**
352
+ * Get the underlying NoSqlDbServer instance (throws if not started)
353
+ */
354
+ getServer() {
355
+ if (!this.server) {
356
+ throw new Error('LocalNoSqlDb is not running. Call start() first.');
357
+ }
358
+ return this.server;
359
+ }
360
+ /**
361
+ * Get the connection URI
362
+ */
363
+ getConnectionUri() {
364
+ if (!this.server) {
365
+ throw new Error('LocalNoSqlDb is not running. Call start() first.');
366
+ }
367
+ return this.server.getConnectionUri();
368
+ }
369
+ /**
370
+ * Check if the server is running
371
+ */
372
+ get running() {
373
+ return this.server !== null && this.server.running;
374
+ }
375
+ /**
376
+ * Stop the local NoSQLDB server
377
+ */
378
+ async stop() {
379
+ if (this.server) {
380
+ await this.server.stop();
381
+ this.server = null;
382
+ this.generatedSocketPath = null;
383
+ }
384
+ }
385
+ }
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5sb2NhbG5vc3FsZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19sb2NhbC9jbGFzc2VzLmxvY2Fsbm9zcWxkYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQztBQUMzQixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEVBQ0wsYUFBYSxHQVNkLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLFlBQVksRUFDWixpQ0FBaUMsR0FDbEMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBRU4sTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsa0NBQWtDLEdBQ25DLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUNMLDREQUE0RCxFQUM1RCwyQ0FBMkMsRUFDM0MseUNBQXlDLEdBQzFDLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNMLGtEQUFrRCxFQUNsRCw0Q0FBNEMsRUFDNUMsc0NBQXNDLEVBQ3RDLHNEQUFzRCxFQUN0RCx3REFBd0QsR0FDekQsTUFBTSwwQ0FBMEMsQ0FBQztBQTJCbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sT0FBTyxZQUFZO2FBQ1IsOEJBQXlCLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQUFBbkMsQ0FBb0M7SUFNNUUsWUFBWSxPQUE2QjtRQUhqQyxXQUFNLEdBQXlCLElBQUksQ0FBQztRQUNwQyx3QkFBbUIsR0FBa0IsSUFBSSxDQUFDO1FBR2hE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
@@ -0,0 +1,5 @@
1
+ export { LocalNoSqlDb } from './classes.localnosqldb.js';
2
+ export type { ILocalNoSqlDbOptions, ILocalNoSqlDbConnectionInfo } from './classes.localnosqldb.js';
3
+ export type { ILocalNoSqlDbOfflineInspectionLimits, ILocalNoSqlDbOfflinePhysicalNamespaceInspectionLimits, ILocalNoSqlDbOfflinePhysicalNamespaceInspection, ILocalNoSqlDbOfflinePhysicalNamespaceInspectionResult, ILocalNoSqlDbOfflineStringValueInspection, TLocalNoSqlDbOfflineStringValueInspectionResult, } from '../ts_nosqldb/service-types.js';
4
+ export type { ILocalNoSqlDbStoppedStorageRootRelocationInput, ILocalNoSqlDbStoppedStorageRootRelocationReceipt, TLocalNoSqlDbStorageRootRelocationErrorCode, } from '../ts_nosqldb/storage-root-relocation.js';
5
+ export { LocalNoSqlDbStorageRootRelocationError, localNoSqlDbStorageRootRelocationErrorCodes, } from '../ts_nosqldb/storage-root-relocation.js';
@@ -0,0 +1,3 @@
1
+ export { LocalNoSqlDb } from './classes.localnosqldb.js';
2
+ export { LocalNoSqlDbStorageRootRelocationError, localNoSqlDbStorageRootRelocationErrorCodes, } from '../ts_nosqldb/storage-root-relocation.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19sb2NhbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFlekQsT0FBTyxFQUNMLHNDQUFzQyxFQUN0QywyQ0FBMkMsR0FDNUMsTUFBTSwwQ0FBMEMsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // Local module plugins - currently no external dependencies needed
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX2xvY2FsL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG1FQUFtRSJ9
@@ -0,0 +1,19 @@
1
+ import type { INoSqlDbManagementOperationOptions } from './service-types.js';
2
+ import { type INoSqlDbStorageRehearsalInput, type INoSqlDbStorageRehearsalOptions, type INoSqlDbStorageRehearsalReceipt } from './storage-rehearsal.js';
3
+ /** Owns one offline rehearsal sidecar at a time. Separate instances are independent;
4
+ * native root ownership excludes concurrent use of a source or destination. */
5
+ export declare class NoSqlDbStorageRehearsal {
6
+ private readonly binaryPath;
7
+ private bridge;
8
+ private cancellation;
9
+ private completion;
10
+ constructor(options?: INoSqlDbStorageRehearsalOptions);
11
+ /** Create or exactly retry a rehearsal. The default deadline is one hour,
12
+ * including spawn and the operation; maximum 24 hours. Cleanup confirms exit
13
+ * before this method settles. Retry the identical request after interruption. */
14
+ createDestination(inputArg: INoSqlDbStorageRehearsalInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbStorageRehearsalReceipt>;
15
+ /** Cancel active work and confirm sidecar exit. Retry this method if cleanup
16
+ * reports RECOVERY_REQUIRED; the instance retains unconfirmed ownership. */
17
+ stop(): Promise<void>;
18
+ private terminateBridge;
19
+ }
@@ -0,0 +1,122 @@
1
+ import { RustDbBridge, rustDbBridgeStorageRehearsal } from './rust-db-bridge.js';
2
+ import { normalizeNoSqlDbStorageRehearsalInput, normalizeNoSqlDbStorageRehearsalReceipt, normalizeNoSqlDbStorageRehearsalOptions, normalizeNoSqlDbStorageRehearsalOperationOptions, NoSqlDbStorageRehearsalError, noSqlDbStorageRehearsalErrorCodes, } from './storage-rehearsal.js';
3
+ /** Owns one offline rehearsal sidecar at a time. Separate instances are independent;
4
+ * native root ownership excludes concurrent use of a source or destination. */
5
+ export class NoSqlDbStorageRehearsal {
6
+ constructor(options = {}) {
7
+ this.binaryPath = normalizeNoSqlDbStorageRehearsalOptions(options).binaryPath;
8
+ }
9
+ /** Create or exactly retry a rehearsal. The default deadline is one hour,
10
+ * including spawn and the operation; maximum 24 hours. Cleanup confirms exit
11
+ * before this method settles. Retry the identical request after interruption. */
12
+ async createDestination(inputArg, optionsArg) {
13
+ let input;
14
+ try {
15
+ input = normalizeNoSqlDbStorageRehearsalInput(inputArg);
16
+ }
17
+ catch {
18
+ throw new NoSqlDbStorageRehearsalError('INVALID_REQUEST');
19
+ }
20
+ const options = normalizeNoSqlDbStorageRehearsalOperationOptions(optionsArg);
21
+ const { timeoutMs } = options;
22
+ if (options.signal?.aborted)
23
+ throw new NoSqlDbStorageRehearsalError('CANCELLED');
24
+ if (process.platform !== 'linux' && process.platform !== 'darwin')
25
+ throw new NoSqlDbStorageRehearsalError('UNSUPPORTED');
26
+ if (this.completion)
27
+ throw new NoSqlDbStorageRehearsalError('BUSY');
28
+ const deadline = performance.now() + timeoutMs;
29
+ const controller = new AbortController();
30
+ this.cancellation = controller;
31
+ const cancel = () => controller.abort();
32
+ options.signal?.addEventListener('abort', cancel, { once: true });
33
+ let complete;
34
+ this.completion = new Promise((resolve) => { complete = resolve; });
35
+ let dispatched = false;
36
+ let receipt;
37
+ let failure;
38
+ const remaining = () => {
39
+ const timeout = Math.ceil(deadline - performance.now());
40
+ if (timeout <= 0 || controller.signal.aborted)
41
+ throw new NoSqlDbStorageRehearsalError(dispatched ? 'RECOVERY_REQUIRED' : 'CANCELLED');
42
+ return timeout;
43
+ };
44
+ try {
45
+ // A failed previous cleanup keeps its bridge here until exit is confirmed.
46
+ await this.terminateBridge();
47
+ remaining();
48
+ const bridge = new RustDbBridge({ binaryPath: this.binaryPath });
49
+ this.bridge = bridge;
50
+ if (!await bridge.spawn({ timeoutMs: remaining(), signal: controller.signal })) {
51
+ throw new NoSqlDbStorageRehearsalError('BINARY_UNAVAILABLE');
52
+ }
53
+ const commandTimeout = remaining();
54
+ dispatched = true;
55
+ const result = await bridge[rustDbBridgeStorageRehearsal](input, {
56
+ timeoutMs: commandTimeout, signal: controller.signal,
57
+ });
58
+ receipt = normalizeNoSqlDbStorageRehearsalReceipt(result, input);
59
+ }
60
+ catch (error) {
61
+ if (error instanceof NoSqlDbStorageRehearsalError)
62
+ failure = error;
63
+ else {
64
+ const nativeCode = error instanceof Error && 'responseErrorCode' in error ? error.responseErrorCode : undefined;
65
+ const code = typeof nativeCode === 'string'
66
+ && noSqlDbStorageRehearsalErrorCodes.includes(nativeCode)
67
+ ? nativeCode
68
+ : dispatched ? 'RECOVERY_REQUIRED' : controller.signal.aborted || performance.now() >= deadline ? 'CANCELLED' : 'BINARY_UNAVAILABLE';
69
+ failure = new NoSqlDbStorageRehearsalError(code);
70
+ }
71
+ }
72
+ finally {
73
+ try {
74
+ await this.terminateBridge();
75
+ }
76
+ catch {
77
+ failure = new NoSqlDbStorageRehearsalError('RECOVERY_REQUIRED');
78
+ }
79
+ options.signal?.removeEventListener('abort', cancel);
80
+ this.cancellation = undefined;
81
+ this.completion = undefined;
82
+ complete();
83
+ }
84
+ if (failure)
85
+ throw failure;
86
+ if (!receipt)
87
+ throw new NoSqlDbStorageRehearsalError('RECOVERY_REQUIRED');
88
+ return receipt;
89
+ }
90
+ /** Cancel active work and confirm sidecar exit. Retry this method if cleanup
91
+ * reports RECOVERY_REQUIRED; the instance retains unconfirmed ownership. */
92
+ async stop() {
93
+ const completion = this.completion;
94
+ this.cancellation?.abort();
95
+ let failure;
96
+ try {
97
+ await this.terminateBridge();
98
+ }
99
+ catch (error) {
100
+ failure = error;
101
+ }
102
+ await completion;
103
+ if (failure)
104
+ throw new NoSqlDbStorageRehearsalError('RECOVERY_REQUIRED');
105
+ }
106
+ async terminateBridge() {
107
+ const bridge = this.bridge;
108
+ if (!bridge)
109
+ return;
110
+ try {
111
+ await bridge.terminate({ gracePeriodMs: 0 });
112
+ if (!bridge.ownershipReleased)
113
+ throw new NoSqlDbStorageRehearsalError('RECOVERY_REQUIRED');
114
+ if (this.bridge === bridge)
115
+ this.bridge = undefined;
116
+ }
117
+ catch {
118
+ throw new NoSqlDbStorageRehearsalError('RECOVERY_REQUIRED');
119
+ }
120
+ }
121
+ }
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlcmVoZWFyc2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvdHNfbm9zcWxkYi9jbGFzc2VzLnN0b3JhZ2VyZWhlYXJzYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE9BQU8sRUFDTCxxQ0FBcUMsRUFBRSx1Q0FBdUMsRUFDOUUsdUNBQXVDLEVBQUUsZ0RBQWdELEVBQ3pGLDRCQUE0QixFQUFFLGlDQUFpQyxHQUdoRSxNQUFNLHdCQUF3QixDQUFDO0FBRWhDOytFQUMrRTtBQUMvRSxNQUFNLE9BQU8sdUJBQXVCO0lBTWxDLFlBQW1CLFVBQTJDLEVBQUU7UUFDOUQsSUFBSSxDQUFDLFVBQVUsR0FBRyx1Q0FBdUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDaEYsQ0FBQztJQUVEOztxRkFFaUY7SUFDMUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFFBQXVDLEVBQ3BFLFVBQStDO1FBQy9DLElBQUksS0FBK0QsQ0FBQztRQUNwRSxJQUFJLENBQUM7WUFBQyxLQUFLLEdBQUcscUNBQXFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQztZQUFDLE1BQU0sSUFBSSw0QkFBNEIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUNwRSxNQUFNLE9BQU8sR0FBRyxnREFBZ0QsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzlCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPO1lBQUUsTUFBTSxJQUFJLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRO1lB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
@@ -0,0 +1,13 @@
1
+ import { type TNoSqlDbFileStorageStartup } from './file-storage-startup.js';
2
+ interface IFileStorageOptions {
3
+ storage?: string;
4
+ fileStorageStartup?: unknown;
5
+ auth?: {
6
+ users?: unknown;
7
+ };
8
+ }
9
+ /** Pure, instance-local admission for the sole native serving engine. */
10
+ export declare const normalizeNoSqlDbFileStorageOptions: (optionsArg: IFileStorageOptions) => {
11
+ fileStorageStartup: TNoSqlDbFileStorageStartup | undefined;
12
+ };
13
+ export {};
@@ -0,0 +1,24 @@
1
+ import { normalizeNoSqlDbFileStorageStartup, } from './file-storage-startup.js';
2
+ /** Pure, instance-local admission for the sole native serving engine. */
3
+ export const normalizeNoSqlDbFileStorageOptions = (optionsArg) => {
4
+ for (const removed of ['fileStorageEngine', 'persistPath', 'persistIntervalMs']) {
5
+ if (removed in optionsArg)
6
+ throw new TypeError(`NoSQLDB ${removed} has been removed; native memory and file storage are selected by storage`);
7
+ }
8
+ if (optionsArg.auth && 'usersPath' in optionsArg.auth) {
9
+ throw new TypeError('NoSQLDB auth.usersPath has been removed; authentication is stored in the native database');
10
+ }
11
+ const storage = optionsArg.storage ?? 'memory';
12
+ if (storage !== 'file' && storage !== 'memory')
13
+ throw new TypeError('NoSQLDB storage must be "memory" or "file"');
14
+ if (process.platform !== 'linux' && process.platform !== 'darwin') {
15
+ throw new TypeError('NoSQLDB native storage requires Linux or macOS');
16
+ }
17
+ if (optionsArg.fileStorageStartup !== undefined && storage !== 'file') {
18
+ throw new TypeError('NoSQLDB fileStorageStartup requires storage: "file"');
19
+ }
20
+ return {
21
+ fileStorageStartup: storage === 'file' ? normalizeNoSqlDbFileStorageStartup(optionsArg.fileStorageStartup) : undefined,
22
+ };
23
+ };
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yYWdlLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19ub3NxbGRiL2ZpbGUtc3RvcmFnZS1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxrQ0FBa0MsR0FFbkMsTUFBTSwyQkFBMkIsQ0FBQztBQVFuQyx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxVQUErQixFQUVoRixFQUFFO0lBQ0YsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7UUFDaEYsSUFBSSxPQUFPLElBQUksVUFBVTtZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsV0FBVyxPQUFPLDJFQUEyRSxDQUFDLENBQUM7SUFDaEosQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxTQUFTLENBQUMsMEZBQTBGLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUM7SUFDL0MsSUFBSSxPQUFPLEtBQUssTUFBTSxJQUFJLE9BQU8sS0FBSyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ2xILElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsRSxNQUFNLElBQUksU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDdEUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxPQUFPO1FBQ0wsa0JBQWtCLEVBQUUsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0NBQWtDLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdkgsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ /** Native format admission is read-only until the engine owns the file root. */
2
+ export type TNoSqlDbFileStorageStartup = 'current-format-only';
3
+ export declare const normalizeNoSqlDbFileStorageStartup: (valueArg: unknown) => TNoSqlDbFileStorageStartup;
@@ -0,0 +1,6 @@
1
+ export const normalizeNoSqlDbFileStorageStartup = (valueArg) => {
2
+ if (valueArg === undefined || valueArg === 'current-format-only')
3
+ return 'current-format-only';
4
+ throw new TypeError('NoSQLDB fileStorageStartup must be "current-format-only"; automatic storage conversion has been removed');
5
+ };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yYWdlLXN0YXJ0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19ub3NxbGRiL2ZpbGUtc3RvcmFnZS1zdGFydHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLENBQ2hELFFBQWlCLEVBQ1csRUFBRTtJQUM5QixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLHFCQUFxQjtRQUFFLE9BQU8scUJBQXFCLENBQUM7SUFDL0YsTUFBTSxJQUFJLFNBQVMsQ0FBQyx5R0FBeUcsQ0FBQyxDQUFDO0FBQ2pJLENBQUMsQ0FBQyJ9