@push.rocks/smartdb 3.0.0 → 3.0.2

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 (27) hide show
  1. package/dist_rust/rustdb_linux_amd64 +0 -0
  2. package/dist_rust/rustdb_linux_arm64 +0 -0
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/ts_migration/classes.authmetadatamigrationrunner.d.ts +2 -1
  5. package/dist_ts/ts_migration/classes.authmetadatamigrationrunner.js +3 -3
  6. package/dist_ts/ts_migration/classes.storagemigrator.d.ts +2 -1
  7. package/dist_ts/ts_migration/classes.storagemigrator.js +36 -20
  8. package/dist_ts/ts_migration/index.d.ts +1 -0
  9. package/dist_ts/ts_migration/index.js +2 -1
  10. package/dist_ts/ts_migration/migrators/v0_to_v1.d.ts +7 -1
  11. package/dist_ts/ts_migration/migrators/v0_to_v1.js +162 -47
  12. package/dist_ts/ts_migration/migrators/v1_auth_metadata_permissions.d.ts +3 -2
  13. package/dist_ts/ts_migration/migrators/v1_auth_metadata_permissions.js +3 -3
  14. package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +2 -2
  15. package/dist_ts/ts_smartdb/rust-db-bridge.js +24 -10
  16. package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +1 -1
  17. package/dist_ts/ts_smartdb/server/SmartdbServer.js +76 -9
  18. package/package.json +1 -1
  19. package/readme.md +16 -3
  20. package/ts/00_commitinfo_data.ts +1 -1
  21. package/ts/ts_migration/classes.authmetadatamigrationrunner.ts +3 -1
  22. package/ts/ts_migration/classes.storagemigrator.ts +38 -19
  23. package/ts/ts_migration/index.ts +1 -0
  24. package/ts/ts_migration/migrators/v0_to_v1.ts +224 -44
  25. package/ts/ts_migration/migrators/v1_auth_metadata_permissions.ts +4 -0
  26. package/ts/ts_smartdb/rust-db-bridge.ts +32 -11
  27. package/ts/ts_smartdb/server/SmartdbServer.ts +89 -9
Binary file
Binary file
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdb',
6
- version: '3.0.0',
6
+ version: '3.0.2',
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=
@@ -1,8 +1,9 @@
1
1
  import { type IAuthMetadataPermissionMigrationBridge, type TAuthMetadataPermissionMigrationStatus } from './migrators/v1_auth_metadata_permissions.js';
2
+ import type { ISmartDbManagementOperationOptions } from '../ts_smartdb/service-types.js';
2
3
  export type TAuthMetadataMigrationRunnerStatus = TAuthMetadataPermissionMigrationStatus | 'not-applicable';
3
4
  export declare class AuthMetadataMigrationRunner {
4
5
  private readonly usersPath;
5
6
  constructor(usersPath: string);
6
- run(bridgeArg: IAuthMetadataPermissionMigrationBridge): Promise<TAuthMetadataMigrationRunnerStatus>;
7
+ run(bridgeArg: IAuthMetadataPermissionMigrationBridge, optionsArg?: ISmartDbManagementOperationOptions): Promise<TAuthMetadataMigrationRunnerStatus>;
7
8
  }
8
9
  export type { IAuthMetadataPermissionMigrationBridge };
@@ -4,14 +4,14 @@ export class AuthMetadataMigrationRunner {
4
4
  constructor(usersPath) {
5
5
  this.usersPath = usersPath;
6
6
  }
7
- async run(bridgeArg) {
7
+ async run(bridgeArg, optionsArg) {
8
8
  if (process.platform !== 'linux')
9
9
  return 'not-applicable';
10
10
  let status = 'not-present';
11
11
  for (const migration of authMetadataMigrations) {
12
- status = await migration(bridgeArg, this.usersPath);
12
+ status = await migration(bridgeArg, this.usersPath, optionsArg);
13
13
  }
14
14
  return status;
15
15
  }
16
16
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRobWV0YWRhdGFtaWdyYXRpb25ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19taWdyYXRpb24vY2xhc3Nlcy5hdXRobWV0YWRhdGFtaWdyYXRpb25ydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdDQUFnQyxHQUdqQyxNQUFNLDZDQUE2QyxDQUFDO0FBRXJELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBVSxDQUFDO0FBTTNFLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsWUFBNkIsU0FBaUI7UUFBakIsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUFHLENBQUM7SUFFM0MsS0FBSyxDQUFDLEdBQUcsQ0FDZCxTQUFpRDtRQUVqRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTztZQUFFLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUQsSUFBSSxNQUFNLEdBQTJDLGFBQWEsQ0FBQztRQUNuRSxLQUFLLE1BQU0sU0FBUyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiJ9
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRobWV0YWRhdGFtaWdyYXRpb25ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19taWdyYXRpb24vY2xhc3Nlcy5hdXRobWV0YWRhdGFtaWdyYXRpb25ydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdDQUFnQyxHQUdqQyxNQUFNLDZDQUE2QyxDQUFDO0FBR3JELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBVSxDQUFDO0FBTTNFLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsWUFBNkIsU0FBaUI7UUFBakIsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUFHLENBQUM7SUFFM0MsS0FBSyxDQUFDLEdBQUcsQ0FDZCxTQUFpRCxFQUNqRCxVQUErQztRQUUvQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTztZQUFFLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUQsSUFBSSxNQUFNLEdBQTJDLGFBQWEsQ0FBQztRQUNuRSxLQUFLLE1BQU0sU0FBUyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YifQ==
@@ -13,7 +13,7 @@ export declare class StorageMigrator {
13
13
  /**
14
14
  * Run any needed migrations. Safe to call even if storage is already current.
15
15
  */
16
- run(): Promise<void>;
16
+ run(signalArg?: AbortSignal): Promise<void>;
17
17
  /**
18
18
  * Detect the storage format version by inspecting the directory structure.
19
19
  *
@@ -21,4 +21,5 @@ export declare class StorageMigrator {
21
21
  * v1: {db}/{coll}/data.rdb directories exist
22
22
  */
23
23
  private detectVersion;
24
+ private pathExists;
24
25
  }
@@ -1,5 +1,5 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
3
  import { migrateV0ToV1 } from './migrators/v0_to_v1.js';
4
4
  /**
5
5
  * StorageMigrator — runs before the Rust engine starts.
@@ -17,18 +17,21 @@ export class StorageMigrator {
17
17
  /**
18
18
  * Run any needed migrations. Safe to call even if storage is already current.
19
19
  */
20
- async run() {
21
- if (!fs.existsSync(this.storagePath)) {
20
+ async run(signalArg) {
21
+ signalArg?.throwIfAborted();
22
+ if (!await this.pathExists(this.storagePath)) {
22
23
  return; // No data yet — nothing to migrate
23
24
  }
24
- const version = this.detectVersion();
25
+ const version = await this.detectVersion(signalArg);
26
+ signalArg?.throwIfAborted();
25
27
  if (version === 1) {
26
28
  return; // Already current
27
29
  }
28
30
  if (version === 0) {
29
31
  console.log(`[smartdb] Detected v0 (JSON) storage format at ${this.storagePath}`);
30
32
  console.log(`[smartdb] Running migration v0 → v1 (Bitcask binary format)...`);
31
- const deletableFiles = await migrateV0ToV1(this.storagePath);
33
+ const deletableFiles = await migrateV0ToV1(this.storagePath, signalArg);
34
+ signalArg?.throwIfAborted();
32
35
  if (deletableFiles.length > 0) {
33
36
  console.log(`[smartdb] Migration v0 → v1 complete.`);
34
37
  console.log(`[smartdb] The following old files can be safely deleted:`);
@@ -47,33 +50,46 @@ export class StorageMigrator {
47
50
  * v0: {db}/{coll}.json files exist
48
51
  * v1: {db}/{coll}/data.rdb directories exist
49
52
  */
50
- detectVersion() {
51
- const entries = fs.readdirSync(this.storagePath, { withFileTypes: true });
53
+ async detectVersion(signalArg) {
54
+ signalArg?.throwIfAborted();
55
+ const entries = await fs.readdir(this.storagePath, { withFileTypes: true });
56
+ let hasLegacyCollections = false;
52
57
  for (const entry of entries) {
58
+ signalArg?.throwIfAborted();
53
59
  if (!entry.isDirectory())
54
60
  continue;
55
61
  if (entry.name.startsWith('.__rustdb_'))
56
62
  continue;
57
63
  const dbDir = path.join(this.storagePath, entry.name);
58
- const dbEntries = fs.readdirSync(dbDir, { withFileTypes: true });
64
+ const dbEntries = await fs.readdir(dbDir, { withFileTypes: true });
59
65
  for (const dbEntry of dbEntries) {
66
+ signalArg?.throwIfAborted();
67
+ if (dbEntry.isDirectory()
68
+ && dbEntry.name.startsWith('.__rustdb_migration_')) {
69
+ throw new Error(`SmartDB legacy migration staging is orphaned: ${path.join(dbDir, dbEntry.name)}`);
70
+ }
60
71
  if (dbEntry.name.startsWith('.__rustdb_'))
61
72
  continue;
62
- // v1: subdirectory with data.rdb
63
- if (dbEntry.isDirectory()) {
64
- const dataRdb = path.join(dbDir, dbEntry.name, 'data.rdb');
65
- if (fs.existsSync(dataRdb)) {
66
- return 1;
67
- }
68
- }
69
73
  // v0: .json file (not .indexes.json)
70
74
  if (dbEntry.isFile() && dbEntry.name.endsWith('.json') && !dbEntry.name.endsWith('.indexes.json')) {
71
- return 0;
75
+ hasLegacyCollections = true;
72
76
  }
73
77
  }
74
78
  }
75
- // Empty or unrecognized treat as v1 (fresh start)
76
- return 1;
79
+ // A mixed layout is an interrupted/resumable migration, not proof that the
80
+ // complete storage root is already current.
81
+ return hasLegacyCollections ? 0 : 1;
82
+ }
83
+ async pathExists(pathArg) {
84
+ try {
85
+ await fs.stat(pathArg);
86
+ return true;
87
+ }
88
+ catch (error) {
89
+ if (error.code === 'ENOENT')
90
+ return false;
91
+ throw error;
92
+ }
77
93
  }
78
94
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlbWlncmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19taWdyYXRpb24vY2xhc3Nlcy5zdG9yYWdlbWlncmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBU3hEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRztRQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxtQ0FBbUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsa0JBQWtCO1FBQzVCLENBQUM7UUFFRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsRixPQUFPLENBQUMsR0FBRyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7WUFFOUUsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7Z0JBQ3hFLEtBQUssTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUVBQWlFLENBQUMsQ0FBQztZQUNqRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGFBQWE7UUFDbkIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFMUUsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFBRSxTQUFTO1lBQ25DLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO2dCQUFFLFNBQVM7WUFFbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO29CQUFFLFNBQVM7Z0JBQ3BELGlDQUFpQztnQkFDakMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDM0QsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxxQ0FBcUM7Z0JBQ3JDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDbEcsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGIn0=
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlbWlncmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19taWdyYXRpb24vY2xhc3Nlcy5zdG9yYWdlbWlncmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFTeEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFZLFdBQW1CO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBdUI7UUFDL0IsU0FBUyxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxDQUFDLG1DQUFtQztRQUM3QyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELFNBQVMsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUU1QixJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsa0JBQWtCO1FBQzVCLENBQUM7UUFFRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsRixPQUFPLENBQUMsR0FBRyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7WUFFOUUsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcs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
@@ -1,2 +1,3 @@
1
1
  export { StorageMigrator } from './classes.storagemigrator.js';
2
+ export { SmartDbStorageMigrationCleanupError } from './migrators/v0_to_v1.js';
2
3
  export { AuthMetadataMigrationRunner, type IAuthMetadataPermissionMigrationBridge, type TAuthMetadataMigrationRunnerStatus, } from './classes.authmetadatamigrationrunner.js';
@@ -1,3 +1,4 @@
1
1
  export { StorageMigrator } from './classes.storagemigrator.js';
2
+ export { SmartDbStorageMigrationCleanupError } from './migrators/v0_to_v1.js';
2
3
  export { AuthMetadataMigrationRunner, } from './classes.authmetadatamigrationrunner.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19taWdyYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDTCwyQkFBMkIsR0FHNUIsTUFBTSwwQ0FBMEMsQ0FBQyJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19taWdyYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlFLE9BQU8sRUFDTCwyQkFBMkIsR0FHNUIsTUFBTSwwQ0FBMEMsQ0FBQyJ9
@@ -1,3 +1,9 @@
1
+ export declare class SmartDbStorageMigrationCleanupError extends AggregateError {
2
+ constructor(operationErrorArg: unknown, cleanupErrorsArg: unknown[]);
3
+ }
4
+ export declare const runWithOwnedMigrationFileHandle: <TResult, TFileHandle extends {
5
+ close(): Promise<void>;
6
+ }>(fileHandleArg: TFileHandle, operationArg: (fileHandleArg: TFileHandle) => Promise<TResult>, signalArg?: AbortSignal) => Promise<TResult>;
1
7
  /**
2
8
  * Migrate a storage directory from v0 (JSON-per-collection) to v1 (Bitcask binary).
3
9
  *
@@ -6,4 +12,4 @@
6
12
  * - Returns a list of old files that can be safely deleted.
7
13
  * - On failure, cleans up any partial new files and throws.
8
14
  */
9
- export declare function migrateV0ToV1(storagePath: string): Promise<string[]>;
15
+ export declare function migrateV0ToV1(storagePath: string, signalArg?: AbortSignal): Promise<string[]>;
@@ -1,6 +1,6 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as crypto from 'crypto';
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import * as crypto from 'node:crypto';
4
4
  import { BSON } from 'bson';
5
5
  // ---------------------------------------------------------------------------
6
6
  // Binary format constants (must match Rust: record.rs)
@@ -92,6 +92,97 @@ function crc32(data) {
92
92
  }
93
93
  return (crc ^ 0xFFFFFFFF) >>> 0;
94
94
  }
95
+ const pathExists = async (pathArg) => {
96
+ try {
97
+ await fs.stat(pathArg);
98
+ return true;
99
+ }
100
+ catch (error) {
101
+ if (error.code === 'ENOENT')
102
+ return false;
103
+ throw error;
104
+ }
105
+ };
106
+ export class SmartDbStorageMigrationCleanupError extends AggregateError {
107
+ constructor(operationErrorArg, cleanupErrorsArg) {
108
+ super([operationErrorArg, ...cleanupErrorsArg], 'SmartDB legacy storage migration failed and staging cleanup was incomplete', { cause: operationErrorArg });
109
+ this.name = 'SmartDbStorageMigrationCleanupError';
110
+ }
111
+ }
112
+ export const runWithOwnedMigrationFileHandle = async (fileHandleArg, operationArg, signalArg) => {
113
+ let operationResult;
114
+ let operationError;
115
+ let operationCompleted = false;
116
+ try {
117
+ operationResult = await operationArg(fileHandleArg);
118
+ operationCompleted = true;
119
+ }
120
+ catch (error) {
121
+ operationError = error;
122
+ }
123
+ try {
124
+ await fileHandleArg.close();
125
+ }
126
+ catch (closeError) {
127
+ if (operationError !== undefined) {
128
+ throw new SmartDbStorageMigrationCleanupError(operationError, [closeError]);
129
+ }
130
+ if (signalArg?.aborted) {
131
+ throw new SmartDbStorageMigrationCleanupError(signalArg.reason, [closeError]);
132
+ }
133
+ throw closeError;
134
+ }
135
+ if (!operationCompleted)
136
+ throw operationError;
137
+ return operationResult;
138
+ };
139
+ const withFileHandle = async (filePathArg, flagsArg, operationArg, signalArg) => runWithOwnedMigrationFileHandle(await fs.open(filePathArg, flagsArg), operationArg, signalArg);
140
+ const writeBuffer = async (fileHandleArg, bufferArg, signalArg) => {
141
+ let offset = 0;
142
+ while (offset < bufferArg.length) {
143
+ signalArg?.throwIfAborted();
144
+ const { bytesWritten } = await fileHandleArg.write(bufferArg, offset, bufferArg.length - offset, null);
145
+ if (bytesWritten <= 0) {
146
+ throw new Error('SmartDB storage migration write made no progress');
147
+ }
148
+ offset += bytesWritten;
149
+ }
150
+ signalArg?.throwIfAborted();
151
+ };
152
+ const syncDirectory = async (directoryPathArg, signalArg) => {
153
+ try {
154
+ await withFileHandle(directoryPathArg, 'r', async (directoryHandleArg) => {
155
+ await directoryHandleArg.sync();
156
+ }, signalArg);
157
+ }
158
+ catch (error) {
159
+ if (!['EINVAL', 'ENOTSUP'].includes(error.code || '')) {
160
+ throw error;
161
+ }
162
+ }
163
+ };
164
+ const syncFile = async (filePathArg, signalArg) => {
165
+ await withFileHandle(filePathArg, 'r', async (fileHandleArg) => {
166
+ await fileHandleArg.sync();
167
+ }, signalArg);
168
+ };
169
+ const assertPublishedMigrationComplete = async (collectionDirectoryArg) => {
170
+ for (const fileName of ['data.rdb', 'keydir.hint', 'indexes.json']) {
171
+ let fileStat;
172
+ try {
173
+ fileStat = await fs.lstat(path.join(collectionDirectoryArg, fileName));
174
+ }
175
+ catch (error) {
176
+ if (error.code === 'ENOENT') {
177
+ throw new Error(`SmartDB legacy migration target is incomplete: ${collectionDirectoryArg}`, { cause: error });
178
+ }
179
+ throw error;
180
+ }
181
+ if (!fileStat.isFile() || fileStat.isSymbolicLink()) {
182
+ throw new Error(`SmartDB legacy migration target is incomplete: ${collectionDirectoryArg}`);
183
+ }
184
+ }
185
+ };
95
186
  /**
96
187
  * Migrate a storage directory from v0 (JSON-per-collection) to v1 (Bitcask binary).
97
188
  *
@@ -100,19 +191,22 @@ function crc32(data) {
100
191
  * - Returns a list of old files that can be safely deleted.
101
192
  * - On failure, cleans up any partial new files and throws.
102
193
  */
103
- export async function migrateV0ToV1(storagePath) {
194
+ export async function migrateV0ToV1(storagePath, signalArg) {
104
195
  const deletableFiles = [];
105
- const createdDirs = [];
196
+ const stagingDirectories = new Set();
106
197
  try {
107
- const dbEntries = fs.readdirSync(storagePath, { withFileTypes: true });
198
+ signalArg?.throwIfAborted();
199
+ const dbEntries = await fs.readdir(storagePath, { withFileTypes: true });
108
200
  for (const dbEntry of dbEntries) {
201
+ signalArg?.throwIfAborted();
109
202
  if (!dbEntry.isDirectory())
110
203
  continue;
111
204
  if (dbEntry.name.startsWith('.__rustdb_'))
112
205
  continue;
113
206
  const dbDir = path.join(storagePath, dbEntry.name);
114
- const collFiles = fs.readdirSync(dbDir, { withFileTypes: true });
207
+ const collFiles = await fs.readdir(dbDir, { withFileTypes: true });
115
208
  for (const collFile of collFiles) {
209
+ signalArg?.throwIfAborted();
116
210
  if (!collFile.isFile())
117
211
  continue;
118
212
  if (collFile.name.startsWith('.__rustdb_'))
@@ -126,28 +220,38 @@ export async function migrateV0ToV1(storagePath) {
126
220
  const indexJsonPath = path.join(dbDir, `${collName}.indexes.json`);
127
221
  // Target directory
128
222
  const collDir = path.join(dbDir, collName);
129
- if (fs.existsSync(collDir)) {
130
- // Already migrated
223
+ if (await pathExists(collDir)) {
224
+ await assertPublishedMigrationComplete(collDir);
225
+ if (await pathExists(indexJsonPath))
226
+ deletableFiles.push(indexJsonPath);
227
+ deletableFiles.push(jsonPath);
131
228
  continue;
132
229
  }
133
230
  console.log(`[smartdb] Migrating ${dbEntry.name}.${collName}...`);
134
231
  // Read the JSON collection
135
- const jsonData = fs.readFileSync(jsonPath, 'utf-8');
232
+ const jsonData = await fs.readFile(jsonPath, {
233
+ encoding: 'utf8',
234
+ signal: signalArg,
235
+ });
236
+ signalArg?.throwIfAborted();
136
237
  const docs = JSON.parse(jsonData);
137
- // Create collection directory
138
- fs.mkdirSync(collDir, { recursive: true });
139
- createdDirs.push(collDir);
238
+ // Build the complete collection in a hidden sibling and publish it
239
+ // atomically so cancellation can never expose partial v1 state.
240
+ const stagingDir = path.join(dbDir, `.__rustdb_migration_${collName}_${process.pid}_${crypto.randomBytes(8).toString('hex')}`);
241
+ await fs.mkdir(stagingDir);
242
+ stagingDirectories.add(stagingDir);
243
+ signalArg?.throwIfAborted();
140
244
  // Write data.rdb
141
- const dataPath = path.join(collDir, 'data.rdb');
142
- const fd = fs.openSync(dataPath, 'w');
143
- try {
245
+ const dataPath = path.join(stagingDir, 'data.rdb');
246
+ await withFileHandle(dataPath, 'wx', async (dataFileHandle) => {
144
247
  // File header
145
248
  const headerBuf = writeFileHeader(FILE_TYPE_DATA);
146
- fs.writeSync(fd, headerBuf);
249
+ await writeBuffer(dataFileHandle, headerBuf, signalArg);
147
250
  let currentOffset = BigInt(FILE_HEADER_SIZE);
148
251
  const keydir = new Map();
149
252
  const ts = BigInt(Date.now());
150
253
  for (const doc of docs) {
254
+ signalArg?.throwIfAborted();
151
255
  // Extract _id
152
256
  let idHex;
153
257
  if (doc._id && doc._id.$oid) {
@@ -169,7 +273,7 @@ export async function migrateV0ToV1(storagePath) {
169
273
  const keyBuf = Buffer.from(idHex, 'utf-8');
170
274
  const valueBuf = Buffer.from(bsonBytes);
171
275
  const record = encodeDataRecord(ts, keyBuf, valueBuf);
172
- fs.writeSync(fd, record);
276
+ await writeBuffer(dataFileHandle, record, signalArg);
173
277
  keydir.set(idHex, {
174
278
  offset: currentOffset,
175
279
  recordLen: record.length,
@@ -178,52 +282,63 @@ export async function migrateV0ToV1(storagePath) {
178
282
  });
179
283
  currentOffset += BigInt(record.length);
180
284
  }
181
- fs.fsyncSync(fd);
182
- fs.closeSync(fd);
285
+ await dataFileHandle.sync();
286
+ signalArg?.throwIfAborted();
183
287
  // Write keydir.hint
184
- const hintPath = path.join(collDir, 'keydir.hint');
185
- const hintFd = fs.openSync(hintPath, 'w');
186
- fs.writeSync(hintFd, writeFileHeader(FILE_TYPE_HINT));
187
- for (const [key, entry] of keydir) {
188
- fs.writeSync(hintFd, encodeHintEntry(key, entry.offset, entry.recordLen, entry.valueLen, entry.timestamp));
189
- }
190
- fs.fsyncSync(hintFd);
191
- fs.closeSync(hintFd);
192
- }
193
- catch (writeErr) {
194
- // Clean up on write failure
195
- try {
196
- fs.closeSync(fd);
197
- }
198
- catch { }
199
- throw writeErr;
200
- }
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
+ }, signalArg);
201
299
  // Copy indexes.json if it exists
202
- if (fs.existsSync(indexJsonPath)) {
203
- const destIndexPath = path.join(collDir, 'indexes.json');
204
- fs.copyFileSync(indexJsonPath, destIndexPath);
300
+ if (await pathExists(indexJsonPath)) {
301
+ const destIndexPath = path.join(stagingDir, 'indexes.json');
302
+ await fs.copyFile(indexJsonPath, destIndexPath);
303
+ await syncFile(destIndexPath, signalArg);
304
+ signalArg?.throwIfAborted();
205
305
  deletableFiles.push(indexJsonPath);
206
306
  }
207
307
  else {
208
308
  // Write default _id index
209
- const destIndexPath = path.join(collDir, 'indexes.json');
210
- fs.writeFileSync(destIndexPath, JSON.stringify([{ name: '_id_', key: { _id: 1 } }], null, 2));
309
+ const destIndexPath = path.join(stagingDir, 'indexes.json');
310
+ await fs.writeFile(destIndexPath, JSON.stringify([{ name: '_id_', key: { _id: 1 } }], null, 2), { signal: signalArg });
311
+ await syncFile(destIndexPath, signalArg);
312
+ signalArg?.throwIfAborted();
211
313
  }
314
+ await assertPublishedMigrationComplete(stagingDir);
315
+ await syncDirectory(stagingDir, signalArg);
316
+ signalArg?.throwIfAborted();
317
+ await fs.rename(stagingDir, collDir);
318
+ stagingDirectories.delete(stagingDir);
319
+ await syncDirectory(dbDir, signalArg);
320
+ signalArg?.throwIfAborted();
212
321
  deletableFiles.push(jsonPath);
213
322
  console.log(`[smartdb] Migrated ${dbEntry.name}.${collName}: ${docs.length} documents`);
214
323
  }
215
324
  }
216
325
  }
217
326
  catch (err) {
218
- // Clean up any partially created directories
219
- for (const dir of createdDirs) {
327
+ const cleanupErrors = [];
328
+ for (const dir of Array.from(stagingDirectories).reverse()) {
220
329
  try {
221
- fs.rmSync(dir, { recursive: true, force: true });
330
+ await fs.rm(dir, { recursive: true, force: true });
331
+ await syncDirectory(path.dirname(dir));
332
+ }
333
+ catch (cleanupError) {
334
+ cleanupErrors.push(cleanupError);
222
335
  }
223
- catch { }
336
+ }
337
+ if (cleanupErrors.length > 0) {
338
+ throw new SmartDbStorageMigrationCleanupError(err, cleanupErrors);
224
339
  }
225
340
  throw err;
226
341
  }
227
342
  return deletableFiles;
228
343
  }
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjBfdG9fdjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19taWdyYXRpb24vbWlncmF0b3JzL3YwX3RvX3YxLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUIsOEVBQThFO0FBQzlFLHVEQUF1RDtBQUN2RCw4RUFBOEU7QUFFOUUsb0NBQW9DO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JELDZCQUE2QjtBQUM3QixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIscUJBQXFCO0FBQ3JCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsNkJBQTZCO0FBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLHVCQUF1QjtBQUN2QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUM7QUFDNUIsNkJBQTZCO0FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUMsb0JBQW9CO0FBRW5ELDhFQUE4RTtBQUM5RSwwQkFBMEI7QUFDMUIsOEVBQThFO0FBRTlFLFNBQVMsZUFBZSxDQUFDLFFBQWdCO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENB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
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjBfdG9fdjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19taWdyYXRpb24vbWlncmF0b3JzL3YwX3RvX3YxLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qiw4RUFBOEU7QUFDOUUsdURBQXVEO0FBQ3ZELDhFQUE4RTtBQUU5RSxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsNkJBQTZCO0FBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixxQkFBcUI7QUFDckIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6Qiw2QkFBNkI7QUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsdUJBQXVCO0FBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUM1Qiw2QkFBNkI7QUFDN0IsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7QUFFbkQsOEVBQThFO0FBQzlFLDBCQUEwQjtBQUMxQiw4RUFBOEU7QUFFOUUsU0FBUyxlQUFlLENBQUMsUUFBZ0I7SUFDdkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixHQUFHLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMs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
@@ -1,6 +1,7 @@
1
1
  import type { TAuthMetadataPermissionTransitionStatus } from '../../ts_smartdb/rust-db-bridge.js';
2
+ import type { ISmartDbManagementOperationOptions } from '../../ts_smartdb/service-types.js';
2
3
  export interface IAuthMetadataPermissionMigrationBridge {
3
- transitionAuthMetadataPermissions(usersPathArg: string, expectedModeArg: number, targetModeArg: number): Promise<TAuthMetadataPermissionTransitionStatus>;
4
+ transitionAuthMetadataPermissions(usersPathArg: string, expectedModeArg: number, targetModeArg: number, optionsArg?: ISmartDbManagementOperationOptions): Promise<TAuthMetadataPermissionTransitionStatus>;
4
5
  }
5
6
  export type TAuthMetadataPermissionMigrationStatus = TAuthMetadataPermissionTransitionStatus;
6
7
  /**
@@ -8,4 +9,4 @@ export type TAuthMetadataPermissionMigrationStatus = TAuthMetadataPermissionTran
8
9
  * process umask and therefore has exact mode 0644 in the supported legacy
9
10
  * state. The native primitive retains the descriptor while applying 0600.
10
11
  */
11
- export declare const migrateV1AuthMetadataPermissions: (bridgeArg: IAuthMetadataPermissionMigrationBridge, usersPathArg: string) => Promise<TAuthMetadataPermissionMigrationStatus>;
12
+ export declare const migrateV1AuthMetadataPermissions: (bridgeArg: IAuthMetadataPermissionMigrationBridge, usersPathArg: string, optionsArg?: ISmartDbManagementOperationOptions) => Promise<TAuthMetadataPermissionMigrationStatus>;
@@ -5,6 +5,6 @@ const privateAuthMetadataMode = 0o600;
5
5
  * process umask and therefore has exact mode 0644 in the supported legacy
6
6
  * state. The native primitive retains the descriptor while applying 0600.
7
7
  */
8
- export const migrateV1AuthMetadataPermissions = async (bridgeArg, usersPathArg) => bridgeArg
9
- .transitionAuthMetadataPermissions(usersPathArg, legacyAuthMetadataMode, privateAuthMetadataMode);
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFfYXV0aF9tZXRhZGF0YV9wZXJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX21pZ3JhdGlvbi9taWdyYXRvcnMvdjFfYXV0aF9tZXRhZGF0YV9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQWF0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsS0FBSyxFQUNuRCxTQUFpRCxFQUNqRCxZQUFvQixFQUM2QixFQUFFLENBQUMsU0FBUztLQUM1RCxpQ0FBaUMsQ0FDaEMsWUFBWSxFQUNaLHNCQUFzQixFQUN0Qix1QkFBdUIsQ0FDeEIsQ0FBQyJ9
8
+ export const migrateV1AuthMetadataPermissions = async (bridgeArg, usersPathArg, optionsArg) => bridgeArg
9
+ .transitionAuthMetadataPermissions(usersPathArg, legacyAuthMetadataMode, privateAuthMetadataMode, optionsArg);
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFfYXV0aF9tZXRhZGF0YV9wZXJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX21pZ3JhdGlvbi9taWdyYXRvcnMvdjFfYXV0aF9tZXRhZGF0YV9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQWN0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsS0FBSyxFQUNuRCxTQUFpRCxFQUNqRCxZQUFvQixFQUNwQixVQUErQyxFQUNFLEVBQUUsQ0FBQyxTQUFTO0tBQzVELGlDQUFpQyxDQUNoQyxZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixVQUFVLENBQ1gsQ0FBQyJ9
@@ -146,8 +146,8 @@ export declare class RustDbBridge extends EventEmitter {
146
146
  get ownershipReleased(): boolean;
147
147
  private awaitManagementOperationTermination;
148
148
  inspectOfflineStringValue(inputArg: ILocalSmartDbOfflineStringValueInspection, optionsArg?: ISmartDbManagementOperationOptions): Promise<TLocalSmartDbOfflineStringValueInspectionResult>;
149
- transitionAuthMetadataPermissions(usersPathArg: string, expectedModeArg: number, targetModeArg: number): Promise<TAuthMetadataPermissionTransitionStatus>;
150
- startDb(config: ISmartDbRustConfig): Promise<{
149
+ transitionAuthMetadataPermissions(usersPathArg: string, expectedModeArg: number, targetModeArg: number, optionsArg?: ISmartDbManagementOperationOptions): Promise<TAuthMetadataPermissionTransitionStatus>;
150
+ startDb(config: ISmartDbRustConfig, optionsArg?: ISmartDbManagementOperationOptions): Promise<{
151
151
  connectionUri: string;
152
152
  }>;
153
153
  stopDb(): Promise<void>;