@push.rocks/smartdb 2.14.10 → 2.15.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.
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/index.js +1 -1
- package/dist_ts/ts_smartdb/index.d.ts +2 -2
- package/dist_ts/ts_smartdb/index.js +3 -3
- package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +20 -8
- package/dist_ts/ts_smartdb/rust-db-bridge.js +92 -14
- package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +11 -6
- package/dist_ts/ts_smartdb/server/SmartdbServer.js +32 -12
- package/dist_ts/ts_smartdb/service-types.d.ts +17 -0
- package/dist_ts/ts_smartdb/service-types.js +1 -1
- package/package.json +1 -1
- package/readme.md +20 -6
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +2 -0
- package/ts/ts_smartdb/index.ts +7 -2
- package/ts/ts_smartdb/rust-db-bridge.ts +153 -9
- package/ts/ts_smartdb/server/SmartdbServer.ts +62 -8
- package/ts/ts_smartdb/service-types.ts +19 -0
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartdb',
|
|
6
|
-
version: '2.
|
|
6
|
+
version: '2.15.0',
|
|
7
7
|
description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHFIQUFxSDtDQUNuSSxDQUFBIn0=
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -4,5 +4,5 @@ export { LocalSmartDb } from './ts_local/index.js';
|
|
|
4
4
|
export type { ILocalSmartDbOptions, ILocalSmartDbConnectionInfo } from './ts_local/index.js';
|
|
5
5
|
export { StorageMigrator } from './ts_migration/index.js';
|
|
6
6
|
export { commitinfo };
|
|
7
|
-
export type { IOpLogEntry, IOpLogResult, IOpLogStats, IRevertResult, ICollectionInfo, IDocumentsResult, ISmartDbMetrics, ISmartDbHealth, ISmartDbResourceFence, ISmartDbResourceFenceReceipt, ISmartDbHeldPublicationReceipt, ISmartDbCommitDatabasePublicationInput, TSmartDbCommitDatabasePublicationResult, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbDatabaseExportLimits, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, TSmartDbEffectivePayloadInputV1, } from './ts_smartdb/index.js';
|
|
7
|
+
export type { IOpLogEntry, IOpLogResult, IOpLogStats, IRevertResult, ICollectionInfo, IDocumentsResult, ISmartDbMetrics, ISmartDbHealth, ISmartDbResourceFence, ISmartDbResourceFenceReceipt, ISmartDbHeldPublicationReceipt, ISmartDbCommitDatabasePublicationInput, ISmartDbManagementOperationOptions, ISmartDbDatabaseResourceFenceState, TSmartDbCommitDatabasePublicationResult, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbDatabaseExportLimits, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, TSmartDbEffectivePayloadInputV1, } from './ts_smartdb/index.js';
|
|
8
8
|
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, createSmartDbEffectivePayloadSha256V1, } from './ts_smartdb/index.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -8,4 +8,4 @@ export { StorageMigrator } from './ts_migration/index.js';
|
|
|
8
8
|
// Export commitinfo
|
|
9
9
|
export { commitinfo };
|
|
10
10
|
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, createSmartDbEffectivePayloadSha256V1, } from './ts_smartdb/index.js';
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsNkJBQTZCO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsc0JBQXNCO0FBQ3RCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUduRCxtQkFBbUI7QUFDbkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFtQ3RCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5QixxQ0FBcUMsR0FDdEMsTUFBTSx1QkFBdUIsQ0FBQyJ9
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { SmartdbServer } from './server/SmartdbServer.js';
|
|
2
2
|
export type { ISmartdbAuthOptions, ISmartdbAuthUser, ISmartdbOplogOptions, ISmartdbServerOptions, ISmartdbTlsOptions, } from './server/SmartdbServer.js';
|
|
3
|
-
export { RustDbBridge } from './rust-db-bridge.js';
|
|
3
|
+
export { RustDbBridge, SmartDbManagementOperationTerminationError, } from './rust-db-bridge.js';
|
|
4
4
|
export type { IOpLogEntry, IOpLogResult, IOpLogStats, IRevertResult, ICollectionInfo, IDocumentsResult, ISmartDbMetrics, } from './rust-db-bridge.js';
|
|
5
|
-
export type { ISmartDbHealth, ISmartDbResourceFence, ISmartDbResourceFenceReceipt, ISmartDbHeldPublicationReceipt, ISmartDbCommitDatabasePublicationInput, TSmartDbCommitDatabasePublicationResult, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbDatabaseExportLimits, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './service-types.js';
|
|
5
|
+
export type { ISmartDbHealth, ISmartDbResourceFence, ISmartDbResourceFenceReceipt, ISmartDbHeldPublicationReceipt, ISmartDbCommitDatabasePublicationInput, ISmartDbManagementOperationOptions, ISmartDbDatabaseResourceFenceState, TSmartDbCommitDatabasePublicationResult, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbDatabaseExportLimits, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './service-types.js';
|
|
6
6
|
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, } from './service-types.js';
|
|
7
7
|
export type { TSmartDbEffectivePayloadInputV1 } from './resource-fencing.js';
|
|
8
8
|
export { createSmartDbEffectivePayloadSha256V1 } from './resource-fencing.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// SmartDB - Wire protocol compatible embedded database server
|
|
2
2
|
// Export server (the main entry point for using SmartDB)
|
|
3
3
|
export { SmartdbServer } from './server/SmartdbServer.js';
|
|
4
|
-
// Export bridge for advanced usage
|
|
5
|
-
export { RustDbBridge } from './rust-db-bridge.js';
|
|
4
|
+
// Export bridge for advanced usage and its fail-stop ownership error.
|
|
5
|
+
export { RustDbBridge, SmartDbManagementOperationTerminationError, } from './rust-db-bridge.js';
|
|
6
6
|
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, } from './service-types.js';
|
|
7
7
|
export { createSmartDbEffectivePayloadSha256V1 } from './resource-fencing.js';
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19zbWFydGRiL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhEQUE4RDtBQUU5RCx5REFBeUQ7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUzFELHNFQUFzRTtBQUN0RSxPQUFPLEVBQ0wsWUFBWSxFQUNaLDBDQUEwQyxHQUMzQyxNQUFNLHFCQUFxQixDQUFDO0FBc0M3QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGtDQUFrQyxFQUNsQyw4QkFBOEIsR0FDL0IsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQyJ9
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
1
2
|
import { EventEmitter } from 'events';
|
|
2
|
-
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, ISmartDbCommitDatabasePublicationInput, TSmartDbCommitDatabasePublicationResult } from './service-types.js';
|
|
3
|
-
export type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, ISmartDbHeldPublicationReceipt, ISmartDbCommitDatabasePublicationInput, TSmartDbCommitDatabasePublicationResult, } from './service-types.js';
|
|
3
|
+
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, ISmartDbCommitDatabasePublicationInput, ISmartDbManagementOperationOptions, ISmartDbDatabaseResourceFenceState, TSmartDbCommitDatabasePublicationResult } from './service-types.js';
|
|
4
|
+
export type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, ISmartDbHeldPublicationReceipt, ISmartDbCommitDatabasePublicationInput, ISmartDbManagementOperationOptions, ISmartDbDatabaseResourceFenceState, TSmartDbCommitDatabasePublicationResult, } from './service-types.js';
|
|
4
5
|
/**
|
|
5
6
|
* A single oplog entry returned from the Rust engine.
|
|
6
7
|
*/
|
|
@@ -62,6 +63,9 @@ export interface IDocumentsResult {
|
|
|
62
63
|
documents: Record<string, any>[];
|
|
63
64
|
total: number;
|
|
64
65
|
}
|
|
66
|
+
export declare class SmartDbManagementOperationTerminationError extends AggregateError {
|
|
67
|
+
constructor(operationErrorArg: unknown, terminationErrorArg: unknown);
|
|
68
|
+
}
|
|
65
69
|
/**
|
|
66
70
|
* Server metrics.
|
|
67
71
|
*/
|
|
@@ -117,6 +121,9 @@ export declare function getRustDbAllocatorEnv(environment?: NodeJS.ProcessEnv):
|
|
|
117
121
|
*/
|
|
118
122
|
export declare class RustDbBridge extends EventEmitter {
|
|
119
123
|
private bridge;
|
|
124
|
+
private terminationConfirmed;
|
|
125
|
+
private terminationPromise;
|
|
126
|
+
private terminationFailure;
|
|
120
127
|
constructor();
|
|
121
128
|
/**
|
|
122
129
|
* Spawn the Rust binary in management mode.
|
|
@@ -130,11 +137,13 @@ export declare class RustDbBridge extends EventEmitter {
|
|
|
130
137
|
/**
|
|
131
138
|
* Confirm that the Rust process has exited and all bridge resources are released.
|
|
132
139
|
*/
|
|
133
|
-
terminate(): Promise<void>;
|
|
140
|
+
terminate(optionsArg?: plugins.smartrust.IRustBridgeTerminateOptions): Promise<void>;
|
|
134
141
|
/**
|
|
135
142
|
* Whether the bridge is currently running.
|
|
136
143
|
*/
|
|
137
144
|
get running(): boolean;
|
|
145
|
+
get ownershipReleased(): boolean;
|
|
146
|
+
private awaitManagementOperationTermination;
|
|
138
147
|
startDb(config: ISmartDbRustConfig): Promise<{
|
|
139
148
|
connectionUri: string;
|
|
140
149
|
}>;
|
|
@@ -145,17 +154,20 @@ export declare class RustDbBridge extends EventEmitter {
|
|
|
145
154
|
getMetrics(): Promise<ISmartDbMetrics>;
|
|
146
155
|
getHealth(): Promise<ISmartDbHealth>;
|
|
147
156
|
createDatabaseTenant(params: ISmartDbDatabaseTenantInput): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
148
|
-
ensureDatabaseTenant(params: ISmartDbEnsureDatabaseTenantInput): Promise<ISmartDbEnsureDatabaseTenantResult>;
|
|
149
|
-
deleteDatabaseTenant(params: ISmartDbDeleteDatabaseTenantInput): Promise<ISmartDbDeleteDatabaseTenantResult>;
|
|
157
|
+
ensureDatabaseTenant(params: ISmartDbEnsureDatabaseTenantInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbEnsureDatabaseTenantResult>;
|
|
158
|
+
deleteDatabaseTenant(params: ISmartDbDeleteDatabaseTenantInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbDeleteDatabaseTenantResult>;
|
|
150
159
|
rotateDatabaseTenantPassword(params: ISmartDbRotateDatabaseTenantPasswordInput): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
151
160
|
listDatabaseTenants(): Promise<ISmartDbDatabaseTenantDescriptor[]>;
|
|
152
161
|
getDatabaseTenantDescriptor(params: {
|
|
153
162
|
databaseName: string;
|
|
154
163
|
username: string;
|
|
155
164
|
}): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
165
|
+
getDatabaseResourceFenceState(params: {
|
|
166
|
+
databaseName: string;
|
|
167
|
+
}, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbDatabaseResourceFenceState | null>;
|
|
168
|
+
exportDatabase(params: ISmartDbExportDatabaseInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbDatabaseExport>;
|
|
169
|
+
importDatabase(params: ISmartDbImportDatabaseInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbImportDatabaseResult>;
|
|
170
|
+
commitDatabasePublication(params: ISmartDbCommitDatabasePublicationInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<TSmartDbCommitDatabasePublicationResult>;
|
|
159
171
|
getOpLog(params?: {
|
|
160
172
|
sinceSeq?: number;
|
|
161
173
|
limit?: number;
|
|
@@ -3,6 +3,12 @@ import * as path from 'path';
|
|
|
3
3
|
import * as url from 'url';
|
|
4
4
|
import { EventEmitter } from 'events';
|
|
5
5
|
import { normalizeSmartDbResourceFenceError } from './service-types.js';
|
|
6
|
+
export class SmartDbManagementOperationTerminationError extends AggregateError {
|
|
7
|
+
constructor(operationErrorArg, terminationErrorArg) {
|
|
8
|
+
super([operationErrorArg, terminationErrorArg], 'SmartDB management operation failed and Rust engine termination was incomplete', { cause: operationErrorArg });
|
|
9
|
+
this.name = 'SmartDbManagementOperationTerminationError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
6
12
|
/**
|
|
7
13
|
* Get the package root directory using import.meta.url.
|
|
8
14
|
* This file is at ts/ts_smartdb/, so package root is 2 levels up.
|
|
@@ -56,6 +62,7 @@ export function getRustDbAllocatorEnv(environment = process.env) {
|
|
|
56
62
|
export class RustDbBridge extends EventEmitter {
|
|
57
63
|
constructor() {
|
|
58
64
|
super();
|
|
65
|
+
this.terminationConfirmed = true;
|
|
59
66
|
this.bridge = new plugins.smartrust.RustBridge({
|
|
60
67
|
binaryName: 'rustdb',
|
|
61
68
|
envVarName: 'SMARTDB_RUST_BINARY',
|
|
@@ -66,6 +73,7 @@ export class RustDbBridge extends EventEmitter {
|
|
|
66
73
|
});
|
|
67
74
|
// Forward events from the inner bridge
|
|
68
75
|
this.bridge.on('exit', (code, signal) => {
|
|
76
|
+
this.terminationConfirmed = true;
|
|
69
77
|
this.emit('exit', code, signal);
|
|
70
78
|
});
|
|
71
79
|
}
|
|
@@ -74,7 +82,12 @@ export class RustDbBridge extends EventEmitter {
|
|
|
74
82
|
* Returns true if the binary was found and spawned successfully.
|
|
75
83
|
*/
|
|
76
84
|
async spawn() {
|
|
77
|
-
|
|
85
|
+
const spawned = await this.bridge.spawn();
|
|
86
|
+
if (spawned) {
|
|
87
|
+
this.terminationConfirmed = false;
|
|
88
|
+
this.terminationFailure = undefined;
|
|
89
|
+
}
|
|
90
|
+
return spawned;
|
|
78
91
|
}
|
|
79
92
|
/**
|
|
80
93
|
* Kill the Rust process and clean up.
|
|
@@ -85,8 +98,28 @@ export class RustDbBridge extends EventEmitter {
|
|
|
85
98
|
/**
|
|
86
99
|
* Confirm that the Rust process has exited and all bridge resources are released.
|
|
87
100
|
*/
|
|
88
|
-
|
|
89
|
-
|
|
101
|
+
terminate(optionsArg) {
|
|
102
|
+
if (this.terminationPromise) {
|
|
103
|
+
return this.terminationPromise;
|
|
104
|
+
}
|
|
105
|
+
const terminationPromise = this.bridge.terminate(optionsArg).then(() => {
|
|
106
|
+
this.terminationConfirmed = true;
|
|
107
|
+
this.terminationFailure = undefined;
|
|
108
|
+
}, (errorArg) => {
|
|
109
|
+
this.terminationFailure = errorArg;
|
|
110
|
+
throw errorArg;
|
|
111
|
+
});
|
|
112
|
+
this.terminationPromise = terminationPromise;
|
|
113
|
+
void terminationPromise.then(() => {
|
|
114
|
+
if (this.terminationPromise === terminationPromise) {
|
|
115
|
+
this.terminationPromise = undefined;
|
|
116
|
+
}
|
|
117
|
+
}, () => {
|
|
118
|
+
if (this.terminationPromise === terminationPromise) {
|
|
119
|
+
this.terminationPromise = undefined;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
return terminationPromise;
|
|
90
123
|
}
|
|
91
124
|
/**
|
|
92
125
|
* Whether the bridge is currently running.
|
|
@@ -94,6 +127,32 @@ export class RustDbBridge extends EventEmitter {
|
|
|
94
127
|
get running() {
|
|
95
128
|
return this.bridge.running;
|
|
96
129
|
}
|
|
130
|
+
get ownershipReleased() {
|
|
131
|
+
return this.terminationConfirmed;
|
|
132
|
+
}
|
|
133
|
+
async awaitManagementOperationTermination(errorArg) {
|
|
134
|
+
const cancellationRequiresTermination = errorArg instanceof plugins.smartrust.RustBridgeRequestError
|
|
135
|
+
&& [
|
|
136
|
+
'ERR_RUST_BRIDGE_REQUEST_ABORTED',
|
|
137
|
+
'ERR_RUST_BRIDGE_REQUEST_TIMEOUT',
|
|
138
|
+
].includes(errorArg.code);
|
|
139
|
+
let terminationPromise = this.terminationPromise;
|
|
140
|
+
if (cancellationRequiresTermination && !terminationPromise) {
|
|
141
|
+
terminationPromise = this.terminate({ gracePeriodMs: 0 });
|
|
142
|
+
}
|
|
143
|
+
if (!terminationPromise) {
|
|
144
|
+
if (!this.terminationConfirmed && this.terminationFailure !== undefined) {
|
|
145
|
+
throw new SmartDbManagementOperationTerminationError(errorArg, this.terminationFailure);
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
await terminationPromise;
|
|
151
|
+
}
|
|
152
|
+
catch (terminationError) {
|
|
153
|
+
throw new SmartDbManagementOperationTerminationError(errorArg, terminationError);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
97
156
|
// --- Convenience methods for each management command ---
|
|
98
157
|
async startDb(config) {
|
|
99
158
|
return await this.bridge.sendCommand('start', { config });
|
|
@@ -118,19 +177,21 @@ export class RustDbBridge extends EventEmitter {
|
|
|
118
177
|
throw normalizeSmartDbResourceFenceError(error);
|
|
119
178
|
}
|
|
120
179
|
}
|
|
121
|
-
async ensureDatabaseTenant(params) {
|
|
180
|
+
async ensureDatabaseTenant(params, optionsArg) {
|
|
122
181
|
try {
|
|
123
|
-
return await this.bridge.sendCommand('ensureDatabaseTenant', params);
|
|
182
|
+
return await this.bridge.sendCommand('ensureDatabaseTenant', params, optionsArg);
|
|
124
183
|
}
|
|
125
184
|
catch (error) {
|
|
185
|
+
await this.awaitManagementOperationTermination(error);
|
|
126
186
|
throw normalizeSmartDbResourceFenceError(error);
|
|
127
187
|
}
|
|
128
188
|
}
|
|
129
|
-
async deleteDatabaseTenant(params) {
|
|
189
|
+
async deleteDatabaseTenant(params, optionsArg) {
|
|
130
190
|
try {
|
|
131
|
-
return await this.bridge.sendCommand('deleteDatabaseTenant', params);
|
|
191
|
+
return await this.bridge.sendCommand('deleteDatabaseTenant', params, optionsArg);
|
|
132
192
|
}
|
|
133
193
|
catch (error) {
|
|
194
|
+
await this.awaitManagementOperationTermination(error);
|
|
134
195
|
throw normalizeSmartDbResourceFenceError(error);
|
|
135
196
|
}
|
|
136
197
|
}
|
|
@@ -144,22 +205,39 @@ export class RustDbBridge extends EventEmitter {
|
|
|
144
205
|
async getDatabaseTenantDescriptor(params) {
|
|
145
206
|
return this.bridge.sendCommand('getDatabaseTenantDescriptor', params);
|
|
146
207
|
}
|
|
147
|
-
async
|
|
148
|
-
|
|
208
|
+
async getDatabaseResourceFenceState(params, optionsArg) {
|
|
209
|
+
try {
|
|
210
|
+
return await this.bridge.sendCommand('getDatabaseResourceFenceState', params, optionsArg);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
await this.awaitManagementOperationTermination(error);
|
|
214
|
+
throw normalizeSmartDbResourceFenceError(error);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async exportDatabase(params, optionsArg) {
|
|
218
|
+
try {
|
|
219
|
+
return await this.bridge.sendCommand('exportDatabase', params, optionsArg);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
await this.awaitManagementOperationTermination(error);
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
149
225
|
}
|
|
150
|
-
async importDatabase(params) {
|
|
226
|
+
async importDatabase(params, optionsArg) {
|
|
151
227
|
try {
|
|
152
|
-
return await this.bridge.sendCommand('importDatabase', params);
|
|
228
|
+
return await this.bridge.sendCommand('importDatabase', params, optionsArg);
|
|
153
229
|
}
|
|
154
230
|
catch (error) {
|
|
231
|
+
await this.awaitManagementOperationTermination(error);
|
|
155
232
|
throw normalizeSmartDbResourceFenceError(error);
|
|
156
233
|
}
|
|
157
234
|
}
|
|
158
|
-
async commitDatabasePublication(params) {
|
|
235
|
+
async commitDatabasePublication(params, optionsArg) {
|
|
159
236
|
try {
|
|
160
|
-
return await this.bridge.sendCommand('commitDatabasePublication', params);
|
|
237
|
+
return await this.bridge.sendCommand('commitDatabasePublication', params, optionsArg);
|
|
161
238
|
}
|
|
162
239
|
catch (error) {
|
|
240
|
+
await this.awaitManagementOperationTermination(error);
|
|
163
241
|
throw normalizeSmartDbResourceFenceError(error);
|
|
164
242
|
}
|
|
165
243
|
}
|
|
@@ -180,4 +258,4 @@ export class RustDbBridge extends EventEmitter {
|
|
|
180
258
|
return this.bridge.sendCommand('getDocuments', { db, collection, limit, skip });
|
|
181
259
|
}
|
|
182
260
|
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1kYi1icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19zbWFydGRiL3J1c3QtZGItYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUF5TnhFOzs7R0FHRztBQUNILFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHVCQUF1QjtJQUM5QixNQUFNLE9BQU8sR0FBMkIsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN6RSxNQUFNLEtBQUssR0FBMkIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDZixPQUFPLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pCLENB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
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1kYi1icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19zbWFydGRiL3J1c3QtZGItYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUEyR3hFLE1BQU0sT0FBTywwQ0FBMkMsU0FBUSxjQUFjO0lBQzVFLFlBQVksaUJBQTBCLEVBQUUsbUJBQTRCO1FBQ2xFLEtBQUssQ0FDSCxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDLEVBQ3hDLGdGQUFnRixFQUNoRixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUM3QixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyw0Q0FBNEMsQ0FBQztJQUMzRCxDQUFDO0NBQ0Y7QUF3SEQ7OztHQUdHO0FBQ0gsU0FBUyxjQUFjO0lBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFB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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IOpLogResult, IOpLogStats, IRevertResult, ICollectionInfo, IDocumentsResult, ISmartDbMetrics } from '../rust-db-bridge.js';
|
|
2
|
-
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, ISmartDbCommitDatabasePublicationInput, TSmartDbCommitDatabasePublicationResult } from '../service-types.js';
|
|
2
|
+
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbExportDatabaseInput, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, ISmartDbCommitDatabasePublicationInput, ISmartDbManagementOperationOptions, ISmartDbDatabaseResourceFenceState, TSmartDbCommitDatabasePublicationResult } from '../service-types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Server configuration options
|
|
5
5
|
*/
|
|
@@ -98,6 +98,7 @@ export declare class SmartdbServer {
|
|
|
98
98
|
* Check if the server is running
|
|
99
99
|
*/
|
|
100
100
|
get running(): boolean;
|
|
101
|
+
private runDatabaseManagementOperation;
|
|
101
102
|
/**
|
|
102
103
|
* Get the port the server is listening on
|
|
103
104
|
*/
|
|
@@ -113,11 +114,11 @@ export declare class SmartdbServer {
|
|
|
113
114
|
/**
|
|
114
115
|
* Idempotently provision or rotate one exclusively owned database tenant.
|
|
115
116
|
*/
|
|
116
|
-
ensureDatabaseTenant(params: ISmartDbEnsureDatabaseTenantInput): Promise<ISmartDbEnsureDatabaseTenantResult>;
|
|
117
|
+
ensureDatabaseTenant(params: ISmartDbEnsureDatabaseTenantInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbEnsureDatabaseTenantResult>;
|
|
117
118
|
/**
|
|
118
119
|
* Delete a tenant database and its tenant user(s).
|
|
119
120
|
*/
|
|
120
|
-
deleteDatabaseTenant(params: ISmartDbDeleteDatabaseTenantInput): Promise<ISmartDbDeleteDatabaseTenantResult>;
|
|
121
|
+
deleteDatabaseTenant(params: ISmartDbDeleteDatabaseTenantInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbDeleteDatabaseTenantResult>;
|
|
121
122
|
/**
|
|
122
123
|
* Rotate a tenant user's password without restarting the server.
|
|
123
124
|
*/
|
|
@@ -133,16 +134,20 @@ export declare class SmartdbServer {
|
|
|
133
134
|
databaseName: string;
|
|
134
135
|
username: string;
|
|
135
136
|
}): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
137
|
+
/** Inspect the durable high-water mark without exposing mutation receipts. */
|
|
138
|
+
getDatabaseResourceFenceState(params: {
|
|
139
|
+
databaseName: string;
|
|
140
|
+
}, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbDatabaseResourceFenceState | null>;
|
|
136
141
|
/**
|
|
137
142
|
* Export one database as an Extended JSON snapshot.
|
|
138
143
|
*/
|
|
139
|
-
exportDatabase(params: ISmartDbExportDatabaseInput): Promise<ISmartDbDatabaseExport>;
|
|
144
|
+
exportDatabase(params: ISmartDbExportDatabaseInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbDatabaseExport>;
|
|
140
145
|
/**
|
|
141
146
|
* Replace one database with a previously exported snapshot.
|
|
142
147
|
*/
|
|
143
|
-
importDatabase(params: ISmartDbImportDatabaseInput): Promise<ISmartDbImportDatabaseResult>;
|
|
148
|
+
importDatabase(params: ISmartDbImportDatabaseInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<ISmartDbImportDatabaseResult>;
|
|
144
149
|
/** Release an exact held database publication after downstream fsync. */
|
|
145
|
-
commitDatabasePublication(params: ISmartDbCommitDatabasePublicationInput): Promise<TSmartDbCommitDatabasePublicationResult>;
|
|
150
|
+
commitDatabasePublication(params: ISmartDbCommitDatabasePublicationInput, optionsArg?: ISmartDbManagementOperationOptions): Promise<TSmartDbCommitDatabasePublicationResult>;
|
|
146
151
|
/**
|
|
147
152
|
* Get readiness/health details for long-running service use.
|
|
148
153
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RustDbBridge } from '../rust-db-bridge.js';
|
|
1
|
+
import { RustDbBridge, SmartDbManagementOperationTerminationError, } from '../rust-db-bridge.js';
|
|
2
2
|
import { StorageMigrator } from '../../ts_migration/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* SmartdbServer - Wire protocol compatible database server backed by Rust
|
|
@@ -169,6 +169,22 @@ export class SmartdbServer {
|
|
|
169
169
|
get running() {
|
|
170
170
|
return this.isRunning;
|
|
171
171
|
}
|
|
172
|
+
async runDatabaseManagementOperation(operationArg) {
|
|
173
|
+
try {
|
|
174
|
+
return await operationArg();
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (!this.bridge.running
|
|
178
|
+
|| error instanceof SmartDbManagementOperationTerminationError) {
|
|
179
|
+
this.isRunning = false;
|
|
180
|
+
this.resolvedConnectionUri = '';
|
|
181
|
+
if (this.bridge.ownershipReleased) {
|
|
182
|
+
this.bridgeOwned = false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
172
188
|
/**
|
|
173
189
|
* Get the port the server is listening on
|
|
174
190
|
*/
|
|
@@ -191,15 +207,15 @@ export class SmartdbServer {
|
|
|
191
207
|
/**
|
|
192
208
|
* Idempotently provision or rotate one exclusively owned database tenant.
|
|
193
209
|
*/
|
|
194
|
-
async ensureDatabaseTenant(params) {
|
|
195
|
-
const descriptor = await this.bridge.ensureDatabaseTenant(params);
|
|
210
|
+
async ensureDatabaseTenant(params, optionsArg) {
|
|
211
|
+
const descriptor = await this.runDatabaseManagementOperation(() => this.bridge.ensureDatabaseTenant(params, optionsArg));
|
|
196
212
|
return this.withTenantMongoUri(descriptor, params.password);
|
|
197
213
|
}
|
|
198
214
|
/**
|
|
199
215
|
* Delete a tenant database and its tenant user(s).
|
|
200
216
|
*/
|
|
201
|
-
async deleteDatabaseTenant(params) {
|
|
202
|
-
return this.bridge.deleteDatabaseTenant(params);
|
|
217
|
+
async deleteDatabaseTenant(params, optionsArg) {
|
|
218
|
+
return this.runDatabaseManagementOperation(() => this.bridge.deleteDatabaseTenant(params, optionsArg));
|
|
203
219
|
}
|
|
204
220
|
/**
|
|
205
221
|
* Rotate a tenant user's password without restarting the server.
|
|
@@ -220,21 +236,25 @@ export class SmartdbServer {
|
|
|
220
236
|
async getDatabaseTenantDescriptor(params) {
|
|
221
237
|
return this.bridge.getDatabaseTenantDescriptor(params);
|
|
222
238
|
}
|
|
239
|
+
/** Inspect the durable high-water mark without exposing mutation receipts. */
|
|
240
|
+
async getDatabaseResourceFenceState(params, optionsArg) {
|
|
241
|
+
return this.runDatabaseManagementOperation(() => this.bridge.getDatabaseResourceFenceState(params, optionsArg));
|
|
242
|
+
}
|
|
223
243
|
/**
|
|
224
244
|
* Export one database as an Extended JSON snapshot.
|
|
225
245
|
*/
|
|
226
|
-
async exportDatabase(params) {
|
|
227
|
-
return this.bridge.exportDatabase(params);
|
|
246
|
+
async exportDatabase(params, optionsArg) {
|
|
247
|
+
return this.runDatabaseManagementOperation(() => this.bridge.exportDatabase(params, optionsArg));
|
|
228
248
|
}
|
|
229
249
|
/**
|
|
230
250
|
* Replace one database with a previously exported snapshot.
|
|
231
251
|
*/
|
|
232
|
-
async importDatabase(params) {
|
|
233
|
-
return this.bridge.importDatabase(params);
|
|
252
|
+
async importDatabase(params, optionsArg) {
|
|
253
|
+
return this.runDatabaseManagementOperation(() => this.bridge.importDatabase(params, optionsArg));
|
|
234
254
|
}
|
|
235
255
|
/** Release an exact held database publication after downstream fsync. */
|
|
236
|
-
async commitDatabasePublication(params) {
|
|
237
|
-
return this.bridge.commitDatabasePublication(params);
|
|
256
|
+
async commitDatabasePublication(params, optionsArg) {
|
|
257
|
+
return this.runDatabaseManagementOperation(() => this.bridge.commitDatabasePublication(params, optionsArg));
|
|
238
258
|
}
|
|
239
259
|
/**
|
|
240
260
|
* Get readiness/health details for long-running service use.
|
|
@@ -316,4 +336,4 @@ export class SmartdbServer {
|
|
|
316
336
|
return `mongodb://${auth}${host}/${encodeURIComponent(databaseName)}?${query.toString()}`;
|
|
317
337
|
}
|
|
318
338
|
}
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU21hcnRkYlNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmVyL1NtYXJ0ZGJTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQWtGOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBU3hCLFlBQVksVUFBaUMsRUFBRTtRQU52QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QiwyQkFBc0IsR0FBeUIsSUFBSSxDQUFDO1FBQ3BELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBR2pDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxLQUFLO1lBQzNCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLFdBQVc7WUFDakMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLFFBQVE7WUFDcEMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksUUFBUTtZQUM1QyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixJQUFJLEtBQUs7WUFDckQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztZQUNoQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7U0FDckIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFtQixFQUFFLE1BQXFCLEVBQUUsRUFBRTtZQUNwRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztZQUNoQyxJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0RBQWtELElBQUksWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzdGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxzQkFBbUMsQ0FBQztRQUN4QyxNQUFNLHNCQUFzQixHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDOUQsc0JBQXNCLEdBQUcsVUFBVSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDO1FBQ3JELElBQUksQ0FBQztZQUNILDJFQUEyRTtZQUMzRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBRUQsd0VBQXdFO1lBQ3hFLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0VBQWtFO29CQUNsRSwrREFBK0QsQ0FDaEUsQ0FBQztZQUNKLENBQUM7WUFFRCxzQ0FBc0M7WUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDdkMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtnQkFDbkMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLFFBQVE7Z0JBQ3pDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7Z0JBQ3JDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7Z0JBQ3JDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO2dCQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2FBQzFCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixDQUFDO2dCQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxjQUFjLENBQ3RCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUNyQiwrREFBK0QsRUFDL0QsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQ2pCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLHNCQUFzQixFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDM0QsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLE1BQU0sc0JBQXNCLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCx1RUFBdUU7WUFDekUsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsaUNBQWlDO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sYUFBYSxXQUFXLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLE1BQW1DO1FBRW5DLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FDeEIsTUFBeUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixNQUF5QztRQUV6QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLDRCQUE0QixDQUNoQyxNQUFpRDtRQUVqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxNQUdqQztRQUNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQW1DO1FBQ3RELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFtQztRQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixNQUE4QztRQUU5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztnQkFDbEcsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ3ZFLHdCQUF3QixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUM3RSw0QkFBNEIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDaEYsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsd0JBQXdCLEVBQUUsS0FBSztnQkFDL0Isb0NBQW9DLEVBQUUsS0FBSztnQkFDM0MsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7Z0JBQ2hELFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7Z0JBQ2hELG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7Z0JBQzFELGFBQWEsRUFBRSxDQUFDO2dCQUNoQixlQUFlLEVBQUUsQ0FBQzthQUNuQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsNEJBQTRCO0lBRTVCOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUtYLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFXLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFDM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFXO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FDaEIsRUFBVSxFQUNWLFVBQWtCLEVBQ2xCLEtBQUssR0FBRyxFQUFFLEVBQ1YsSUFBSSxHQUFHLENBQUM7UUFFUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsVUFBdUIsRUFDdkIsUUFBZ0I7UUFFaEIsT0FBTztZQUNMLEdBQUcsVUFBVTtZQUNiLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztTQUM3RixDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUFDLFlBQW9CLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjtRQUNsRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbEMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4RSxNQUFNLElBQUksR0FBRyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDaEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzlCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxPQUFPLGFBQWEsSUFBSSxHQUFHLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUM1RixDQUFDO0NBQ0YifQ==
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU21hcnRkYlNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmVyL1NtYXJ0ZGJTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWiwwQ0FBMEMsR0FDM0MsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFvRjlEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQVN4QixZQUFZLFVBQWlDLEVBQUU7UUFOdkMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsMkJBQXNCLEdBQXlCLElBQUksQ0FBQztRQUNwRCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUdqQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSztZQUMzQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXO1lBQ2pDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxRQUFRO1lBQ3BDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFFBQVE7WUFDNUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxLQUFLO1lBQ3JELElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsSUFB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
|
|
@@ -54,6 +54,23 @@ export interface ISmartDbCommitDatabasePublicationInput {
|
|
|
54
54
|
databaseName: string;
|
|
55
55
|
resourceFence: ISmartDbHeldPublicationReceipt;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Cancellation and deadline ownership for one durable database-management
|
|
59
|
+
* operation. Aborting or timing out is fail-stop: SmartDB terminates the Rust
|
|
60
|
+
* engine so the operation cannot continue after the caller has released it.
|
|
61
|
+
*/
|
|
62
|
+
export interface ISmartDbManagementOperationOptions {
|
|
63
|
+
signal?: AbortSignal;
|
|
64
|
+
timeoutMs?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface ISmartDbDatabaseResourceFenceState {
|
|
67
|
+
version: 1;
|
|
68
|
+
databaseName: string;
|
|
69
|
+
resourceIdSha256: string;
|
|
70
|
+
scopeId: string;
|
|
71
|
+
highestToken: number;
|
|
72
|
+
publicationState: 'requested' | 'publishing' | 'held' | 'released';
|
|
73
|
+
}
|
|
57
74
|
export declare class SmartDbResourceFenceError extends Error {
|
|
58
75
|
readonly code: TSmartDbResourceFenceErrorCode;
|
|
59
76
|
constructor(codeArg: TSmartDbResourceFenceErrorCode, messageArg: string, causeArg?: unknown);
|
|
@@ -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,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmljZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUc7SUFDNUMsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCx1QkFBdUI7SUFDdkIsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0Isc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QixpQkFBaUI7Q0FDVCxDQUFDO0FBc0VYLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBR2xELFlBQ0UsT0FBdUMsRUFDdkMsVUFBa0IsRUFDbEIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLEdBQUcsT0FBTyxLQUFLLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxDQUNoRCxRQUFpQixFQUNWLEVBQUU7SUFDVCxNQUFNLEtBQUssR0FDVCxRQUFRLFlBQVksS0FBSztRQUN2QixDQUFDLENBQUMsUUFBUTtRQUNWLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLElBQ0UsQ0FBQyxLQUFLO1FBQ04sQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQW1DLENBQzNDLEVBQ0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sSUFBSSx5QkFBeUIsQ0FDbEMsS0FBSyxDQUFDLENBQUMsQ0FBbUMsRUFDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @push.rocks/smartdb
|
|
2
2
|
|
|
3
|
-
A MongoDB-compatible embedded database server powered by Rust
|
|
3
|
+
A MongoDB-wire-compatible embedded database server powered by Rust 🦀⚡. It supports the documented command surface through the official `mongodb` driver without an external MongoDB server. No binary downloads, instant startup, zero config. Features a built-in **operation log** with **point-in-time revert** and a web-based **debug dashboard**.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -389,8 +389,20 @@ const released = await server.commitDatabasePublication({
|
|
|
389
389
|
|
|
390
390
|
The held barrier survives restart and blocks wire commands, transactions, startup recovery, compaction, index restoration, and close-time hint writes for that database while unrelated databases remain available. Commit is exact and idempotent. A successful commit removes the raw capability from durable state and retains only protected verification material. Provider/root identity, durable fenced-mode markers, and bounded startup validation make copied, missing, corrupt, or legacy-active publication state fail closed. A higher fencing token compacts resolved older receipts, so long-lived coordinators do not exhaust receipt capacity.
|
|
391
391
|
|
|
392
|
+
Coordinators that do not yet have their own durable record can call `getDatabaseResourceFenceState({ databaseName })` before creating it. File-backed SmartDB returns the durable scope, highest token, and current publication phase, or `null` only when both fence state and its durable marker are absent. The inspection never returns mutation IDs, receipts, payload digests, binding digests, or publication capabilities. Treat any active phase, identity mismatch, corrupt state, unsupported storage, or unsafe token as a hard stop rather than creating coordinator state.
|
|
393
|
+
|
|
392
394
|
`exportDatabase()` drains live MongoDB wire commands for the selected database and holds an exclusive local and cross-process database lease while producing the snapshot. The export is therefore consistent across all collections. It enforces server ceilings while visiting documents instead of first materializing an unbounded database; callers can request lower `maxEncodedBytes`, `maxCollections`, `maxDocuments`, and `maxIndexes` limits. The result emits canonical MongoDB Extended JSON so every BSON type, including 64-bit integers, survives the JSON management channel exactly. `importDatabase()` accepts canonical or relaxed Extended JSON. Database migration clients should preserve the exported objects as JSON values and must not coerce Extended JSON numeric wrappers into JavaScript numbers.
|
|
393
395
|
|
|
396
|
+
The lifecycle-critical fence-state inspection, export, import, publication-commit, tenant-ensure, and tenant-delete methods accept an optional `ISmartDbManagementOperationOptions` second argument with `signal?: AbortSignal` and `timeoutMs?: number`. `timeoutMs`, when provided, must be a positive safe integer. Cancellation and deadlines are fail-stop: SmartDB attempts to terminate the Rust engine before rejecting. Once termination is confirmed, the operation cannot continue after the caller releases ownership. If termination itself fails, the rejection is a `SmartDbManagementOperationTerminationError`; bridge ownership is retained and the service owner must retry `stop()` until it succeeds. After any cancellation or deadline, restart SmartDB before accepting more traffic.
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
const controller = new AbortController();
|
|
400
|
+
const exported = await server.exportDatabase(
|
|
401
|
+
{ databaseName: 'myapp' },
|
|
402
|
+
{ signal: controller.signal, timeoutMs: 5 * 60_000 },
|
|
403
|
+
);
|
|
404
|
+
```
|
|
405
|
+
|
|
394
406
|
Basic user management commands are available for authenticated users with `root` or `userAdmin` privileges:
|
|
395
407
|
|
|
396
408
|
```typescript
|
|
@@ -421,10 +433,12 @@ await client.db('admin').command({ usersInfo: 'reader' });
|
|
|
421
433
|
| `getCollections(db?)` | `Promise<ICollectionInfo[]>` | List all collections with counts |
|
|
422
434
|
| `getDocuments(db, coll, limit?, skip?)` | `Promise<IDocumentsResult>` | Browse documents with pagination |
|
|
423
435
|
| `getHealth()` | `Promise<ISmartDbHealth>` | Read readiness and explicit publication-hold capability fields |
|
|
424
|
-
| `
|
|
425
|
-
| `
|
|
426
|
-
| `
|
|
427
|
-
| `
|
|
436
|
+
| `ensureDatabaseTenant(params, options?)` | `Promise<ISmartDbEnsureDatabaseTenantResult>` | Idempotently ensure an exact fenced tenant; supports fail-stop cancellation and deadlines |
|
|
437
|
+
| `getDatabaseResourceFenceState(params, options?)` | `Promise<ISmartDbDatabaseResourceFenceState \| null>` | Safely inspect a file-backed database fence high-water mark and publication phase without exposing receipts or capability material; supports fail-stop cancellation and deadlines |
|
|
438
|
+
| `exportDatabase(params, options?)` | `Promise<ISmartDbDatabaseExport>` | Export one database as lossless canonical MongoDB Extended JSON; supports fail-stop cancellation and deadlines |
|
|
439
|
+
| `importDatabase(params, options?)` | `Promise<ISmartDbImportDatabaseResult>` | Durably replace one database from canonical or relaxed MongoDB Extended JSON, optionally leaving publication held; supports fail-stop cancellation and deadlines |
|
|
440
|
+
| `deleteDatabaseTenant(params, options?)` | `Promise<ISmartDbDeleteDatabaseTenantResult>` | Durably delete an exact tenant database/user, optionally leaving publication held; supports fail-stop cancellation and deadlines |
|
|
441
|
+
| `commitDatabasePublication(params, options?)` | `Promise<TSmartDbCommitDatabasePublicationResult>` | Idempotently release an exact held publication receipt; supports fail-stop cancellation and deadlines |
|
|
428
442
|
|
|
429
443
|
### LocalSmartDb
|
|
430
444
|
|
|
@@ -646,7 +660,7 @@ const names = await collection.distinct('name');
|
|
|
646
660
|
| **Transactions** | `startTransaction`, `commitTransaction`, `abortTransaction` through driver sessions |
|
|
647
661
|
| **Admin** | `ping`, `listDatabases`, `listCollections`, `drop`, `dropDatabase`, `create`, `serverStatus`, `buildInfo`, `dbStats`, `collStats`, `connectionStatus`, `currentOp`, `renameCollection` |
|
|
648
662
|
|
|
649
|
-
|
|
663
|
+
Advertises MongoDB wire protocol versions 0–21. The documented command surface is tested with the official `mongodb` Node.js driver version 7.5.x.
|
|
650
664
|
|
|
651
665
|
---
|
|
652
666
|
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/index.ts
CHANGED
|
@@ -27,6 +27,8 @@ export type {
|
|
|
27
27
|
ISmartDbResourceFenceReceipt,
|
|
28
28
|
ISmartDbHeldPublicationReceipt,
|
|
29
29
|
ISmartDbCommitDatabasePublicationInput,
|
|
30
|
+
ISmartDbManagementOperationOptions,
|
|
31
|
+
ISmartDbDatabaseResourceFenceState,
|
|
30
32
|
TSmartDbCommitDatabasePublicationResult,
|
|
31
33
|
TSmartDbResourceFenceErrorCode,
|
|
32
34
|
ISmartDbDatabaseTenantInput,
|
package/ts/ts_smartdb/index.ts
CHANGED
|
@@ -10,8 +10,11 @@ export type {
|
|
|
10
10
|
ISmartdbTlsOptions,
|
|
11
11
|
} from './server/SmartdbServer.js';
|
|
12
12
|
|
|
13
|
-
// Export bridge for advanced usage
|
|
14
|
-
export {
|
|
13
|
+
// Export bridge for advanced usage and its fail-stop ownership error.
|
|
14
|
+
export {
|
|
15
|
+
RustDbBridge,
|
|
16
|
+
SmartDbManagementOperationTerminationError,
|
|
17
|
+
} from './rust-db-bridge.js';
|
|
15
18
|
|
|
16
19
|
// Export oplog / debug types
|
|
17
20
|
export type {
|
|
@@ -31,6 +34,8 @@ export type {
|
|
|
31
34
|
ISmartDbResourceFenceReceipt,
|
|
32
35
|
ISmartDbHeldPublicationReceipt,
|
|
33
36
|
ISmartDbCommitDatabasePublicationInput,
|
|
37
|
+
ISmartDbManagementOperationOptions,
|
|
38
|
+
ISmartDbDatabaseResourceFenceState,
|
|
34
39
|
TSmartDbCommitDatabasePublicationResult,
|
|
35
40
|
TSmartDbResourceFenceErrorCode,
|
|
36
41
|
ISmartDbDatabaseTenantInput,
|
|
@@ -17,6 +17,8 @@ import type {
|
|
|
17
17
|
ISmartDbImportDatabaseInput,
|
|
18
18
|
ISmartDbImportDatabaseResult,
|
|
19
19
|
ISmartDbCommitDatabasePublicationInput,
|
|
20
|
+
ISmartDbManagementOperationOptions,
|
|
21
|
+
ISmartDbDatabaseResourceFenceState,
|
|
20
22
|
TSmartDbCommitDatabasePublicationResult,
|
|
21
23
|
} from './service-types.js';
|
|
22
24
|
|
|
@@ -35,6 +37,8 @@ export type {
|
|
|
35
37
|
ISmartDbImportDatabaseResult,
|
|
36
38
|
ISmartDbHeldPublicationReceipt,
|
|
37
39
|
ISmartDbCommitDatabasePublicationInput,
|
|
40
|
+
ISmartDbManagementOperationOptions,
|
|
41
|
+
ISmartDbDatabaseResourceFenceState,
|
|
38
42
|
TSmartDbCommitDatabasePublicationResult,
|
|
39
43
|
} from './service-types.js';
|
|
40
44
|
|
|
@@ -105,6 +109,17 @@ export interface IDocumentsResult {
|
|
|
105
109
|
total: number;
|
|
106
110
|
}
|
|
107
111
|
|
|
112
|
+
export class SmartDbManagementOperationTerminationError extends AggregateError {
|
|
113
|
+
constructor(operationErrorArg: unknown, terminationErrorArg: unknown) {
|
|
114
|
+
super(
|
|
115
|
+
[operationErrorArg, terminationErrorArg],
|
|
116
|
+
'SmartDB management operation failed and Rust engine termination was incomplete',
|
|
117
|
+
{ cause: operationErrorArg },
|
|
118
|
+
);
|
|
119
|
+
this.name = 'SmartDbManagementOperationTerminationError';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
108
123
|
/**
|
|
109
124
|
* Server metrics.
|
|
110
125
|
*/
|
|
@@ -153,6 +168,10 @@ type TSmartDbCommands = {
|
|
|
153
168
|
params: { databaseName: string; username: string };
|
|
154
169
|
result: ISmartDbDatabaseTenantDescriptor;
|
|
155
170
|
};
|
|
171
|
+
getDatabaseResourceFenceState: {
|
|
172
|
+
params: { databaseName: string };
|
|
173
|
+
result: ISmartDbDatabaseResourceFenceState | null;
|
|
174
|
+
};
|
|
156
175
|
exportDatabase: {
|
|
157
176
|
params: ISmartDbExportDatabaseInput;
|
|
158
177
|
result: ISmartDbDatabaseExport;
|
|
@@ -279,6 +298,9 @@ export function getRustDbAllocatorEnv(
|
|
|
279
298
|
*/
|
|
280
299
|
export class RustDbBridge extends EventEmitter {
|
|
281
300
|
private bridge: plugins.smartrust.RustBridge<TSmartDbCommands>;
|
|
301
|
+
private terminationConfirmed = true;
|
|
302
|
+
private terminationPromise: Promise<void> | undefined;
|
|
303
|
+
private terminationFailure: unknown;
|
|
282
304
|
|
|
283
305
|
constructor() {
|
|
284
306
|
super();
|
|
@@ -294,6 +316,7 @@ export class RustDbBridge extends EventEmitter {
|
|
|
294
316
|
|
|
295
317
|
// Forward events from the inner bridge
|
|
296
318
|
this.bridge.on('exit', (code: number | null, signal: string | null) => {
|
|
319
|
+
this.terminationConfirmed = true;
|
|
297
320
|
this.emit('exit', code, signal);
|
|
298
321
|
});
|
|
299
322
|
}
|
|
@@ -303,7 +326,12 @@ export class RustDbBridge extends EventEmitter {
|
|
|
303
326
|
* Returns true if the binary was found and spawned successfully.
|
|
304
327
|
*/
|
|
305
328
|
public async spawn(): Promise<boolean> {
|
|
306
|
-
|
|
329
|
+
const spawned = await this.bridge.spawn();
|
|
330
|
+
if (spawned) {
|
|
331
|
+
this.terminationConfirmed = false;
|
|
332
|
+
this.terminationFailure = undefined;
|
|
333
|
+
}
|
|
334
|
+
return spawned;
|
|
307
335
|
}
|
|
308
336
|
|
|
309
337
|
/**
|
|
@@ -316,8 +344,37 @@ export class RustDbBridge extends EventEmitter {
|
|
|
316
344
|
/**
|
|
317
345
|
* Confirm that the Rust process has exited and all bridge resources are released.
|
|
318
346
|
*/
|
|
319
|
-
public
|
|
320
|
-
|
|
347
|
+
public terminate(
|
|
348
|
+
optionsArg?: plugins.smartrust.IRustBridgeTerminateOptions,
|
|
349
|
+
): Promise<void> {
|
|
350
|
+
if (this.terminationPromise) {
|
|
351
|
+
return this.terminationPromise;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const terminationPromise = this.bridge.terminate(optionsArg).then(
|
|
355
|
+
() => {
|
|
356
|
+
this.terminationConfirmed = true;
|
|
357
|
+
this.terminationFailure = undefined;
|
|
358
|
+
},
|
|
359
|
+
(errorArg: unknown) => {
|
|
360
|
+
this.terminationFailure = errorArg;
|
|
361
|
+
throw errorArg;
|
|
362
|
+
},
|
|
363
|
+
);
|
|
364
|
+
this.terminationPromise = terminationPromise;
|
|
365
|
+
void terminationPromise.then(
|
|
366
|
+
() => {
|
|
367
|
+
if (this.terminationPromise === terminationPromise) {
|
|
368
|
+
this.terminationPromise = undefined;
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
() => {
|
|
372
|
+
if (this.terminationPromise === terminationPromise) {
|
|
373
|
+
this.terminationPromise = undefined;
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
);
|
|
377
|
+
return terminationPromise;
|
|
321
378
|
}
|
|
322
379
|
|
|
323
380
|
/**
|
|
@@ -327,6 +384,42 @@ export class RustDbBridge extends EventEmitter {
|
|
|
327
384
|
return this.bridge.running;
|
|
328
385
|
}
|
|
329
386
|
|
|
387
|
+
public get ownershipReleased(): boolean {
|
|
388
|
+
return this.terminationConfirmed;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
private async awaitManagementOperationTermination(errorArg: unknown) {
|
|
392
|
+
const cancellationRequiresTermination =
|
|
393
|
+
errorArg instanceof plugins.smartrust.RustBridgeRequestError
|
|
394
|
+
&& [
|
|
395
|
+
'ERR_RUST_BRIDGE_REQUEST_ABORTED',
|
|
396
|
+
'ERR_RUST_BRIDGE_REQUEST_TIMEOUT',
|
|
397
|
+
].includes(errorArg.code);
|
|
398
|
+
let terminationPromise = this.terminationPromise;
|
|
399
|
+
if (cancellationRequiresTermination && !terminationPromise) {
|
|
400
|
+
terminationPromise = this.terminate({ gracePeriodMs: 0 });
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (!terminationPromise) {
|
|
404
|
+
if (!this.terminationConfirmed && this.terminationFailure !== undefined) {
|
|
405
|
+
throw new SmartDbManagementOperationTerminationError(
|
|
406
|
+
errorArg,
|
|
407
|
+
this.terminationFailure,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
try {
|
|
414
|
+
await terminationPromise;
|
|
415
|
+
} catch (terminationError) {
|
|
416
|
+
throw new SmartDbManagementOperationTerminationError(
|
|
417
|
+
errorArg,
|
|
418
|
+
terminationError,
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
330
423
|
// --- Convenience methods for each management command ---
|
|
331
424
|
|
|
332
425
|
public async startDb(config: ISmartDbRustConfig): Promise<{ connectionUri: string }> {
|
|
@@ -361,20 +454,32 @@ export class RustDbBridge extends EventEmitter {
|
|
|
361
454
|
|
|
362
455
|
public async ensureDatabaseTenant(
|
|
363
456
|
params: ISmartDbEnsureDatabaseTenantInput,
|
|
457
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
364
458
|
): Promise<ISmartDbEnsureDatabaseTenantResult> {
|
|
365
459
|
try {
|
|
366
|
-
return await this.bridge.sendCommand(
|
|
460
|
+
return await this.bridge.sendCommand(
|
|
461
|
+
'ensureDatabaseTenant',
|
|
462
|
+
params,
|
|
463
|
+
optionsArg,
|
|
464
|
+
) as ISmartDbEnsureDatabaseTenantResult;
|
|
367
465
|
} catch (error) {
|
|
466
|
+
await this.awaitManagementOperationTermination(error);
|
|
368
467
|
throw normalizeSmartDbResourceFenceError(error);
|
|
369
468
|
}
|
|
370
469
|
}
|
|
371
470
|
|
|
372
471
|
public async deleteDatabaseTenant(
|
|
373
472
|
params: ISmartDbDeleteDatabaseTenantInput,
|
|
473
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
374
474
|
): Promise<ISmartDbDeleteDatabaseTenantResult> {
|
|
375
475
|
try {
|
|
376
|
-
return await this.bridge.sendCommand(
|
|
476
|
+
return await this.bridge.sendCommand(
|
|
477
|
+
'deleteDatabaseTenant',
|
|
478
|
+
params,
|
|
479
|
+
optionsArg,
|
|
480
|
+
) as ISmartDbDeleteDatabaseTenantResult;
|
|
377
481
|
} catch (error) {
|
|
482
|
+
await this.awaitManagementOperationTermination(error);
|
|
378
483
|
throw normalizeSmartDbResourceFenceError(error);
|
|
379
484
|
}
|
|
380
485
|
}
|
|
@@ -397,27 +502,66 @@ export class RustDbBridge extends EventEmitter {
|
|
|
397
502
|
return this.bridge.sendCommand('getDatabaseTenantDescriptor', params) as Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
398
503
|
}
|
|
399
504
|
|
|
400
|
-
public async
|
|
401
|
-
|
|
505
|
+
public async getDatabaseResourceFenceState(
|
|
506
|
+
params: { databaseName: string },
|
|
507
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
508
|
+
): Promise<ISmartDbDatabaseResourceFenceState | null> {
|
|
509
|
+
try {
|
|
510
|
+
return await this.bridge.sendCommand(
|
|
511
|
+
'getDatabaseResourceFenceState',
|
|
512
|
+
params,
|
|
513
|
+
optionsArg,
|
|
514
|
+
) as ISmartDbDatabaseResourceFenceState | null;
|
|
515
|
+
} catch (error) {
|
|
516
|
+
await this.awaitManagementOperationTermination(error);
|
|
517
|
+
throw normalizeSmartDbResourceFenceError(error);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
public async exportDatabase(
|
|
522
|
+
params: ISmartDbExportDatabaseInput,
|
|
523
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
524
|
+
): Promise<ISmartDbDatabaseExport> {
|
|
525
|
+
try {
|
|
526
|
+
return await this.bridge.sendCommand(
|
|
527
|
+
'exportDatabase',
|
|
528
|
+
params,
|
|
529
|
+
optionsArg,
|
|
530
|
+
) as ISmartDbDatabaseExport;
|
|
531
|
+
} catch (error) {
|
|
532
|
+
await this.awaitManagementOperationTermination(error);
|
|
533
|
+
throw error;
|
|
534
|
+
}
|
|
402
535
|
}
|
|
403
536
|
|
|
404
|
-
public async importDatabase(
|
|
537
|
+
public async importDatabase(
|
|
538
|
+
params: ISmartDbImportDatabaseInput,
|
|
539
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
540
|
+
): Promise<ISmartDbImportDatabaseResult> {
|
|
405
541
|
try {
|
|
406
|
-
return await this.bridge.sendCommand(
|
|
542
|
+
return await this.bridge.sendCommand(
|
|
543
|
+
'importDatabase',
|
|
544
|
+
params,
|
|
545
|
+
optionsArg,
|
|
546
|
+
) as ISmartDbImportDatabaseResult;
|
|
407
547
|
} catch (error) {
|
|
548
|
+
await this.awaitManagementOperationTermination(error);
|
|
408
549
|
throw normalizeSmartDbResourceFenceError(error);
|
|
409
550
|
}
|
|
410
551
|
}
|
|
411
552
|
|
|
412
553
|
public async commitDatabasePublication(
|
|
413
554
|
params: ISmartDbCommitDatabasePublicationInput,
|
|
555
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
414
556
|
): Promise<TSmartDbCommitDatabasePublicationResult> {
|
|
415
557
|
try {
|
|
416
558
|
return await this.bridge.sendCommand(
|
|
417
559
|
'commitDatabasePublication',
|
|
418
560
|
params,
|
|
561
|
+
optionsArg,
|
|
419
562
|
) as TSmartDbCommitDatabasePublicationResult;
|
|
420
563
|
} catch (error) {
|
|
564
|
+
await this.awaitManagementOperationTermination(error);
|
|
421
565
|
throw normalizeSmartDbResourceFenceError(error);
|
|
422
566
|
}
|
|
423
567
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
RustDbBridge,
|
|
3
|
+
SmartDbManagementOperationTerminationError,
|
|
4
|
+
} from '../rust-db-bridge.js';
|
|
2
5
|
import { StorageMigrator } from '../../ts_migration/index.js';
|
|
3
6
|
import type {
|
|
4
7
|
IOpLogEntry,
|
|
@@ -23,6 +26,8 @@ import type {
|
|
|
23
26
|
ISmartDbImportDatabaseInput,
|
|
24
27
|
ISmartDbImportDatabaseResult,
|
|
25
28
|
ISmartDbCommitDatabasePublicationInput,
|
|
29
|
+
ISmartDbManagementOperationOptions,
|
|
30
|
+
ISmartDbDatabaseResourceFenceState,
|
|
26
31
|
TSmartDbCommitDatabasePublicationResult,
|
|
27
32
|
} from '../service-types.js';
|
|
28
33
|
|
|
@@ -268,6 +273,26 @@ export class SmartdbServer {
|
|
|
268
273
|
return this.isRunning;
|
|
269
274
|
}
|
|
270
275
|
|
|
276
|
+
private async runDatabaseManagementOperation<TResult>(
|
|
277
|
+
operationArg: () => Promise<TResult>,
|
|
278
|
+
): Promise<TResult> {
|
|
279
|
+
try {
|
|
280
|
+
return await operationArg();
|
|
281
|
+
} catch (error) {
|
|
282
|
+
if (
|
|
283
|
+
!this.bridge.running
|
|
284
|
+
|| error instanceof SmartDbManagementOperationTerminationError
|
|
285
|
+
) {
|
|
286
|
+
this.isRunning = false;
|
|
287
|
+
this.resolvedConnectionUri = '';
|
|
288
|
+
if (this.bridge.ownershipReleased) {
|
|
289
|
+
this.bridgeOwned = false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
throw error;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
271
296
|
/**
|
|
272
297
|
* Get the port the server is listening on
|
|
273
298
|
*/
|
|
@@ -297,8 +322,11 @@ export class SmartdbServer {
|
|
|
297
322
|
*/
|
|
298
323
|
async ensureDatabaseTenant(
|
|
299
324
|
params: ISmartDbEnsureDatabaseTenantInput,
|
|
325
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
300
326
|
): Promise<ISmartDbEnsureDatabaseTenantResult> {
|
|
301
|
-
const descriptor = await this.
|
|
327
|
+
const descriptor = await this.runDatabaseManagementOperation(
|
|
328
|
+
() => this.bridge.ensureDatabaseTenant(params, optionsArg),
|
|
329
|
+
);
|
|
302
330
|
return this.withTenantMongoUri(descriptor, params.password);
|
|
303
331
|
}
|
|
304
332
|
|
|
@@ -307,8 +335,11 @@ export class SmartdbServer {
|
|
|
307
335
|
*/
|
|
308
336
|
async deleteDatabaseTenant(
|
|
309
337
|
params: ISmartDbDeleteDatabaseTenantInput,
|
|
338
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
310
339
|
): Promise<ISmartDbDeleteDatabaseTenantResult> {
|
|
311
|
-
return this.
|
|
340
|
+
return this.runDatabaseManagementOperation(
|
|
341
|
+
() => this.bridge.deleteDatabaseTenant(params, optionsArg),
|
|
342
|
+
);
|
|
312
343
|
}
|
|
313
344
|
|
|
314
345
|
/**
|
|
@@ -338,25 +369,48 @@ export class SmartdbServer {
|
|
|
338
369
|
return this.bridge.getDatabaseTenantDescriptor(params);
|
|
339
370
|
}
|
|
340
371
|
|
|
372
|
+
/** Inspect the durable high-water mark without exposing mutation receipts. */
|
|
373
|
+
async getDatabaseResourceFenceState(
|
|
374
|
+
params: { databaseName: string },
|
|
375
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
376
|
+
): Promise<ISmartDbDatabaseResourceFenceState | null> {
|
|
377
|
+
return this.runDatabaseManagementOperation(
|
|
378
|
+
() => this.bridge.getDatabaseResourceFenceState(params, optionsArg),
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
|
|
341
382
|
/**
|
|
342
383
|
* Export one database as an Extended JSON snapshot.
|
|
343
384
|
*/
|
|
344
|
-
async exportDatabase(
|
|
345
|
-
|
|
385
|
+
async exportDatabase(
|
|
386
|
+
params: ISmartDbExportDatabaseInput,
|
|
387
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
388
|
+
): Promise<ISmartDbDatabaseExport> {
|
|
389
|
+
return this.runDatabaseManagementOperation(
|
|
390
|
+
() => this.bridge.exportDatabase(params, optionsArg),
|
|
391
|
+
);
|
|
346
392
|
}
|
|
347
393
|
|
|
348
394
|
/**
|
|
349
395
|
* Replace one database with a previously exported snapshot.
|
|
350
396
|
*/
|
|
351
|
-
async importDatabase(
|
|
352
|
-
|
|
397
|
+
async importDatabase(
|
|
398
|
+
params: ISmartDbImportDatabaseInput,
|
|
399
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
400
|
+
): Promise<ISmartDbImportDatabaseResult> {
|
|
401
|
+
return this.runDatabaseManagementOperation(
|
|
402
|
+
() => this.bridge.importDatabase(params, optionsArg),
|
|
403
|
+
);
|
|
353
404
|
}
|
|
354
405
|
|
|
355
406
|
/** Release an exact held database publication after downstream fsync. */
|
|
356
407
|
async commitDatabasePublication(
|
|
357
408
|
params: ISmartDbCommitDatabasePublicationInput,
|
|
409
|
+
optionsArg?: ISmartDbManagementOperationOptions,
|
|
358
410
|
): Promise<TSmartDbCommitDatabasePublicationResult> {
|
|
359
|
-
return this.
|
|
411
|
+
return this.runDatabaseManagementOperation(
|
|
412
|
+
() => this.bridge.commitDatabasePublication(params, optionsArg),
|
|
413
|
+
);
|
|
360
414
|
}
|
|
361
415
|
|
|
362
416
|
/**
|
|
@@ -80,6 +80,25 @@ export interface ISmartDbCommitDatabasePublicationInput {
|
|
|
80
80
|
resourceFence: ISmartDbHeldPublicationReceipt;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Cancellation and deadline ownership for one durable database-management
|
|
85
|
+
* operation. Aborting or timing out is fail-stop: SmartDB terminates the Rust
|
|
86
|
+
* engine so the operation cannot continue after the caller has released it.
|
|
87
|
+
*/
|
|
88
|
+
export interface ISmartDbManagementOperationOptions {
|
|
89
|
+
signal?: AbortSignal;
|
|
90
|
+
timeoutMs?: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface ISmartDbDatabaseResourceFenceState {
|
|
94
|
+
version: 1;
|
|
95
|
+
databaseName: string;
|
|
96
|
+
resourceIdSha256: string;
|
|
97
|
+
scopeId: string;
|
|
98
|
+
highestToken: number;
|
|
99
|
+
publicationState: 'requested' | 'publishing' | 'held' | 'released';
|
|
100
|
+
}
|
|
101
|
+
|
|
83
102
|
export class SmartDbResourceFenceError extends Error {
|
|
84
103
|
public readonly code: TSmartDbResourceFenceErrorCode;
|
|
85
104
|
|