mindoodb 0.0.85 → 0.0.86

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.
Files changed (235) hide show
  1. package/README-server.md +1 -0
  2. package/README.md +6 -4
  3. package/dist/cloudflare/DurableObjectSql.d.ts +56 -0
  4. package/dist/cloudflare/DurableObjectSql.d.ts.map +1 -0
  5. package/dist/cloudflare/DurableObjectSql.js +180 -0
  6. package/dist/cloudflare/DurableObjectSql.js.map +1 -0
  7. package/dist/cloudflare/MindooDatabaseObject.d.ts +86 -0
  8. package/dist/cloudflare/MindooDatabaseObject.d.ts.map +1 -0
  9. package/dist/cloudflare/MindooDatabaseObject.js +614 -0
  10. package/dist/cloudflare/MindooDatabaseObject.js.map +1 -0
  11. package/dist/cloudflare/MindooServerObject.d.ts +63 -0
  12. package/dist/cloudflare/MindooServerObject.d.ts.map +1 -0
  13. package/dist/cloudflare/MindooServerObject.js +521 -0
  14. package/dist/cloudflare/MindooServerObject.js.map +1 -0
  15. package/dist/cloudflare/WorkersCryptoAdapter.d.ts +7 -0
  16. package/dist/cloudflare/WorkersCryptoAdapter.d.ts.map +1 -0
  17. package/dist/cloudflare/WorkersCryptoAdapter.js +14 -0
  18. package/dist/cloudflare/WorkersCryptoAdapter.js.map +1 -0
  19. package/dist/cloudflare/host.d.ts +49 -0
  20. package/dist/cloudflare/host.d.ts.map +1 -0
  21. package/dist/cloudflare/host.js +104 -0
  22. package/dist/cloudflare/host.js.map +1 -0
  23. package/dist/cloudflare/http.d.ts +91 -0
  24. package/dist/cloudflare/http.d.ts.map +1 -0
  25. package/dist/cloudflare/http.js +266 -0
  26. package/dist/cloudflare/http.js.map +1 -0
  27. package/dist/cloudflare/index.d.ts +12 -0
  28. package/dist/cloudflare/index.d.ts.map +1 -0
  29. package/dist/cloudflare/index.js +20 -0
  30. package/dist/cloudflare/index.js.map +1 -0
  31. package/dist/cloudflare/storeRpc.d.ts +22 -0
  32. package/dist/cloudflare/storeRpc.d.ts.map +1 -0
  33. package/dist/cloudflare/storeRpc.js +85 -0
  34. package/dist/cloudflare/storeRpc.js.map +1 -0
  35. package/dist/cloudflare/types.d.ts +101 -0
  36. package/dist/cloudflare/types.d.ts.map +1 -0
  37. package/dist/cloudflare/types.js +10 -0
  38. package/dist/cloudflare/types.js.map +1 -0
  39. package/dist/cloudflare/worker.d.ts +25 -0
  40. package/dist/cloudflare/worker.d.ts.map +1 -0
  41. package/dist/cloudflare/worker.js +170 -0
  42. package/dist/cloudflare/worker.js.map +1 -0
  43. package/dist/core/BaseMindooDB.d.ts +28 -1
  44. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  45. package/dist/core/BaseMindooDB.js +180 -86
  46. package/dist/core/BaseMindooDB.js.map +1 -1
  47. package/dist/core/BaseMindooTenant.d.ts +14 -0
  48. package/dist/core/BaseMindooTenant.d.ts.map +1 -1
  49. package/dist/core/BaseMindooTenant.js +46 -0
  50. package/dist/core/BaseMindooTenant.js.map +1 -1
  51. package/dist/core/BaseMindooTenantDirectory.d.ts +10 -0
  52. package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
  53. package/dist/core/BaseMindooTenantDirectory.js +79 -8
  54. package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
  55. package/dist/core/ChangeDocDraft.d.ts +133 -0
  56. package/dist/core/ChangeDocDraft.d.ts.map +1 -0
  57. package/dist/core/ChangeDocDraft.js +492 -0
  58. package/dist/core/ChangeDocDraft.js.map +1 -0
  59. package/dist/core/appendonlystores/network/AuthenticationService.d.ts +8 -0
  60. package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
  61. package/dist/core/appendonlystores/network/AuthenticationService.js +19 -0
  62. package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
  63. package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
  64. package/dist/core/appendonlystores/network/IrohStreamIO.js +3 -23
  65. package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
  66. package/dist/core/appendonlystores/rpc/storeRpcCodec.d.ts.map +1 -1
  67. package/dist/core/appendonlystores/rpc/storeRpcCodec.js +3 -23
  68. package/dist/core/appendonlystores/rpc/storeRpcCodec.js.map +1 -1
  69. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -1
  70. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +21 -30
  71. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -1
  72. package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +37 -1
  73. package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -1
  74. package/dist/core/appendonlystores/sqlite/SqliteDriver.js +99 -40
  75. package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -1
  76. package/dist/core/expressions/evaluateExpression.d.ts +8 -0
  77. package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
  78. package/dist/core/expressions/evaluateExpression.js +29 -4
  79. package/dist/core/expressions/evaluateExpression.js.map +1 -1
  80. package/dist/core/expressions/metadata.js +4 -4
  81. package/dist/core/expressions/metadata.js.map +1 -1
  82. package/dist/core/types.d.ts +61 -2
  83. package/dist/core/types.d.ts.map +1 -1
  84. package/dist/core/types.js.map +1 -1
  85. package/dist/core/uri/MindooURI.d.ts.map +1 -1
  86. package/dist/core/uri/MindooURI.js +3 -24
  87. package/dist/core/uri/MindooURI.js.map +1 -1
  88. package/dist/core/utils/base64.d.ts +17 -0
  89. package/dist/core/utils/base64.d.ts.map +1 -0
  90. package/dist/core/utils/base64.js +54 -0
  91. package/dist/core/utils/base64.js.map +1 -0
  92. package/dist/core/utils/idGeneration.d.ts.map +1 -1
  93. package/dist/core/utils/idGeneration.js +14 -3
  94. package/dist/core/utils/idGeneration.js.map +1 -1
  95. package/dist/node/server/FsServerDataStore.d.ts +23 -0
  96. package/dist/node/server/FsServerDataStore.d.ts.map +1 -0
  97. package/dist/node/server/FsServerDataStore.js +59 -0
  98. package/dist/node/server/FsServerDataStore.js.map +1 -0
  99. package/dist/node/server/IrohServerEndpoint.d.ts +1 -1
  100. package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -1
  101. package/dist/node/server/IrohServerRpc.d.ts +5 -5
  102. package/dist/node/server/IrohServerRpc.d.ts.map +1 -1
  103. package/dist/node/server/IrohServerRpc.js +1 -1
  104. package/dist/node/server/IrohServerRpc.js.map +1 -1
  105. package/dist/node/server/MindooDBServer.d.ts +29 -150
  106. package/dist/node/server/MindooDBServer.d.ts.map +1 -1
  107. package/dist/node/server/MindooDBServer.js +160 -1573
  108. package/dist/node/server/MindooDBServer.js.map +1 -1
  109. package/dist/node/server/PurgedDocRegistry.d.ts +4 -27
  110. package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -1
  111. package/dist/node/server/PurgedDocRegistry.js +6 -83
  112. package/dist/node/server/PurgedDocRegistry.js.map +1 -1
  113. package/dist/node/server/StoreFactory.d.ts +1 -1
  114. package/dist/node/server/StoreFactory.d.ts.map +1 -1
  115. package/dist/node/server/TenantManager.d.ts +16 -284
  116. package/dist/node/server/TenantManager.d.ts.map +1 -1
  117. package/dist/node/server/TenantManager.js +35 -1168
  118. package/dist/node/server/TenantManager.js.map +1 -1
  119. package/dist/node/server/add-to-network.js +1 -1
  120. package/dist/node/server/add-to-network.js.map +1 -1
  121. package/dist/node/server/config.d.ts +11 -15
  122. package/dist/node/server/config.d.ts.map +1 -1
  123. package/dist/node/server/config.js +30 -245
  124. package/dist/node/server/config.js.map +1 -1
  125. package/dist/node/server/expressAdapter.d.ts +23 -0
  126. package/dist/node/server/expressAdapter.d.ts.map +1 -0
  127. package/dist/node/server/expressAdapter.js +108 -0
  128. package/dist/node/server/expressAdapter.js.map +1 -0
  129. package/dist/node/server/nativeIrohStreamIO.d.ts +1 -1
  130. package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
  131. package/dist/node/server/peer/FileClusterAuditStorage.d.ts +16 -0
  132. package/dist/node/server/peer/FileClusterAuditStorage.d.ts.map +1 -0
  133. package/dist/node/server/peer/FileClusterAuditStorage.js +39 -0
  134. package/dist/node/server/peer/FileClusterAuditStorage.js.map +1 -0
  135. package/dist/node/server/peer/IrohPeerLink.d.ts +1 -1
  136. package/dist/node/server/peer/IrohPeerLink.d.ts.map +1 -1
  137. package/dist/node/server/peer/routes.d.ts +10 -44
  138. package/dist/node/server/peer/routes.d.ts.map +1 -1
  139. package/dist/node/server/peer/routes.js +33 -275
  140. package/dist/node/server/peer/routes.js.map +1 -1
  141. package/dist/node/server/resolveServerPassword.js +1 -1
  142. package/dist/node/server/resolveServerPassword.js.map +1 -1
  143. package/dist/node/server/server.js +1 -1
  144. package/dist/node/server/server.js.map +1 -1
  145. package/dist/node/server/serverinit.js +1 -1
  146. package/dist/node/server/serverinit.js.map +1 -1
  147. package/dist/server/CapabilityMatcher.d.ts +60 -0
  148. package/dist/server/CapabilityMatcher.d.ts.map +1 -0
  149. package/dist/server/CapabilityMatcher.js +138 -0
  150. package/dist/server/CapabilityMatcher.js.map +1 -0
  151. package/dist/server/DeviceDiscoveryService.d.ts +36 -0
  152. package/dist/server/DeviceDiscoveryService.d.ts.map +1 -0
  153. package/dist/server/DeviceDiscoveryService.js +165 -0
  154. package/dist/server/DeviceDiscoveryService.js.map +1 -0
  155. package/dist/server/PurgedDocRegistry.d.ts +35 -0
  156. package/dist/server/PurgedDocRegistry.d.ts.map +1 -0
  157. package/dist/server/PurgedDocRegistry.js +90 -0
  158. package/dist/server/PurgedDocRegistry.js.map +1 -0
  159. package/dist/server/ServerDataStore.d.ts +67 -0
  160. package/dist/server/ServerDataStore.d.ts.map +1 -0
  161. package/dist/server/ServerDataStore.js +88 -0
  162. package/dist/server/ServerDataStore.js.map +1 -0
  163. package/dist/server/SyncEventBus.d.ts +39 -0
  164. package/dist/server/SyncEventBus.d.ts.map +1 -0
  165. package/dist/server/SyncEventBus.js +41 -0
  166. package/dist/server/SyncEventBus.js.map +1 -0
  167. package/dist/server/SystemAdminAuth.d.ts +82 -0
  168. package/dist/server/SystemAdminAuth.d.ts.map +1 -0
  169. package/dist/server/SystemAdminAuth.js +228 -0
  170. package/dist/server/SystemAdminAuth.js.map +1 -0
  171. package/dist/server/TenantManager.d.ts +330 -0
  172. package/dist/server/TenantManager.d.ts.map +1 -0
  173. package/dist/server/TenantManager.js +1186 -0
  174. package/dist/server/TenantManager.js.map +1 -0
  175. package/dist/server/http/MindooDBServerCore.d.ts +313 -0
  176. package/dist/server/http/MindooDBServerCore.d.ts.map +1 -0
  177. package/dist/server/http/MindooDBServerCore.js +1403 -0
  178. package/dist/server/http/MindooDBServerCore.js.map +1 -0
  179. package/dist/server/http/types.d.ts +89 -0
  180. package/dist/server/http/types.d.ts.map +1 -0
  181. package/dist/server/http/types.js +29 -0
  182. package/dist/server/http/types.js.map +1 -0
  183. package/dist/server/index.d.ts +32 -0
  184. package/dist/server/index.d.ts.map +1 -0
  185. package/dist/server/index.js +76 -0
  186. package/dist/server/index.js.map +1 -0
  187. package/dist/server/peer/ClusterAuditLog.d.ts +71 -0
  188. package/dist/server/peer/ClusterAuditLog.d.ts.map +1 -0
  189. package/dist/server/peer/ClusterAuditLog.js +81 -0
  190. package/dist/server/peer/ClusterAuditLog.js.map +1 -0
  191. package/dist/server/peer/ClusterJobRunner.d.ts +43 -0
  192. package/dist/server/peer/ClusterJobRunner.d.ts.map +1 -0
  193. package/dist/server/peer/ClusterJobRunner.js +119 -0
  194. package/dist/server/peer/ClusterJobRunner.js.map +1 -0
  195. package/dist/server/peer/ClusterManager.d.ts +149 -0
  196. package/dist/server/peer/ClusterManager.d.ts.map +1 -0
  197. package/dist/server/peer/ClusterManager.js +292 -0
  198. package/dist/server/peer/ClusterManager.js.map +1 -0
  199. package/dist/server/peer/PeerAuthService.d.ts +69 -0
  200. package/dist/server/peer/PeerAuthService.d.ts.map +1 -0
  201. package/dist/server/peer/PeerAuthService.js +208 -0
  202. package/dist/server/peer/PeerAuthService.js.map +1 -0
  203. package/dist/server/peer/PeerReplicator.d.ts +303 -0
  204. package/dist/server/peer/PeerReplicator.d.ts.map +1 -0
  205. package/dist/server/peer/PeerReplicator.js +1071 -0
  206. package/dist/server/peer/PeerReplicator.js.map +1 -0
  207. package/dist/server/peer/clusterHttp.d.ts +113 -0
  208. package/dist/server/peer/clusterHttp.d.ts.map +1 -0
  209. package/dist/server/peer/clusterHttp.js +290 -0
  210. package/dist/server/peer/clusterHttp.js.map +1 -0
  211. package/dist/server/peer/types.d.ts +244 -0
  212. package/dist/server/peer/types.d.ts.map +1 -0
  213. package/dist/server/peer/types.js +189 -0
  214. package/dist/server/peer/types.js.map +1 -0
  215. package/dist/server/rateLimits.d.ts +119 -0
  216. package/dist/server/rateLimits.d.ts.map +1 -0
  217. package/dist/server/rateLimits.js +159 -0
  218. package/dist/server/rateLimits.js.map +1 -0
  219. package/dist/server/serverConfig.d.ts +37 -0
  220. package/dist/server/serverConfig.d.ts.map +1 -0
  221. package/dist/server/serverConfig.js +251 -0
  222. package/dist/server/serverConfig.js.map +1 -0
  223. package/dist/server/timestampProxy.d.ts +129 -0
  224. package/dist/server/timestampProxy.d.ts.map +1 -0
  225. package/dist/server/timestampProxy.js +361 -0
  226. package/dist/server/timestampProxy.js.map +1 -0
  227. package/dist/server/types.d.ts +267 -0
  228. package/dist/server/types.d.ts.map +1 -0
  229. package/dist/server/types.js +56 -0
  230. package/dist/server/types.js.map +1 -0
  231. package/dist/server/validation.d.ts +43 -0
  232. package/dist/server/validation.d.ts.map +1 -0
  233. package/dist/server/validation.js +104 -0
  234. package/dist/server/validation.js.map +1 -0
  235. 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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"}