@push.rocks/smartdb 2.12.0 → 2.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +2 -2
- package/dist_ts/index.js +2 -2
- package/dist_ts/ts_smartdb/index.d.ts +3 -1
- package/dist_ts/ts_smartdb/index.js +2 -1
- package/dist_ts/ts_smartdb/plugins.d.ts +3 -0
- package/dist_ts/ts_smartdb/plugins.js +5 -1
- package/dist_ts/ts_smartdb/resource-fencing.d.ts +26 -0
- package/dist_ts/ts_smartdb/resource-fencing.js +212 -0
- package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +3 -2
- package/dist_ts/ts_smartdb/rust-db-bridge.js +15 -2
- package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +5 -1
- package/dist_ts/ts_smartdb/server/SmartdbServer.js +8 -1
- package/dist_ts/ts_smartdb/service-types.d.ts +33 -4
- package/dist_ts/ts_smartdb/service-types.js +2 -1
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +4 -0
- package/ts/ts_smartdb/index.ts +4 -0
- package/ts/ts_smartdb/plugins.ts +6 -0
- package/ts/ts_smartdb/resource-fencing.ts +286 -0
- package/ts/ts_smartdb/rust-db-bridge.ts +23 -1
- package/ts/ts_smartdb/server/SmartdbServer.ts +15 -3
- package/ts/ts_smartdb/service-types.ts +38 -3
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartdb',
|
|
6
|
-
version: '2.12.
|
|
6
|
+
version: '2.12.2',
|
|
7
7
|
description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,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, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './ts_smartdb/index.js';
|
|
8
|
-
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, } from './ts_smartdb/index.js';
|
|
7
|
+
export type { IOpLogEntry, IOpLogResult, IOpLogStats, IRevertResult, ICollectionInfo, IDocumentsResult, ISmartDbMetrics, ISmartDbHealth, ISmartDbResourceFence, ISmartDbResourceFenceReceipt, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, TSmartDbEffectivePayloadInputV1, } from './ts_smartdb/index.js';
|
|
8
|
+
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, createSmartDbEffectivePayloadSha256V1, } from './ts_smartdb/index.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -7,5 +7,5 @@ export { LocalSmartDb } from './ts_local/index.js';
|
|
|
7
7
|
export { StorageMigrator } from './ts_migration/index.js';
|
|
8
8
|
// Export commitinfo
|
|
9
9
|
export { commitinfo };
|
|
10
|
-
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, } from './ts_smartdb/index.js';
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, createSmartDbEffectivePayloadSha256V1, } from './ts_smartdb/index.js';
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsNkJBQTZCO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsc0JBQXNCO0FBQ3RCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUduRCxtQkFBbUI7QUFDbkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUE0QnRCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5QixxQ0FBcUMsR0FDdEMsTUFBTSx1QkFBdUIsQ0FBQyJ9
|
|
@@ -2,5 +2,7 @@ export { SmartdbServer } from './server/SmartdbServer.js';
|
|
|
2
2
|
export type { ISmartdbAuthOptions, ISmartdbAuthUser, ISmartdbOplogOptions, ISmartdbServerOptions, ISmartdbTlsOptions, } from './server/SmartdbServer.js';
|
|
3
3
|
export { RustDbBridge } 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, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './service-types.js';
|
|
5
|
+
export type { ISmartDbHealth, ISmartDbResourceFence, ISmartDbResourceFenceReceipt, TSmartDbResourceFenceErrorCode, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './service-types.js';
|
|
6
6
|
export { SmartDbResourceFenceError, normalizeSmartDbResourceFenceError, smartDbResourceFenceErrorCodes, } from './service-types.js';
|
|
7
|
+
export type { TSmartDbEffectivePayloadInputV1 } from './resource-fencing.js';
|
|
8
|
+
export { createSmartDbEffectivePayloadSha256V1 } from './resource-fencing.js';
|
|
@@ -4,4 +4,5 @@ export { SmartdbServer } from './server/SmartdbServer.js';
|
|
|
4
4
|
// Export bridge for advanced usage
|
|
5
5
|
export { RustDbBridge } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19zbWFydGRiL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhEQUE4RDtBQUU5RCx5REFBeUQ7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUzFELG1DQUFtQztBQUNuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUErQm5ELE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsa0NBQWtDLEVBQ2xDLDhCQUE4QixHQUMvQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDIn0=
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
// node native scope
|
|
2
|
+
import * as buffer from 'node:buffer';
|
|
3
|
+
import * as crypto from 'node:crypto';
|
|
4
|
+
export { buffer, crypto };
|
|
1
5
|
// @push.rocks scope
|
|
2
6
|
import * as smartrust from '@push.rocks/smartrust';
|
|
3
7
|
export { smartrust };
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX3NtYXJ0ZGIvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUUxQixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ISmartDbDatabaseExport } from './service-types.js';
|
|
2
|
+
export type TSmartDbEffectivePayloadInputV1 = {
|
|
3
|
+
version: 1;
|
|
4
|
+
kind: 'smartdb.database.replace.v1';
|
|
5
|
+
databaseName: string;
|
|
6
|
+
source: ISmartDbDatabaseExport;
|
|
7
|
+
/** Exact exclusive tenant owner; omission retains the legacy v1 digest. */
|
|
8
|
+
username?: string;
|
|
9
|
+
} | {
|
|
10
|
+
version: 1;
|
|
11
|
+
kind: 'smartdb.database.delete.v1';
|
|
12
|
+
databaseName: string;
|
|
13
|
+
username: string;
|
|
14
|
+
} | {
|
|
15
|
+
version: 1;
|
|
16
|
+
kind: 'smartdb.database.ensure.v1';
|
|
17
|
+
databaseName: string;
|
|
18
|
+
username: string;
|
|
19
|
+
password: string;
|
|
20
|
+
roles?: string[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Computes the provider-derived SHA-256 identity for SmartDB's version 1
|
|
24
|
+
* fenced replace, exact-user delete, and exact-user ensure payload profiles.
|
|
25
|
+
*/
|
|
26
|
+
export declare const createSmartDbEffectivePayloadSha256V1: (inputArg: TSmartDbEffectivePayloadInputV1) => string;
|
|
@@ -0,0 +1,212 @@
|
|
|
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('SmartDB 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('SmartDB 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 SmartDB's version 1
|
|
130
|
+
* fenced replace, exact-user delete, and exact-user ensure payload profiles.
|
|
131
|
+
*/
|
|
132
|
+
export const createSmartDbEffectivePayloadSha256V1 = (inputArg) => {
|
|
133
|
+
if (inputArg.version !== 1) {
|
|
134
|
+
throw new TypeError('SmartDB effective payload version must be 1');
|
|
135
|
+
}
|
|
136
|
+
if (typeof inputArg.databaseName !== 'string') {
|
|
137
|
+
throw new TypeError('SmartDB 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('SmartDB exact replace username must be a string');
|
|
146
|
+
}
|
|
147
|
+
effectivePayload = {
|
|
148
|
+
version: 1,
|
|
149
|
+
kind: inputArg.kind,
|
|
150
|
+
databaseName: inputArg.databaseName,
|
|
151
|
+
source: inputArg.source,
|
|
152
|
+
...(inputArg.username === undefined
|
|
153
|
+
? {}
|
|
154
|
+
: { username: inputArg.username }),
|
|
155
|
+
};
|
|
156
|
+
useTypedEncoding = inputArg.username !== undefined;
|
|
157
|
+
break;
|
|
158
|
+
case 'smartdb.database.ensure.v1': {
|
|
159
|
+
if (typeof inputArg.username !== 'string') {
|
|
160
|
+
throw new TypeError('SmartDB exact ensure username must be a string');
|
|
161
|
+
}
|
|
162
|
+
if (typeof inputArg.password !== 'string') {
|
|
163
|
+
throw new TypeError('SmartDB exact ensure password must be a string');
|
|
164
|
+
}
|
|
165
|
+
const roles = inputArg.roles ?? ['readWrite', 'dbAdmin'];
|
|
166
|
+
if (!Array.isArray(roles) ||
|
|
167
|
+
roles.some((roleArg) => typeof roleArg !== 'string' || roleArg.length === 0)) {
|
|
168
|
+
throw new TypeError('SmartDB exact ensure roles must be an array of non-empty strings');
|
|
169
|
+
}
|
|
170
|
+
const canonicalRoles = [...new Set(roles)].sort(compareUtf8Keys);
|
|
171
|
+
effectivePayload = {
|
|
172
|
+
version: 1,
|
|
173
|
+
kind: inputArg.kind,
|
|
174
|
+
databaseName: inputArg.databaseName,
|
|
175
|
+
username: inputArg.username,
|
|
176
|
+
passwordSha256: plugins.crypto
|
|
177
|
+
.createHash('sha256')
|
|
178
|
+
.update(inputArg.password, 'utf8')
|
|
179
|
+
.digest('hex'),
|
|
180
|
+
roles: canonicalRoles,
|
|
181
|
+
};
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case 'smartdb.database.delete.v1':
|
|
185
|
+
if (typeof inputArg.username !== 'string') {
|
|
186
|
+
throw new TypeError('SmartDB exact delete username must be a string');
|
|
187
|
+
}
|
|
188
|
+
effectivePayload = {
|
|
189
|
+
version: 1,
|
|
190
|
+
kind: inputArg.kind,
|
|
191
|
+
databaseName: inputArg.databaseName,
|
|
192
|
+
username: inputArg.username,
|
|
193
|
+
rawDatabaseOnly: false,
|
|
194
|
+
};
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
throw new TypeError('SmartDB mutation kind has no version 1 payload profile');
|
|
198
|
+
}
|
|
199
|
+
const transportJson = JSON.stringify(effectivePayload);
|
|
200
|
+
if (transportJson === undefined) {
|
|
201
|
+
throw new TypeError('SmartDB effective payload cannot be encoded as JSON');
|
|
202
|
+
}
|
|
203
|
+
const normalizedPayload = JSON.parse(transportJson);
|
|
204
|
+
const encodedPayload = useTypedEncoding
|
|
205
|
+
? encodeTypedPayload(normalizedPayload)
|
|
206
|
+
: canonicalJsonStringify(normalizedPayload);
|
|
207
|
+
return plugins.crypto
|
|
208
|
+
.createHash('sha256')
|
|
209
|
+
.update(encodedPayload)
|
|
210
|
+
.digest('hex');
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZmVuY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX3NtYXJ0ZGIvcmVzb3VyY2UtZmVuY2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQW1DeEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ25ELHNDQUFzQyxFQUN0QyxNQUFNLENBQ1AsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsb0JBQTBCLENBQUM7QUFDL0MsTUFBTSxVQUFVLEdBQUcscUJBQTJCLENBQUM7QUFFL0MsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQUUsUUFBZ0IsRUFBVSxFQUFFLENBQ3BFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FDN0MsQ0FBQztBQUVKLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUU7SUFDeEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEMsSUFBSSxPQUFPLElBQUksVUFBVSxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuRCxPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLENB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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
|
-
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult } from './service-types.js';
|
|
3
|
-
export type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './service-types.js';
|
|
2
|
+
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult } from './service-types.js';
|
|
3
|
+
export type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExportCollection, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult, } from './service-types.js';
|
|
4
4
|
/**
|
|
5
5
|
* A single oplog entry returned from the Rust engine.
|
|
6
6
|
*/
|
|
@@ -140,6 +140,7 @@ export declare class RustDbBridge extends EventEmitter {
|
|
|
140
140
|
getMetrics(): Promise<ISmartDbMetrics>;
|
|
141
141
|
getHealth(): Promise<ISmartDbHealth>;
|
|
142
142
|
createDatabaseTenant(params: ISmartDbDatabaseTenantInput): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
143
|
+
ensureDatabaseTenant(params: ISmartDbEnsureDatabaseTenantInput): Promise<ISmartDbEnsureDatabaseTenantResult>;
|
|
143
144
|
deleteDatabaseTenant(params: ISmartDbDeleteDatabaseTenantInput): Promise<ISmartDbDeleteDatabaseTenantResult>;
|
|
144
145
|
rotateDatabaseTenantPassword(params: ISmartDbRotateDatabaseTenantPasswordInput): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
145
146
|
listDatabaseTenants(): Promise<ISmartDbDatabaseTenantDescriptor[]>;
|
|
@@ -98,7 +98,20 @@ export class RustDbBridge extends EventEmitter {
|
|
|
98
98
|
return this.bridge.sendCommand('getHealth', {});
|
|
99
99
|
}
|
|
100
100
|
async createDatabaseTenant(params) {
|
|
101
|
-
|
|
101
|
+
try {
|
|
102
|
+
return await this.bridge.sendCommand('createDatabaseTenant', params);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw normalizeSmartDbResourceFenceError(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async ensureDatabaseTenant(params) {
|
|
109
|
+
try {
|
|
110
|
+
return await this.bridge.sendCommand('ensureDatabaseTenant', params);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw normalizeSmartDbResourceFenceError(error);
|
|
114
|
+
}
|
|
102
115
|
}
|
|
103
116
|
async deleteDatabaseTenant(params) {
|
|
104
117
|
try {
|
|
@@ -146,4 +159,4 @@ export class RustDbBridge extends EventEmitter {
|
|
|
146
159
|
return this.bridge.sendCommand('getDocuments', { db, collection, limit, skip });
|
|
147
160
|
}
|
|
148
161
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1kYi1icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90c19zbWFydGRiL3J1c3QtZGItYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUErTXhFOzs7R0FHRztBQUNILFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHVCQUF1QjtJQUM5QixNQUFNLE9BQU8sR0FBMkIsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN6RSxNQUFNLEtBQUssR0FBMkIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDZixPQUFPLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pCLENB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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, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult } from '../service-types.js';
|
|
2
|
+
import type { ISmartDbHealth, ISmartDbDatabaseTenantInput, ISmartDbEnsureDatabaseTenantInput, ISmartDbEnsureDatabaseTenantResult, ISmartDbDeleteDatabaseTenantInput, ISmartDbRotateDatabaseTenantPasswordInput, ISmartDbDatabaseTenantDescriptor, ISmartDbDeleteDatabaseTenantResult, ISmartDbDatabaseExport, ISmartDbImportDatabaseInput, ISmartDbImportDatabaseResult } from '../service-types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Server configuration options
|
|
5
5
|
*/
|
|
@@ -107,6 +107,10 @@ export declare class SmartdbServer {
|
|
|
107
107
|
* Create an isolated database/user pair for an application tenant.
|
|
108
108
|
*/
|
|
109
109
|
createDatabaseTenant(params: ISmartDbDatabaseTenantInput): Promise<ISmartDbDatabaseTenantDescriptor>;
|
|
110
|
+
/**
|
|
111
|
+
* Idempotently provision or rotate one exclusively owned database tenant.
|
|
112
|
+
*/
|
|
113
|
+
ensureDatabaseTenant(params: ISmartDbEnsureDatabaseTenantInput): Promise<ISmartDbEnsureDatabaseTenantResult>;
|
|
110
114
|
/**
|
|
111
115
|
* Delete a tenant database and its tenant user(s).
|
|
112
116
|
*/
|
|
@@ -138,6 +138,13 @@ export class SmartdbServer {
|
|
|
138
138
|
const descriptor = await this.bridge.createDatabaseTenant(params);
|
|
139
139
|
return this.withTenantMongoUri(descriptor, params.password);
|
|
140
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Idempotently provision or rotate one exclusively owned database tenant.
|
|
143
|
+
*/
|
|
144
|
+
async ensureDatabaseTenant(params) {
|
|
145
|
+
const descriptor = await this.bridge.ensureDatabaseTenant(params);
|
|
146
|
+
return this.withTenantMongoUri(descriptor, params.password);
|
|
147
|
+
}
|
|
141
148
|
/**
|
|
142
149
|
* Delete a tenant database and its tenant user(s).
|
|
143
150
|
*/
|
|
@@ -252,4 +259,4 @@ export class SmartdbServer {
|
|
|
252
259
|
return `mongodb://${auth}${host}/${encodeURIComponent(databaseName)}?${query.toString()}`;
|
|
253
260
|
}
|
|
254
261
|
}
|
|
255
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU21hcnRkYlNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmVyL1NtYXJ0ZGJTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQStFOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBTXhCLFlBQVksVUFBaUMsRUFBRTtRQUh2QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUdqQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSztZQUMzQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXO1lBQ2pDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxRQUFRO1lBQ3BDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFFBQVE7WUFDNUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxLQUFLO1lBQ3JELElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDJC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
|
|
@@ -12,7 +12,7 @@ export interface ISmartDbHealth {
|
|
|
12
12
|
collectionCount: number;
|
|
13
13
|
uptimeSeconds?: number;
|
|
14
14
|
}
|
|
15
|
-
export declare const smartDbResourceFenceErrorCodes: readonly ["EFENCE_REQUIRED", "EFENCE_STALE", "EFENCE_SCOPE_MISMATCH", "EFENCE_UNSUPPORTED", "EFENCE_MUTATION_MISMATCH", "EFENCE_STATE_CORRUPT", "EFENCE_RECEIPT_LIMIT", "EFENCE_BUSY"];
|
|
15
|
+
export declare const smartDbResourceFenceErrorCodes: readonly ["EFENCE_REQUIRED", "EFENCE_STALE", "EFENCE_SCOPE_MISMATCH", "EFENCE_UNSUPPORTED", "EFENCE_MUTATION_MISMATCH", "EFENCE_OWNERSHIP_MISMATCH", "EFENCE_STATE_CORRUPT", "EFENCE_RECEIPT_LIMIT", "EFENCE_BUSY"];
|
|
16
16
|
export type TSmartDbResourceFenceErrorCode = (typeof smartDbResourceFenceErrorCodes)[number];
|
|
17
17
|
export interface ISmartDbResourceFence {
|
|
18
18
|
version: 1;
|
|
@@ -22,7 +22,7 @@ export interface ISmartDbResourceFence {
|
|
|
22
22
|
payloadSha256: string;
|
|
23
23
|
}
|
|
24
24
|
export interface ISmartDbResourceFenceReceipt extends ISmartDbResourceFence {
|
|
25
|
-
kind: 'smartdb.database.replace.v1' | 'smartdb.database.delete.v1';
|
|
25
|
+
kind: 'smartdb.database.replace.v1' | 'smartdb.database.delete.v1' | 'smartdb.database.ensure.v1';
|
|
26
26
|
/** Digest of the canonical payload interpretation derived by SmartDB. */
|
|
27
27
|
effectivePayloadSha256: string;
|
|
28
28
|
}
|
|
@@ -37,9 +37,19 @@ export interface ISmartDbDatabaseTenantInput {
|
|
|
37
37
|
password: string;
|
|
38
38
|
roles?: string[];
|
|
39
39
|
}
|
|
40
|
+
export interface ISmartDbEnsureDatabaseTenantInput extends ISmartDbDatabaseTenantInput {
|
|
41
|
+
fence: ISmartDbResourceFence;
|
|
42
|
+
}
|
|
40
43
|
export interface ISmartDbDeleteDatabaseTenantInput {
|
|
41
44
|
databaseName: string;
|
|
42
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Exact tenant user to revoke. For a fenced deletion this identity is
|
|
47
|
+
* included in the durable mutation and is removed idempotently after the
|
|
48
|
+
* database deletion is durable. Omitting it from a fenced deletion
|
|
49
|
+
* preserves auth users; an unfenced omission retains the legacy behavior
|
|
50
|
+
* of deleting every user for the database. If the database exists, a
|
|
51
|
+
* fenced deletion fails closed unless this exact user currently owns it.
|
|
52
|
+
*/
|
|
43
53
|
username?: string;
|
|
44
54
|
fence?: ISmartDbResourceFence;
|
|
45
55
|
}
|
|
@@ -53,12 +63,25 @@ export interface ISmartDbDatabaseTenantDescriptor {
|
|
|
53
63
|
roles: string[];
|
|
54
64
|
authSource: string;
|
|
55
65
|
mongodbUri?: string;
|
|
66
|
+
resourceFence?: ISmartDbResourceFenceReceipt;
|
|
67
|
+
}
|
|
68
|
+
export interface ISmartDbEnsureDatabaseTenantResult extends ISmartDbDatabaseTenantDescriptor {
|
|
69
|
+
resourceFence: ISmartDbResourceFenceReceipt;
|
|
56
70
|
}
|
|
57
71
|
export interface ISmartDbDeleteDatabaseTenantResult {
|
|
58
72
|
databaseName: string;
|
|
73
|
+
/**
|
|
74
|
+
* Users removed during the completing attempt. This can be zero after
|
|
75
|
+
* crash recovery when the exact user was durably removed by the prior
|
|
76
|
+
* attempt.
|
|
77
|
+
*/
|
|
59
78
|
deletedUsers: number;
|
|
60
79
|
databaseDropped: boolean;
|
|
61
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Present for fenced calls. False means the bound exact username is now
|
|
82
|
+
* absent; true means no username was supplied and auth users were preserved.
|
|
83
|
+
*/
|
|
84
|
+
usersPreserved?: boolean;
|
|
62
85
|
resourceFence?: ISmartDbResourceFenceReceipt;
|
|
63
86
|
}
|
|
64
87
|
export interface ISmartDbDatabaseExportCollection {
|
|
@@ -75,6 +98,12 @@ export interface ISmartDbDatabaseExport {
|
|
|
75
98
|
export interface ISmartDbImportDatabaseInput {
|
|
76
99
|
databaseName: string;
|
|
77
100
|
source: ISmartDbDatabaseExport;
|
|
101
|
+
/**
|
|
102
|
+
* Exact exclusive tenant owner required for this replacement. When used
|
|
103
|
+
* with a fence, the username is included in the provider-derived mutation
|
|
104
|
+
* identity. Omission preserves the original version 1 replacement profile.
|
|
105
|
+
*/
|
|
106
|
+
username?: string;
|
|
78
107
|
fence?: ISmartDbResourceFence;
|
|
79
108
|
}
|
|
80
109
|
export interface ISmartDbImportDatabaseResult {
|
|
@@ -4,6 +4,7 @@ export const smartDbResourceFenceErrorCodes = [
|
|
|
4
4
|
'EFENCE_SCOPE_MISMATCH',
|
|
5
5
|
'EFENCE_UNSUPPORTED',
|
|
6
6
|
'EFENCE_MUTATION_MISMATCH',
|
|
7
|
+
'EFENCE_OWNERSHIP_MISMATCH',
|
|
7
8
|
'EFENCE_STATE_CORRUPT',
|
|
8
9
|
'EFENCE_RECEIPT_LIMIT',
|
|
9
10
|
'EFENCE_BUSY',
|
|
@@ -26,4 +27,4 @@ export const normalizeSmartDbResourceFenceError = (errorArg) => {
|
|
|
26
27
|
}
|
|
27
28
|
return new SmartDbResourceFenceError(match[1], match[2], error);
|
|
28
29
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3RzX3NtYXJ0ZGIvc2VydmljZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRztJQUM1QyxpQkFBaUI7SUFDakIsY0FBYztJQUNkLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsMEJBQTBCO0lBQzFCLDJCQUEyQjtJQUMzQixzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLGFBQWE7Q0FDTCxDQUFDO0FBdUJYLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBR2xELFlBQ0UsT0FBdUMsRUFDdkMsVUFBa0IsRUFDbEIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLEdBQUcsT0FBTyxLQUFLLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxDQUNoRCxRQUFpQixFQUNWLEVBQUU7SUFDVCxNQUFNLEtBQUssR0FDVCxRQUFRLFlBQVksS0FBSztRQUN2QixDQUFDLENBQUMsUUFBUTtRQUNWLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLElBQ0UsQ0FBQyxLQUFLO1FBQ04sQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQW1DLENBQzNDLEVBQ0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sSUFBSSx5QkFBeUIsQ0FDbEMsS0FBSyxDQUFDLENBQUMsQ0FBbUMsRUFDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLEtBQUssQ0FDTixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/index.ts
CHANGED
|
@@ -27,6 +27,8 @@ export type {
|
|
|
27
27
|
ISmartDbResourceFenceReceipt,
|
|
28
28
|
TSmartDbResourceFenceErrorCode,
|
|
29
29
|
ISmartDbDatabaseTenantInput,
|
|
30
|
+
ISmartDbEnsureDatabaseTenantInput,
|
|
31
|
+
ISmartDbEnsureDatabaseTenantResult,
|
|
30
32
|
ISmartDbDeleteDatabaseTenantInput,
|
|
31
33
|
ISmartDbRotateDatabaseTenantPasswordInput,
|
|
32
34
|
ISmartDbDatabaseTenantDescriptor,
|
|
@@ -35,9 +37,11 @@ export type {
|
|
|
35
37
|
ISmartDbDatabaseExport,
|
|
36
38
|
ISmartDbImportDatabaseInput,
|
|
37
39
|
ISmartDbImportDatabaseResult,
|
|
40
|
+
TSmartDbEffectivePayloadInputV1,
|
|
38
41
|
} from './ts_smartdb/index.js';
|
|
39
42
|
export {
|
|
40
43
|
SmartDbResourceFenceError,
|
|
41
44
|
normalizeSmartDbResourceFenceError,
|
|
42
45
|
smartDbResourceFenceErrorCodes,
|
|
46
|
+
createSmartDbEffectivePayloadSha256V1,
|
|
43
47
|
} from './ts_smartdb/index.js';
|
package/ts/ts_smartdb/index.ts
CHANGED
|
@@ -31,6 +31,8 @@ export type {
|
|
|
31
31
|
ISmartDbResourceFenceReceipt,
|
|
32
32
|
TSmartDbResourceFenceErrorCode,
|
|
33
33
|
ISmartDbDatabaseTenantInput,
|
|
34
|
+
ISmartDbEnsureDatabaseTenantInput,
|
|
35
|
+
ISmartDbEnsureDatabaseTenantResult,
|
|
34
36
|
ISmartDbDeleteDatabaseTenantInput,
|
|
35
37
|
ISmartDbRotateDatabaseTenantPasswordInput,
|
|
36
38
|
ISmartDbDatabaseTenantDescriptor,
|
|
@@ -45,3 +47,5 @@ export {
|
|
|
45
47
|
normalizeSmartDbResourceFenceError,
|
|
46
48
|
smartDbResourceFenceErrorCodes,
|
|
47
49
|
} from './service-types.js';
|
|
50
|
+
export type { TSmartDbEffectivePayloadInputV1 } from './resource-fencing.js';
|
|
51
|
+
export { createSmartDbEffectivePayloadSha256V1 } from './resource-fencing.js';
|
package/ts/ts_smartdb/plugins.ts
CHANGED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import type { ISmartDbDatabaseExport } from './service-types.js';
|
|
3
|
+
|
|
4
|
+
export type TSmartDbEffectivePayloadInputV1 =
|
|
5
|
+
| {
|
|
6
|
+
version: 1;
|
|
7
|
+
kind: 'smartdb.database.replace.v1';
|
|
8
|
+
databaseName: string;
|
|
9
|
+
source: ISmartDbDatabaseExport;
|
|
10
|
+
/** Exact exclusive tenant owner; omission retains the legacy v1 digest. */
|
|
11
|
+
username?: string;
|
|
12
|
+
}
|
|
13
|
+
| {
|
|
14
|
+
version: 1;
|
|
15
|
+
kind: 'smartdb.database.delete.v1';
|
|
16
|
+
databaseName: string;
|
|
17
|
+
username: string;
|
|
18
|
+
}
|
|
19
|
+
| {
|
|
20
|
+
version: 1;
|
|
21
|
+
kind: 'smartdb.database.ensure.v1';
|
|
22
|
+
databaseName: string;
|
|
23
|
+
username: string;
|
|
24
|
+
password: string;
|
|
25
|
+
roles?: string[];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type TCanonicalJsonValue =
|
|
29
|
+
| null
|
|
30
|
+
| boolean
|
|
31
|
+
| number
|
|
32
|
+
| string
|
|
33
|
+
| TCanonicalJsonValue[]
|
|
34
|
+
| { [key: string]: TCanonicalJsonValue };
|
|
35
|
+
|
|
36
|
+
const typedPayloadPrefix = plugins.buffer.Buffer.from(
|
|
37
|
+
'smartdb.effective-payload.typed.v1\0',
|
|
38
|
+
'utf8',
|
|
39
|
+
);
|
|
40
|
+
const minimumI64 = -9_223_372_036_854_775_808n;
|
|
41
|
+
const maximumU64 = 18_446_744_073_709_551_615n;
|
|
42
|
+
|
|
43
|
+
const compareUtf8Keys = (leftArg: string, rightArg: string): number =>
|
|
44
|
+
plugins.buffer.Buffer.compare(
|
|
45
|
+
plugins.buffer.Buffer.from(leftArg, 'utf8'),
|
|
46
|
+
plugins.buffer.Buffer.from(rightArg, 'utf8'),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const formatSerdeJsonFloat = (valueArg: number): string => {
|
|
50
|
+
const transportNumber = JSON.stringify(valueArg);
|
|
51
|
+
if (/^-?\d+$/.test(transportNumber)) {
|
|
52
|
+
const integer = BigInt(transportNumber);
|
|
53
|
+
if (integer >= minimumI64 && integer <= maximumU64) {
|
|
54
|
+
return transportNumber;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const negative = valueArg < 0;
|
|
59
|
+
const source = Math.abs(valueArg).toString().toLowerCase();
|
|
60
|
+
let digits: string;
|
|
61
|
+
let decimalExponent: number;
|
|
62
|
+
if (source.includes('e')) {
|
|
63
|
+
const [coefficient, exponent] = source.split('e');
|
|
64
|
+
digits = coefficient.replace('.', '').replace(/^0+|0+$/g, '');
|
|
65
|
+
decimalExponent = Number.parseInt(exponent, 10);
|
|
66
|
+
} else {
|
|
67
|
+
const [integerPart, fractionPart = ''] = source.split('.');
|
|
68
|
+
const rawDigits = `${integerPart}${fractionPart}`;
|
|
69
|
+
const firstSignificant = rawDigits.search(/[1-9]/);
|
|
70
|
+
const lastSignificant = rawDigits.search(/[1-9](?!.*[1-9])/);
|
|
71
|
+
if (firstSignificant < 0) {
|
|
72
|
+
return '0.0';
|
|
73
|
+
}
|
|
74
|
+
digits = rawDigits.slice(firstSignificant, lastSignificant + 1);
|
|
75
|
+
decimalExponent = integerPart.length - firstSignificant - 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let rendered: string;
|
|
79
|
+
if (decimalExponent >= -5 && decimalExponent <= 15) {
|
|
80
|
+
const integerDigits = decimalExponent + 1;
|
|
81
|
+
if (digits.length <= integerDigits) {
|
|
82
|
+
rendered = `${digits}${'0'.repeat(integerDigits - digits.length)}.0`;
|
|
83
|
+
} else if (integerDigits > 0) {
|
|
84
|
+
rendered = `${digits.slice(0, integerDigits)}.${digits.slice(integerDigits)}`;
|
|
85
|
+
} else {
|
|
86
|
+
rendered = `0.${'0'.repeat(-integerDigits)}${digits}`;
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
const significand =
|
|
90
|
+
digits.length === 1 ? digits : `${digits[0]}.${digits.slice(1)}`;
|
|
91
|
+
rendered = `${significand}e${decimalExponent >= 0 ? '+' : ''}${decimalExponent}`;
|
|
92
|
+
}
|
|
93
|
+
return negative ? `-${rendered}` : rendered;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const canonicalJsonStringify = (valueArg: TCanonicalJsonValue): string => {
|
|
97
|
+
if (typeof valueArg === 'number') {
|
|
98
|
+
return formatSerdeJsonFloat(valueArg);
|
|
99
|
+
}
|
|
100
|
+
if (valueArg === null || typeof valueArg !== 'object') {
|
|
101
|
+
const serialized = JSON.stringify(valueArg);
|
|
102
|
+
if (serialized === undefined) {
|
|
103
|
+
throw new TypeError('SmartDB effective payload contains unsupported JSON');
|
|
104
|
+
}
|
|
105
|
+
return serialized;
|
|
106
|
+
}
|
|
107
|
+
if (Array.isArray(valueArg)) {
|
|
108
|
+
return `[${valueArg.map((entryArg) => canonicalJsonStringify(entryArg)).join(',')}]`;
|
|
109
|
+
}
|
|
110
|
+
return `{${Object.keys(valueArg)
|
|
111
|
+
.map(
|
|
112
|
+
(keyArg) =>
|
|
113
|
+
`${JSON.stringify(keyArg)}:${canonicalJsonStringify(valueArg[keyArg])}`,
|
|
114
|
+
)
|
|
115
|
+
.join(',')}}`;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const encodeTypedLength = (lengthArg: number): Uint8Array => {
|
|
119
|
+
const encoded = plugins.buffer.Buffer.allocUnsafe(8);
|
|
120
|
+
encoded.writeBigUInt64BE(BigInt(lengthArg));
|
|
121
|
+
return encoded;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const encodeTypedBytes = (valueArg: Uint8Array): Uint8Array[] => [
|
|
125
|
+
encodeTypedLength(valueArg.byteLength),
|
|
126
|
+
valueArg,
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
const encodeTypedValue = (
|
|
130
|
+
valueArg: TCanonicalJsonValue,
|
|
131
|
+
chunksArg: Uint8Array[],
|
|
132
|
+
): void => {
|
|
133
|
+
if (valueArg === null) {
|
|
134
|
+
chunksArg.push(plugins.buffer.Buffer.from([0]));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (valueArg === false) {
|
|
138
|
+
chunksArg.push(plugins.buffer.Buffer.from([1]));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (valueArg === true) {
|
|
142
|
+
chunksArg.push(plugins.buffer.Buffer.from([2]));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (typeof valueArg === 'number') {
|
|
146
|
+
if (!Number.isFinite(valueArg)) {
|
|
147
|
+
throw new TypeError('SmartDB exact replace contains a non-finite number');
|
|
148
|
+
}
|
|
149
|
+
const encoded = plugins.buffer.Buffer.allocUnsafe(9);
|
|
150
|
+
encoded[0] = 3;
|
|
151
|
+
encoded.writeDoubleBE(valueArg, 1);
|
|
152
|
+
chunksArg.push(encoded);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (typeof valueArg === 'string') {
|
|
156
|
+
const encoded = plugins.buffer.Buffer.from(valueArg, 'utf8');
|
|
157
|
+
chunksArg.push(plugins.buffer.Buffer.from([4]), ...encodeTypedBytes(encoded));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (Array.isArray(valueArg)) {
|
|
161
|
+
chunksArg.push(
|
|
162
|
+
plugins.buffer.Buffer.from([5]),
|
|
163
|
+
encodeTypedLength(valueArg.length),
|
|
164
|
+
);
|
|
165
|
+
for (const value of valueArg) {
|
|
166
|
+
encodeTypedValue(value, chunksArg);
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const keys = Object.keys(valueArg).sort(compareUtf8Keys);
|
|
171
|
+
chunksArg.push(
|
|
172
|
+
plugins.buffer.Buffer.from([6]),
|
|
173
|
+
encodeTypedLength(keys.length),
|
|
174
|
+
);
|
|
175
|
+
for (const key of keys) {
|
|
176
|
+
const encodedKey = plugins.buffer.Buffer.from(key, 'utf8');
|
|
177
|
+
chunksArg.push(
|
|
178
|
+
plugins.buffer.Buffer.from([4]),
|
|
179
|
+
...encodeTypedBytes(encodedKey),
|
|
180
|
+
);
|
|
181
|
+
encodeTypedValue(valueArg[key], chunksArg);
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const encodeTypedPayload = (valueArg: TCanonicalJsonValue): Uint8Array => {
|
|
186
|
+
const chunks: Uint8Array[] = [typedPayloadPrefix];
|
|
187
|
+
encodeTypedValue(valueArg, chunks);
|
|
188
|
+
return plugins.buffer.Buffer.concat(chunks);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Computes the provider-derived SHA-256 identity for SmartDB's version 1
|
|
193
|
+
* fenced replace, exact-user delete, and exact-user ensure payload profiles.
|
|
194
|
+
*/
|
|
195
|
+
export const createSmartDbEffectivePayloadSha256V1 = (
|
|
196
|
+
inputArg: TSmartDbEffectivePayloadInputV1,
|
|
197
|
+
): string => {
|
|
198
|
+
if (inputArg.version !== 1) {
|
|
199
|
+
throw new TypeError('SmartDB effective payload version must be 1');
|
|
200
|
+
}
|
|
201
|
+
if (typeof inputArg.databaseName !== 'string') {
|
|
202
|
+
throw new TypeError('SmartDB effective payload databaseName must be a string');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
let effectivePayload: object;
|
|
206
|
+
let useTypedEncoding = false;
|
|
207
|
+
switch (inputArg.kind) {
|
|
208
|
+
case 'smartdb.database.replace.v1':
|
|
209
|
+
if (
|
|
210
|
+
inputArg.username !== undefined &&
|
|
211
|
+
typeof inputArg.username !== 'string'
|
|
212
|
+
) {
|
|
213
|
+
throw new TypeError('SmartDB exact replace username must be a string');
|
|
214
|
+
}
|
|
215
|
+
effectivePayload = {
|
|
216
|
+
version: 1,
|
|
217
|
+
kind: inputArg.kind,
|
|
218
|
+
databaseName: inputArg.databaseName,
|
|
219
|
+
source: inputArg.source,
|
|
220
|
+
...(inputArg.username === undefined
|
|
221
|
+
? {}
|
|
222
|
+
: { username: inputArg.username }),
|
|
223
|
+
};
|
|
224
|
+
useTypedEncoding = inputArg.username !== undefined;
|
|
225
|
+
break;
|
|
226
|
+
case 'smartdb.database.ensure.v1': {
|
|
227
|
+
if (typeof inputArg.username !== 'string') {
|
|
228
|
+
throw new TypeError('SmartDB exact ensure username must be a string');
|
|
229
|
+
}
|
|
230
|
+
if (typeof inputArg.password !== 'string') {
|
|
231
|
+
throw new TypeError('SmartDB exact ensure password must be a string');
|
|
232
|
+
}
|
|
233
|
+
const roles = inputArg.roles ?? ['readWrite', 'dbAdmin'];
|
|
234
|
+
if (
|
|
235
|
+
!Array.isArray(roles) ||
|
|
236
|
+
roles.some(
|
|
237
|
+
(roleArg) => typeof roleArg !== 'string' || roleArg.length === 0,
|
|
238
|
+
)
|
|
239
|
+
) {
|
|
240
|
+
throw new TypeError(
|
|
241
|
+
'SmartDB exact ensure roles must be an array of non-empty strings',
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const canonicalRoles = [...new Set(roles)].sort(compareUtf8Keys);
|
|
245
|
+
effectivePayload = {
|
|
246
|
+
version: 1,
|
|
247
|
+
kind: inputArg.kind,
|
|
248
|
+
databaseName: inputArg.databaseName,
|
|
249
|
+
username: inputArg.username,
|
|
250
|
+
passwordSha256: plugins.crypto
|
|
251
|
+
.createHash('sha256')
|
|
252
|
+
.update(inputArg.password, 'utf8')
|
|
253
|
+
.digest('hex'),
|
|
254
|
+
roles: canonicalRoles,
|
|
255
|
+
};
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
case 'smartdb.database.delete.v1':
|
|
259
|
+
if (typeof inputArg.username !== 'string') {
|
|
260
|
+
throw new TypeError('SmartDB exact delete username must be a string');
|
|
261
|
+
}
|
|
262
|
+
effectivePayload = {
|
|
263
|
+
version: 1,
|
|
264
|
+
kind: inputArg.kind,
|
|
265
|
+
databaseName: inputArg.databaseName,
|
|
266
|
+
username: inputArg.username,
|
|
267
|
+
rawDatabaseOnly: false,
|
|
268
|
+
};
|
|
269
|
+
break;
|
|
270
|
+
default:
|
|
271
|
+
throw new TypeError('SmartDB mutation kind has no version 1 payload profile');
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const transportJson = JSON.stringify(effectivePayload);
|
|
275
|
+
if (transportJson === undefined) {
|
|
276
|
+
throw new TypeError('SmartDB effective payload cannot be encoded as JSON');
|
|
277
|
+
}
|
|
278
|
+
const normalizedPayload = JSON.parse(transportJson) as TCanonicalJsonValue;
|
|
279
|
+
const encodedPayload = useTypedEncoding
|
|
280
|
+
? encodeTypedPayload(normalizedPayload)
|
|
281
|
+
: canonicalJsonStringify(normalizedPayload);
|
|
282
|
+
return plugins.crypto
|
|
283
|
+
.createHash('sha256')
|
|
284
|
+
.update(encodedPayload)
|
|
285
|
+
.digest('hex');
|
|
286
|
+
};
|
|
@@ -6,6 +6,8 @@ import { normalizeSmartDbResourceFenceError } from './service-types.js';
|
|
|
6
6
|
import type {
|
|
7
7
|
ISmartDbHealth,
|
|
8
8
|
ISmartDbDatabaseTenantInput,
|
|
9
|
+
ISmartDbEnsureDatabaseTenantInput,
|
|
10
|
+
ISmartDbEnsureDatabaseTenantResult,
|
|
9
11
|
ISmartDbDeleteDatabaseTenantInput,
|
|
10
12
|
ISmartDbRotateDatabaseTenantPasswordInput,
|
|
11
13
|
ISmartDbDatabaseTenantDescriptor,
|
|
@@ -18,6 +20,8 @@ import type {
|
|
|
18
20
|
export type {
|
|
19
21
|
ISmartDbHealth,
|
|
20
22
|
ISmartDbDatabaseTenantInput,
|
|
23
|
+
ISmartDbEnsureDatabaseTenantInput,
|
|
24
|
+
ISmartDbEnsureDatabaseTenantResult,
|
|
21
25
|
ISmartDbDeleteDatabaseTenantInput,
|
|
22
26
|
ISmartDbRotateDatabaseTenantPasswordInput,
|
|
23
27
|
ISmartDbDatabaseTenantDescriptor,
|
|
@@ -123,6 +127,10 @@ type TSmartDbCommands = {
|
|
|
123
127
|
params: ISmartDbDatabaseTenantInput;
|
|
124
128
|
result: ISmartDbDatabaseTenantDescriptor;
|
|
125
129
|
};
|
|
130
|
+
ensureDatabaseTenant: {
|
|
131
|
+
params: ISmartDbEnsureDatabaseTenantInput;
|
|
132
|
+
result: ISmartDbEnsureDatabaseTenantResult;
|
|
133
|
+
};
|
|
126
134
|
deleteDatabaseTenant: {
|
|
127
135
|
params: ISmartDbDeleteDatabaseTenantInput;
|
|
128
136
|
result: ISmartDbDeleteDatabaseTenantResult;
|
|
@@ -318,7 +326,21 @@ export class RustDbBridge extends EventEmitter {
|
|
|
318
326
|
public async createDatabaseTenant(
|
|
319
327
|
params: ISmartDbDatabaseTenantInput,
|
|
320
328
|
): Promise<ISmartDbDatabaseTenantDescriptor> {
|
|
321
|
-
|
|
329
|
+
try {
|
|
330
|
+
return await this.bridge.sendCommand('createDatabaseTenant', params) as ISmartDbDatabaseTenantDescriptor;
|
|
331
|
+
} catch (error) {
|
|
332
|
+
throw normalizeSmartDbResourceFenceError(error);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
public async ensureDatabaseTenant(
|
|
337
|
+
params: ISmartDbEnsureDatabaseTenantInput,
|
|
338
|
+
): Promise<ISmartDbEnsureDatabaseTenantResult> {
|
|
339
|
+
try {
|
|
340
|
+
return await this.bridge.sendCommand('ensureDatabaseTenant', params) as ISmartDbEnsureDatabaseTenantResult;
|
|
341
|
+
} catch (error) {
|
|
342
|
+
throw normalizeSmartDbResourceFenceError(error);
|
|
343
|
+
}
|
|
322
344
|
}
|
|
323
345
|
|
|
324
346
|
public async deleteDatabaseTenant(
|
|
@@ -12,6 +12,8 @@ import type {
|
|
|
12
12
|
import type {
|
|
13
13
|
ISmartDbHealth,
|
|
14
14
|
ISmartDbDatabaseTenantInput,
|
|
15
|
+
ISmartDbEnsureDatabaseTenantInput,
|
|
16
|
+
ISmartDbEnsureDatabaseTenantResult,
|
|
15
17
|
ISmartDbDeleteDatabaseTenantInput,
|
|
16
18
|
ISmartDbRotateDatabaseTenantPasswordInput,
|
|
17
19
|
ISmartDbDatabaseTenantDescriptor,
|
|
@@ -236,6 +238,16 @@ export class SmartdbServer {
|
|
|
236
238
|
return this.withTenantMongoUri(descriptor, params.password);
|
|
237
239
|
}
|
|
238
240
|
|
|
241
|
+
/**
|
|
242
|
+
* Idempotently provision or rotate one exclusively owned database tenant.
|
|
243
|
+
*/
|
|
244
|
+
async ensureDatabaseTenant(
|
|
245
|
+
params: ISmartDbEnsureDatabaseTenantInput,
|
|
246
|
+
): Promise<ISmartDbEnsureDatabaseTenantResult> {
|
|
247
|
+
const descriptor = await this.bridge.ensureDatabaseTenant(params);
|
|
248
|
+
return this.withTenantMongoUri(descriptor, params.password);
|
|
249
|
+
}
|
|
250
|
+
|
|
239
251
|
/**
|
|
240
252
|
* Delete a tenant database and its tenant user(s).
|
|
241
253
|
*/
|
|
@@ -363,10 +375,10 @@ export class SmartdbServer {
|
|
|
363
375
|
return this.bridge.getMetrics();
|
|
364
376
|
}
|
|
365
377
|
|
|
366
|
-
private withTenantMongoUri(
|
|
367
|
-
descriptor:
|
|
378
|
+
private withTenantMongoUri<TDescriptor extends ISmartDbDatabaseTenantDescriptor>(
|
|
379
|
+
descriptor: TDescriptor,
|
|
368
380
|
password: string,
|
|
369
|
-
):
|
|
381
|
+
): TDescriptor & { mongodbUri: string } {
|
|
370
382
|
return {
|
|
371
383
|
...descriptor,
|
|
372
384
|
mongodbUri: this.buildTenantMongoUri(descriptor.databaseName, descriptor.username, password),
|
|
@@ -19,6 +19,7 @@ export const smartDbResourceFenceErrorCodes = [
|
|
|
19
19
|
'EFENCE_SCOPE_MISMATCH',
|
|
20
20
|
'EFENCE_UNSUPPORTED',
|
|
21
21
|
'EFENCE_MUTATION_MISMATCH',
|
|
22
|
+
'EFENCE_OWNERSHIP_MISMATCH',
|
|
22
23
|
'EFENCE_STATE_CORRUPT',
|
|
23
24
|
'EFENCE_RECEIPT_LIMIT',
|
|
24
25
|
'EFENCE_BUSY',
|
|
@@ -39,7 +40,8 @@ export interface ISmartDbResourceFenceReceipt
|
|
|
39
40
|
extends ISmartDbResourceFence {
|
|
40
41
|
kind:
|
|
41
42
|
| 'smartdb.database.replace.v1'
|
|
42
|
-
| 'smartdb.database.delete.v1'
|
|
43
|
+
| 'smartdb.database.delete.v1'
|
|
44
|
+
| 'smartdb.database.ensure.v1';
|
|
43
45
|
/** Digest of the canonical payload interpretation derived by SmartDB. */
|
|
44
46
|
effectivePayloadSha256: string;
|
|
45
47
|
}
|
|
@@ -88,9 +90,21 @@ export interface ISmartDbDatabaseTenantInput {
|
|
|
88
90
|
roles?: string[];
|
|
89
91
|
}
|
|
90
92
|
|
|
93
|
+
export interface ISmartDbEnsureDatabaseTenantInput
|
|
94
|
+
extends ISmartDbDatabaseTenantInput {
|
|
95
|
+
fence: ISmartDbResourceFence;
|
|
96
|
+
}
|
|
97
|
+
|
|
91
98
|
export interface ISmartDbDeleteDatabaseTenantInput {
|
|
92
99
|
databaseName: string;
|
|
93
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Exact tenant user to revoke. For a fenced deletion this identity is
|
|
102
|
+
* included in the durable mutation and is removed idempotently after the
|
|
103
|
+
* database deletion is durable. Omitting it from a fenced deletion
|
|
104
|
+
* preserves auth users; an unfenced omission retains the legacy behavior
|
|
105
|
+
* of deleting every user for the database. If the database exists, a
|
|
106
|
+
* fenced deletion fails closed unless this exact user currently owns it.
|
|
107
|
+
*/
|
|
94
108
|
username?: string;
|
|
95
109
|
fence?: ISmartDbResourceFence;
|
|
96
110
|
}
|
|
@@ -106,13 +120,28 @@ export interface ISmartDbDatabaseTenantDescriptor {
|
|
|
106
120
|
roles: string[];
|
|
107
121
|
authSource: string;
|
|
108
122
|
mongodbUri?: string;
|
|
123
|
+
resourceFence?: ISmartDbResourceFenceReceipt;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface ISmartDbEnsureDatabaseTenantResult
|
|
127
|
+
extends ISmartDbDatabaseTenantDescriptor {
|
|
128
|
+
resourceFence: ISmartDbResourceFenceReceipt;
|
|
109
129
|
}
|
|
110
130
|
|
|
111
131
|
export interface ISmartDbDeleteDatabaseTenantResult {
|
|
112
132
|
databaseName: string;
|
|
133
|
+
/**
|
|
134
|
+
* Users removed during the completing attempt. This can be zero after
|
|
135
|
+
* crash recovery when the exact user was durably removed by the prior
|
|
136
|
+
* attempt.
|
|
137
|
+
*/
|
|
113
138
|
deletedUsers: number;
|
|
114
139
|
databaseDropped: boolean;
|
|
115
|
-
|
|
140
|
+
/**
|
|
141
|
+
* Present for fenced calls. False means the bound exact username is now
|
|
142
|
+
* absent; true means no username was supplied and auth users were preserved.
|
|
143
|
+
*/
|
|
144
|
+
usersPreserved?: boolean;
|
|
116
145
|
resourceFence?: ISmartDbResourceFenceReceipt;
|
|
117
146
|
}
|
|
118
147
|
|
|
@@ -132,6 +161,12 @@ export interface ISmartDbDatabaseExport {
|
|
|
132
161
|
export interface ISmartDbImportDatabaseInput {
|
|
133
162
|
databaseName: string;
|
|
134
163
|
source: ISmartDbDatabaseExport;
|
|
164
|
+
/**
|
|
165
|
+
* Exact exclusive tenant owner required for this replacement. When used
|
|
166
|
+
* with a fence, the username is included in the provider-derived mutation
|
|
167
|
+
* identity. Omission preserves the original version 1 replacement profile.
|
|
168
|
+
*/
|
|
169
|
+
username?: string;
|
|
135
170
|
fence?: ISmartDbResourceFence;
|
|
136
171
|
}
|
|
137
172
|
|