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,614 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* One Durable Object per (tenant, database), named `<tenantId>/<dbId>`.
|
|
4
|
+
*
|
|
5
|
+
* Each object runs the platform-neutral server core for its database: the
|
|
6
|
+
* docs and attachments stores live in the object's SQLite, and access control
|
|
7
|
+
* runs locally with the same code as on Node. For that it needs the tenant's
|
|
8
|
+
* directory, so every object other than `directory` keeps a read-only replica
|
|
9
|
+
* of the directory store and pulls new entries from the tenant's directory
|
|
10
|
+
* object before it serves a request (at most every few seconds, immediately
|
|
11
|
+
* when the directory announces a change, and once more when a request was
|
|
12
|
+
* denied — a grant may just have arrived).
|
|
13
|
+
*
|
|
14
|
+
* The `directory` object is also the tenant's hub: it answers the auth
|
|
15
|
+
* handshake (challenges are kept in memory), proxies RFC 3161 requests, holds
|
|
16
|
+
* the Server-Sent-Events streams and receives the change events of the other
|
|
17
|
+
* databases, and knows which databases the tenant has.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.MindooDatabaseObject = void 0;
|
|
21
|
+
const entryWireCodec_1 = require("../core/appendonlystores/network/entryWireCodec");
|
|
22
|
+
const types_1 = require("../core/appendonlystores/types");
|
|
23
|
+
const base64_1 = require("../core/utils/base64");
|
|
24
|
+
const MindooDBServerCore_1 = require("../server/http/MindooDBServerCore");
|
|
25
|
+
const TenantManager_1 = require("../server/TenantManager");
|
|
26
|
+
const CapabilityMatcher_1 = require("../server/CapabilityMatcher");
|
|
27
|
+
const SystemAdminAuth_1 = require("../server/SystemAdminAuth");
|
|
28
|
+
const DeviceDiscoveryService_1 = require("../server/DeviceDiscoveryService");
|
|
29
|
+
const SyncEventBus_1 = require("../server/SyncEventBus");
|
|
30
|
+
const rateLimits_1 = require("../server/rateLimits");
|
|
31
|
+
const types_2 = require("../server/http/types");
|
|
32
|
+
const PeerAuthService_1 = require("../server/peer/PeerAuthService");
|
|
33
|
+
const purgedDocumentGuard_1 = require("../core/appendonlystores/purgedDocumentGuard");
|
|
34
|
+
const StoreRpcServer_1 = require("../core/appendonlystores/rpc/StoreRpcServer");
|
|
35
|
+
const storeRpc_1 = require("./storeRpc");
|
|
36
|
+
const DurableObjectSql_1 = require("./DurableObjectSql");
|
|
37
|
+
const WorkersCryptoAdapter_1 = require("./WorkersCryptoAdapter");
|
|
38
|
+
const http_1 = require("./http");
|
|
39
|
+
const host_1 = require("./host");
|
|
40
|
+
const DIRECTORY_DB_ID = "directory";
|
|
41
|
+
/** How long tenant config and keys from the server object are trusted. */
|
|
42
|
+
const TENANT_STATE_TTL_MS = 60000;
|
|
43
|
+
/** How often a database object asks the directory for new entries on its own. */
|
|
44
|
+
const DIRECTORY_POLL_INTERVAL_MS = 2000;
|
|
45
|
+
const DIRECTORY_PAGE_SIZE = 200;
|
|
46
|
+
const REPLICA_CURSOR_KEY = "directory-replica-cursor.json";
|
|
47
|
+
const DATABASES_KEY = "databases.json";
|
|
48
|
+
/** Sync routes whose request or response carries entry payloads. */
|
|
49
|
+
const PAYLOAD_ROUTES = new Set(["getEntries", "getEntriesBinary", "putEntries", "putEntriesBinary"]);
|
|
50
|
+
const TRUSTED_SERVERS_KEY = "trusted-servers.json";
|
|
51
|
+
class MindooDatabaseObject {
|
|
52
|
+
withPayloadSlot(work) {
|
|
53
|
+
const run = this.payloadQueue.then(work, work);
|
|
54
|
+
this.payloadQueue = run.catch(() => undefined);
|
|
55
|
+
return run;
|
|
56
|
+
}
|
|
57
|
+
constructor(ctx, env) {
|
|
58
|
+
this.ctx = ctx;
|
|
59
|
+
this.env = env;
|
|
60
|
+
this.cryptoAdapter = new WorkersCryptoAdapter_1.WorkersCryptoAdapter();
|
|
61
|
+
this.stores = new Map();
|
|
62
|
+
this.tenantId = null;
|
|
63
|
+
this.dbId = null;
|
|
64
|
+
this.tenantState = null;
|
|
65
|
+
this.tenantStateLoad = null;
|
|
66
|
+
this.tenantManager = null;
|
|
67
|
+
this.core = null;
|
|
68
|
+
/** Change events of the whole tenant; only used in the directory object. */
|
|
69
|
+
this.eventBus = new SyncEventBus_1.SyncEventBus();
|
|
70
|
+
this.replicaCheckedAt = 0;
|
|
71
|
+
this.replicaRefresh = null;
|
|
72
|
+
/** Payload buffers of store RPC exchanges with the server object. */
|
|
73
|
+
this.rpcBytes = new storeRpc_1.StoreRpcBytes();
|
|
74
|
+
/**
|
|
75
|
+
* Requests that carry entry payloads run one at a time: a batch of
|
|
76
|
+
* attachment chunks is up to ~25 MB plus its encrypted copies, and the
|
|
77
|
+
* isolate has 128 MB. Metadata requests are not queued.
|
|
78
|
+
*/
|
|
79
|
+
this.payloadQueue = Promise.resolve();
|
|
80
|
+
this.settings = (0, host_1.createHostSettings)(env);
|
|
81
|
+
this.openStorage();
|
|
82
|
+
}
|
|
83
|
+
openStorage() {
|
|
84
|
+
this.dataStore = new DurableObjectSql_1.DurableObjectServerDataStore(this.ctx.storage.sql);
|
|
85
|
+
(0, host_1.seedServerIdentity)(this.dataStore, this.env);
|
|
86
|
+
this.stores = new Map();
|
|
87
|
+
}
|
|
88
|
+
get isDirectory() {
|
|
89
|
+
return this.dbId === DIRECTORY_DB_ID;
|
|
90
|
+
}
|
|
91
|
+
async fetch(request) {
|
|
92
|
+
const tenantId = request.headers.get(host_1.OBJECT_HEADER.tenantId);
|
|
93
|
+
const dbId = request.headers.get(host_1.OBJECT_HEADER.dbId);
|
|
94
|
+
if (!tenantId || !dbId) {
|
|
95
|
+
return (0, http_1.jsonResponse)(400, { error: "Missing object address" });
|
|
96
|
+
}
|
|
97
|
+
if (this.tenantId === null) {
|
|
98
|
+
this.tenantId = tenantId;
|
|
99
|
+
this.dbId = dbId;
|
|
100
|
+
}
|
|
101
|
+
else if (this.tenantId !== tenantId || this.dbId !== dbId) {
|
|
102
|
+
return (0, http_1.jsonResponse)(400, { error: "Request addressed to another database object" });
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const url = new URL(request.url);
|
|
106
|
+
if (url.pathname.startsWith("/internal/") && (0, http_1.isInternalCall)(request)) {
|
|
107
|
+
return await this.internal(url.pathname, request);
|
|
108
|
+
}
|
|
109
|
+
return await this.public(request, url);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(`[MindooDatabaseObject ${tenantId}/${dbId}] Request error:`, error);
|
|
113
|
+
return (0, http_1.jsonResponse)(500, { error: "Internal server error" });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ==================== Stores ====================
|
|
117
|
+
/** The object's own stores, and the directory (own or replica). */
|
|
118
|
+
store(dbId, storeKind) {
|
|
119
|
+
let prefix;
|
|
120
|
+
if (dbId === this.dbId) {
|
|
121
|
+
prefix = storeKind === types_1.StoreKind.docs ? "d_" : "a_";
|
|
122
|
+
}
|
|
123
|
+
else if (dbId === DIRECTORY_DB_ID) {
|
|
124
|
+
prefix = storeKind === types_1.StoreKind.docs ? "rd_" : "ra_";
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error(`Database ${dbId} is served by its own object`);
|
|
128
|
+
}
|
|
129
|
+
let store = this.stores.get(prefix);
|
|
130
|
+
if (!store) {
|
|
131
|
+
const bucket = this.env.MINDOODB_LARGE_ENTRIES;
|
|
132
|
+
store = (0, DurableObjectSql_1.createDurableObjectStore)(this.ctx.storage.sql, dbId, storeKind, prefix, bucket ? (0, DurableObjectSql_1.r2ContentStore)(bucket, `${this.r2Prefix()}${prefix}`) : undefined);
|
|
133
|
+
this.stores.set(prefix, store);
|
|
134
|
+
}
|
|
135
|
+
return store;
|
|
136
|
+
}
|
|
137
|
+
/** R2 keys of this object's large entries start with this. */
|
|
138
|
+
r2Prefix() {
|
|
139
|
+
return `${encodeURIComponent(this.tenantId)}/${encodeURIComponent(this.dbId)}/`;
|
|
140
|
+
}
|
|
141
|
+
// ==================== Tenant state ====================
|
|
142
|
+
async loadTenantState() {
|
|
143
|
+
const current = this.tenantState;
|
|
144
|
+
if (current && Date.now() - current.loadedAt < TENANT_STATE_TTL_MS) {
|
|
145
|
+
return current;
|
|
146
|
+
}
|
|
147
|
+
if (!this.tenantStateLoad) {
|
|
148
|
+
this.tenantStateLoad = this.fetchTenantState().finally(() => {
|
|
149
|
+
this.tenantStateLoad = null;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return this.tenantStateLoad;
|
|
153
|
+
}
|
|
154
|
+
async fetchTenantState() {
|
|
155
|
+
const tenantId = this.tenantId;
|
|
156
|
+
const response = await (0, host_1.serverObject)(this.env).fetch(`${http_1.INTERNAL_ORIGIN}/internal/tenants/${encodeURIComponent(tenantId)}`, { headers: (0, host_1.internalHeaders)() });
|
|
157
|
+
if (!response.ok) {
|
|
158
|
+
throw new Error(`Tenant state of ${tenantId} unavailable: HTTP ${response.status}`);
|
|
159
|
+
}
|
|
160
|
+
const body = (await response.json());
|
|
161
|
+
const state = {
|
|
162
|
+
exists: body.exists,
|
|
163
|
+
config: body.config,
|
|
164
|
+
publicInfosKeys: (body.publicInfosKeys ?? []).map((key) => (0, base64_1.base64ToBytes)(key)),
|
|
165
|
+
trustedServers: body.trustedServers ?? [],
|
|
166
|
+
clusterActive: body.clusterActive === true,
|
|
167
|
+
loadedAt: Date.now(),
|
|
168
|
+
};
|
|
169
|
+
const configKey = `${tenantId}/config.json`;
|
|
170
|
+
const configJson = state.config ? JSON.stringify(state.config, null, 2) : null;
|
|
171
|
+
const trustedJson = JSON.stringify(state.trustedServers, null, 2);
|
|
172
|
+
const changed = !this.tenantState ||
|
|
173
|
+
this.dataStore.readText(configKey) !== configJson ||
|
|
174
|
+
this.dataStore.readText(TRUSTED_SERVERS_KEY) !== trustedJson ||
|
|
175
|
+
this.tenantState.publicInfosKeys.map(String).join() !== state.publicInfosKeys.map(String).join();
|
|
176
|
+
if (configJson === null) {
|
|
177
|
+
this.dataStore.deleteTree(configKey);
|
|
178
|
+
}
|
|
179
|
+
else if (changed) {
|
|
180
|
+
this.dataStore.writeText(configKey, configJson);
|
|
181
|
+
}
|
|
182
|
+
// The tenant manager reads trusted servers when it is created: they count
|
|
183
|
+
// as directory members (peer pushes) and as trusted witnesses.
|
|
184
|
+
if (changed) {
|
|
185
|
+
this.dataStore.writeText(TRUSTED_SERVERS_KEY, trustedJson);
|
|
186
|
+
}
|
|
187
|
+
this.tenantState = state;
|
|
188
|
+
if (changed || !this.core) {
|
|
189
|
+
this.createCore();
|
|
190
|
+
}
|
|
191
|
+
if (state.exists && !this.isDirectory) {
|
|
192
|
+
await this.registerWithDirectory();
|
|
193
|
+
}
|
|
194
|
+
return state;
|
|
195
|
+
}
|
|
196
|
+
/** Tell the tenant's directory object that this database exists. */
|
|
197
|
+
async registerWithDirectory() {
|
|
198
|
+
if (this.dataStore.readText("registered") === "1")
|
|
199
|
+
return;
|
|
200
|
+
const response = await this.directoryObject().fetch(`${http_1.INTERNAL_ORIGIN}/internal/databases/register`, {
|
|
201
|
+
method: "POST",
|
|
202
|
+
headers: (0, host_1.internalHeaders)(this.tenantId, DIRECTORY_DB_ID),
|
|
203
|
+
body: JSON.stringify({ dbId: this.dbId }),
|
|
204
|
+
});
|
|
205
|
+
if (response.ok) {
|
|
206
|
+
this.dataStore.writeText("registered", "1");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
createCore() {
|
|
210
|
+
const tenantId = this.tenantId;
|
|
211
|
+
const env = this.env;
|
|
212
|
+
this.tenantManager = new TenantManager_1.TenantManager({
|
|
213
|
+
dataStore: this.dataStore,
|
|
214
|
+
cryptoAdapter: this.cryptoAdapter,
|
|
215
|
+
serverPassword: env.MINDOODB_SERVER_PASSWORD,
|
|
216
|
+
storeProvider: {
|
|
217
|
+
createTenantStores: () => ({
|
|
218
|
+
getStore: (dbId, storeKind) => this.store(dbId, storeKind),
|
|
219
|
+
}),
|
|
220
|
+
listDatabases: () => (this.isDirectory ? this.registeredDatabases() : [this.dbId]),
|
|
221
|
+
},
|
|
222
|
+
jwtSecretForTenant: (id) => (0, host_1.deriveTenantJwtSecret)(env, id),
|
|
223
|
+
publicInfosKeysResolver: async () => this.tenantState?.publicInfosKeys ?? [],
|
|
224
|
+
});
|
|
225
|
+
// Peers replicate through the ordinary sync routes with a peer token from
|
|
226
|
+
// the server object (same key derivation), as on the Node server.
|
|
227
|
+
const trustedServers = () => this.tenantState?.trustedServers ?? [];
|
|
228
|
+
let peerAuth = null;
|
|
229
|
+
const getPeerAuth = () => (peerAuth ?? (peerAuth = (0, host_1.derivePeerJwtSecret)(env).then((jwtSecret) => new PeerAuthService_1.PeerAuthService(this.cryptoAdapter, trustedServers, { jwtSecret }))));
|
|
230
|
+
this.tenantManager.setPeerAccessControl({
|
|
231
|
+
peerTokenResolver: async (token) => {
|
|
232
|
+
const auth = await getPeerAuth();
|
|
233
|
+
const payload = await auth.validateToken(token);
|
|
234
|
+
const trusted = payload ? auth.findTrustedServerByKey(payload.publicsignkey) : null;
|
|
235
|
+
return trusted
|
|
236
|
+
? {
|
|
237
|
+
name: trusted.name,
|
|
238
|
+
signingPublicKey: trusted.signingPublicKey,
|
|
239
|
+
encryptionPublicKey: trusted.encryptionPublicKey,
|
|
240
|
+
}
|
|
241
|
+
: null;
|
|
242
|
+
},
|
|
243
|
+
trustedWitnessResolver: (receivedByPublicKey) => trustedServers().some((server) => server.signingPublicKey.replace(/\s+/g, "") === receivedByPublicKey.replace(/\s+/g, "")),
|
|
244
|
+
});
|
|
245
|
+
const config = { capabilities: {} };
|
|
246
|
+
const syncEvents = {
|
|
247
|
+
listenerCount: 1,
|
|
248
|
+
publish: (event) => {
|
|
249
|
+
if (this.isDirectory) {
|
|
250
|
+
this.eventBus.publish(event);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
this.ctx.waitUntil(this.forwardEvent(event));
|
|
254
|
+
}
|
|
255
|
+
if (this.tenantState?.clusterActive) {
|
|
256
|
+
this.ctx.waitUntil(this.reportToCluster(event));
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
this.core = new MindooDBServerCore_1.MindooDBServerCore({
|
|
261
|
+
tenantManager: this.tenantManager,
|
|
262
|
+
// System administration runs in the server object; these are inert here.
|
|
263
|
+
systemAdminAuth: new SystemAdminAuth_1.SystemAdminAuthService(this.cryptoAdapter, config),
|
|
264
|
+
capabilityMatcher: new CapabilityMatcher_1.CapabilityMatcher(config),
|
|
265
|
+
deviceDiscovery: new DeviceDiscoveryService_1.DeviceDiscoveryService(this.tenantManager, this.cryptoAdapter),
|
|
266
|
+
configRepository: {
|
|
267
|
+
listBackups: () => [],
|
|
268
|
+
loadBackup: (file) => {
|
|
269
|
+
throw new Error(`Config backup not found: ${file}`);
|
|
270
|
+
},
|
|
271
|
+
replace: () => null,
|
|
272
|
+
},
|
|
273
|
+
getServerConfig: () => config,
|
|
274
|
+
reloadConfig: () => undefined,
|
|
275
|
+
syncEvents,
|
|
276
|
+
tsaProviders: this.settings.tsaProviders,
|
|
277
|
+
jsonBodyLimit: this.settings.jsonBodyLimit,
|
|
278
|
+
allowInsecureSyncUrls: this.settings.allowInsecureSyncUrls,
|
|
279
|
+
runInBackground: (task) => this.ctx.waitUntil(task),
|
|
280
|
+
cluster: {
|
|
281
|
+
mirrorsForTenant: () => [],
|
|
282
|
+
syncReplicators: () => undefined,
|
|
283
|
+
resolvePeerName: async (token) => (await (await getPeerAuth()).validateToken(token))?.sub,
|
|
284
|
+
},
|
|
285
|
+
onDirectoryWrite: async (id) => {
|
|
286
|
+
this.notifyDatabasesOfDirectoryChange(id);
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
directoryObject() {
|
|
291
|
+
return (0, host_1.databaseObject)(this.env, this.tenantId, DIRECTORY_DB_ID);
|
|
292
|
+
}
|
|
293
|
+
/** Let the server object push an accepted write on to the peers. */
|
|
294
|
+
async reportToCluster(event) {
|
|
295
|
+
try {
|
|
296
|
+
await (0, host_1.serverObject)(this.env).fetch(`${http_1.INTERNAL_ORIGIN}/internal/cluster/change`, {
|
|
297
|
+
method: "POST",
|
|
298
|
+
headers: (0, host_1.internalHeaders)(),
|
|
299
|
+
body: JSON.stringify(event),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
console.warn("[MindooDatabaseObject] Could not report change to the cluster:", error);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async forwardEvent(event) {
|
|
307
|
+
try {
|
|
308
|
+
await this.directoryObject().fetch(`${http_1.INTERNAL_ORIGIN}/internal/events/publish`, {
|
|
309
|
+
method: "POST",
|
|
310
|
+
headers: (0, host_1.internalHeaders)(this.tenantId, DIRECTORY_DB_ID),
|
|
311
|
+
body: JSON.stringify(event),
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
console.warn("[MindooDatabaseObject] Could not forward change event:", error);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// ==================== Directory replica ====================
|
|
319
|
+
registeredDatabases() {
|
|
320
|
+
const raw = this.dataStore.readText(DATABASES_KEY);
|
|
321
|
+
return raw ? JSON.parse(raw) : [];
|
|
322
|
+
}
|
|
323
|
+
/** Directory object: let every database pull the directory and run its purges. */
|
|
324
|
+
notifyDatabasesOfDirectoryChange(tenantId) {
|
|
325
|
+
for (const dbId of this.registeredDatabases()) {
|
|
326
|
+
this.ctx.waitUntil((0, host_1.databaseObject)(this.env, tenantId, dbId)
|
|
327
|
+
.fetch(`${http_1.INTERNAL_ORIGIN}/internal/directory/changed`, {
|
|
328
|
+
method: "POST",
|
|
329
|
+
headers: (0, host_1.internalHeaders)(tenantId, dbId),
|
|
330
|
+
})
|
|
331
|
+
.catch((error) => console.warn(`[MindooDatabaseObject] Notifying ${dbId} failed:`, error)));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Pull new directory entries into the replica. Returns whether anything
|
|
336
|
+
* arrived. Concurrent callers share one pull.
|
|
337
|
+
*/
|
|
338
|
+
async refreshDirectoryReplica(force) {
|
|
339
|
+
if (this.isDirectory)
|
|
340
|
+
return false;
|
|
341
|
+
if (!force && Date.now() - this.replicaCheckedAt < DIRECTORY_POLL_INTERVAL_MS)
|
|
342
|
+
return false;
|
|
343
|
+
if (this.replicaRefresh)
|
|
344
|
+
return this.replicaRefresh;
|
|
345
|
+
this.replicaRefresh = this.pullDirectory().finally(() => {
|
|
346
|
+
this.replicaRefresh = null;
|
|
347
|
+
});
|
|
348
|
+
return this.replicaRefresh;
|
|
349
|
+
}
|
|
350
|
+
async pullDirectory() {
|
|
351
|
+
const replica = this.store(DIRECTORY_DB_ID, types_1.StoreKind.docs);
|
|
352
|
+
const storedCursor = this.dataStore.readText(REPLICA_CURSOR_KEY);
|
|
353
|
+
let cursor = storedCursor ? JSON.parse(storedCursor) : null;
|
|
354
|
+
let received = false;
|
|
355
|
+
for (;;) {
|
|
356
|
+
const response = await this.directoryObject().fetch(`${http_1.INTERNAL_ORIGIN}/internal/directory/changes`, {
|
|
357
|
+
method: "POST",
|
|
358
|
+
headers: (0, host_1.internalHeaders)(this.tenantId, DIRECTORY_DB_ID),
|
|
359
|
+
body: JSON.stringify({ cursor }),
|
|
360
|
+
});
|
|
361
|
+
if (!response.ok) {
|
|
362
|
+
throw new Error(`Directory pull failed: HTTP ${response.status}`);
|
|
363
|
+
}
|
|
364
|
+
const page = (await response.json());
|
|
365
|
+
if (page.entries.length > 0) {
|
|
366
|
+
const entries = page.entries.map((entry) => (0, entryWireCodec_1.deserializeStoreEntry)(entry));
|
|
367
|
+
await replica.putEntries(entries);
|
|
368
|
+
// Receipts of entries the replica already had arrive as metadata updates.
|
|
369
|
+
await replica.applyWitnessReceipts?.(entries);
|
|
370
|
+
received = true;
|
|
371
|
+
}
|
|
372
|
+
cursor = page.nextCursor ?? cursor;
|
|
373
|
+
if (cursor)
|
|
374
|
+
this.dataStore.writeText(REPLICA_CURSOR_KEY, JSON.stringify(cursor));
|
|
375
|
+
if (!page.hasMore)
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
this.replicaCheckedAt = Date.now();
|
|
379
|
+
if (received && this.tenantManager) {
|
|
380
|
+
// Purge requests arrive through the directory (docs/accesscontrol.md §13).
|
|
381
|
+
this.ctx.waitUntil(this.tenantManager
|
|
382
|
+
.executePendingPurges(this.tenantId, { dbIds: new Set([this.dbId]) })
|
|
383
|
+
.catch((error) => console.error("[MindooDatabaseObject] executePendingPurges failed:", error)));
|
|
384
|
+
}
|
|
385
|
+
return received;
|
|
386
|
+
}
|
|
387
|
+
/** Directory object: one page of directory entries after `cursor`. */
|
|
388
|
+
async directoryChanges(request) {
|
|
389
|
+
const { cursor } = (await request.json());
|
|
390
|
+
const store = this.store(DIRECTORY_DB_ID, types_1.StoreKind.docs);
|
|
391
|
+
const page = await store.scanEntriesSince(cursor, DIRECTORY_PAGE_SIZE);
|
|
392
|
+
const entries = await store.getEntries(page.entries.map((entry) => entry.id));
|
|
393
|
+
return (0, http_1.jsonResponse)(200, {
|
|
394
|
+
entries: entries.map((entry) => (0, entryWireCodec_1.serializeStoreEntry)(entry)),
|
|
395
|
+
nextCursor: page.nextCursor,
|
|
396
|
+
hasMore: page.hasMore,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
// ==================== Internal routes ====================
|
|
400
|
+
async internal(path, request) {
|
|
401
|
+
const bytes = await this.rpcBytes.handle(path, request);
|
|
402
|
+
if (bytes)
|
|
403
|
+
return bytes;
|
|
404
|
+
switch (path) {
|
|
405
|
+
case "/internal/store-rpc":
|
|
406
|
+
return this.withPayloadSlot(() => this.storeRpc(request));
|
|
407
|
+
case "/internal/databases":
|
|
408
|
+
if (!this.isDirectory)
|
|
409
|
+
break;
|
|
410
|
+
return (0, http_1.jsonResponse)(200, { databases: [DIRECTORY_DB_ID, ...this.registeredDatabases()] });
|
|
411
|
+
case "/internal/directory/announce":
|
|
412
|
+
// Directory entries arrived by peer replication.
|
|
413
|
+
if (!this.isDirectory)
|
|
414
|
+
break;
|
|
415
|
+
this.notifyDatabasesOfDirectoryChange(this.tenantId);
|
|
416
|
+
return (0, http_1.jsonResponse)(200, { ok: true });
|
|
417
|
+
case "/internal/wipe":
|
|
418
|
+
return this.wipe();
|
|
419
|
+
case "/internal/directory/changed":
|
|
420
|
+
await this.loadTenantState();
|
|
421
|
+
await this.refreshDirectoryReplica(true);
|
|
422
|
+
return (0, http_1.jsonResponse)(200, { ok: true });
|
|
423
|
+
case "/internal/directory/changes":
|
|
424
|
+
if (!this.isDirectory)
|
|
425
|
+
break;
|
|
426
|
+
return this.directoryChanges(request);
|
|
427
|
+
case "/internal/events/publish":
|
|
428
|
+
if (!this.isDirectory)
|
|
429
|
+
break;
|
|
430
|
+
this.eventBus.publish((await request.json()));
|
|
431
|
+
return (0, http_1.jsonResponse)(200, { ok: true });
|
|
432
|
+
case "/internal/databases/register": {
|
|
433
|
+
if (!this.isDirectory)
|
|
434
|
+
break;
|
|
435
|
+
const { dbId } = (await request.json());
|
|
436
|
+
const databases = new Set(this.registeredDatabases());
|
|
437
|
+
databases.add(dbId);
|
|
438
|
+
this.dataStore.writeText(DATABASES_KEY, JSON.stringify([...databases].sort()));
|
|
439
|
+
return (0, http_1.jsonResponse)(200, { ok: true });
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return (0, http_1.jsonResponse)(404, { error: "Not found" });
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* This object's stores for peer replication in the server object. Pulled
|
|
446
|
+
* entries of purged documents are refused, as on Node.
|
|
447
|
+
*/
|
|
448
|
+
async storeRpc(request) {
|
|
449
|
+
const state = await this.loadTenantState();
|
|
450
|
+
if (!state.exists) {
|
|
451
|
+
return (0, http_1.jsonResponse)(404, { error: "Tenant not found" });
|
|
452
|
+
}
|
|
453
|
+
const tenantId = this.tenantId;
|
|
454
|
+
const dbId = this.dbId;
|
|
455
|
+
const server = new StoreRpcServer_1.StoreRpcServer({
|
|
456
|
+
bytes: this.rpcBytes,
|
|
457
|
+
createFactory: (scope) => ({
|
|
458
|
+
createStore: (requestedDbId) => {
|
|
459
|
+
if (scope !== tenantId || requestedDbId !== dbId) {
|
|
460
|
+
throw new Error(`Store RPC for ${scope}/${requestedDbId} reached ${tenantId}/${dbId}`);
|
|
461
|
+
}
|
|
462
|
+
const guard = (store) => dbId === DIRECTORY_DB_ID || !this.tenantManager
|
|
463
|
+
? store
|
|
464
|
+
: (0, purgedDocumentGuard_1.guardStoreAgainstPurgedDocuments)(store, async () => this.tenantManager.getPurgedDocIds(tenantId, dbId));
|
|
465
|
+
return {
|
|
466
|
+
docStore: guard(this.store(dbId, types_1.StoreKind.docs)),
|
|
467
|
+
attachmentStore: guard(this.store(dbId, types_1.StoreKind.attachments)),
|
|
468
|
+
};
|
|
469
|
+
},
|
|
470
|
+
}),
|
|
471
|
+
});
|
|
472
|
+
try {
|
|
473
|
+
const result = await server.handle((await request.json()));
|
|
474
|
+
if (dbId !== DIRECTORY_DB_ID) {
|
|
475
|
+
await this.registerWithDirectory();
|
|
476
|
+
}
|
|
477
|
+
return (0, http_1.jsonResponse)(200, { result });
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
return (0, http_1.jsonResponse)(500, { error: error instanceof Error ? error.message : String(error) });
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
/** Delete everything of a removed tenant (the directory object first wipes the others). */
|
|
484
|
+
async wipe() {
|
|
485
|
+
if (this.isDirectory) {
|
|
486
|
+
for (const dbId of this.registeredDatabases()) {
|
|
487
|
+
const response = await (0, host_1.databaseObject)(this.env, this.tenantId, dbId).fetch(`${http_1.INTERNAL_ORIGIN}/internal/wipe`, { method: "POST", headers: (0, host_1.internalHeaders)(this.tenantId, dbId) });
|
|
488
|
+
if (!response.ok) {
|
|
489
|
+
return (0, http_1.jsonResponse)(500, { error: `Wiping ${dbId} failed` });
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
if (this.env.MINDOODB_LARGE_ENTRIES) {
|
|
494
|
+
await (0, DurableObjectSql_1.deleteR2Prefix)(this.env.MINDOODB_LARGE_ENTRIES, this.r2Prefix());
|
|
495
|
+
}
|
|
496
|
+
await this.ctx.storage.deleteAll();
|
|
497
|
+
this.tenantState = null;
|
|
498
|
+
this.tenantManager = null;
|
|
499
|
+
this.core = null;
|
|
500
|
+
this.replicaCheckedAt = 0;
|
|
501
|
+
this.openStorage();
|
|
502
|
+
return (0, http_1.jsonResponse)(200, { ok: true });
|
|
503
|
+
}
|
|
504
|
+
// ==================== Public routes ====================
|
|
505
|
+
async public(request, url) {
|
|
506
|
+
const route = (0, http_1.matchRoute)(request.method, url.pathname);
|
|
507
|
+
if (route.kind !== "tenantAuth" &&
|
|
508
|
+
route.kind !== "timestamp" &&
|
|
509
|
+
route.kind !== "sync" &&
|
|
510
|
+
route.kind !== "tenantNotFound") {
|
|
511
|
+
return (0, http_1.jsonResponse)(404, { error: "Not found" });
|
|
512
|
+
}
|
|
513
|
+
await this.loadTenantState();
|
|
514
|
+
const core = this.core;
|
|
515
|
+
const parsed = await (0, http_1.toServerRequest)(request, {
|
|
516
|
+
params: { tenantId: route.tenantId },
|
|
517
|
+
jsonBodyLimitBytes: this.settings.jsonBodyLimitBytes,
|
|
518
|
+
});
|
|
519
|
+
if (parsed instanceof Response)
|
|
520
|
+
return parsed;
|
|
521
|
+
const req = parsed;
|
|
522
|
+
const rejection = core.tenantGuard(req);
|
|
523
|
+
if (rejection)
|
|
524
|
+
return (0, http_1.toResponse)(rejection);
|
|
525
|
+
const clientIp = req.clientIp ?? "unknown";
|
|
526
|
+
switch (route.kind) {
|
|
527
|
+
case "tenantNotFound":
|
|
528
|
+
return (0, http_1.jsonResponse)(404, { error: "Not found" });
|
|
529
|
+
case "tenantAuth": {
|
|
530
|
+
const limited = await (0, host_1.rateLimited)(this.env.MINDOODB_RATE_LIMIT_AUTH, (0, rateLimits_1.buildAuthRateLimitKey)("tenant", route.phase, req.tenantId, clientIp, req.body), "Too many authentication attempts, please try again later");
|
|
531
|
+
if (limited)
|
|
532
|
+
return limited;
|
|
533
|
+
return (0, http_1.toResponse)(route.phase === "challenge" ? await core.challenge(req) : await core.authenticate(req));
|
|
534
|
+
}
|
|
535
|
+
case "timestamp": {
|
|
536
|
+
const denied = await core.timestampAuthGuard(req);
|
|
537
|
+
if (denied)
|
|
538
|
+
return (0, http_1.toResponse)(denied);
|
|
539
|
+
const limited = await (0, host_1.rateLimited)(this.env.MINDOODB_RATE_LIMIT_TIMESTAMP, (0, rateLimits_1.buildTimestampRateLimitKey)("burst", req.tenantId, req.timestampPrincipal, clientIp), "Too many timestamp requests, please try again shortly");
|
|
540
|
+
if (limited)
|
|
541
|
+
return limited;
|
|
542
|
+
return (0, http_1.toResponse)(await core.timestampRequest(req));
|
|
543
|
+
}
|
|
544
|
+
case "sync":
|
|
545
|
+
return this.sync(request, req, route.storeKind, route.name);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
async sync(request, req, storeKind, name) {
|
|
549
|
+
const core = this.core;
|
|
550
|
+
await this.refreshDirectoryReplica(false);
|
|
551
|
+
await core.resolveSyncPrincipal(req);
|
|
552
|
+
const limited = await (0, host_1.rateLimited)(this.env.MINDOODB_RATE_LIMIT_SYNC, (0, rateLimits_1.buildSyncRateLimitKey)(req.tenantId, req.syncPrincipal, req.clientIp ?? "unknown"), "Too many sync requests, please try again later");
|
|
553
|
+
if (limited)
|
|
554
|
+
return limited;
|
|
555
|
+
if (name === "events") {
|
|
556
|
+
if (request.headers.get(http_1.INTERNAL_HEADER.eventsGatePassed) === "1") {
|
|
557
|
+
return this.openEventStream({ tenantId: req.tenantId, storeKind });
|
|
558
|
+
}
|
|
559
|
+
const response = await core.sync("events", req, storeKind);
|
|
560
|
+
return (0, types_2.isEventStreamResponse)(response)
|
|
561
|
+
? this.openEventStream(response.events)
|
|
562
|
+
: (0, http_1.toResponse)(response);
|
|
563
|
+
}
|
|
564
|
+
const carriesPayload = PAYLOAD_ROUTES.has(name);
|
|
565
|
+
const run = () => core.sync(name, req, storeKind);
|
|
566
|
+
let response = carriesPayload ? await this.withPayloadSlot(run) : await run();
|
|
567
|
+
// A grant or a new device key may have reached the directory a moment
|
|
568
|
+
// ago: refresh the replica once and retry a denied request.
|
|
569
|
+
if (!this.isDirectory &&
|
|
570
|
+
(response.status === 401 || response.status === 403 || response.status === 404) &&
|
|
571
|
+
(await this.refreshDirectoryReplica(true))) {
|
|
572
|
+
response = carriesPayload ? await this.withPayloadSlot(run) : await run();
|
|
573
|
+
}
|
|
574
|
+
return (0, http_1.toResponse)(response);
|
|
575
|
+
}
|
|
576
|
+
/** Server-Sent-Events stream on the tenant's event bus (directory object only). */
|
|
577
|
+
openEventStream(subscription) {
|
|
578
|
+
const { readable, writable } = new TransformStream();
|
|
579
|
+
const writer = writable.getWriter();
|
|
580
|
+
const encoder = new TextEncoder();
|
|
581
|
+
let closed = false;
|
|
582
|
+
const cleanup = () => {
|
|
583
|
+
if (closed)
|
|
584
|
+
return;
|
|
585
|
+
closed = true;
|
|
586
|
+
clearInterval(heartbeat);
|
|
587
|
+
unsubscribe();
|
|
588
|
+
writer.close().catch(() => undefined);
|
|
589
|
+
};
|
|
590
|
+
const write = (frame) => {
|
|
591
|
+
if (closed)
|
|
592
|
+
return;
|
|
593
|
+
writer.write(encoder.encode(frame)).catch(cleanup);
|
|
594
|
+
};
|
|
595
|
+
write((0, MindooDBServerCore_1.formatSyncHelloEvent)());
|
|
596
|
+
const unsubscribe = this.eventBus.subscribe((event) => {
|
|
597
|
+
const frame = (0, MindooDBServerCore_1.formatSyncChangeEvent)(subscription, event);
|
|
598
|
+
if (frame)
|
|
599
|
+
write(frame);
|
|
600
|
+
});
|
|
601
|
+
const heartbeat = setInterval(() => write((0, MindooDBServerCore_1.formatSyncHeartbeat)(Date.now())), MindooDBServerCore_1.SYNC_EVENT_HEARTBEAT_MS);
|
|
602
|
+
console.log(`[MindooDatabaseObject] SSE subscriber connected tenant=${subscription.tenantId} storeKind=${subscription.storeKind} subscribers=${this.eventBus.listenerCount}`);
|
|
603
|
+
return new Response(readable, {
|
|
604
|
+
status: 200,
|
|
605
|
+
headers: {
|
|
606
|
+
"content-type": "text/event-stream",
|
|
607
|
+
"cache-control": "no-cache, no-transform",
|
|
608
|
+
"x-accel-buffering": "no",
|
|
609
|
+
},
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
exports.MindooDatabaseObject = MindooDatabaseObject;
|
|
614
|
+
//# sourceMappingURL=MindooDatabaseObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MindooDatabaseObject.js","sourceRoot":"","sources":["../../src/cloudflare/MindooDatabaseObject.ts"],"names":[],"mappings":"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"}
|