@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.
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/ts_migration/classes.authmetadatamigrationrunner.d.ts +2 -1
- package/dist_ts/ts_migration/classes.authmetadatamigrationrunner.js +3 -3
- package/dist_ts/ts_migration/classes.storagemigrator.d.ts +2 -1
- package/dist_ts/ts_migration/classes.storagemigrator.js +36 -20
- package/dist_ts/ts_migration/index.d.ts +1 -0
- package/dist_ts/ts_migration/index.js +2 -1
- package/dist_ts/ts_migration/migrators/v0_to_v1.d.ts +7 -1
- package/dist_ts/ts_migration/migrators/v0_to_v1.js +162 -47
- package/dist_ts/ts_migration/migrators/v1_auth_metadata_permissions.d.ts +3 -2
- package/dist_ts/ts_migration/migrators/v1_auth_metadata_permissions.js +3 -3
- package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +2 -2
- package/dist_ts/ts_smartdb/rust-db-bridge.js +24 -10
- package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +1 -1
- package/dist_ts/ts_smartdb/server/SmartdbServer.js +76 -9
- package/package.json +1 -1
- package/readme.md +16 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/ts_migration/classes.authmetadatamigrationrunner.ts +3 -1
- package/ts/ts_migration/classes.storagemigrator.ts +38 -19
- package/ts/ts_migration/index.ts +1 -0
- package/ts/ts_migration/migrators/v0_to_v1.ts +224 -44
- package/ts/ts_migration/migrators/v1_auth_metadata_permissions.ts +4 -0
- package/ts/ts_smartdb/rust-db-bridge.ts +32 -11
- 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.
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
75
|
+
hasLegacyCollections = true;
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
78
|
}
|
|
75
|
-
//
|
|
76
|
-
|
|
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,
|
|
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,
|
|
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
|
|
196
|
+
const stagingDirectories = new Set();
|
|
106
197
|
try {
|
|
107
|
-
|
|
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.
|
|
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 (
|
|
130
|
-
|
|
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.
|
|
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
|
-
//
|
|
138
|
-
|
|
139
|
-
|
|
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(
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
182
|
-
|
|
285
|
+
await dataFileHandle.sync();
|
|
286
|
+
signalArg?.throwIfAborted();
|
|
183
287
|
// Write keydir.hint
|
|
184
|
-
const hintPath = path.join(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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 (
|
|
203
|
-
const destIndexPath = path.join(
|
|
204
|
-
fs.
|
|
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(
|
|
210
|
-
fs.
|
|
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
|
-
|
|
219
|
-
for (const dir of
|
|
327
|
+
const cleanupErrors = [];
|
|
328
|
+
for (const dir of Array.from(stagingDirectories).reverse()) {
|
|
220
329
|
try {
|
|
221
|
-
fs.
|
|
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
|
-
|
|
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,
|
|
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>;
|