mindoodb 0.0.85 → 0.0.88
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/README-server.md +6 -2
- package/README.md +6 -4
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +2 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +151 -12
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +340 -24
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +14 -0
- package/dist/cloudflare/DurableObjectSql.d.ts +56 -0
- package/dist/cloudflare/DurableObjectSql.d.ts.map +1 -0
- package/dist/cloudflare/DurableObjectSql.js +180 -0
- package/dist/cloudflare/DurableObjectSql.js.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts +86 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.js +614 -0
- package/dist/cloudflare/MindooDatabaseObject.js.map +1 -0
- package/dist/cloudflare/MindooServerObject.d.ts +63 -0
- package/dist/cloudflare/MindooServerObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooServerObject.js +521 -0
- package/dist/cloudflare/MindooServerObject.js.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts +7 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js +14 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js.map +1 -0
- package/dist/cloudflare/host.d.ts +49 -0
- package/dist/cloudflare/host.d.ts.map +1 -0
- package/dist/cloudflare/host.js +104 -0
- package/dist/cloudflare/host.js.map +1 -0
- package/dist/cloudflare/http.d.ts +91 -0
- package/dist/cloudflare/http.d.ts.map +1 -0
- package/dist/cloudflare/http.js +266 -0
- package/dist/cloudflare/http.js.map +1 -0
- package/dist/cloudflare/index.d.ts +12 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +20 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/storeRpc.d.ts +22 -0
- package/dist/cloudflare/storeRpc.d.ts.map +1 -0
- package/dist/cloudflare/storeRpc.js +85 -0
- package/dist/cloudflare/storeRpc.js.map +1 -0
- package/dist/cloudflare/types.d.ts +101 -0
- package/dist/cloudflare/types.d.ts.map +1 -0
- package/dist/cloudflare/types.js +10 -0
- package/dist/cloudflare/types.js.map +1 -0
- package/dist/cloudflare/worker.d.ts +25 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +170 -0
- package/dist/cloudflare/worker.js.map +1 -0
- package/dist/core/BaseMindooDB.d.ts +95 -10
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +441 -98
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +43 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +157 -6
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +103 -0
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +371 -8
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +2 -1
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/ChangeDocDraft.d.ts +133 -0
- package/dist/core/ChangeDocDraft.d.ts.map +1 -0
- package/dist/core/ChangeDocDraft.js +492 -0
- package/dist/core/ChangeDocDraft.js.map +1 -0
- package/dist/core/MindooDBServerAdmin.d.ts.map +1 -1
- package/dist/core/MindooDBServerAdmin.js +2 -1
- package/dist/core/MindooDBServerAdmin.js.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.js +19 -0
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -1
- package/dist/core/accesscontrol/evaluate.d.ts +14 -0
- package/dist/core/accesscontrol/evaluate.d.ts.map +1 -1
- package/dist/core/accesscontrol/evaluate.js +42 -1
- package/dist/core/accesscontrol/evaluate.js.map +1 -1
- package/dist/core/accesscontrol/types.d.ts +88 -4
- package/dist/core/accesscontrol/types.d.ts.map +1 -1
- package/dist/core/accesscontrol/types.js +114 -1
- package/dist/core/accesscontrol/types.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +14 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +27 -7
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/IrohNetworkTransport.js +12 -0
- package/dist/core/appendonlystores/network/IrohNetworkTransport.js.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.js +3 -23
- package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.d.ts +6 -0
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.js +20 -1
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.d.ts.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js +3 -23
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts +7 -0
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +39 -30
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +37 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js +99 -40
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -1
- package/dist/core/appendonlystores/syncStores.d.ts.map +1 -1
- package/dist/core/appendonlystores/syncStores.js +25 -5
- package/dist/core/appendonlystores/syncStores.js.map +1 -1
- package/dist/core/appendonlystores/types.d.ts +7 -1
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/types.js +1 -0
- package/dist/core/appendonlystores/types.js.map +1 -1
- package/dist/core/builtinDbInvariants.d.ts +49 -0
- package/dist/core/builtinDbInvariants.d.ts.map +1 -1
- package/dist/core/builtinDbInvariants.js +86 -1
- package/dist/core/builtinDbInvariants.js.map +1 -1
- package/dist/core/crypto/AuthChallenge.d.ts +68 -0
- package/dist/core/crypto/AuthChallenge.d.ts.map +1 -0
- package/dist/core/crypto/AuthChallenge.js +118 -0
- package/dist/core/crypto/AuthChallenge.js.map +1 -0
- package/dist/core/crypto/DomainStatement.d.ts +5 -3
- package/dist/core/crypto/DomainStatement.d.ts.map +1 -1
- package/dist/core/crypto/DomainStatement.js +5 -3
- package/dist/core/crypto/DomainStatement.js.map +1 -1
- package/dist/core/crypto/encryptedFields.d.ts +11 -0
- package/dist/core/crypto/encryptedFields.d.ts.map +1 -1
- package/dist/core/crypto/encryptedFields.js +18 -0
- package/dist/core/crypto/encryptedFields.js.map +1 -1
- package/dist/core/expressions/evaluateExpression.d.ts +8 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
- package/dist/core/expressions/evaluateExpression.js +29 -4
- package/dist/core/expressions/evaluateExpression.js.map +1 -1
- package/dist/core/expressions/metadata.js +4 -4
- package/dist/core/expressions/metadata.js.map +1 -1
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +17 -6
- package/dist/core/index.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts.map +1 -1
- package/dist/core/query/executeQuery.js +5 -1
- package/dist/core/query/executeQuery.js.map +1 -1
- package/dist/core/query/executeQueryInclude.d.ts.map +1 -1
- package/dist/core/query/executeQueryInclude.js +2 -0
- package/dist/core/query/executeQueryInclude.js.map +1 -1
- package/dist/core/query/queryView.d.ts.map +1 -1
- package/dist/core/query/queryView.js +5 -1
- package/dist/core/query/queryView.js.map +1 -1
- package/dist/core/types.d.ts +204 -10
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +3 -24
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/userkeys/index.d.ts +1 -0
- package/dist/core/userkeys/index.d.ts.map +1 -1
- package/dist/core/userkeys/index.js +5 -1
- package/dist/core/userkeys/index.js.map +1 -1
- package/dist/core/userkeys/sealedValues.d.ts +54 -0
- package/dist/core/userkeys/sealedValues.d.ts.map +1 -0
- package/dist/core/userkeys/sealedValues.js +67 -0
- package/dist/core/userkeys/sealedValues.js.map +1 -0
- package/dist/core/utils/base64.d.ts +17 -0
- package/dist/core/utils/base64.d.ts.map +1 -0
- package/dist/core/utils/base64.js +54 -0
- package/dist/core/utils/base64.js.map +1 -0
- package/dist/core/utils/dynamicImportInterop.d.ts +10 -0
- package/dist/core/utils/dynamicImportInterop.d.ts.map +1 -0
- package/dist/core/utils/dynamicImportInterop.js +22 -0
- package/dist/core/utils/dynamicImportInterop.js.map +1 -0
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +14 -3
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +7 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/FsServerDataStore.d.ts +23 -0
- package/dist/node/server/FsServerDataStore.d.ts.map +1 -0
- package/dist/node/server/FsServerDataStore.js +59 -0
- package/dist/node/server/FsServerDataStore.js.map +1 -0
- package/dist/node/server/IrohServerEndpoint.d.ts +1 -1
- package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.d.ts +5 -5
- package/dist/node/server/IrohServerRpc.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.js +1 -1
- package/dist/node/server/IrohServerRpc.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts +29 -150
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +160 -1573
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +4 -27
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -1
- package/dist/node/server/PurgedDocRegistry.js +6 -83
- package/dist/node/server/PurgedDocRegistry.js.map +1 -1
- package/dist/node/server/StoreFactory.d.ts +1 -1
- package/dist/node/server/StoreFactory.d.ts.map +1 -1
- package/dist/node/server/TenantManager.d.ts +16 -284
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +35 -1168
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/add-to-network.js +1 -1
- package/dist/node/server/add-to-network.js.map +1 -1
- package/dist/node/server/config.d.ts +11 -15
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +30 -245
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/expressAdapter.d.ts +23 -0
- package/dist/node/server/expressAdapter.d.ts.map +1 -0
- package/dist/node/server/expressAdapter.js +108 -0
- package/dist/node/server/expressAdapter.js.map +1 -0
- package/dist/node/server/nativeIrohStreamIO.d.ts +1 -1
- package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts +16 -0
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts.map +1 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js +39 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js.map +1 -0
- package/dist/node/server/peer/IrohPeerLink.d.ts +1 -1
- package/dist/node/server/peer/IrohPeerLink.d.ts.map +1 -1
- package/dist/node/server/peer/routes.d.ts +10 -44
- package/dist/node/server/peer/routes.d.ts.map +1 -1
- package/dist/node/server/peer/routes.js +33 -275
- package/dist/node/server/peer/routes.js.map +1 -1
- package/dist/node/server/resolveServerPassword.js +1 -1
- package/dist/node/server/resolveServerPassword.js.map +1 -1
- package/dist/node/server/server.js +1 -1
- package/dist/node/server/server.js.map +1 -1
- package/dist/node/server/serverinit.js +1 -1
- package/dist/node/server/serverinit.js.map +1 -1
- package/dist/server/CapabilityMatcher.d.ts +60 -0
- package/dist/server/CapabilityMatcher.d.ts.map +1 -0
- package/dist/server/CapabilityMatcher.js +138 -0
- package/dist/server/CapabilityMatcher.js.map +1 -0
- package/dist/server/DeviceDiscoveryService.d.ts +36 -0
- package/dist/server/DeviceDiscoveryService.d.ts.map +1 -0
- package/dist/server/DeviceDiscoveryService.js +164 -0
- package/dist/server/DeviceDiscoveryService.js.map +1 -0
- package/dist/server/PurgedDocRegistry.d.ts +35 -0
- package/dist/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/server/PurgedDocRegistry.js +90 -0
- package/dist/server/PurgedDocRegistry.js.map +1 -0
- package/dist/server/ServerDataStore.d.ts +67 -0
- package/dist/server/ServerDataStore.d.ts.map +1 -0
- package/dist/server/ServerDataStore.js +88 -0
- package/dist/server/ServerDataStore.js.map +1 -0
- package/dist/server/SyncEventBus.d.ts +39 -0
- package/dist/server/SyncEventBus.d.ts.map +1 -0
- package/dist/server/SyncEventBus.js +41 -0
- package/dist/server/SyncEventBus.js.map +1 -0
- package/dist/server/SystemAdminAuth.d.ts +82 -0
- package/dist/server/SystemAdminAuth.d.ts.map +1 -0
- package/dist/server/SystemAdminAuth.js +227 -0
- package/dist/server/SystemAdminAuth.js.map +1 -0
- package/dist/server/TenantManager.d.ts +366 -0
- package/dist/server/TenantManager.d.ts.map +1 -0
- package/dist/server/TenantManager.js +1416 -0
- package/dist/server/TenantManager.js.map +1 -0
- package/dist/server/http/MindooDBServerCore.d.ts +313 -0
- package/dist/server/http/MindooDBServerCore.d.ts.map +1 -0
- package/dist/server/http/MindooDBServerCore.js +1410 -0
- package/dist/server/http/MindooDBServerCore.js.map +1 -0
- package/dist/server/http/types.d.ts +89 -0
- package/dist/server/http/types.d.ts.map +1 -0
- package/dist/server/http/types.js +29 -0
- package/dist/server/http/types.js.map +1 -0
- package/dist/server/index.d.ts +32 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +76 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/peer/ClusterAuditLog.d.ts +71 -0
- package/dist/server/peer/ClusterAuditLog.d.ts.map +1 -0
- package/dist/server/peer/ClusterAuditLog.js +81 -0
- package/dist/server/peer/ClusterAuditLog.js.map +1 -0
- package/dist/server/peer/ClusterJobRunner.d.ts +43 -0
- package/dist/server/peer/ClusterJobRunner.d.ts.map +1 -0
- package/dist/server/peer/ClusterJobRunner.js +119 -0
- package/dist/server/peer/ClusterJobRunner.js.map +1 -0
- package/dist/server/peer/ClusterManager.d.ts +149 -0
- package/dist/server/peer/ClusterManager.d.ts.map +1 -0
- package/dist/server/peer/ClusterManager.js +292 -0
- package/dist/server/peer/ClusterManager.js.map +1 -0
- package/dist/server/peer/PeerAuthService.d.ts +69 -0
- package/dist/server/peer/PeerAuthService.d.ts.map +1 -0
- package/dist/server/peer/PeerAuthService.js +207 -0
- package/dist/server/peer/PeerAuthService.js.map +1 -0
- package/dist/server/peer/PeerReplicator.d.ts +303 -0
- package/dist/server/peer/PeerReplicator.d.ts.map +1 -0
- package/dist/server/peer/PeerReplicator.js +1072 -0
- package/dist/server/peer/PeerReplicator.js.map +1 -0
- package/dist/server/peer/clusterHttp.d.ts +113 -0
- package/dist/server/peer/clusterHttp.d.ts.map +1 -0
- package/dist/server/peer/clusterHttp.js +290 -0
- package/dist/server/peer/clusterHttp.js.map +1 -0
- package/dist/server/peer/types.d.ts +244 -0
- package/dist/server/peer/types.d.ts.map +1 -0
- package/dist/server/peer/types.js +189 -0
- package/dist/server/peer/types.js.map +1 -0
- package/dist/server/rateLimits.d.ts +119 -0
- package/dist/server/rateLimits.d.ts.map +1 -0
- package/dist/server/rateLimits.js +159 -0
- package/dist/server/rateLimits.js.map +1 -0
- package/dist/server/serverConfig.d.ts +37 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +251 -0
- package/dist/server/serverConfig.js.map +1 -0
- package/dist/server/timestampProxy.d.ts +129 -0
- package/dist/server/timestampProxy.d.ts.map +1 -0
- package/dist/server/timestampProxy.js +361 -0
- package/dist/server/timestampProxy.js.map +1 -0
- package/dist/server/types.d.ts +267 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +56 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/validation.d.ts +43 -0
- package/dist/server/validation.d.ts.map +1 -0
- package/dist/server/validation.js +104 -0
- package/dist/server/validation.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Entry stores of a database object, reached from another object.
|
|
4
|
+
*
|
|
5
|
+
* Peer replication runs in the server object but the stores live in the
|
|
6
|
+
* database objects. The existing store RPC ({@link RpcContentAddressedStore} /
|
|
7
|
+
* {@link StoreRpcServer}) carries the calls: JSON for metadata, raw bytes for
|
|
8
|
+
* entry payloads, over internal requests between the objects.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.StoreRpcBytes = void 0;
|
|
12
|
+
exports.remoteObjectStore = remoteObjectStore;
|
|
13
|
+
const RpcContentAddressedStore_1 = require("../core/appendonlystores/rpc/RpcContentAddressedStore");
|
|
14
|
+
const http_1 = require("./http");
|
|
15
|
+
const RPC_PATH = "/internal/store-rpc";
|
|
16
|
+
class DurableObjectStoreRpcTransport {
|
|
17
|
+
constructor(stub, headers) {
|
|
18
|
+
this.stub = stub;
|
|
19
|
+
this.headers = headers;
|
|
20
|
+
}
|
|
21
|
+
async call(request) {
|
|
22
|
+
const response = await this.stub.fetch(`${http_1.INTERNAL_ORIGIN}${RPC_PATH}`, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: { ...this.headers, "content-type": "application/json" },
|
|
25
|
+
body: JSON.stringify(request),
|
|
26
|
+
});
|
|
27
|
+
const body = (await response.json());
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(body.error ?? `Store RPC ${request.method} failed: HTTP ${response.status}`);
|
|
30
|
+
}
|
|
31
|
+
return body.result;
|
|
32
|
+
}
|
|
33
|
+
async sendBytes(blobId, bytes) {
|
|
34
|
+
const response = await this.stub.fetch(`${http_1.INTERNAL_ORIGIN}${RPC_PATH}/bytes/${encodeURIComponent(blobId)}`, {
|
|
35
|
+
method: "PUT",
|
|
36
|
+
headers: this.headers,
|
|
37
|
+
body: bytes,
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok)
|
|
40
|
+
throw new Error(`Store RPC upload failed: HTTP ${response.status}`);
|
|
41
|
+
}
|
|
42
|
+
async receiveBytes(blobId) {
|
|
43
|
+
const response = await this.stub.fetch(`${http_1.INTERNAL_ORIGIN}${RPC_PATH}/bytes/${encodeURIComponent(blobId)}`, {
|
|
44
|
+
headers: this.headers,
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok)
|
|
47
|
+
throw new Error(`Store RPC download failed: HTTP ${response.status}`);
|
|
48
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** A store of `dbId` in the object `stub`; `headers` address and authorize the call. */
|
|
52
|
+
function remoteObjectStore(stub, headers, tenantId, dbId, kind) {
|
|
53
|
+
return new RpcContentAddressedStore_1.RpcContentAddressedStore(new DurableObjectStoreRpcTransport(stub, headers), { scope: tenantId, dbId, kind }, RpcContentAddressedStore_1.SQLITE_STORE_RPC_METHODS);
|
|
54
|
+
}
|
|
55
|
+
/** Payload buffers between the calls of one store RPC exchange. */
|
|
56
|
+
class StoreRpcBytes {
|
|
57
|
+
constructor() {
|
|
58
|
+
this.buffers = new Map();
|
|
59
|
+
}
|
|
60
|
+
async take(blobId) {
|
|
61
|
+
const bytes = this.buffers.get(blobId) ?? null;
|
|
62
|
+
this.buffers.delete(blobId);
|
|
63
|
+
return bytes;
|
|
64
|
+
}
|
|
65
|
+
async offer(blobId, bytes) {
|
|
66
|
+
this.buffers.set(blobId, bytes);
|
|
67
|
+
}
|
|
68
|
+
/** Serve the byte routes under {@link RPC_PATH}; null for anything else. */
|
|
69
|
+
async handle(path, request) {
|
|
70
|
+
const match = /^\/internal\/store-rpc\/bytes\/([^/]+)$/.exec(path);
|
|
71
|
+
if (!match)
|
|
72
|
+
return null;
|
|
73
|
+
const blobId = decodeURIComponent(match[1]);
|
|
74
|
+
if (request.method === "PUT") {
|
|
75
|
+
this.buffers.set(blobId, new Uint8Array(await request.arrayBuffer()));
|
|
76
|
+
return (0, http_1.jsonResponse)(200, { ok: true });
|
|
77
|
+
}
|
|
78
|
+
const bytes = await this.take(blobId);
|
|
79
|
+
return bytes
|
|
80
|
+
? new Response(bytes, { headers: { "content-type": "application/octet-stream" } })
|
|
81
|
+
: (0, http_1.jsonResponse)(404, { error: "Unknown buffer" });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.StoreRpcBytes = StoreRpcBytes;
|
|
85
|
+
//# sourceMappingURL=storeRpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeRpc.js","sourceRoot":"","sources":["../../src/cloudflare/storeRpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of the Cloudflare Workers runtime API the MindooDB host uses.
|
|
3
|
+
*
|
|
4
|
+
* Declared here instead of depending on `@cloudflare/workers-types`, so the
|
|
5
|
+
* host compiles and unit-tests with the rest of the package. Shapes follow
|
|
6
|
+
* the runtime: https://developers.cloudflare.com/durable-objects/api/
|
|
7
|
+
*/
|
|
8
|
+
export type SqlStorageValue = ArrayBuffer | string | number | null;
|
|
9
|
+
export interface SqlStorageCursor<T = Record<string, SqlStorageValue>> extends Iterable<T> {
|
|
10
|
+
toArray(): T[];
|
|
11
|
+
readonly rowsWritten: number;
|
|
12
|
+
}
|
|
13
|
+
export interface SqlStorage {
|
|
14
|
+
exec<T = Record<string, SqlStorageValue>>(query: string, ...bindings: unknown[]): SqlStorageCursor<T>;
|
|
15
|
+
}
|
|
16
|
+
export interface DurableObjectStorage {
|
|
17
|
+
readonly sql: SqlStorage;
|
|
18
|
+
deleteAll(): Promise<void>;
|
|
19
|
+
getAlarm(): Promise<number | null>;
|
|
20
|
+
setAlarm(scheduledTime: number | Date): Promise<void>;
|
|
21
|
+
deleteAlarm(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface DurableObjectId {
|
|
24
|
+
toString(): string;
|
|
25
|
+
}
|
|
26
|
+
export interface DurableObjectState {
|
|
27
|
+
readonly id: DurableObjectId;
|
|
28
|
+
readonly storage: DurableObjectStorage;
|
|
29
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
30
|
+
blockConcurrencyWhile<T>(callback: () => Promise<T>): Promise<T>;
|
|
31
|
+
}
|
|
32
|
+
export interface DurableObjectStub {
|
|
33
|
+
fetch(input: Request | string, init?: RequestInit): Promise<Response>;
|
|
34
|
+
}
|
|
35
|
+
export interface DurableObjectNamespace {
|
|
36
|
+
idFromName(name: string): DurableObjectId;
|
|
37
|
+
get(id: DurableObjectId): DurableObjectStub;
|
|
38
|
+
}
|
|
39
|
+
/** The slice of an R2 bucket binding used for large entries. */
|
|
40
|
+
export interface R2Bucket {
|
|
41
|
+
put(key: string, value: ArrayBuffer | ArrayBufferView): Promise<unknown>;
|
|
42
|
+
get(key: string): Promise<{
|
|
43
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
44
|
+
} | null>;
|
|
45
|
+
delete(keys: string | string[]): Promise<void>;
|
|
46
|
+
list(options?: {
|
|
47
|
+
prefix?: string;
|
|
48
|
+
cursor?: string;
|
|
49
|
+
limit?: number;
|
|
50
|
+
}): Promise<{
|
|
51
|
+
objects: Array<{
|
|
52
|
+
key: string;
|
|
53
|
+
}>;
|
|
54
|
+
truncated: boolean;
|
|
55
|
+
cursor?: string;
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
/** Workers Rate Limiting binding (`ratelimits` in the wrangler config). */
|
|
59
|
+
export interface RateLimitBinding {
|
|
60
|
+
limit(options: {
|
|
61
|
+
key: string;
|
|
62
|
+
}): Promise<{
|
|
63
|
+
success: boolean;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
export interface ExecutionContext {
|
|
67
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
68
|
+
}
|
|
69
|
+
/** Bindings and variables of the MindooDB Worker (see `cloudflare/wrangler.jsonc`). */
|
|
70
|
+
export interface MindooCloudflareEnv {
|
|
71
|
+
MINDOODB_SERVER: DurableObjectNamespace;
|
|
72
|
+
MINDOODB_DATABASES: DurableObjectNamespace;
|
|
73
|
+
/**
|
|
74
|
+
* Optional R2 bucket for entries too large for Durable Object SQLite
|
|
75
|
+
* (rows are capped at 2 MB). Without it such entries are refused.
|
|
76
|
+
*/
|
|
77
|
+
MINDOODB_LARGE_ENTRIES?: R2Bucket;
|
|
78
|
+
/** `server.identity.json` content (secret). Created by `cloudflare/scripts/setup.mjs`. */
|
|
79
|
+
MINDOODB_SERVER_IDENTITY?: string;
|
|
80
|
+
/** Password of the server identity (secret). */
|
|
81
|
+
MINDOODB_SERVER_PASSWORD?: string;
|
|
82
|
+
/** Base64 secret from which per-tenant sync-token keys are derived (secret). */
|
|
83
|
+
MINDOODB_JWT_SECRET?: string;
|
|
84
|
+
/** Initial `config.json` (capabilities); `PUT /system/config` stores a replacement. */
|
|
85
|
+
MINDOODB_SERVER_CONFIG?: string;
|
|
86
|
+
/** Comma-separated allowed CORS origins, like the Node server's env var. */
|
|
87
|
+
MINDOODB_CORS_ORIGIN?: string;
|
|
88
|
+
/** JSON body limit, e.g. "5mb" (default). */
|
|
89
|
+
MINDOODB_JSON_BODY_LIMIT?: string;
|
|
90
|
+
/** RFC 3161 providers, same syntax as on Node. */
|
|
91
|
+
MINDOODB_TSA_PROVIDERS?: string;
|
|
92
|
+
MINDOODB_ALLOW_INSECURE_SYNC_URLS?: string;
|
|
93
|
+
/** Optional rate limiters; without them the tier is not enforced. */
|
|
94
|
+
MINDOODB_RATE_LIMIT_GLOBAL?: RateLimitBinding;
|
|
95
|
+
MINDOODB_RATE_LIMIT_AUTH?: RateLimitBinding;
|
|
96
|
+
MINDOODB_RATE_LIMIT_SYNC?: RateLimitBinding;
|
|
97
|
+
MINDOODB_RATE_LIMIT_SYSTEM?: RateLimitBinding;
|
|
98
|
+
MINDOODB_RATE_LIMIT_TIMESTAMP?: RateLimitBinding;
|
|
99
|
+
MINDOODB_RATE_LIMIT_PEER?: RateLimitBinding;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cloudflare/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The slice of the Cloudflare Workers runtime API the MindooDB host uses.
|
|
4
|
+
*
|
|
5
|
+
* Declared here instead of depending on `@cloudflare/workers-types`, so the
|
|
6
|
+
* host compiles and unit-tests with the rest of the package. Shapes follow
|
|
7
|
+
* the runtime: https://developers.cloudflare.com/durable-objects/api/
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cloudflare/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MindooDB Worker: routes every request of the MindooDB HTTP API to the
|
|
3
|
+
* Durable Object that serves it.
|
|
4
|
+
*
|
|
5
|
+
* - `/system/*` (including `/system/peer/*` and `/system/cluster/*`) and
|
|
6
|
+
* discovery → the server object (config, tenants, key bag, peer replication)
|
|
7
|
+
* - `/:tenantId/auth/*`, `/:tenantId/timestamps/*`, the event stream → the
|
|
8
|
+
* tenant's `directory` object
|
|
9
|
+
* - `/:tenantId/sync/:kind/:op` → the object of the database named by `dbId`
|
|
10
|
+
* (query string for GET, JSON body, or the binary message header)
|
|
11
|
+
*
|
|
12
|
+
* Paths, status codes and bodies match the Node server. The cron trigger
|
|
13
|
+
* drives peer replication (`scheduled`).
|
|
14
|
+
*/
|
|
15
|
+
import type { ExecutionContext, MindooCloudflareEnv } from "./types";
|
|
16
|
+
declare const _default: {
|
|
17
|
+
fetch(request: Request, env: MindooCloudflareEnv, _ctx: ExecutionContext): Promise<Response>;
|
|
18
|
+
/**
|
|
19
|
+
* Cron trigger (`triggers.crons` in wrangler.jsonc): one peer replication
|
|
20
|
+
* pass. Replication runs only when `config.json` sets `cluster.autoSync`.
|
|
21
|
+
*/
|
|
22
|
+
scheduled(_controller: unknown, env: MindooCloudflareEnv, ctx: ExecutionContext): Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
export default _default;
|
|
25
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cloudflare/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0BH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;;mBAoJ9C,OAAO,OAAO,mBAAmB,QAAQ,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsBlG;;;OAGG;2BAC0B,OAAO,OAAO,mBAAmB,OAAO,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;;AA3BvG,wBAoCE"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The MindooDB Worker: routes every request of the MindooDB HTTP API to the
|
|
4
|
+
* Durable Object that serves it.
|
|
5
|
+
*
|
|
6
|
+
* - `/system/*` (including `/system/peer/*` and `/system/cluster/*`) and
|
|
7
|
+
* discovery → the server object (config, tenants, key bag, peer replication)
|
|
8
|
+
* - `/:tenantId/auth/*`, `/:tenantId/timestamps/*`, the event stream → the
|
|
9
|
+
* tenant's `directory` object
|
|
10
|
+
* - `/:tenantId/sync/:kind/:op` → the object of the database named by `dbId`
|
|
11
|
+
* (query string for GET, JSON body, or the binary message header)
|
|
12
|
+
*
|
|
13
|
+
* Paths, status codes and bodies match the Node server. The cron trigger
|
|
14
|
+
* drives peer replication (`scheduled`).
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const binaryEntryFraming_1 = require("../core/appendonlystores/network/binaryEntryFraming");
|
|
18
|
+
const validation_1 = require("../server/validation");
|
|
19
|
+
const http_1 = require("./http");
|
|
20
|
+
const host_1 = require("./host");
|
|
21
|
+
const DIRECTORY_DB_ID = "directory";
|
|
22
|
+
/** Copy of the request for an object, with internal headers set and client-supplied ones dropped. */
|
|
23
|
+
function forward(request, url, body, headers) {
|
|
24
|
+
const forwarded = new Headers();
|
|
25
|
+
request.headers.forEach((value, name) => {
|
|
26
|
+
if (!name.toLowerCase().startsWith("x-mindoodb-"))
|
|
27
|
+
forwarded.set(name, value);
|
|
28
|
+
});
|
|
29
|
+
for (const [name, value] of Object.entries(headers))
|
|
30
|
+
forwarded.set(name, value);
|
|
31
|
+
return new Request(`${http_1.INTERNAL_ORIGIN}${url.pathname}${url.search}`, {
|
|
32
|
+
method: request.method,
|
|
33
|
+
headers: forwarded,
|
|
34
|
+
body: body && request.method !== "GET" && request.method !== "HEAD" ? body : undefined,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** The database a sync request is for, from wherever the client put `dbId`. */
|
|
38
|
+
function syncDbId(request, url, body, name) {
|
|
39
|
+
if (request.method === "GET") {
|
|
40
|
+
const dbId = url.searchParams.get("dbId");
|
|
41
|
+
return name === "events" ? dbId || DIRECTORY_DB_ID : dbId;
|
|
42
|
+
}
|
|
43
|
+
if (!body)
|
|
44
|
+
return undefined;
|
|
45
|
+
const contentType = (request.headers.get("content-type") ?? "").split(";")[0].trim().toLowerCase();
|
|
46
|
+
if (contentType === binaryEntryFraming_1.BINARY_ENTRIES_CONTENT_TYPE) {
|
|
47
|
+
try {
|
|
48
|
+
return (0, binaryEntryFraming_1.decodeBinaryEntryMessage)(body).header.dbId;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(new TextDecoder().decode(body))?.dbId;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function handle(request, env, route, url, clientIp) {
|
|
62
|
+
const internal = { [http_1.INTERNAL_HEADER.clientIp]: clientIp };
|
|
63
|
+
switch (route.kind) {
|
|
64
|
+
case "health":
|
|
65
|
+
return (0, http_1.jsonResponse)(200, { status: "ok", timestamp: Date.now() });
|
|
66
|
+
case "notFound":
|
|
67
|
+
return (0, http_1.jsonResponse)(404, { error: "Not found" });
|
|
68
|
+
case "unsupported":
|
|
69
|
+
return (0, http_1.jsonResponse)(501, { error: `${route.feature} is not available on this server` });
|
|
70
|
+
case "serverInfo":
|
|
71
|
+
case "clusterMirrors":
|
|
72
|
+
case "publicInfosFingerprints":
|
|
73
|
+
return (0, host_1.serverObject)(env).fetch(forward(request, url, null, internal));
|
|
74
|
+
case "peer":
|
|
75
|
+
case "system": {
|
|
76
|
+
// Peer routes are server-to-server traffic with their own budget, as on
|
|
77
|
+
// Node: the admin budget would throttle replication to a crawl.
|
|
78
|
+
const limited = route.kind === "peer"
|
|
79
|
+
? await (0, host_1.rateLimited)(env.MINDOODB_RATE_LIMIT_PEER, `peer:${(0, http_1.clientAddressKey)(clientIp)}`, "Too many peer requests, please try again later")
|
|
80
|
+
: await (0, host_1.rateLimited)(env.MINDOODB_RATE_LIMIT_SYSTEM, `system:${(0, http_1.clientAddressKey)(clientIp)}`, "Too many system requests, please try again later");
|
|
81
|
+
if (limited)
|
|
82
|
+
return limited;
|
|
83
|
+
const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;
|
|
84
|
+
return (0, host_1.serverObject)(env).fetch(forward(request, url, body, internal));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Everything below is tenant-scoped.
|
|
88
|
+
const tenantId = route.tenantId.toLowerCase();
|
|
89
|
+
try {
|
|
90
|
+
(0, validation_1.validateTenantIdFormat)(tenantId);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return (0, http_1.jsonResponse)(400, { error: "Invalid tenant ID format" });
|
|
94
|
+
}
|
|
95
|
+
const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;
|
|
96
|
+
const settings = (0, host_1.createHostSettings)(env);
|
|
97
|
+
if (body && settings.jsonBodyLimitBytes !== null && body.byteLength > settings.jsonBodyLimitBytes) {
|
|
98
|
+
return (0, http_1.jsonResponse)(413, { error: "Request body too large" });
|
|
99
|
+
}
|
|
100
|
+
const toObject = (dbId, extra = {}) => (0, host_1.databaseObject)(env, tenantId, dbId).fetch(forward(request, url, body, {
|
|
101
|
+
...internal,
|
|
102
|
+
...extra,
|
|
103
|
+
[host_1.OBJECT_HEADER.tenantId]: tenantId,
|
|
104
|
+
[host_1.OBJECT_HEADER.dbId]: dbId,
|
|
105
|
+
}));
|
|
106
|
+
if (route.kind !== "sync") {
|
|
107
|
+
return toObject(DIRECTORY_DB_ID);
|
|
108
|
+
}
|
|
109
|
+
let dbId;
|
|
110
|
+
try {
|
|
111
|
+
dbId = (0, validation_1.validateIdentifier)(syncDbId(request, url, body, route.name), "dbId");
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// The object reports a missing tenant first, as the Node server does.
|
|
115
|
+
const message = error instanceof validation_1.ValidationError ? error.message : "Invalid dbId";
|
|
116
|
+
const probe = await toObject(DIRECTORY_DB_ID);
|
|
117
|
+
return probe.status === 404 ? probe : (0, http_1.jsonResponse)(400, { error: message });
|
|
118
|
+
}
|
|
119
|
+
if (route.name !== "events") {
|
|
120
|
+
return toObject(dbId);
|
|
121
|
+
}
|
|
122
|
+
// The read gate of an event stream runs in the database it names; the
|
|
123
|
+
// stream itself lives in the tenant's directory object, where every
|
|
124
|
+
// database of the tenant publishes its changes.
|
|
125
|
+
if (dbId !== DIRECTORY_DB_ID) {
|
|
126
|
+
const gateUrl = new URL(url);
|
|
127
|
+
gateUrl.pathname = url.pathname.replace(/\/events\/?$/i, "/capabilities");
|
|
128
|
+
const gate = await (0, host_1.databaseObject)(env, tenantId, dbId).fetch(forward(request, gateUrl, null, {
|
|
129
|
+
...internal,
|
|
130
|
+
[host_1.OBJECT_HEADER.tenantId]: tenantId,
|
|
131
|
+
[host_1.OBJECT_HEADER.dbId]: dbId,
|
|
132
|
+
}));
|
|
133
|
+
if (!gate.ok)
|
|
134
|
+
return gate;
|
|
135
|
+
return toObject(DIRECTORY_DB_ID, { [http_1.INTERNAL_HEADER.eventsGatePassed]: "1" });
|
|
136
|
+
}
|
|
137
|
+
return toObject(DIRECTORY_DB_ID);
|
|
138
|
+
}
|
|
139
|
+
exports.default = {
|
|
140
|
+
async fetch(request, env, _ctx) {
|
|
141
|
+
const origins = (0, http_1.parseCorsOrigins)(env.MINDOODB_CORS_ORIGIN);
|
|
142
|
+
const preflight = (0, http_1.corsPreflight)(request, origins);
|
|
143
|
+
if (preflight)
|
|
144
|
+
return preflight;
|
|
145
|
+
const url = new URL(request.url);
|
|
146
|
+
const clientIp = request.headers.get("cf-connecting-ip") ?? "unknown";
|
|
147
|
+
try {
|
|
148
|
+
const limited = await (0, host_1.rateLimited)(env.MINDOODB_RATE_LIMIT_GLOBAL, `global:${(0, http_1.clientAddressKey)(clientIp)}`, "Too many requests, please try again later");
|
|
149
|
+
const response = limited ?? (await handle(request, env, (0, http_1.matchRoute)(request.method, url.pathname), url, clientIp));
|
|
150
|
+
return (0, http_1.decorateResponse)(request, response, origins);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error("[MindooDB Worker] Unhandled error:", error);
|
|
154
|
+
return (0, http_1.decorateResponse)(request, (0, http_1.jsonResponse)(500, { error: "Internal server error" }), origins);
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
/**
|
|
158
|
+
* Cron trigger (`triggers.crons` in wrangler.jsonc): one peer replication
|
|
159
|
+
* pass. Replication runs only when `config.json` sets `cluster.autoSync`.
|
|
160
|
+
*/
|
|
161
|
+
async scheduled(_controller, env, ctx) {
|
|
162
|
+
ctx.waitUntil((0, host_1.serverObject)(env)
|
|
163
|
+
.fetch(`${http_1.INTERNAL_ORIGIN}/internal/cluster/tick`, { method: "POST", headers: (0, host_1.internalHeaders)() })
|
|
164
|
+
.then(async (response) => {
|
|
165
|
+
if (!response.ok)
|
|
166
|
+
console.error(`[MindooDB Worker] Cluster tick failed: ${await response.text()}`);
|
|
167
|
+
}));
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/cloudflare/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { MindooDB, CreateOptions, DeleteOptions, ListDocumentIdsOptions, InaccessibleDocumentInfo, ListDocumentCreationDatesOptions, DocumentCreationDate, IterateChangesOptions, UndeleteOptions, ChangeOptions, PatchOptions, DocumentDagAnalysisTimestamp, DocumentDagAnalysisResult, DocumentDagBranchMaterializationResult, DocumentRestoreResult, DocumentDagEntryDetails, DocumentConflictAnalysisEvent, DocumentConflictAnalysisOptions, DocumentConflictBaseValue, DocumentConflictBaseValueQuery, DocumentConflictReport, DocumentConflictReportOptions, ConflictScanCheckpoint, MindooDoc, MindooTenant, ProcessChangesCursor, ProcessChangesResult, DocumentHistoryResult, RevisionCursor, ChangeRevisionResult, AttachmentConfig, DocumentCacheConfig, SnapshotConfig, SigningKeyPair, PerformanceCallback, ProcessChangeSummaryResult, IncompleteAttachmentUploadReclaimResult, SyncOptions, SyncResult, DocumentHistoryPageOptions, DocumentHistoryPageResult, MindooJsonPatch, MindooTextCursorOptions, MindooTextCursorPosition, MindooTextCursorPositionsResult, MindooTextCursorsResult, MindooJsonPatchResult, MindooRichTextPatch, MindooRichTextPatchResult, MindooRichTextStepPatch, MindooDocumentUpdate, MindooRichTextSnapshot, MindooAutomergeSnapshot, MindooAutomergeChangesPatch, MindooAutomergePatchResult, MindooTextPatch, MindooTextPatchResult, StartBackgroundWarmerOptions, BackgroundWarmerProgress, DbChangeListener } from "./types";
|
|
1
|
+
import { MindooDB, CreateOptions, DeleteOptions, ListDocumentIdsOptions, InaccessibleDocumentInfo, ListDocumentCreationDatesOptions, DocumentCreationDate, IterateChangesOptions, UndeleteOptions, ChangeOptions, PatchOptions, DocumentDagAnalysisTimestamp, DocumentDagAnalysisResult, DocumentDagBranchMaterializationResult, DocumentRestoreResult, DocumentDagEntryDetails, DocumentConflictAnalysisEvent, DocumentConflictAnalysisOptions, DocumentConflictBaseValue, DocumentConflictBaseValueQuery, DocumentConflictReport, DocumentConflictReportOptions, ConflictScanCheckpoint, MindooDoc, MindooFieldType, MindooTenant, ProcessChangesCursor, ProcessChangesResult, DocumentHistoryResult, RevisionCursor, ChangeRevisionResult, AttachmentConfig, DocumentCacheConfig, SnapshotConfig, SigningKeyPair, PerformanceCallback, ProcessChangeSummaryResult, IncompleteAttachmentUploadReclaimResult, SyncOptions, SyncResult, DocumentHistoryPageOptions, DocumentHistoryPageResult, MindooJsonPatch, MindooTextCursorOptions, MindooTextCursorPosition, MindooTextCursorPositionsResult, MindooTextCursorsResult, MindooJsonPatchResult, MindooRichTextPatch, MindooRichTextPatchResult, MindooRichTextStepPatch, MindooDocumentUpdate, MindooRichTextSnapshot, MindooAutomergeSnapshot, MindooAutomergeChangesPatch, MindooAutomergePatchResult, MindooTextPatch, MindooTextPatchResult, StartBackgroundWarmerOptions, BackgroundWarmerProgress, DbChangeListener } from "./types";
|
|
2
|
+
import type { BuiltinIngestEntry } from "./types";
|
|
2
3
|
import { BaseMindooTenant } from "./BaseMindooTenant";
|
|
3
4
|
import type { ContentAddressedStore } from "./appendonlystores/types";
|
|
4
5
|
import { type DocumentHistoryPurgeOutcome } from "./appendonlystores/purgeDocumentHistory";
|
|
@@ -203,6 +204,25 @@ export declare class BaseMindooDB implements MindooDB {
|
|
|
203
204
|
*/
|
|
204
205
|
private revisionFeedDocCache;
|
|
205
206
|
private readonly revisionFeedCacheLimit;
|
|
207
|
+
/**
|
|
208
|
+
* Revisions of documents whose fold suffix holds un-witnessed entries, keyed
|
|
209
|
+
* by the exact fold (entry order, witness state and prefix). The feed
|
|
210
|
+
* re-discovers such entries on every resume, since their trusted time is the
|
|
211
|
+
* provisional `now`; while nothing about the document changed, only that
|
|
212
|
+
* trusted time differs, so the revisions are re-emitted from here instead
|
|
213
|
+
* of being loaded, verified, decrypted and folded again. Without it, every
|
|
214
|
+
* pass re-folded every un-witnessed document: registering N users offline
|
|
215
|
+
* cost O(N) per registration. An entry is replaced on any change and
|
|
216
|
+
* dropped once the document has no un-witnessed entries left.
|
|
217
|
+
*
|
|
218
|
+
* Each revision holds its own document state, so the cache is bounded: a
|
|
219
|
+
* document with a longer suffix, or one arriving when the cache is full, is
|
|
220
|
+
* folded every pass as before.
|
|
221
|
+
*/
|
|
222
|
+
private provisionalRevisionCache;
|
|
223
|
+
private provisionalRevisionCacheSize;
|
|
224
|
+
private readonly provisionalRevisionCacheLimit;
|
|
225
|
+
private readonly provisionalRevisionCacheDocLimit;
|
|
206
226
|
/**
|
|
207
227
|
* Window size for batching encrypted-payload loads while folding a document's
|
|
208
228
|
* revision suffix ({@link foldDocRevisions}): one {@link ContentAddressedStore.getEntries}
|
|
@@ -293,6 +313,16 @@ export declare class BaseMindooDB implements MindooDB {
|
|
|
293
313
|
private syncStoreChangesInFlight;
|
|
294
314
|
/** Shared follow-up run for callers that arrive mid-sync. */
|
|
295
315
|
private syncStoreChangesQueued;
|
|
316
|
+
/**
|
|
317
|
+
* > 0 while this database hands a sealed document's wrap list to the tenant
|
|
318
|
+
* ({@link ingestSealed}). Unwrapping may resolve the own User-Key, which
|
|
319
|
+
* reads `directory` (grants, username hashes) and so calls
|
|
320
|
+
* {@link syncStoreChanges} on it. When this database *is* `directory` (a
|
|
321
|
+
* sealed admin document there, e.g. a mail gateway configuration sealed to
|
|
322
|
+
* the gateway), that call would wait for the very run that is waiting for
|
|
323
|
+
* it. Such nested calls return at once and read the index as it is.
|
|
324
|
+
*/
|
|
325
|
+
private sealedIngestDepth;
|
|
296
326
|
private changeListeners;
|
|
297
327
|
private pendingChangeNotifications;
|
|
298
328
|
private changeNotifyTimer;
|
|
@@ -435,19 +465,28 @@ export declare class BaseMindooDB implements MindooDB {
|
|
|
435
465
|
* — a peer sync — and therefore have to apply the admin/owner rules
|
|
436
466
|
* themselves.
|
|
437
467
|
*
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
*
|
|
441
|
-
*
|
|
468
|
+
* This is the server's write rule ({@link evaluateBuiltinWrite}), not the
|
|
469
|
+
* lenient load-path filter. The load path may fail open because whatever it
|
|
470
|
+
* reads already passed a server; an entry arriving from a peer has passed
|
|
471
|
+
* nothing, so an owner hash that cannot be resolved is a refusal here, as it
|
|
472
|
+
* is on the server. Everything this admits also passes the load path, so an
|
|
473
|
+
* admitted entry still materializes.
|
|
474
|
+
*
|
|
475
|
+
* `batch` is the rest of the delivery: a new document arrives as its
|
|
476
|
+
* `doc_create` plus later changes in one batch, and the create is what names
|
|
477
|
+
* the owner. Pass entries with their payload (`encryptedData`) where you have
|
|
478
|
+
* it; a `doc_create` of a userkey document is decrypted to read
|
|
479
|
+
* `username_hash`.
|
|
442
480
|
*
|
|
443
481
|
* Returns false for databases without a builtin invariant, so callers can
|
|
444
482
|
* ask unconditionally.
|
|
445
483
|
*/
|
|
446
|
-
violatesBuiltinWriteInvariant(entry:
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
484
|
+
violatesBuiltinWriteInvariant(entry: BuiltinIngestEntry, batch?: readonly BuiltinIngestEntry[]): Promise<boolean>;
|
|
485
|
+
/** Reason the builtin invariant refuses `entry` from a peer, or null. */
|
|
486
|
+
private builtinIngestDenial;
|
|
487
|
+
private isAdminKey;
|
|
488
|
+
/** `username_hash` out of a userkey document's `doc_create` payload. */
|
|
489
|
+
private usernameHashFromCreateEntry;
|
|
451
490
|
private ensureSignerUsernameHash;
|
|
452
491
|
/**
|
|
453
492
|
* Owner of a personal `userdirectory` document: the person who signed its
|
|
@@ -1037,6 +1076,38 @@ export declare class BaseMindooDB implements MindooDB {
|
|
|
1037
1076
|
* {@link MindooDB.purgeDocumentHistory}).
|
|
1038
1077
|
*/
|
|
1039
1078
|
purgeDocumentHistory(docId: string): Promise<DocumentHistoryPurgeOutcome>;
|
|
1079
|
+
/**
|
|
1080
|
+
* Request the hard delete of deleted documents in a personal database
|
|
1081
|
+
* (`mmail_…`, `mmailout_…`; docs/accesscontrol.md §6.11, "Purge"). Writes a
|
|
1082
|
+
* purge request document (`purgereq_…`, `$publicinfos`) that names the
|
|
1083
|
+
* documents; push it like any change. The server accepts it only from the
|
|
1084
|
+
* owner's devices, a service with a matching `accessPrefixes` grant or the
|
|
1085
|
+
* tenant admin, and only for documents that are deleted; it then removes
|
|
1086
|
+
* their history and refuses it from then on. Every replica (also this one)
|
|
1087
|
+
* removes the documents when it next pulls the request
|
|
1088
|
+
* ({@link applyPurgeRequests}).
|
|
1089
|
+
*
|
|
1090
|
+
* @returns The id of the purge request document.
|
|
1091
|
+
*/
|
|
1092
|
+
requestPurgeOfDeletedDocuments(docIds: string[]): Promise<string>;
|
|
1093
|
+
/**
|
|
1094
|
+
* The document ids the purge requests of this personal database name
|
|
1095
|
+
* (§6.11). Empty for any other database. With `onlyAccepted`, only requests
|
|
1096
|
+
* the server has accepted (their `doc_create` carries a witness receipt):
|
|
1097
|
+
* a request that is still local, or that the server refused, purges
|
|
1098
|
+
* nothing, so a refused request never loses data that stays on the server.
|
|
1099
|
+
*/
|
|
1100
|
+
getPurgeRequestedDocIds(options?: {
|
|
1101
|
+
onlyAccepted?: boolean;
|
|
1102
|
+
}): Promise<Set<string>>;
|
|
1103
|
+
/**
|
|
1104
|
+
* Execute the purge requests of this personal database locally (§6.11):
|
|
1105
|
+
* remove every named document that still has entries here. Idempotent; runs
|
|
1106
|
+
* after every docs pull of a personal database.
|
|
1107
|
+
*
|
|
1108
|
+
* @returns How many documents were removed in this run.
|
|
1109
|
+
*/
|
|
1110
|
+
applyPurgeRequests(): Promise<number>;
|
|
1040
1111
|
/**
|
|
1041
1112
|
* Drop everything this instance derived from a document whose store entries
|
|
1042
1113
|
* were purged: the L1/L2 caches, summary values and full-text tokens (via
|
|
@@ -1319,6 +1390,12 @@ export declare class BaseMindooDB implements MindooDB {
|
|
|
1319
1390
|
private prepareFreshDocumentCreate;
|
|
1320
1391
|
getDocument(docId: string): Promise<MindooDoc>;
|
|
1321
1392
|
getDocumentAtTimestamp(docId: string, timestamp: number): Promise<MindooDoc | null>;
|
|
1393
|
+
/**
|
|
1394
|
+
* Hands a sealed document's newest wrap list to the tenant, with nested
|
|
1395
|
+
* {@link syncStoreChanges} calls on this database short-circuited meanwhile
|
|
1396
|
+
* (see {@link sealedIngestDepth}).
|
|
1397
|
+
*/
|
|
1398
|
+
private ingestSealed;
|
|
1322
1399
|
/**
|
|
1323
1400
|
* Unwrap a `$sealed:` DEK from entry recipient wraps into the tenant session
|
|
1324
1401
|
* cache. `loadDocumentInternal` already does this; history, timestamp, and
|
|
@@ -1851,6 +1928,14 @@ export declare class BaseMindooDB implements MindooDB {
|
|
|
1851
1928
|
private resolveReadableInternalDoc;
|
|
1852
1929
|
applyJsonPatch(doc: MindooDoc, patch: MindooJsonPatch, options?: PatchOptions): Promise<MindooJsonPatchResult>;
|
|
1853
1930
|
private changeDocInternal;
|
|
1931
|
+
/** "counter" / "atomic" for the CRDT scalars that read as plain values, otherwise null. */
|
|
1932
|
+
private automergeScalarKind;
|
|
1933
|
+
/** Whether the text at `path` carries marks or block markers (rich text). */
|
|
1934
|
+
private isRichTextAt;
|
|
1935
|
+
private fieldTypeAt;
|
|
1936
|
+
getFieldType(doc: MindooDoc, path: string | Array<string | number>): Promise<MindooFieldType | undefined>;
|
|
1937
|
+
/** Replays the edits a changeDoc() callback made through getData(), see ChangeDocDraft. */
|
|
1938
|
+
private applyChangeDocDraftOps;
|
|
1854
1939
|
private validateTextPatch;
|
|
1855
1940
|
private validateJsonPatch;
|
|
1856
1941
|
private isAutomergeCounter;
|