@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,271 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
const typedPayloadPrefix = plugins.buffer.Buffer.from('smartdb.effective-payload.typed.v1\0', 'utf8');
|
|
3
|
+
const minimumI64 = -9223372036854775808n;
|
|
4
|
+
const maximumU64 = 18446744073709551615n;
|
|
5
|
+
const compareUtf8Keys = (leftArg, rightArg) => plugins.buffer.Buffer.compare(plugins.buffer.Buffer.from(leftArg, 'utf8'), plugins.buffer.Buffer.from(rightArg, 'utf8'));
|
|
6
|
+
const formatSerdeJsonFloat = (valueArg) => {
|
|
7
|
+
const transportNumber = JSON.stringify(valueArg);
|
|
8
|
+
if (/^-?\d+$/.test(transportNumber)) {
|
|
9
|
+
const integer = BigInt(transportNumber);
|
|
10
|
+
if (integer >= minimumI64 && integer <= maximumU64) {
|
|
11
|
+
return transportNumber;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const negative = valueArg < 0;
|
|
15
|
+
const source = Math.abs(valueArg).toString().toLowerCase();
|
|
16
|
+
let digits;
|
|
17
|
+
let decimalExponent;
|
|
18
|
+
if (source.includes('e')) {
|
|
19
|
+
const [coefficient, exponent] = source.split('e');
|
|
20
|
+
digits = coefficient.replace('.', '').replace(/^0+|0+$/g, '');
|
|
21
|
+
decimalExponent = Number.parseInt(exponent, 10);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const [integerPart, fractionPart = ''] = source.split('.');
|
|
25
|
+
const rawDigits = `${integerPart}${fractionPart}`;
|
|
26
|
+
const firstSignificant = rawDigits.search(/[1-9]/);
|
|
27
|
+
const lastSignificant = rawDigits.search(/[1-9](?!.*[1-9])/);
|
|
28
|
+
if (firstSignificant < 0) {
|
|
29
|
+
return '0.0';
|
|
30
|
+
}
|
|
31
|
+
digits = rawDigits.slice(firstSignificant, lastSignificant + 1);
|
|
32
|
+
decimalExponent = integerPart.length - firstSignificant - 1;
|
|
33
|
+
}
|
|
34
|
+
let rendered;
|
|
35
|
+
if (decimalExponent >= -5 && decimalExponent <= 15) {
|
|
36
|
+
const integerDigits = decimalExponent + 1;
|
|
37
|
+
if (digits.length <= integerDigits) {
|
|
38
|
+
rendered = `${digits}${'0'.repeat(integerDigits - digits.length)}.0`;
|
|
39
|
+
}
|
|
40
|
+
else if (integerDigits > 0) {
|
|
41
|
+
rendered = `${digits.slice(0, integerDigits)}.${digits.slice(integerDigits)}`;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
rendered = `0.${'0'.repeat(-integerDigits)}${digits}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const significand = digits.length === 1 ? digits : `${digits[0]}.${digits.slice(1)}`;
|
|
49
|
+
rendered = `${significand}e${decimalExponent >= 0 ? '+' : ''}${decimalExponent}`;
|
|
50
|
+
}
|
|
51
|
+
return negative ? `-${rendered}` : rendered;
|
|
52
|
+
};
|
|
53
|
+
const canonicalJsonStringify = (valueArg) => {
|
|
54
|
+
if (typeof valueArg === 'number') {
|
|
55
|
+
return formatSerdeJsonFloat(valueArg);
|
|
56
|
+
}
|
|
57
|
+
if (valueArg === null || typeof valueArg !== 'object') {
|
|
58
|
+
const serialized = JSON.stringify(valueArg);
|
|
59
|
+
if (serialized === undefined) {
|
|
60
|
+
throw new TypeError('NoSQLDB effective payload contains unsupported JSON');
|
|
61
|
+
}
|
|
62
|
+
return serialized;
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(valueArg)) {
|
|
65
|
+
return `[${valueArg.map((entryArg) => canonicalJsonStringify(entryArg)).join(',')}]`;
|
|
66
|
+
}
|
|
67
|
+
return `{${Object.keys(valueArg)
|
|
68
|
+
.map((keyArg) => `${JSON.stringify(keyArg)}:${canonicalJsonStringify(valueArg[keyArg])}`)
|
|
69
|
+
.join(',')}}`;
|
|
70
|
+
};
|
|
71
|
+
const encodeTypedLength = (lengthArg) => {
|
|
72
|
+
const encoded = plugins.buffer.Buffer.allocUnsafe(8);
|
|
73
|
+
encoded.writeBigUInt64BE(BigInt(lengthArg));
|
|
74
|
+
return encoded;
|
|
75
|
+
};
|
|
76
|
+
const encodeTypedBytes = (valueArg) => [
|
|
77
|
+
encodeTypedLength(valueArg.byteLength),
|
|
78
|
+
valueArg,
|
|
79
|
+
];
|
|
80
|
+
const encodeTypedValue = (valueArg, chunksArg) => {
|
|
81
|
+
if (valueArg === null) {
|
|
82
|
+
chunksArg.push(plugins.buffer.Buffer.from([0]));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (valueArg === false) {
|
|
86
|
+
chunksArg.push(plugins.buffer.Buffer.from([1]));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (valueArg === true) {
|
|
90
|
+
chunksArg.push(plugins.buffer.Buffer.from([2]));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (typeof valueArg === 'number') {
|
|
94
|
+
if (!Number.isFinite(valueArg)) {
|
|
95
|
+
throw new TypeError('NoSQLDB exact replace contains a non-finite number');
|
|
96
|
+
}
|
|
97
|
+
const encoded = plugins.buffer.Buffer.allocUnsafe(9);
|
|
98
|
+
encoded[0] = 3;
|
|
99
|
+
encoded.writeDoubleBE(valueArg, 1);
|
|
100
|
+
chunksArg.push(encoded);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (typeof valueArg === 'string') {
|
|
104
|
+
const encoded = plugins.buffer.Buffer.from(valueArg, 'utf8');
|
|
105
|
+
chunksArg.push(plugins.buffer.Buffer.from([4]), ...encodeTypedBytes(encoded));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (Array.isArray(valueArg)) {
|
|
109
|
+
chunksArg.push(plugins.buffer.Buffer.from([5]), encodeTypedLength(valueArg.length));
|
|
110
|
+
for (const value of valueArg) {
|
|
111
|
+
encodeTypedValue(value, chunksArg);
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const keys = Object.keys(valueArg).sort(compareUtf8Keys);
|
|
116
|
+
chunksArg.push(plugins.buffer.Buffer.from([6]), encodeTypedLength(keys.length));
|
|
117
|
+
for (const key of keys) {
|
|
118
|
+
const encodedKey = plugins.buffer.Buffer.from(key, 'utf8');
|
|
119
|
+
chunksArg.push(plugins.buffer.Buffer.from([4]), ...encodeTypedBytes(encodedKey));
|
|
120
|
+
encodeTypedValue(valueArg[key], chunksArg);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const encodeTypedPayload = (valueArg) => {
|
|
124
|
+
const chunks = [typedPayloadPrefix];
|
|
125
|
+
encodeTypedValue(valueArg, chunks);
|
|
126
|
+
return plugins.buffer.Buffer.concat(chunks);
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Computes the provider-derived SHA-256 identity for NoSQLDB's version 1
|
|
130
|
+
* fenced replace, exact-user delete, and exact-user ensure payload profiles.
|
|
131
|
+
*/
|
|
132
|
+
export const createNoSqlDbEffectivePayloadSha256V1 = (inputArg) => {
|
|
133
|
+
if (inputArg.version !== 1) {
|
|
134
|
+
throw new TypeError('NoSQLDB effective payload version must be 1');
|
|
135
|
+
}
|
|
136
|
+
if (typeof inputArg.databaseName !== 'string') {
|
|
137
|
+
throw new TypeError('NoSQLDB effective payload databaseName must be a string');
|
|
138
|
+
}
|
|
139
|
+
let effectivePayload;
|
|
140
|
+
let useTypedEncoding = false;
|
|
141
|
+
switch (inputArg.kind) {
|
|
142
|
+
case 'smartdb.database.replace.v1':
|
|
143
|
+
if (inputArg.username !== undefined &&
|
|
144
|
+
typeof inputArg.username !== 'string') {
|
|
145
|
+
throw new TypeError('NoSQLDB exact replace username must be a string');
|
|
146
|
+
}
|
|
147
|
+
if (inputArg.holdPublication !== undefined &&
|
|
148
|
+
typeof inputArg.holdPublication !== 'boolean') {
|
|
149
|
+
throw new TypeError('NoSQLDB holdPublication must be a Boolean');
|
|
150
|
+
}
|
|
151
|
+
effectivePayload = {
|
|
152
|
+
version: 1,
|
|
153
|
+
kind: inputArg.kind,
|
|
154
|
+
databaseName: inputArg.databaseName,
|
|
155
|
+
source: inputArg.source,
|
|
156
|
+
...(inputArg.username === undefined
|
|
157
|
+
? {}
|
|
158
|
+
: { username: inputArg.username }),
|
|
159
|
+
...(inputArg.allocation === undefined
|
|
160
|
+
? {}
|
|
161
|
+
: { allocation: inputArg.allocation }),
|
|
162
|
+
...(inputArg.holdPublication === true
|
|
163
|
+
? { holdPublication: true }
|
|
164
|
+
: {}),
|
|
165
|
+
};
|
|
166
|
+
useTypedEncoding =
|
|
167
|
+
inputArg.username !== undefined ||
|
|
168
|
+
inputArg.allocation !== undefined ||
|
|
169
|
+
inputArg.holdPublication === true;
|
|
170
|
+
break;
|
|
171
|
+
case 'smartdb.database.ensure.v1': {
|
|
172
|
+
if (typeof inputArg.username !== 'string') {
|
|
173
|
+
throw new TypeError('NoSQLDB exact ensure username must be a string');
|
|
174
|
+
}
|
|
175
|
+
if (typeof inputArg.password !== 'string') {
|
|
176
|
+
throw new TypeError('NoSQLDB exact ensure password must be a string');
|
|
177
|
+
}
|
|
178
|
+
const roles = inputArg.roles ?? ['readWrite', 'dbAdmin'];
|
|
179
|
+
if (!Array.isArray(roles) ||
|
|
180
|
+
roles.some((roleArg) => typeof roleArg !== 'string' || roleArg.length === 0)) {
|
|
181
|
+
throw new TypeError('NoSQLDB exact ensure roles must be an array of non-empty strings');
|
|
182
|
+
}
|
|
183
|
+
const canonicalRoles = [...new Set(roles)].sort(compareUtf8Keys);
|
|
184
|
+
effectivePayload = {
|
|
185
|
+
version: 1,
|
|
186
|
+
kind: inputArg.kind,
|
|
187
|
+
databaseName: inputArg.databaseName,
|
|
188
|
+
username: inputArg.username,
|
|
189
|
+
passwordSha256: plugins.crypto
|
|
190
|
+
.createHash('sha256')
|
|
191
|
+
.update(inputArg.password, 'utf8')
|
|
192
|
+
.digest('hex'),
|
|
193
|
+
roles: canonicalRoles,
|
|
194
|
+
...(inputArg.allocation === undefined
|
|
195
|
+
? {}
|
|
196
|
+
: { allocation: inputArg.allocation }),
|
|
197
|
+
};
|
|
198
|
+
useTypedEncoding = inputArg.allocation !== undefined;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case 'smartdb.database.allocate.v1': {
|
|
202
|
+
if (inputArg.expectedAbsent !== true) {
|
|
203
|
+
throw new TypeError('NoSQLDB allocation expectedAbsent must be true');
|
|
204
|
+
}
|
|
205
|
+
if (typeof inputArg.username !== 'string') {
|
|
206
|
+
throw new TypeError('NoSQLDB allocation username must be a string');
|
|
207
|
+
}
|
|
208
|
+
if (typeof inputArg.password !== 'string') {
|
|
209
|
+
throw new TypeError('NoSQLDB allocation password must be a string');
|
|
210
|
+
}
|
|
211
|
+
const roles = inputArg.roles ?? ['readWrite', 'dbAdmin'];
|
|
212
|
+
if (!Array.isArray(roles) || roles.some((roleArg) => typeof roleArg !== 'string' || roleArg.length === 0)) {
|
|
213
|
+
throw new TypeError('NoSQLDB allocation roles must be an array of non-empty strings');
|
|
214
|
+
}
|
|
215
|
+
effectivePayload = {
|
|
216
|
+
version: 1,
|
|
217
|
+
kind: inputArg.kind,
|
|
218
|
+
databaseName: inputArg.databaseName,
|
|
219
|
+
expectedAbsent: true,
|
|
220
|
+
username: inputArg.username,
|
|
221
|
+
passwordSha256: plugins.crypto
|
|
222
|
+
.createHash('sha256')
|
|
223
|
+
.update(inputArg.password, 'utf8')
|
|
224
|
+
.digest('hex'),
|
|
225
|
+
roles: [...new Set(roles)].sort(compareUtf8Keys),
|
|
226
|
+
};
|
|
227
|
+
useTypedEncoding = true;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case 'smartdb.database.delete.v1':
|
|
231
|
+
if (inputArg.username !== undefined &&
|
|
232
|
+
typeof inputArg.username !== 'string') {
|
|
233
|
+
throw new TypeError('NoSQLDB exact delete username must be a string when supplied');
|
|
234
|
+
}
|
|
235
|
+
if (inputArg.holdPublication !== undefined &&
|
|
236
|
+
typeof inputArg.holdPublication !== 'boolean') {
|
|
237
|
+
throw new TypeError('NoSQLDB holdPublication must be a Boolean');
|
|
238
|
+
}
|
|
239
|
+
effectivePayload = {
|
|
240
|
+
version: 1,
|
|
241
|
+
kind: inputArg.kind,
|
|
242
|
+
databaseName: inputArg.databaseName,
|
|
243
|
+
...(inputArg.username === undefined
|
|
244
|
+
? { rawDatabaseOnly: true }
|
|
245
|
+
: { username: inputArg.username, rawDatabaseOnly: false }),
|
|
246
|
+
...(inputArg.allocation === undefined
|
|
247
|
+
? {}
|
|
248
|
+
: { allocation: inputArg.allocation }),
|
|
249
|
+
...(inputArg.holdPublication === true
|
|
250
|
+
? { holdPublication: true }
|
|
251
|
+
: {}),
|
|
252
|
+
};
|
|
253
|
+
useTypedEncoding = inputArg.allocation !== undefined;
|
|
254
|
+
break;
|
|
255
|
+
default:
|
|
256
|
+
throw new TypeError('NoSQLDB mutation kind has no version 1 payload profile');
|
|
257
|
+
}
|
|
258
|
+
const transportJson = JSON.stringify(effectivePayload);
|
|
259
|
+
if (transportJson === undefined) {
|
|
260
|
+
throw new TypeError('NoSQLDB effective payload cannot be encoded as JSON');
|
|
261
|
+
}
|
|
262
|
+
const normalizedPayload = JSON.parse(transportJson);
|
|
263
|
+
const encodedPayload = useTypedEncoding
|
|
264
|
+
? encodeTypedPayload(normalizedPayload)
|
|
265
|
+
: canonicalJsonStringify(normalizedPayload);
|
|
266
|
+
return plugins.crypto
|
|
267
|
+
.createHash('sha256')
|
|
268
|
+
.update(encodedPayload)
|
|
269
|
+
.digest('hex');
|
|
270
|
+
};
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZmVuY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX25vc3FsZGIvcmVzb3VyY2UtZmVuY2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQW9EeEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ25ELHNDQUFzQyxFQUN0QyxNQUFNLENBQ1AsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsb0JBQTBCLENBQUM7QUFDL0MsTUFBTSxVQUFVLEdBQUcscUJBQTJCLENBQUM7QUFFL0MsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQUUsUUFBZ0IsRUFBVSxFQUFFLENBQ3BFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FDN0MsQ0FBQztBQUVKLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUU7SUFDeEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEMsSUFBSSxPQUFPLElBQUksVUFBVSxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuRCxPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLENB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
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { type INoSqlDbStorageRehearsalInput, type INoSqlDbStorageRehearsalReceipt } from './storage-rehearsal.js';
|
|
4
|
+
import { type ILocalNoSqlDbStoppedStorageRootRelocationInput, type ILocalNoSqlDbStoppedStorageRootRelocationReceipt } from './storage-root-relocation.js';
|
|
5
|
+
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, ILocalNoSqlDbOfflinePhysicalNamespaceInspection, ILocalNoSqlDbOfflinePhysicalNamespaceInspectionResult, ILocalNoSqlDbOfflineStringValueInspection, TLocalNoSqlDbOfflineStringValueInspectionResult, TNoSqlDbCommitDatabasePublicationResult } from './service-types.js';
|
|
6
|
+
export type { INoSqlDbHealth, INoSqlDbDatabaseTenantInput, INoSqlDbAttestDatabaseTenantInput, INoSqlDbAttestDatabaseTenantResult, INoSqlDbEnsureDatabaseTenantInput, INoSqlDbEnsureDatabaseTenantResult, INoSqlDbAllocateDatabaseTenantInput, INoSqlDbAllocateDatabaseTenantResult, INoSqlDbDeleteDatabaseTenantInput, INoSqlDbRotateDatabaseTenantPasswordInput, INoSqlDbDatabaseTenantDescriptor, INoSqlDbDeleteDatabaseTenantResult, INoSqlDbDatabaseAllocationReadAccessGrantIdentity, INoSqlDbIssueDatabaseAllocationReadAccessGrantInput, INoSqlDbIssueDatabaseAllocationReadAccessGrantResult, INoSqlDbRevokeDatabaseAllocationReadAccessGrantInput, INoSqlDbRevokeDatabaseAllocationReadAccessGrantResult, INoSqlDbDatabaseExportCollection, INoSqlDbDatabaseExport, INoSqlDbImportDatabaseInput, INoSqlDbImportDatabaseResult, INoSqlDbHeldPublicationReceipt, INoSqlDbCommitDatabasePublicationInput, INoSqlDbManagementOperationOptions, INoSqlDbDatabaseResourceFenceState, ILocalNoSqlDbOfflineInspectionLimits, ILocalNoSqlDbOfflinePhysicalNamespaceInspectionLimits, ILocalNoSqlDbOfflinePhysicalNamespaceInspection, ILocalNoSqlDbOfflinePhysicalNamespaceInspectionResult, ILocalNoSqlDbOfflineStringValueInspection, TLocalNoSqlDbOfflineStringValueInspectionResult, TNoSqlDbCommitDatabasePublicationResult, } from './service-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* A single oplog entry returned from the Rust engine.
|
|
9
|
+
*/
|
|
10
|
+
export interface IOpLogEntry {
|
|
11
|
+
seq: number;
|
|
12
|
+
timestampMs: number;
|
|
13
|
+
op: 'insert' | 'update' | 'delete';
|
|
14
|
+
db: string;
|
|
15
|
+
collection: string;
|
|
16
|
+
documentId: string;
|
|
17
|
+
document: Record<string, any> | null;
|
|
18
|
+
previousDocument: Record<string, any> | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Aggregate oplog statistics.
|
|
22
|
+
*/
|
|
23
|
+
export interface IOpLogStats {
|
|
24
|
+
currentSeq: number;
|
|
25
|
+
totalEntries: number;
|
|
26
|
+
oldestSeq: number;
|
|
27
|
+
/** Approximate retained bytes across all in-memory oplog entries. */
|
|
28
|
+
approxBytes: number;
|
|
29
|
+
entriesByOp: {
|
|
30
|
+
insert: number;
|
|
31
|
+
update: number;
|
|
32
|
+
delete: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of a getOpLog query.
|
|
37
|
+
*/
|
|
38
|
+
export interface IOpLogResult {
|
|
39
|
+
entries: IOpLogEntry[];
|
|
40
|
+
currentSeq: number;
|
|
41
|
+
totalEntries: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of a revertToSeq command.
|
|
45
|
+
*/
|
|
46
|
+
export interface IRevertResult {
|
|
47
|
+
dryRun: boolean;
|
|
48
|
+
reverted: number;
|
|
49
|
+
targetSeq?: number;
|
|
50
|
+
entries?: IOpLogEntry[];
|
|
51
|
+
errors?: string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A collection info entry.
|
|
55
|
+
*/
|
|
56
|
+
export interface ICollectionInfo {
|
|
57
|
+
db: string;
|
|
58
|
+
name: string;
|
|
59
|
+
count: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result of a getDocuments query.
|
|
63
|
+
*/
|
|
64
|
+
export interface IDocumentsResult {
|
|
65
|
+
documents: Record<string, any>[];
|
|
66
|
+
total: number;
|
|
67
|
+
}
|
|
68
|
+
export declare class NoSqlDbManagementOperationTerminationError extends AggregateError {
|
|
69
|
+
constructor(operationErrorArg: unknown, terminationErrorArg: unknown);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Server metrics.
|
|
73
|
+
*/
|
|
74
|
+
export interface INoSqlDbMetrics {
|
|
75
|
+
databases: number;
|
|
76
|
+
collections: number;
|
|
77
|
+
oplogEntries: number;
|
|
78
|
+
oplogCurrentSeq: number;
|
|
79
|
+
sessions: number;
|
|
80
|
+
activeTransactions: number;
|
|
81
|
+
authEnabled: boolean;
|
|
82
|
+
authUsers: number;
|
|
83
|
+
uptimeSeconds: number;
|
|
84
|
+
}
|
|
85
|
+
export declare const rustDbBridgeStorageRootRelocation: unique symbol;
|
|
86
|
+
export declare const rustDbBridgeStorageRehearsal: unique symbol;
|
|
87
|
+
/**
|
|
88
|
+
* Configuration sent to the Rust binary on start.
|
|
89
|
+
*/
|
|
90
|
+
export interface INoSqlDbQueryOptions {
|
|
91
|
+
/** Target encoded bytes per in-memory sort run (default: 4 MiB). */
|
|
92
|
+
sortBufferBytes?: number;
|
|
93
|
+
/** Shared temporary sort-file budget, including merge output (default: 4 GiB). */
|
|
94
|
+
maxSortSpillBytes?: number;
|
|
95
|
+
/** Concurrent sort builders (default: 4). */
|
|
96
|
+
maxConcurrentSorts?: number;
|
|
97
|
+
}
|
|
98
|
+
interface INoSqlDbRustConfig {
|
|
99
|
+
storageRehearsalId?: string;
|
|
100
|
+
port?: number;
|
|
101
|
+
host?: string;
|
|
102
|
+
socketPath?: string;
|
|
103
|
+
storage: 'memory' | 'file';
|
|
104
|
+
storagePath?: string;
|
|
105
|
+
query?: INoSqlDbQueryOptions;
|
|
106
|
+
auth?: {
|
|
107
|
+
enabled?: boolean;
|
|
108
|
+
users?: Array<{
|
|
109
|
+
username: string;
|
|
110
|
+
password: string;
|
|
111
|
+
database?: string;
|
|
112
|
+
roles?: string[];
|
|
113
|
+
}>;
|
|
114
|
+
scramIterations?: number;
|
|
115
|
+
};
|
|
116
|
+
tls?: {
|
|
117
|
+
enabled?: boolean;
|
|
118
|
+
certPath?: string;
|
|
119
|
+
keyPath?: string;
|
|
120
|
+
caPath?: string;
|
|
121
|
+
requireClientCert?: boolean;
|
|
122
|
+
};
|
|
123
|
+
oplog?: {
|
|
124
|
+
maxEntries?: number;
|
|
125
|
+
maxBytes?: number;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export declare function getRustDbAllocatorEnv(environment?: NodeJS.ProcessEnv): Record<string, string>;
|
|
129
|
+
export interface IRustDbBridgeOptions {
|
|
130
|
+
/** Exact engine executable, validated by Smartrust without discovery fallback or permission changes. */
|
|
131
|
+
binaryPath?: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Bridge between TypeScript NoSqlDbServer and the Rust binary.
|
|
135
|
+
* Wraps @push.rocks/smartrust's RustBridge with type-safe command definitions.
|
|
136
|
+
*/
|
|
137
|
+
export declare class RustDbBridge extends EventEmitter {
|
|
138
|
+
private bridge;
|
|
139
|
+
/**
|
|
140
|
+
* Operating-system process id of the spawned Rust engine while it runs as a
|
|
141
|
+
* child process of this Node.js process. Undefined before spawn, after
|
|
142
|
+
* termination, or when the bridge is connected to an external process.
|
|
143
|
+
*/
|
|
144
|
+
get processId(): number | undefined;
|
|
145
|
+
private terminationConfirmed;
|
|
146
|
+
private terminationPromise;
|
|
147
|
+
private terminationFailure;
|
|
148
|
+
constructor(options?: IRustDbBridgeOptions);
|
|
149
|
+
/**
|
|
150
|
+
* Spawn the Rust binary in management mode.
|
|
151
|
+
* Returns true if the binary was found and spawned successfully.
|
|
152
|
+
*/
|
|
153
|
+
spawn(optionsArg?: INoSqlDbManagementOperationOptions): Promise<boolean>;
|
|
154
|
+
/**
|
|
155
|
+
* Kill the Rust process and clean up.
|
|
156
|
+
*/
|
|
157
|
+
kill(): void;
|
|
158
|
+
/**
|
|
159
|
+
* Confirm that the Rust process has exited and all bridge resources are released.
|
|
160
|
+
*/
|
|
161
|
+
terminate(optionsArg?: plugins.smartrust.IRustBridgeTerminateOptions): Promise<void>;
|
|
162
|
+
/**
|
|
163
|
+
* Whether the bridge is currently running.
|
|
164
|
+
*/
|
|
165
|
+
get running(): boolean;
|
|
166
|
+
get ownershipReleased(): boolean;
|
|
167
|
+
private awaitManagementOperationTermination;
|
|
168
|
+
[rustDbBridgeStorageRehearsal](inputArg: INoSqlDbStorageRehearsalInput, optionsArg: INoSqlDbManagementOperationOptions & {
|
|
169
|
+
timeoutMs: number;
|
|
170
|
+
}): Promise<INoSqlDbStorageRehearsalReceipt>;
|
|
171
|
+
[rustDbBridgeStorageRootRelocation](inputArg: ILocalNoSqlDbStoppedStorageRootRelocationInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<ILocalNoSqlDbStoppedStorageRootRelocationReceipt>;
|
|
172
|
+
inspectOfflinePhysicalNamespaces(inputArg: ILocalNoSqlDbOfflinePhysicalNamespaceInspection, optionsArg?: INoSqlDbManagementOperationOptions): Promise<ILocalNoSqlDbOfflinePhysicalNamespaceInspectionResult>;
|
|
173
|
+
inspectOfflineStringValue(inputArg: ILocalNoSqlDbOfflineStringValueInspection, optionsArg?: INoSqlDbManagementOperationOptions): Promise<TLocalNoSqlDbOfflineStringValueInspectionResult>;
|
|
174
|
+
startDb(config: INoSqlDbRustConfig, optionsArg?: INoSqlDbManagementOperationOptions): Promise<{
|
|
175
|
+
connectionUri: string;
|
|
176
|
+
}>;
|
|
177
|
+
stopDb(): Promise<void>;
|
|
178
|
+
getStatus(): Promise<{
|
|
179
|
+
running: boolean;
|
|
180
|
+
}>;
|
|
181
|
+
getMetrics(): Promise<INoSqlDbMetrics>;
|
|
182
|
+
getHealth(optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbHealth>;
|
|
183
|
+
createDatabaseTenant(params: INoSqlDbDatabaseTenantInput): Promise<INoSqlDbDatabaseTenantDescriptor>;
|
|
184
|
+
ensureDatabaseTenant(params: INoSqlDbEnsureDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbEnsureDatabaseTenantResult>;
|
|
185
|
+
attestDatabaseTenant(params: INoSqlDbAttestDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbAttestDatabaseTenantResult>;
|
|
186
|
+
allocateDatabaseTenant(params: INoSqlDbAllocateDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbAllocateDatabaseTenantResult>;
|
|
187
|
+
deleteDatabaseTenant(params: INoSqlDbDeleteDatabaseTenantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDeleteDatabaseTenantResult>;
|
|
188
|
+
issueDatabaseAllocationReadAccessGrant(params: INoSqlDbIssueDatabaseAllocationReadAccessGrantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbIssueDatabaseAllocationReadAccessGrantResult>;
|
|
189
|
+
revokeDatabaseAllocationReadAccessGrant(params: INoSqlDbRevokeDatabaseAllocationReadAccessGrantInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbRevokeDatabaseAllocationReadAccessGrantResult>;
|
|
190
|
+
rotateDatabaseTenantPassword(params: INoSqlDbRotateDatabaseTenantPasswordInput): Promise<INoSqlDbDatabaseTenantDescriptor>;
|
|
191
|
+
listDatabaseTenants(): Promise<INoSqlDbDatabaseTenantDescriptor[]>;
|
|
192
|
+
getDatabaseTenantDescriptor(params: {
|
|
193
|
+
databaseName: string;
|
|
194
|
+
username: string;
|
|
195
|
+
}): Promise<INoSqlDbDatabaseTenantDescriptor>;
|
|
196
|
+
getDatabaseResourceFenceState(params: {
|
|
197
|
+
databaseName: string;
|
|
198
|
+
}, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDatabaseResourceFenceState | null>;
|
|
199
|
+
exportDatabase(params: INoSqlDbExportDatabaseInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDatabaseExport>;
|
|
200
|
+
getDatabaseContentDigest(params: INoSqlDbGetDatabaseContentDigestInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbDatabaseContentDigest>;
|
|
201
|
+
importDatabase(params: INoSqlDbImportDatabaseInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<INoSqlDbImportDatabaseResult>;
|
|
202
|
+
commitDatabasePublication(params: INoSqlDbCommitDatabasePublicationInput, optionsArg?: INoSqlDbManagementOperationOptions): Promise<TNoSqlDbCommitDatabasePublicationResult>;
|
|
203
|
+
getOpLog(params?: {
|
|
204
|
+
sinceSeq?: number;
|
|
205
|
+
limit?: number;
|
|
206
|
+
db?: string;
|
|
207
|
+
collection?: string;
|
|
208
|
+
}): Promise<IOpLogResult>;
|
|
209
|
+
getOpLogStats(): Promise<IOpLogStats>;
|
|
210
|
+
revertToSeq(seq: number, dryRun?: boolean): Promise<IRevertResult>;
|
|
211
|
+
getCollections(db?: string): Promise<ICollectionInfo[]>;
|
|
212
|
+
getDocuments(db: string, collection: string, limit?: number, skip?: number): Promise<IDocumentsResult>;
|
|
213
|
+
}
|