@push.rocks/smartdb 2.12.1 → 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 +17 -3
- 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 +22 -2
|
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,6 +37,9 @@ 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
|
/**
|
|
@@ -44,7 +47,8 @@ export interface ISmartDbDeleteDatabaseTenantInput {
|
|
|
44
47
|
* included in the durable mutation and is removed idempotently after the
|
|
45
48
|
* database deletion is durable. Omitting it from a fenced deletion
|
|
46
49
|
* preserves auth users; an unfenced omission retains the legacy behavior
|
|
47
|
-
* of deleting every user for the database.
|
|
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.
|
|
48
52
|
*/
|
|
49
53
|
username?: string;
|
|
50
54
|
fence?: ISmartDbResourceFence;
|
|
@@ -59,6 +63,10 @@ export interface ISmartDbDatabaseTenantDescriptor {
|
|
|
59
63
|
roles: string[];
|
|
60
64
|
authSource: string;
|
|
61
65
|
mongodbUri?: string;
|
|
66
|
+
resourceFence?: ISmartDbResourceFenceReceipt;
|
|
67
|
+
}
|
|
68
|
+
export interface ISmartDbEnsureDatabaseTenantResult extends ISmartDbDatabaseTenantDescriptor {
|
|
69
|
+
resourceFence: ISmartDbResourceFenceReceipt;
|
|
62
70
|
}
|
|
63
71
|
export interface ISmartDbDeleteDatabaseTenantResult {
|
|
64
72
|
databaseName: string;
|
|
@@ -90,6 +98,12 @@ export interface ISmartDbDatabaseExport {
|
|
|
90
98
|
export interface ISmartDbImportDatabaseInput {
|
|
91
99
|
databaseName: string;
|
|
92
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;
|
|
93
107
|
fence?: ISmartDbResourceFence;
|
|
94
108
|
}
|
|
95
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,6 +90,11 @@ 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
|
/**
|
|
@@ -95,7 +102,8 @@ export interface ISmartDbDeleteDatabaseTenantInput {
|
|
|
95
102
|
* included in the durable mutation and is removed idempotently after the
|
|
96
103
|
* database deletion is durable. Omitting it from a fenced deletion
|
|
97
104
|
* preserves auth users; an unfenced omission retains the legacy behavior
|
|
98
|
-
* of deleting every user for the database.
|
|
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.
|
|
99
107
|
*/
|
|
100
108
|
username?: string;
|
|
101
109
|
fence?: ISmartDbResourceFence;
|
|
@@ -112,6 +120,12 @@ export interface ISmartDbDatabaseTenantDescriptor {
|
|
|
112
120
|
roles: string[];
|
|
113
121
|
authSource: string;
|
|
114
122
|
mongodbUri?: string;
|
|
123
|
+
resourceFence?: ISmartDbResourceFenceReceipt;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface ISmartDbEnsureDatabaseTenantResult
|
|
127
|
+
extends ISmartDbDatabaseTenantDescriptor {
|
|
128
|
+
resourceFence: ISmartDbResourceFenceReceipt;
|
|
115
129
|
}
|
|
116
130
|
|
|
117
131
|
export interface ISmartDbDeleteDatabaseTenantResult {
|
|
@@ -147,6 +161,12 @@ export interface ISmartDbDatabaseExport {
|
|
|
147
161
|
export interface ISmartDbImportDatabaseInput {
|
|
148
162
|
databaseName: string;
|
|
149
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;
|
|
150
170
|
fence?: ISmartDbResourceFence;
|
|
151
171
|
}
|
|
152
172
|
|