@push.rocks/smartdb 2.15.3 → 2.16.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.
@@ -15,6 +15,30 @@ export interface ISmartDbHealth {
15
15
  collectionCount: number;
16
16
  uptimeSeconds?: number;
17
17
  }
18
+ export interface ILocalSmartDbOfflineInspectionLimits {
19
+ maximumDataFileBytes: number;
20
+ maximumWalFileBytes: number;
21
+ maximumRecords: number;
22
+ maximumRecordBytes: number;
23
+ maximumResultBytes: number;
24
+ }
25
+ export interface ILocalSmartDbOfflineStringValueInspection {
26
+ folderPath: string;
27
+ databaseName: string;
28
+ collectionName: string;
29
+ match: {
30
+ field: string;
31
+ value: string;
32
+ };
33
+ valueField: string;
34
+ limits: ILocalSmartDbOfflineInspectionLimits;
35
+ }
36
+ export type TLocalSmartDbOfflineStringValueInspectionResult = {
37
+ status: 'not-found';
38
+ } | {
39
+ status: 'found';
40
+ value: string;
41
+ };
18
42
  export declare const smartDbResourceFenceErrorCodes: readonly ["EFENCE_REQUIRED", "EFENCE_STALE", "EFENCE_SCOPE_MISMATCH", "EFENCE_UNSUPPORTED", "EFENCE_MUTATION_MISMATCH", "EFENCE_OWNERSHIP_MISMATCH", "EFENCE_STATE_CORRUPT", "EFENCE_RECEIPT_LIMIT", "EFENCE_BUSY", "EFENCE_PUBLICATION_HELD", "EFENCE_CAPABILITY_MISMATCH", "EFENCE_NOT_HELD"];
19
43
  export type TSmartDbResourceFenceErrorCode = (typeof smartDbResourceFenceErrorCodes)[number];
20
44
  export interface ISmartDbResourceFence {
@@ -30,4 +30,4 @@ export const normalizeSmartDbResourceFenceError = (errorArg) => {
30
30
  }
31
31
  return new SmartDbResourceFenceError(match[1], match[2], error);
32
32
  };
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmljZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7SUFDNUMsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCx1QkFBdUI7SUFDdkIsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0Isc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QixpQkFBaUI7Q0FDVCxDQUFDO0FBc0VYLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBR2xELFlBQ0UsT0FBdUMsRUFDdkMsVUFBa0IsRUFDbEIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLEdBQUcsT0FBTyxLQUFLLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxDQUNoRCxRQUFpQixFQUNWLEVBQUU7SUFDVCxNQUFNLEtBQUssR0FDVCxRQUFRLFlBQVksS0FBSztRQUN2QixDQUFDLENBQUMsUUFBUTtRQUNWLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLElBQ0UsQ0FBQyxLQUFLO1FBQ04sQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQW1DLENBQzNDLEVBQ0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sSUFBSSx5QkFBeUIsQ0FDbEMsS0FBSyxDQUFDLENBQUMsQ0FBbUMsRUFDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmljZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEwQ0EsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7SUFDNUMsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCx1QkFBdUI7SUFDdkIsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0Isc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QixpQkFBaUI7Q0FDVCxDQUFDO0FBc0VYLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBR2xELFlBQ0UsT0FBdUMsRUFDdkMsVUFBa0IsRUFDbEIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLEdBQUcsT0FBTyxLQUFLLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxDQUNoRCxRQUFpQixFQUNWLEVBQUU7SUFDVCxNQUFNLEtBQUssR0FDVCxRQUFRLFlBQVksS0FBSztRQUN2QixDQUFDLENBQUMsUUFBUTtRQUNWLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLElBQ0UsQ0FBQyxLQUFLO1FBQ04sQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQW1DLENBQzNDLEVBQ0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sSUFBSSx5QkFBeUIsQ0FDbEMsS0FBSyxDQUFDLENBQUMsQ0FBbUMsRUFDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartdb",
3
- "version": "2.15.3",
3
+ "version": "2.16.0",
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": {
@@ -39,7 +39,8 @@
39
39
  "assets/**/*",
40
40
  "cli.js",
41
41
  ".smartconfig.json",
42
- "readme.md"
42
+ "readme.md",
43
+ "third-party-notices.md"
43
44
  ],
44
45
  "keywords": [
45
46
  "mongodb-compatible",
package/readme.md CHANGED
@@ -470,6 +470,59 @@ const db = new LocalSmartDb({
470
470
  | `getConnectionUri()` | `string` | Get the connection URI |
471
471
  | `getServer()` | `SmartdbServer` | Access the underlying server |
472
472
  | `running` | `boolean` | Whether the server is running |
473
+ | `LocalSmartDb.inspectOfflineStringValue(input, options?)` | `Promise<TLocalSmartDbOfflineStringValueInspectionResult>` | Read one exact top-level string value from stopped file storage without starting or mutating the engine |
474
+
475
+ #### Offline String-Value Inspection
476
+
477
+ `inspectOfflineStringValue()` is a Linux-only operational API for reading one metadata value while the owning `LocalSmartDb` engine is stopped. Other platforms reject the call because the reader requires Linux `openat2` descriptor traversal. It starts only the Rust management sidecar: it does not start a database listener, run storage migrations, repair tails, replay or truncate the WAL, compact data, or persist hints.
478
+
479
+ ```typescript
480
+ import { LocalSmartDb } from '@push.rocks/smartdb';
481
+
482
+ const result = await LocalSmartDb.inspectOfflineStringValue({
483
+ folderPath: '/var/lib/myapp/smartdb',
484
+ databaseName: 'myapp',
485
+ collectionName: 'MetadataDoc',
486
+ match: {
487
+ field: 'key',
488
+ value: 'migrationStateV1',
489
+ },
490
+ valueField: 'value',
491
+ limits: {
492
+ maximumDataFileBytes: 16 * 1024 * 1024,
493
+ maximumWalFileBytes: 16 * 1024 * 1024,
494
+ maximumRecords: 100_000,
495
+ maximumRecordBytes: 1024 * 1024,
496
+ maximumResultBytes: 1024 * 1024,
497
+ },
498
+ }, {
499
+ timeoutMs: 5000,
500
+ });
501
+
502
+ if (result.status === 'found') {
503
+ console.log(result.value);
504
+ }
505
+ ```
506
+
507
+ The result is only `{ status: 'not-found' }` or `{ status: 'found', value: string }`. No other document fields cross the management boundary. The reader validates descriptor-safe paths, the current data/WAL format, CRCs and live-record semantics, applies any bounded uncommitted WAL overlay in memory, and rejects ambiguous matches, corruption, exceeded limits, symlinks, an engine-owned storage root, or files that change during inspection.
508
+
509
+ The TypeScript API enforces these bounds before creating the sidecar or serializing the IPC request:
510
+
511
+ | Input | Enforced range |
512
+ |---|---|
513
+ | `folderPath` | 1 to 4096 UTF-8 bytes before and after absolute resolution; no control characters |
514
+ | `databaseName`, `collectionName` | 1 to 255 UTF-8 bytes; one canonical path component; no controls, slash, or backslash |
515
+ | `match.field`, `valueField` | 1 to 255 UTF-8 bytes; no control characters |
516
+ | `match.value` | 0 to 1,048,576 UTF-8 bytes and no larger than `maximumRecordBytes` |
517
+ | Complete serialized request | At most 2,097,152 bytes |
518
+ | `timeoutMs` | 1 to 2,147,483,647 milliseconds |
519
+ | `maximumDataFileBytes` | 64 to 268,435,456 bytes |
520
+ | `maximumWalFileBytes` | 64 to 67,108,864 bytes |
521
+ | `maximumRecords` | 1 to 1,000,000 data/WAL items |
522
+ | `maximumRecordBytes` | 22 to 17,825,792 bytes |
523
+ | `maximumResultBytes` | 1 to 16,777,216 bytes |
524
+
525
+ All numeric limits must be positive safe integers. The caller must stop and retain external ownership of the `LocalSmartDb` daemon for the full call. Current storage roots additionally enforce this through SmartDB's storage-owner lock. Roots created before that lock existed rely on the caller's external single-owner coordination plus descriptor and stability validation. One `timeoutMs` budget covers sidecar lookup/spawn, readiness, and the command. Cancellation or timeout kills and reaps the disposable sidecar before the call rejects.
473
526
 
474
527
  ### SmartdbDebugServer
475
528