@lossless.org/nosqldb 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +107 -0
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_amd64.tsrust-build.json +14 -0
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_rust/rustdb_linux_arm64.tsrust-build.json +14 -0
- package/dist_rust/rustdb_macos_amd64 +0 -0
- package/dist_rust/rustdb_macos_amd64.tsrust-build.json +14 -0
- package/dist_rust/rustdb_macos_arm64 +0 -0
- package/dist_rust/rustdb_macos_arm64.tsrust-build.json +14 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +8 -0
- package/dist_ts/index.js +10 -0
- package/dist_ts/ts_local/classes.localnosqldb.d.ts +119 -0
- package/dist_ts/ts_local/classes.localnosqldb.js +386 -0
- package/dist_ts/ts_local/index.d.ts +5 -0
- package/dist_ts/ts_local/index.js +3 -0
- package/dist_ts/ts_local/plugins.d.ts +1 -0
- package/dist_ts/ts_local/plugins.js +3 -0
- package/dist_ts/ts_nosqldb/classes.storagerehearsal.d.ts +19 -0
- package/dist_ts/ts_nosqldb/classes.storagerehearsal.js +122 -0
- package/dist_ts/ts_nosqldb/file-storage-options.d.ts +13 -0
- package/dist_ts/ts_nosqldb/file-storage-options.js +24 -0
- package/dist_ts/ts_nosqldb/file-storage-startup.d.ts +3 -0
- package/dist_ts/ts_nosqldb/file-storage-startup.js +6 -0
- package/dist_ts/ts_nosqldb/index.d.ts +14 -0
- package/dist_ts/ts_nosqldb/index.js +11 -0
- package/dist_ts/ts_nosqldb/offline-inspection.d.ts +72 -0
- package/dist_ts/ts_nosqldb/offline-inspection.js +282 -0
- package/dist_ts/ts_nosqldb/plugins.d.ts +7 -0
- package/dist_ts/ts_nosqldb/plugins.js +10 -0
- package/dist_ts/ts_nosqldb/resource-fencing.d.ts +39 -0
- package/dist_ts/ts_nosqldb/resource-fencing.js +271 -0
- package/dist_ts/ts_nosqldb/rust-db-bridge.d.ts +213 -0
- package/dist_ts/ts_nosqldb/rust-db-bridge.js +439 -0
- package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.d.ts +204 -0
- package/dist_ts/ts_nosqldb/server/classes.nosqldbserver.js +456 -0
- package/dist_ts/ts_nosqldb/server/index.d.ts +3 -0
- package/dist_ts/ts_nosqldb/server/index.js +3 -0
- package/dist_ts/ts_nosqldb/service-types.d.ts +341 -0
- package/dist_ts/ts_nosqldb/service-types.js +62 -0
- package/dist_ts/ts_nosqldb/storage-rehearsal.d.ts +103 -0
- package/dist_ts/ts_nosqldb/storage-rehearsal.js +131 -0
- package/dist_ts/ts_nosqldb/storage-root-relocation.d.ts +27 -0
- package/dist_ts/ts_nosqldb/storage-root-relocation.js +211 -0
- package/dist_ts_debugserver/bundled.d.ts +4 -0
- package/dist_ts_debugserver/bundled.js +16 -0
- package/dist_ts_debugserver/classes.debugserver.d.ts +36 -0
- package/dist_ts_debugserver/classes.debugserver.js +95 -0
- package/dist_ts_debugserver/index.d.ts +2 -0
- package/dist_ts_debugserver/index.js +2 -0
- package/dist_ts_debugserver/plugins.d.ts +2 -0
- package/dist_ts_debugserver/plugins.js +3 -0
- package/dist_ts_debugui/index.d.ts +2 -0
- package/dist_ts_debugui/index.js +2 -0
- package/dist_ts_debugui/nosqldb-debugui.d.ts +62 -0
- package/dist_ts_debugui/nosqldb-debugui.js +1132 -0
- package/dist_ts_debugui/plugins.d.ts +1 -0
- package/dist_ts_debugui/plugins.js +2 -0
- package/license +21 -0
- package/package.json +82 -0
- package/readme.md +1733 -0
- package/third-party-notices.md +925 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +85 -0
- package/ts/ts_local/classes.localnosqldb.ts +500 -0
- package/ts/ts_local/index.ts +19 -0
- package/ts/ts_local/plugins.ts +1 -0
- package/ts/ts_nosqldb/classes.storagerehearsal.ts +109 -0
- package/ts/ts_nosqldb/file-storage-options.ts +33 -0
- package/ts/ts_nosqldb/file-storage-startup.ts +9 -0
- package/ts/ts_nosqldb/index.ts +104 -0
- package/ts/ts_nosqldb/offline-inspection.ts +375 -0
- package/ts/ts_nosqldb/plugins.ts +12 -0
- package/ts/ts_nosqldb/resource-fencing.ts +368 -0
- package/ts/ts_nosqldb/rust-db-bridge.ts +964 -0
- package/ts/ts_nosqldb/server/classes.nosqldbserver.ts +696 -0
- package/ts/ts_nosqldb/server/index.ts +4 -0
- package/ts/ts_nosqldb/service-types.ts +484 -0
- package/ts/ts_nosqldb/storage-rehearsal.ts +215 -0
- package/ts/ts_nosqldb/storage-root-relocation.ts +277 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { normalizeNoSqlDbFileStorageOptions } from './file-storage-options.js';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as url from 'url';
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { normalizeNoSqlDbStorageRehearsalInput, } from './storage-rehearsal.js';
|
|
7
|
+
import { normalizeNoSqlDbAllocationReadAccessGrantError, normalizeNoSqlDbResourceFenceError, } from './service-types.js';
|
|
8
|
+
import { normalizeLocalNoSqlDbOfflinePhysicalNamespaceInspectionInput, normalizeLocalNoSqlDbOfflineInspectionInput, validateNoSqlDbManagementOperationOptions, } from './offline-inspection.js';
|
|
9
|
+
import { normalizeLocalNoSqlDbStoppedStorageRootRelocationInput, } from './storage-root-relocation.js';
|
|
10
|
+
export class NoSqlDbManagementOperationTerminationError extends AggregateError {
|
|
11
|
+
constructor(operationErrorArg, terminationErrorArg) {
|
|
12
|
+
super([operationErrorArg, terminationErrorArg], 'NoSQLDB management operation failed and Rust engine termination was incomplete', { cause: operationErrorArg });
|
|
13
|
+
this.name = 'NoSqlDbManagementOperationTerminationError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export const rustDbBridgeStorageRootRelocation = Symbol('nosqldb.internal.storage-root-relocation');
|
|
17
|
+
export const rustDbBridgeStorageRehearsal = Symbol('nosqldb.internal.storage-rehearsal');
|
|
18
|
+
/**
|
|
19
|
+
* Get the package root directory using import.meta.url.
|
|
20
|
+
* This file is at ts/ts_nosqldb/, so package root is 2 levels up.
|
|
21
|
+
*/
|
|
22
|
+
function getPackageRoot() {
|
|
23
|
+
const thisDir = path.dirname(url.fileURLToPath(import.meta.url));
|
|
24
|
+
return path.resolve(thisDir, '..', '..');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Map Node.js process.platform/process.arch to tsrust's friendly name suffix.
|
|
28
|
+
* tsrust names cross-compiled binaries as: rustdb_linux_amd64, rustdb_linux_arm64, etc.
|
|
29
|
+
*/
|
|
30
|
+
function getTsrustPlatformSuffix() {
|
|
31
|
+
const archMap = { x64: 'amd64', arm64: 'arm64' };
|
|
32
|
+
const osMap = { linux: 'linux', darwin: 'macos' };
|
|
33
|
+
const os = osMap[process.platform];
|
|
34
|
+
const arch = archMap[process.arch];
|
|
35
|
+
if (os && arch) {
|
|
36
|
+
return `${os}_${arch}`;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build local search paths for the Rust binary, including dist_rust/ candidates
|
|
42
|
+
* (built by tsrust) and local development build paths.
|
|
43
|
+
*/
|
|
44
|
+
function buildLocalPaths() {
|
|
45
|
+
const packageRoot = getPackageRoot();
|
|
46
|
+
const suffix = getTsrustPlatformSuffix();
|
|
47
|
+
const paths = [];
|
|
48
|
+
// dist_rust/ candidates (tsrust cross-compiled output)
|
|
49
|
+
if (suffix) {
|
|
50
|
+
paths.push(path.join(packageRoot, 'dist_rust', `rustdb_${suffix}`));
|
|
51
|
+
}
|
|
52
|
+
paths.push(path.join(packageRoot, 'dist_rust', 'rustdb'));
|
|
53
|
+
// Local dev build paths
|
|
54
|
+
paths.push(path.resolve(process.cwd(), 'rust', 'target', 'release', 'rustdb'));
|
|
55
|
+
paths.push(path.resolve(process.cwd(), 'rust', 'target', 'debug', 'rustdb'));
|
|
56
|
+
return paths;
|
|
57
|
+
}
|
|
58
|
+
export function getRustDbAllocatorEnv(environment = process.env) {
|
|
59
|
+
return {
|
|
60
|
+
MIMALLOC_ARENA_EAGER_COMMIT: environment.MIMALLOC_ARENA_EAGER_COMMIT ?? '0',
|
|
61
|
+
MIMALLOC_ALLOW_LARGE_OS_PAGES: environment.MIMALLOC_ALLOW_LARGE_OS_PAGES ?? '0',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Bridge between TypeScript NoSqlDbServer and the Rust binary.
|
|
66
|
+
* Wraps @push.rocks/smartrust's RustBridge with type-safe command definitions.
|
|
67
|
+
*/
|
|
68
|
+
export class RustDbBridge extends EventEmitter {
|
|
69
|
+
/**
|
|
70
|
+
* Operating-system process id of the spawned Rust engine while it runs as a
|
|
71
|
+
* child process of this Node.js process. Undefined before spawn, after
|
|
72
|
+
* termination, or when the bridge is connected to an external process.
|
|
73
|
+
*/
|
|
74
|
+
get processId() {
|
|
75
|
+
const transport = this.bridge.transport;
|
|
76
|
+
return transport?.childProcess?.pid;
|
|
77
|
+
}
|
|
78
|
+
constructor(options = {}) {
|
|
79
|
+
super();
|
|
80
|
+
this.terminationConfirmed = true;
|
|
81
|
+
this.bridge = new plugins.smartrust.RustBridge({
|
|
82
|
+
binaryName: 'rustdb',
|
|
83
|
+
binaryPath: options.binaryPath,
|
|
84
|
+
envVarName: 'NOSQLDB_RUST_BINARY',
|
|
85
|
+
platformPackagePrefix: '@lossless.org/nosqldb',
|
|
86
|
+
localPaths: buildLocalPaths(),
|
|
87
|
+
maxPayloadSize: 100 * 1024 * 1024, // database exports/imports can be larger than command replies
|
|
88
|
+
env: getRustDbAllocatorEnv(),
|
|
89
|
+
});
|
|
90
|
+
// Forward events from the inner bridge
|
|
91
|
+
this.bridge.on('exit', (code, signal) => {
|
|
92
|
+
this.terminationConfirmed = true;
|
|
93
|
+
this.emit('exit', code, signal);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Spawn the Rust binary in management mode.
|
|
98
|
+
* Returns true if the binary was found and spawned successfully.
|
|
99
|
+
*/
|
|
100
|
+
async spawn(optionsArg) {
|
|
101
|
+
validateNoSqlDbManagementOperationOptions(optionsArg);
|
|
102
|
+
if (optionsArg?.signal?.aborted) {
|
|
103
|
+
throw new plugins.smartrust.RustBridgeRequestError('NoSQLDB Rust sidecar spawn was aborted before it started', {
|
|
104
|
+
code: 'ERR_RUST_BRIDGE_REQUEST_ABORTED',
|
|
105
|
+
method: 'spawn',
|
|
106
|
+
cause: optionsArg.signal.reason,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
this.terminationConfirmed = false;
|
|
110
|
+
this.terminationFailure = undefined;
|
|
111
|
+
const spawnPromise = this.bridge.spawn();
|
|
112
|
+
let timeout;
|
|
113
|
+
let abortHandler;
|
|
114
|
+
const cancellationPromise = new Promise((_resolveArg, rejectArg) => {
|
|
115
|
+
if (optionsArg?.timeoutMs !== undefined) {
|
|
116
|
+
timeout = setTimeout(() => {
|
|
117
|
+
rejectArg(new plugins.smartrust.RustBridgeRequestError(`NoSQLDB Rust sidecar spawn timed out after ${optionsArg.timeoutMs}ms`, {
|
|
118
|
+
code: 'ERR_RUST_BRIDGE_REQUEST_TIMEOUT',
|
|
119
|
+
method: 'spawn',
|
|
120
|
+
}));
|
|
121
|
+
}, optionsArg.timeoutMs);
|
|
122
|
+
}
|
|
123
|
+
if (optionsArg?.signal) {
|
|
124
|
+
abortHandler = () => {
|
|
125
|
+
rejectArg(new plugins.smartrust.RustBridgeRequestError('NoSQLDB Rust sidecar spawn was aborted', {
|
|
126
|
+
code: 'ERR_RUST_BRIDGE_REQUEST_ABORTED',
|
|
127
|
+
method: 'spawn',
|
|
128
|
+
cause: optionsArg.signal.reason,
|
|
129
|
+
}));
|
|
130
|
+
};
|
|
131
|
+
optionsArg.signal.addEventListener('abort', abortHandler, { once: true });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
const spawned = await Promise.race([spawnPromise, cancellationPromise]);
|
|
136
|
+
if (!spawned) {
|
|
137
|
+
await this.terminate({ gracePeriodMs: 0 });
|
|
138
|
+
}
|
|
139
|
+
return spawned;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
try {
|
|
143
|
+
await this.terminate({ gracePeriodMs: 0 });
|
|
144
|
+
}
|
|
145
|
+
catch (terminationError) {
|
|
146
|
+
throw new NoSqlDbManagementOperationTerminationError(error, terminationError);
|
|
147
|
+
}
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
if (timeout)
|
|
152
|
+
clearTimeout(timeout);
|
|
153
|
+
if (abortHandler && optionsArg?.signal) {
|
|
154
|
+
optionsArg.signal.removeEventListener('abort', abortHandler);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Kill the Rust process and clean up.
|
|
160
|
+
*/
|
|
161
|
+
kill() {
|
|
162
|
+
this.bridge.kill();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Confirm that the Rust process has exited and all bridge resources are released.
|
|
166
|
+
*/
|
|
167
|
+
terminate(optionsArg) {
|
|
168
|
+
if (this.terminationPromise) {
|
|
169
|
+
return this.terminationPromise;
|
|
170
|
+
}
|
|
171
|
+
const terminationPromise = this.bridge.terminate(optionsArg).then(() => {
|
|
172
|
+
this.terminationConfirmed = true;
|
|
173
|
+
this.terminationFailure = undefined;
|
|
174
|
+
}, (errorArg) => {
|
|
175
|
+
this.terminationFailure = errorArg;
|
|
176
|
+
throw errorArg;
|
|
177
|
+
});
|
|
178
|
+
this.terminationPromise = terminationPromise;
|
|
179
|
+
void terminationPromise.then(() => {
|
|
180
|
+
if (this.terminationPromise === terminationPromise) {
|
|
181
|
+
this.terminationPromise = undefined;
|
|
182
|
+
}
|
|
183
|
+
}, () => {
|
|
184
|
+
if (this.terminationPromise === terminationPromise) {
|
|
185
|
+
this.terminationPromise = undefined;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return terminationPromise;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Whether the bridge is currently running.
|
|
192
|
+
*/
|
|
193
|
+
get running() {
|
|
194
|
+
return this.bridge.running;
|
|
195
|
+
}
|
|
196
|
+
get ownershipReleased() {
|
|
197
|
+
return this.terminationConfirmed;
|
|
198
|
+
}
|
|
199
|
+
async awaitManagementOperationTermination(errorArg) {
|
|
200
|
+
const cancellationRequiresTermination = errorArg instanceof plugins.smartrust.RustBridgeRequestError
|
|
201
|
+
&& [
|
|
202
|
+
'ERR_RUST_BRIDGE_REQUEST_ABORTED',
|
|
203
|
+
'ERR_RUST_BRIDGE_REQUEST_TIMEOUT',
|
|
204
|
+
].includes(errorArg.code);
|
|
205
|
+
let terminationPromise = this.terminationPromise;
|
|
206
|
+
if (cancellationRequiresTermination && !terminationPromise) {
|
|
207
|
+
terminationPromise = this.terminate({ gracePeriodMs: 0 });
|
|
208
|
+
}
|
|
209
|
+
if (!terminationPromise) {
|
|
210
|
+
if (!this.terminationConfirmed && this.terminationFailure !== undefined) {
|
|
211
|
+
throw new NoSqlDbManagementOperationTerminationError(errorArg, this.terminationFailure);
|
|
212
|
+
}
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
await terminationPromise;
|
|
217
|
+
}
|
|
218
|
+
catch (terminationError) {
|
|
219
|
+
throw new NoSqlDbManagementOperationTerminationError(errorArg, terminationError);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// --- Convenience methods for each management command ---
|
|
223
|
+
async [rustDbBridgeStorageRehearsal](inputArg, optionsArg) {
|
|
224
|
+
const request = normalizeNoSqlDbStorageRehearsalInput(inputArg);
|
|
225
|
+
validateNoSqlDbManagementOperationOptions(optionsArg);
|
|
226
|
+
try {
|
|
227
|
+
return await this.bridge.sendCommand('createStoppedStorageRehearsal', { request, timeoutMs: optionsArg.timeoutMs }, optionsArg);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
await this.awaitManagementOperationTermination(error);
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async [rustDbBridgeStorageRootRelocation](inputArg, optionsArg) {
|
|
235
|
+
const input = normalizeLocalNoSqlDbStoppedStorageRootRelocationInput(inputArg);
|
|
236
|
+
validateNoSqlDbManagementOperationOptions(optionsArg);
|
|
237
|
+
try {
|
|
238
|
+
return await this.bridge.sendCommand('relocateStoppedStorageRoot', { ...input, timeoutMs: optionsArg?.timeoutMs }, optionsArg);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
await this.awaitManagementOperationTermination(error);
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async inspectOfflinePhysicalNamespaces(inputArg, optionsArg) {
|
|
246
|
+
const input = normalizeLocalNoSqlDbOfflinePhysicalNamespaceInspectionInput(inputArg);
|
|
247
|
+
validateNoSqlDbManagementOperationOptions(optionsArg);
|
|
248
|
+
const params = {
|
|
249
|
+
folderPath: input.folderPath,
|
|
250
|
+
...input.limits,
|
|
251
|
+
timeoutMs: optionsArg?.timeoutMs,
|
|
252
|
+
};
|
|
253
|
+
try {
|
|
254
|
+
return await this.bridge.sendCommand('inspectOfflinePhysicalNamespaces', params, optionsArg);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
await this.awaitManagementOperationTermination(error);
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async inspectOfflineStringValue(inputArg, optionsArg) {
|
|
262
|
+
const input = normalizeLocalNoSqlDbOfflineInspectionInput(inputArg);
|
|
263
|
+
validateNoSqlDbManagementOperationOptions(optionsArg);
|
|
264
|
+
try {
|
|
265
|
+
return await this.bridge.sendCommand('inspectOfflineStringValue', { ...input, timeoutMs: optionsArg?.timeoutMs }, optionsArg);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
await this.awaitManagementOperationTermination(error);
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async startDb(config, optionsArg) {
|
|
273
|
+
normalizeNoSqlDbFileStorageOptions(config);
|
|
274
|
+
validateNoSqlDbManagementOperationOptions(optionsArg);
|
|
275
|
+
try {
|
|
276
|
+
return await this.bridge.sendCommand('start', { config, timeoutMs: optionsArg?.timeoutMs }, optionsArg);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
await this.awaitManagementOperationTermination(error);
|
|
280
|
+
throw error;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async stopDb() {
|
|
284
|
+
await this.bridge.sendCommand('stop', {});
|
|
285
|
+
}
|
|
286
|
+
async getStatus() {
|
|
287
|
+
return await this.bridge.sendCommand('getStatus', {});
|
|
288
|
+
}
|
|
289
|
+
async getMetrics() {
|
|
290
|
+
return this.bridge.sendCommand('getMetrics', {});
|
|
291
|
+
}
|
|
292
|
+
async getHealth(optionsArg) {
|
|
293
|
+
try {
|
|
294
|
+
return await this.bridge.sendCommand('getHealth', {}, optionsArg);
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
await this.awaitManagementOperationTermination(error);
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async createDatabaseTenant(params) {
|
|
302
|
+
try {
|
|
303
|
+
return await this.bridge.sendCommand('createDatabaseTenant', params);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async ensureDatabaseTenant(params, optionsArg) {
|
|
310
|
+
try {
|
|
311
|
+
return await this.bridge.sendCommand('ensureDatabaseTenant', params, optionsArg);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
await this.awaitManagementOperationTermination(error);
|
|
315
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async attestDatabaseTenant(params, optionsArg) {
|
|
319
|
+
try {
|
|
320
|
+
return await this.bridge.sendCommand('attestDatabaseTenant', params, optionsArg);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
await this.awaitManagementOperationTermination(error);
|
|
324
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async allocateDatabaseTenant(params, optionsArg) {
|
|
328
|
+
try {
|
|
329
|
+
return await this.bridge.sendCommand('allocateDatabaseTenant', params, optionsArg);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
await this.awaitManagementOperationTermination(error);
|
|
333
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async deleteDatabaseTenant(params, optionsArg) {
|
|
337
|
+
try {
|
|
338
|
+
return await this.bridge.sendCommand('deleteDatabaseTenant', params, optionsArg);
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
await this.awaitManagementOperationTermination(error);
|
|
342
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async issueDatabaseAllocationReadAccessGrant(params, optionsArg) {
|
|
346
|
+
try {
|
|
347
|
+
return await this.bridge.sendCommand('issueDatabaseAllocationReadAccessGrant', params, optionsArg);
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
await this.awaitManagementOperationTermination(error);
|
|
351
|
+
throw normalizeNoSqlDbAllocationReadAccessGrantError(normalizeNoSqlDbResourceFenceError(error), error instanceof plugins.smartrust.RustBridgeRequestError
|
|
352
|
+
? error.responseErrorCode
|
|
353
|
+
: undefined);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
async revokeDatabaseAllocationReadAccessGrant(params, optionsArg) {
|
|
357
|
+
try {
|
|
358
|
+
return await this.bridge.sendCommand('revokeDatabaseAllocationReadAccessGrant', params, optionsArg);
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
await this.awaitManagementOperationTermination(error);
|
|
362
|
+
throw normalizeNoSqlDbAllocationReadAccessGrantError(normalizeNoSqlDbResourceFenceError(error), error instanceof plugins.smartrust.RustBridgeRequestError
|
|
363
|
+
? error.responseErrorCode
|
|
364
|
+
: undefined);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
async rotateDatabaseTenantPassword(params) {
|
|
368
|
+
return this.bridge.sendCommand('rotateDatabaseTenantPassword', params);
|
|
369
|
+
}
|
|
370
|
+
async listDatabaseTenants() {
|
|
371
|
+
const result = await this.bridge.sendCommand('listDatabaseTenants', {});
|
|
372
|
+
return result.tenants;
|
|
373
|
+
}
|
|
374
|
+
async getDatabaseTenantDescriptor(params) {
|
|
375
|
+
return this.bridge.sendCommand('getDatabaseTenantDescriptor', params);
|
|
376
|
+
}
|
|
377
|
+
async getDatabaseResourceFenceState(params, optionsArg) {
|
|
378
|
+
try {
|
|
379
|
+
return await this.bridge.sendCommand('getDatabaseResourceFenceState', params, optionsArg);
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
await this.awaitManagementOperationTermination(error);
|
|
383
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
async exportDatabase(params, optionsArg) {
|
|
387
|
+
try {
|
|
388
|
+
return await this.bridge.sendCommand('exportDatabase', params, optionsArg);
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
await this.awaitManagementOperationTermination(error);
|
|
392
|
+
throw error;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
async getDatabaseContentDigest(params, optionsArg) {
|
|
396
|
+
try {
|
|
397
|
+
return await this.bridge.sendCommand('getDatabaseContentDigest', params, optionsArg);
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
await this.awaitManagementOperationTermination(error);
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
async importDatabase(params, optionsArg) {
|
|
405
|
+
try {
|
|
406
|
+
return await this.bridge.sendCommand('importDatabase', { ...params, timeoutMs: optionsArg?.timeoutMs }, optionsArg);
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
await this.awaitManagementOperationTermination(error);
|
|
410
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
async commitDatabasePublication(params, optionsArg) {
|
|
414
|
+
try {
|
|
415
|
+
return await this.bridge.sendCommand('commitDatabasePublication', params, optionsArg);
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
await this.awaitManagementOperationTermination(error);
|
|
419
|
+
throw normalizeNoSqlDbResourceFenceError(error);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
async getOpLog(params = {}) {
|
|
423
|
+
return this.bridge.sendCommand('getOpLog', params);
|
|
424
|
+
}
|
|
425
|
+
async getOpLogStats() {
|
|
426
|
+
return this.bridge.sendCommand('getOpLogStats', {});
|
|
427
|
+
}
|
|
428
|
+
async revertToSeq(seq, dryRun = false) {
|
|
429
|
+
return this.bridge.sendCommand('revertToSeq', { seq, dryRun });
|
|
430
|
+
}
|
|
431
|
+
async getCollections(db) {
|
|
432
|
+
const result = await this.bridge.sendCommand('getCollections', db ? { db } : {});
|
|
433
|
+
return result.collections;
|
|
434
|
+
}
|
|
435
|
+
async getDocuments(db, collection, limit = 50, skip = 0) {
|
|
436
|
+
return this.bridge.sendCommand('getDocuments', { db, collection, limit, skip });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1kYi1icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19ub3NxbGRiL3J1c3QtZGItYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9FLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUNMLHFDQUFxQyxHQUl0QyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCw4Q0FBOEMsRUFDOUMsa0NBQWtDLEdBQ25DLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUNMLDREQUE0RCxFQUM1RCwyQ0FBMkMsRUFDM0MseUNBQXlDLEdBQzFDLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLHNEQUFzRCxHQUd2RCxNQUFNLDhCQUE4QixDQUFDO0FBd0l0QyxNQUFNLE9BQU8sMENBQTJDLFNBQVEsY0FBYztJQUM1RSxZQUFZLGlCQUEwQixFQUFFLG1CQUE0QjtRQUNsRSxLQUFLLENBQ0gsQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxFQUN4QyxnRkFBZ0YsRUFDaEYsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FDN0IsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsNENBQTRDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBOEhELE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FDckQsMENBQTBDLENBQzNDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQTZDekY7OztHQUdH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
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { type TNoSqlDbFileStorageStartup } from '../file-storage-startup.js';
|
|
2
|
+
import type { IOpLogResult, IOpLogStats, IRevertResult, ICollectionInfo, IDocumentsResult, INoSqlDbMetrics, INoSqlDbQueryOptions } from '../rust-db-bridge.js';
|
|
3
|
+
import type { INoSqlDbHealth, INoSqlDbDatabaseTenantInput, INoSqlDbAttestDatabaseTenantInput, INoSqlDbAttestDatabaseTenantResult, INoSqlDbEnsureDatabaseTenantInput, INoSqlDbEnsureDatabaseTenantResult, INoSqlDbAllocateDatabaseTenantInput, INoSqlDbAllocateDatabaseTenantResult, INoSqlDbDeleteDatabaseTenantInput, INoSqlDbRotateDatabaseTenantPasswordInput, INoSqlDbDatabaseTenantDescriptor, INoSqlDbDeleteDatabaseTenantResult, INoSqlDbIssueDatabaseAllocationReadAccessGrantInput, INoSqlDbIssueDatabaseAllocationReadAccessGrantResult, INoSqlDbRevokeDatabaseAllocationReadAccessGrantInput, INoSqlDbRevokeDatabaseAllocationReadAccessGrantResult, INoSqlDbDatabaseExport, INoSqlDbExportDatabaseInput, INoSqlDbDatabaseContentDigest, INoSqlDbGetDatabaseContentDigestInput, INoSqlDbImportDatabaseInput, INoSqlDbImportDatabaseResult, INoSqlDbCommitDatabasePublicationInput, INoSqlDbManagementOperationOptions, INoSqlDbDatabaseResourceFenceState, TNoSqlDbCommitDatabasePublicationResult } from '../service-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Server configuration options
|
|
6
|
+
*/
|
|
7
|
+
export interface INoSqlDbServerOptions {
|
|
8
|
+
/** Exact engine executable. Invalid explicit paths reject without chmod or discovery fallback. Omit for normal discovery. */
|
|
9
|
+
binaryPath?: string;
|
|
10
|
+
/** Exact rehearsal operation ID. Requires authenticated current-format-only file storage and an explicit private Unix socket. Never promotes a rehearsal. */
|
|
11
|
+
storageRehearsalId?: string;
|
|
12
|
+
/** Default: current-format-only. The native owner rejects foreign, mixed and migration staging roots without conversion. */
|
|
13
|
+
fileStorageStartup?: TNoSqlDbFileStorageStartup;
|
|
14
|
+
/** Port to listen on (default: 27017, 0 requests an OS-assigned port) - ignored if socketPath is set */
|
|
15
|
+
port?: number;
|
|
16
|
+
/** Host to bind to (default: 127.0.0.1) - ignored if socketPath is set */
|
|
17
|
+
host?: string;
|
|
18
|
+
/** Unix socket path - if set, server listens on socket instead of TCP */
|
|
19
|
+
socketPath?: string;
|
|
20
|
+
/** Storage type: 'memory' or 'file' (default: 'memory') */
|
|
21
|
+
storage?: 'memory' | 'file';
|
|
22
|
+
/** Path for file storage (required if storage is 'file') */
|
|
23
|
+
storagePath?: string;
|
|
24
|
+
/** Authentication configuration. Disabled by default. */
|
|
25
|
+
auth?: INoSqlDbAuthOptions;
|
|
26
|
+
/** TLS transport configuration for TCP listeners. Disabled by default. */
|
|
27
|
+
tls?: INoSqlDbTlsOptions;
|
|
28
|
+
/** In-memory oplog retention limits (defaults: 10000 entries / 64 MiB). */
|
|
29
|
+
oplog?: INoSqlDbOplogOptions;
|
|
30
|
+
/** Memory, temporary storage, and concurrency admission for large sorts. */
|
|
31
|
+
query?: INoSqlDbQueryOptions;
|
|
32
|
+
}
|
|
33
|
+
export interface INoSqlDbOplogOptions {
|
|
34
|
+
/** Maximum number of retained oplog entries (default: 10000). */
|
|
35
|
+
maxEntries?: number;
|
|
36
|
+
/** Maximum approximate retained bytes (default: 64 MiB). Oldest entries are evicted first; reverts cannot reach past evicted entries. */
|
|
37
|
+
maxBytes?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface INoSqlDbAuthOptions {
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
users?: INoSqlDbAuthUser[];
|
|
42
|
+
scramIterations?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface INoSqlDbAuthUser {
|
|
45
|
+
username: string;
|
|
46
|
+
password: string;
|
|
47
|
+
database?: string;
|
|
48
|
+
roles?: string[];
|
|
49
|
+
}
|
|
50
|
+
export interface INoSqlDbTlsOptions {
|
|
51
|
+
enabled?: boolean;
|
|
52
|
+
certPath?: string;
|
|
53
|
+
keyPath?: string;
|
|
54
|
+
caPath?: string;
|
|
55
|
+
requireClientCert?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* NoSqlDbServer - Wire protocol compatible database server backed by Rust
|
|
59
|
+
*
|
|
60
|
+
* This server implements the wire protocol to allow official drivers to
|
|
61
|
+
* connect and perform operations. The core engine runs as a Rust sidecar
|
|
62
|
+
* binary managed via @push.rocks/smartrust IPC.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* import { NoSqlDbServer } from '@lossless.org/nosqldb';
|
|
67
|
+
* import { MongoClient } from 'mongodb';
|
|
68
|
+
*
|
|
69
|
+
* const server = new NoSqlDbServer({ port: 27017 });
|
|
70
|
+
* await server.start();
|
|
71
|
+
*
|
|
72
|
+
* const client = new MongoClient(server.getConnectionUri());
|
|
73
|
+
* await client.connect();
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare class NoSqlDbServer {
|
|
77
|
+
private options;
|
|
78
|
+
private bridge;
|
|
79
|
+
private bridgeOwned;
|
|
80
|
+
private startInProgress;
|
|
81
|
+
private startCompletionPromise;
|
|
82
|
+
private isRunning;
|
|
83
|
+
private resolvedConnectionUri;
|
|
84
|
+
private resolvedPort;
|
|
85
|
+
constructor(options?: INoSqlDbServerOptions);
|
|
86
|
+
/**
|
|
87
|
+
* Start the server
|
|
88
|
+
*/
|
|
89
|
+
start(optionsArg?: INoSqlDbManagementOperationOptions): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Stop the server
|
|
92
|
+
*/
|
|
93
|
+
stop(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Get the connection URI for this server
|
|
96
|
+
*/
|
|
97
|
+
getConnectionUri(): string;
|
|
98
|
+
/**
|
|
99
|
+
* Get the socket path (if using Unix socket mode)
|
|
100
|
+
*/
|
|
101
|
+
get socketPath(): string | undefined;
|
|
102
|
+
/**
|
|
103
|
+
* Check if the server is running
|
|
104
|
+
*/
|
|
105
|
+
/** Process id of the spawned Rust engine, when it runs as a child process. */
|
|
106
|
+
get processId(): number | undefined;
|
|
107
|
+
get running(): boolean;
|
|
108
|
+
private runDatabaseManagementOperation;
|
|
109
|
+
/**
|
|
110
|
+
* Get the port the server is listening on
|
|
111
|
+
*/
|
|
112
|
+
get port(): number;
|
|
113
|
+
/**
|
|
114
|
+
* Get the host the server is bound to
|
|
115
|
+
*/
|
|
116
|
+
get host(): string;
|
|
117
|
+
/**
|
|
118
|
+
* Create an isolated database/user pair for an application tenant.
|
|
119
|
+
*/
|
|
120
|
+
createDatabaseTenant(params: INoSqlDbDatabaseTenantInput): Promise<INoSqlDbDatabaseTenantDescriptor>;
|
|
121
|
+
/** Authoritatively allocate an absent, fenced database tenant. */
|
|
122
|
+
allocateDatabaseTenant(params: INoSqlDbAllocateDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbAllocateDatabaseTenantResult>;
|
|
123
|
+
/**
|
|
124
|
+
* Idempotently provision or rotate one exclusively owned database tenant.
|
|
125
|
+
*/
|
|
126
|
+
ensureDatabaseTenant(params: INoSqlDbEnsureDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbEnsureDatabaseTenantResult>;
|
|
127
|
+
/** Verify an exact tenant credential without changing provider state. */
|
|
128
|
+
attestDatabaseTenant(params: INoSqlDbAttestDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbAttestDatabaseTenantResult>;
|
|
129
|
+
/**
|
|
130
|
+
* Delete a tenant database and its tenant user(s).
|
|
131
|
+
*/
|
|
132
|
+
deleteDatabaseTenant(params: INoSqlDbDeleteDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDeleteDatabaseTenantResult>;
|
|
133
|
+
/** Issue one fixed-expiry read grant bound to an exact active allocation. */
|
|
134
|
+
issueDatabaseAllocationReadAccessGrant(params: INoSqlDbIssueDatabaseAllocationReadAccessGrantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbIssueDatabaseAllocationReadAccessGrantResult>;
|
|
135
|
+
/** Idempotently revoke one allocation read grant without returning a secret. */
|
|
136
|
+
revokeDatabaseAllocationReadAccessGrant(params: INoSqlDbRevokeDatabaseAllocationReadAccessGrantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbRevokeDatabaseAllocationReadAccessGrantResult>;
|
|
137
|
+
/**
|
|
138
|
+
* Rotate a tenant user's password without restarting the server.
|
|
139
|
+
*/
|
|
140
|
+
rotateDatabaseTenantPassword(params: INoSqlDbRotateDatabaseTenantPasswordInput): Promise<INoSqlDbDatabaseTenantDescriptor>;
|
|
141
|
+
/**
|
|
142
|
+
* List known database tenants.
|
|
143
|
+
*/
|
|
144
|
+
listDatabaseTenants(): Promise<INoSqlDbDatabaseTenantDescriptor[]>;
|
|
145
|
+
/**
|
|
146
|
+
* Get a tenant descriptor without exposing a password.
|
|
147
|
+
*/
|
|
148
|
+
getDatabaseTenantDescriptor(params: {
|
|
149
|
+
databaseName: string;
|
|
150
|
+
username: string;
|
|
151
|
+
}): Promise<INoSqlDbDatabaseTenantDescriptor>;
|
|
152
|
+
/** Inspect the durable high-water mark without exposing mutation receipts. */
|
|
153
|
+
getDatabaseResourceFenceState(params: {
|
|
154
|
+
databaseName: string;
|
|
155
|
+
}, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDatabaseResourceFenceState | null>;
|
|
156
|
+
/**
|
|
157
|
+
* Export one database as an Extended JSON snapshot.
|
|
158
|
+
*/
|
|
159
|
+
exportDatabase(params: INoSqlDbExportDatabaseInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDatabaseExport>;
|
|
160
|
+
/** Compute a bounded, database-name-independent digest of logical database content. */
|
|
161
|
+
getDatabaseContentDigest(params: INoSqlDbGetDatabaseContentDigestInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDatabaseContentDigest>;
|
|
162
|
+
/**
|
|
163
|
+
* Replace one database with a previously exported snapshot.
|
|
164
|
+
*/
|
|
165
|
+
importDatabase(params: INoSqlDbImportDatabaseInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbImportDatabaseResult>;
|
|
166
|
+
/** Release an exact held database publication after downstream fsync. */
|
|
167
|
+
commitDatabasePublication(params: INoSqlDbCommitDatabasePublicationInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<TNoSqlDbCommitDatabasePublicationResult>;
|
|
168
|
+
/**
|
|
169
|
+
* Get readiness/health details for long-running service use.
|
|
170
|
+
*/
|
|
171
|
+
getHealth(optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbHealth>;
|
|
172
|
+
/**
|
|
173
|
+
* Get oplog entries, optionally filtered.
|
|
174
|
+
*/
|
|
175
|
+
getOpLog(params?: {
|
|
176
|
+
sinceSeq?: number;
|
|
177
|
+
limit?: number;
|
|
178
|
+
db?: string;
|
|
179
|
+
collection?: string;
|
|
180
|
+
}): Promise<IOpLogResult>;
|
|
181
|
+
/**
|
|
182
|
+
* Get aggregate oplog statistics.
|
|
183
|
+
*/
|
|
184
|
+
getOpLogStats(): Promise<IOpLogStats>;
|
|
185
|
+
/**
|
|
186
|
+
* Revert database state to a specific oplog sequence number.
|
|
187
|
+
* Use dryRun=true to preview which entries would be reverted.
|
|
188
|
+
*/
|
|
189
|
+
revertToSeq(seq: number, dryRun?: boolean): Promise<IRevertResult>;
|
|
190
|
+
/**
|
|
191
|
+
* List all collections across all databases, with document counts.
|
|
192
|
+
*/
|
|
193
|
+
getCollections(db?: string): Promise<ICollectionInfo[]>;
|
|
194
|
+
/**
|
|
195
|
+
* Get documents from a collection with pagination.
|
|
196
|
+
*/
|
|
197
|
+
getDocuments(db: string, collection: string, limit?: number, skip?: number): Promise<IDocumentsResult>;
|
|
198
|
+
/**
|
|
199
|
+
* Get server metrics including database/collection counts and oplog info.
|
|
200
|
+
*/
|
|
201
|
+
getMetrics(): Promise<INoSqlDbMetrics>;
|
|
202
|
+
private withTenantMongoUri;
|
|
203
|
+
private buildTenantMongoUri;
|
|
204
|
+
}
|