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.
Files changed (319) hide show
  1. package/README-server.md +6 -2
  2. package/README.md +6 -4
  3. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
  4. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +2 -1
  5. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
  6. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +151 -12
  7. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
  8. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +340 -24
  9. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
  10. package/dist/browser/index.mjs +14 -0
  11. package/dist/cloudflare/DurableObjectSql.d.ts +56 -0
  12. package/dist/cloudflare/DurableObjectSql.d.ts.map +1 -0
  13. package/dist/cloudflare/DurableObjectSql.js +180 -0
  14. package/dist/cloudflare/DurableObjectSql.js.map +1 -0
  15. package/dist/cloudflare/MindooDatabaseObject.d.ts +86 -0
  16. package/dist/cloudflare/MindooDatabaseObject.d.ts.map +1 -0
  17. package/dist/cloudflare/MindooDatabaseObject.js +614 -0
  18. package/dist/cloudflare/MindooDatabaseObject.js.map +1 -0
  19. package/dist/cloudflare/MindooServerObject.d.ts +63 -0
  20. package/dist/cloudflare/MindooServerObject.d.ts.map +1 -0
  21. package/dist/cloudflare/MindooServerObject.js +521 -0
  22. package/dist/cloudflare/MindooServerObject.js.map +1 -0
  23. package/dist/cloudflare/WorkersCryptoAdapter.d.ts +7 -0
  24. package/dist/cloudflare/WorkersCryptoAdapter.d.ts.map +1 -0
  25. package/dist/cloudflare/WorkersCryptoAdapter.js +14 -0
  26. package/dist/cloudflare/WorkersCryptoAdapter.js.map +1 -0
  27. package/dist/cloudflare/host.d.ts +49 -0
  28. package/dist/cloudflare/host.d.ts.map +1 -0
  29. package/dist/cloudflare/host.js +104 -0
  30. package/dist/cloudflare/host.js.map +1 -0
  31. package/dist/cloudflare/http.d.ts +91 -0
  32. package/dist/cloudflare/http.d.ts.map +1 -0
  33. package/dist/cloudflare/http.js +266 -0
  34. package/dist/cloudflare/http.js.map +1 -0
  35. package/dist/cloudflare/index.d.ts +12 -0
  36. package/dist/cloudflare/index.d.ts.map +1 -0
  37. package/dist/cloudflare/index.js +20 -0
  38. package/dist/cloudflare/index.js.map +1 -0
  39. package/dist/cloudflare/storeRpc.d.ts +22 -0
  40. package/dist/cloudflare/storeRpc.d.ts.map +1 -0
  41. package/dist/cloudflare/storeRpc.js +85 -0
  42. package/dist/cloudflare/storeRpc.js.map +1 -0
  43. package/dist/cloudflare/types.d.ts +101 -0
  44. package/dist/cloudflare/types.d.ts.map +1 -0
  45. package/dist/cloudflare/types.js +10 -0
  46. package/dist/cloudflare/types.js.map +1 -0
  47. package/dist/cloudflare/worker.d.ts +25 -0
  48. package/dist/cloudflare/worker.d.ts.map +1 -0
  49. package/dist/cloudflare/worker.js +170 -0
  50. package/dist/cloudflare/worker.js.map +1 -0
  51. package/dist/core/BaseMindooDB.d.ts +95 -10
  52. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  53. package/dist/core/BaseMindooDB.js +441 -98
  54. package/dist/core/BaseMindooDB.js.map +1 -1
  55. package/dist/core/BaseMindooTenant.d.ts +43 -0
  56. package/dist/core/BaseMindooTenant.d.ts.map +1 -1
  57. package/dist/core/BaseMindooTenant.js +157 -6
  58. package/dist/core/BaseMindooTenant.js.map +1 -1
  59. package/dist/core/BaseMindooTenantDirectory.d.ts +103 -0
  60. package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
  61. package/dist/core/BaseMindooTenantDirectory.js +371 -8
  62. package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
  63. package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
  64. package/dist/core/BaseMindooTenantFactory.js +2 -1
  65. package/dist/core/BaseMindooTenantFactory.js.map +1 -1
  66. package/dist/core/ChangeDocDraft.d.ts +133 -0
  67. package/dist/core/ChangeDocDraft.d.ts.map +1 -0
  68. package/dist/core/ChangeDocDraft.js +492 -0
  69. package/dist/core/ChangeDocDraft.js.map +1 -0
  70. package/dist/core/MindooDBServerAdmin.d.ts.map +1 -1
  71. package/dist/core/MindooDBServerAdmin.js +2 -1
  72. package/dist/core/MindooDBServerAdmin.js.map +1 -1
  73. package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -1
  74. package/dist/core/accesscontrol/directoryProjection.js +19 -0
  75. package/dist/core/accesscontrol/directoryProjection.js.map +1 -1
  76. package/dist/core/accesscontrol/evaluate.d.ts +14 -0
  77. package/dist/core/accesscontrol/evaluate.d.ts.map +1 -1
  78. package/dist/core/accesscontrol/evaluate.js +42 -1
  79. package/dist/core/accesscontrol/evaluate.js.map +1 -1
  80. package/dist/core/accesscontrol/types.d.ts +88 -4
  81. package/dist/core/accesscontrol/types.d.ts.map +1 -1
  82. package/dist/core/accesscontrol/types.js +114 -1
  83. package/dist/core/accesscontrol/types.js.map +1 -1
  84. package/dist/core/appendonlystores/network/AuthenticationService.d.ts +14 -0
  85. package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
  86. package/dist/core/appendonlystores/network/AuthenticationService.js +27 -7
  87. package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
  88. package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts.map +1 -1
  89. package/dist/core/appendonlystores/network/IrohNetworkTransport.js +12 -0
  90. package/dist/core/appendonlystores/network/IrohNetworkTransport.js.map +1 -1
  91. package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
  92. package/dist/core/appendonlystores/network/IrohStreamIO.js +3 -23
  93. package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
  94. package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.d.ts +6 -0
  95. package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.d.ts.map +1 -1
  96. package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.js +20 -1
  97. package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.js.map +1 -1
  98. package/dist/core/appendonlystores/rpc/storeRpcCodec.d.ts.map +1 -1
  99. package/dist/core/appendonlystores/rpc/storeRpcCodec.js +3 -23
  100. package/dist/core/appendonlystores/rpc/storeRpcCodec.js.map +1 -1
  101. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts +7 -0
  102. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -1
  103. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +39 -30
  104. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -1
  105. package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +37 -1
  106. package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -1
  107. package/dist/core/appendonlystores/sqlite/SqliteDriver.js +99 -40
  108. package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -1
  109. package/dist/core/appendonlystores/syncStores.d.ts.map +1 -1
  110. package/dist/core/appendonlystores/syncStores.js +25 -5
  111. package/dist/core/appendonlystores/syncStores.js.map +1 -1
  112. package/dist/core/appendonlystores/types.d.ts +7 -1
  113. package/dist/core/appendonlystores/types.d.ts.map +1 -1
  114. package/dist/core/appendonlystores/types.js +1 -0
  115. package/dist/core/appendonlystores/types.js.map +1 -1
  116. package/dist/core/builtinDbInvariants.d.ts +49 -0
  117. package/dist/core/builtinDbInvariants.d.ts.map +1 -1
  118. package/dist/core/builtinDbInvariants.js +86 -1
  119. package/dist/core/builtinDbInvariants.js.map +1 -1
  120. package/dist/core/crypto/AuthChallenge.d.ts +68 -0
  121. package/dist/core/crypto/AuthChallenge.d.ts.map +1 -0
  122. package/dist/core/crypto/AuthChallenge.js +118 -0
  123. package/dist/core/crypto/AuthChallenge.js.map +1 -0
  124. package/dist/core/crypto/DomainStatement.d.ts +5 -3
  125. package/dist/core/crypto/DomainStatement.d.ts.map +1 -1
  126. package/dist/core/crypto/DomainStatement.js +5 -3
  127. package/dist/core/crypto/DomainStatement.js.map +1 -1
  128. package/dist/core/crypto/encryptedFields.d.ts +11 -0
  129. package/dist/core/crypto/encryptedFields.d.ts.map +1 -1
  130. package/dist/core/crypto/encryptedFields.js +18 -0
  131. package/dist/core/crypto/encryptedFields.js.map +1 -1
  132. package/dist/core/expressions/evaluateExpression.d.ts +8 -0
  133. package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
  134. package/dist/core/expressions/evaluateExpression.js +29 -4
  135. package/dist/core/expressions/evaluateExpression.js.map +1 -1
  136. package/dist/core/expressions/metadata.js +4 -4
  137. package/dist/core/expressions/metadata.js.map +1 -1
  138. package/dist/core/index.d.ts +3 -3
  139. package/dist/core/index.d.ts.map +1 -1
  140. package/dist/core/index.js +17 -6
  141. package/dist/core/index.js.map +1 -1
  142. package/dist/core/query/executeQuery.d.ts.map +1 -1
  143. package/dist/core/query/executeQuery.js +5 -1
  144. package/dist/core/query/executeQuery.js.map +1 -1
  145. package/dist/core/query/executeQueryInclude.d.ts.map +1 -1
  146. package/dist/core/query/executeQueryInclude.js +2 -0
  147. package/dist/core/query/executeQueryInclude.js.map +1 -1
  148. package/dist/core/query/queryView.d.ts.map +1 -1
  149. package/dist/core/query/queryView.js +5 -1
  150. package/dist/core/query/queryView.js.map +1 -1
  151. package/dist/core/types.d.ts +204 -10
  152. package/dist/core/types.d.ts.map +1 -1
  153. package/dist/core/types.js.map +1 -1
  154. package/dist/core/uri/MindooURI.d.ts.map +1 -1
  155. package/dist/core/uri/MindooURI.js +3 -24
  156. package/dist/core/uri/MindooURI.js.map +1 -1
  157. package/dist/core/userkeys/index.d.ts +1 -0
  158. package/dist/core/userkeys/index.d.ts.map +1 -1
  159. package/dist/core/userkeys/index.js +5 -1
  160. package/dist/core/userkeys/index.js.map +1 -1
  161. package/dist/core/userkeys/sealedValues.d.ts +54 -0
  162. package/dist/core/userkeys/sealedValues.d.ts.map +1 -0
  163. package/dist/core/userkeys/sealedValues.js +67 -0
  164. package/dist/core/userkeys/sealedValues.js.map +1 -0
  165. package/dist/core/utils/base64.d.ts +17 -0
  166. package/dist/core/utils/base64.d.ts.map +1 -0
  167. package/dist/core/utils/base64.js +54 -0
  168. package/dist/core/utils/base64.js.map +1 -0
  169. package/dist/core/utils/dynamicImportInterop.d.ts +10 -0
  170. package/dist/core/utils/dynamicImportInterop.d.ts.map +1 -0
  171. package/dist/core/utils/dynamicImportInterop.js +22 -0
  172. package/dist/core/utils/dynamicImportInterop.js.map +1 -0
  173. package/dist/core/utils/idGeneration.d.ts.map +1 -1
  174. package/dist/core/utils/idGeneration.js +14 -3
  175. package/dist/core/utils/idGeneration.js.map +1 -1
  176. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
  177. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +7 -0
  178. package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
  179. package/dist/node/server/FsServerDataStore.d.ts +23 -0
  180. package/dist/node/server/FsServerDataStore.d.ts.map +1 -0
  181. package/dist/node/server/FsServerDataStore.js +59 -0
  182. package/dist/node/server/FsServerDataStore.js.map +1 -0
  183. package/dist/node/server/IrohServerEndpoint.d.ts +1 -1
  184. package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -1
  185. package/dist/node/server/IrohServerRpc.d.ts +5 -5
  186. package/dist/node/server/IrohServerRpc.d.ts.map +1 -1
  187. package/dist/node/server/IrohServerRpc.js +1 -1
  188. package/dist/node/server/IrohServerRpc.js.map +1 -1
  189. package/dist/node/server/MindooDBServer.d.ts +29 -150
  190. package/dist/node/server/MindooDBServer.d.ts.map +1 -1
  191. package/dist/node/server/MindooDBServer.js +160 -1573
  192. package/dist/node/server/MindooDBServer.js.map +1 -1
  193. package/dist/node/server/PurgedDocRegistry.d.ts +4 -27
  194. package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -1
  195. package/dist/node/server/PurgedDocRegistry.js +6 -83
  196. package/dist/node/server/PurgedDocRegistry.js.map +1 -1
  197. package/dist/node/server/StoreFactory.d.ts +1 -1
  198. package/dist/node/server/StoreFactory.d.ts.map +1 -1
  199. package/dist/node/server/TenantManager.d.ts +16 -284
  200. package/dist/node/server/TenantManager.d.ts.map +1 -1
  201. package/dist/node/server/TenantManager.js +35 -1168
  202. package/dist/node/server/TenantManager.js.map +1 -1
  203. package/dist/node/server/add-to-network.js +1 -1
  204. package/dist/node/server/add-to-network.js.map +1 -1
  205. package/dist/node/server/config.d.ts +11 -15
  206. package/dist/node/server/config.d.ts.map +1 -1
  207. package/dist/node/server/config.js +30 -245
  208. package/dist/node/server/config.js.map +1 -1
  209. package/dist/node/server/expressAdapter.d.ts +23 -0
  210. package/dist/node/server/expressAdapter.d.ts.map +1 -0
  211. package/dist/node/server/expressAdapter.js +108 -0
  212. package/dist/node/server/expressAdapter.js.map +1 -0
  213. package/dist/node/server/nativeIrohStreamIO.d.ts +1 -1
  214. package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
  215. package/dist/node/server/peer/FileClusterAuditStorage.d.ts +16 -0
  216. package/dist/node/server/peer/FileClusterAuditStorage.d.ts.map +1 -0
  217. package/dist/node/server/peer/FileClusterAuditStorage.js +39 -0
  218. package/dist/node/server/peer/FileClusterAuditStorage.js.map +1 -0
  219. package/dist/node/server/peer/IrohPeerLink.d.ts +1 -1
  220. package/dist/node/server/peer/IrohPeerLink.d.ts.map +1 -1
  221. package/dist/node/server/peer/routes.d.ts +10 -44
  222. package/dist/node/server/peer/routes.d.ts.map +1 -1
  223. package/dist/node/server/peer/routes.js +33 -275
  224. package/dist/node/server/peer/routes.js.map +1 -1
  225. package/dist/node/server/resolveServerPassword.js +1 -1
  226. package/dist/node/server/resolveServerPassword.js.map +1 -1
  227. package/dist/node/server/server.js +1 -1
  228. package/dist/node/server/server.js.map +1 -1
  229. package/dist/node/server/serverinit.js +1 -1
  230. package/dist/node/server/serverinit.js.map +1 -1
  231. package/dist/server/CapabilityMatcher.d.ts +60 -0
  232. package/dist/server/CapabilityMatcher.d.ts.map +1 -0
  233. package/dist/server/CapabilityMatcher.js +138 -0
  234. package/dist/server/CapabilityMatcher.js.map +1 -0
  235. package/dist/server/DeviceDiscoveryService.d.ts +36 -0
  236. package/dist/server/DeviceDiscoveryService.d.ts.map +1 -0
  237. package/dist/server/DeviceDiscoveryService.js +164 -0
  238. package/dist/server/DeviceDiscoveryService.js.map +1 -0
  239. package/dist/server/PurgedDocRegistry.d.ts +35 -0
  240. package/dist/server/PurgedDocRegistry.d.ts.map +1 -0
  241. package/dist/server/PurgedDocRegistry.js +90 -0
  242. package/dist/server/PurgedDocRegistry.js.map +1 -0
  243. package/dist/server/ServerDataStore.d.ts +67 -0
  244. package/dist/server/ServerDataStore.d.ts.map +1 -0
  245. package/dist/server/ServerDataStore.js +88 -0
  246. package/dist/server/ServerDataStore.js.map +1 -0
  247. package/dist/server/SyncEventBus.d.ts +39 -0
  248. package/dist/server/SyncEventBus.d.ts.map +1 -0
  249. package/dist/server/SyncEventBus.js +41 -0
  250. package/dist/server/SyncEventBus.js.map +1 -0
  251. package/dist/server/SystemAdminAuth.d.ts +82 -0
  252. package/dist/server/SystemAdminAuth.d.ts.map +1 -0
  253. package/dist/server/SystemAdminAuth.js +227 -0
  254. package/dist/server/SystemAdminAuth.js.map +1 -0
  255. package/dist/server/TenantManager.d.ts +366 -0
  256. package/dist/server/TenantManager.d.ts.map +1 -0
  257. package/dist/server/TenantManager.js +1416 -0
  258. package/dist/server/TenantManager.js.map +1 -0
  259. package/dist/server/http/MindooDBServerCore.d.ts +313 -0
  260. package/dist/server/http/MindooDBServerCore.d.ts.map +1 -0
  261. package/dist/server/http/MindooDBServerCore.js +1410 -0
  262. package/dist/server/http/MindooDBServerCore.js.map +1 -0
  263. package/dist/server/http/types.d.ts +89 -0
  264. package/dist/server/http/types.d.ts.map +1 -0
  265. package/dist/server/http/types.js +29 -0
  266. package/dist/server/http/types.js.map +1 -0
  267. package/dist/server/index.d.ts +32 -0
  268. package/dist/server/index.d.ts.map +1 -0
  269. package/dist/server/index.js +76 -0
  270. package/dist/server/index.js.map +1 -0
  271. package/dist/server/peer/ClusterAuditLog.d.ts +71 -0
  272. package/dist/server/peer/ClusterAuditLog.d.ts.map +1 -0
  273. package/dist/server/peer/ClusterAuditLog.js +81 -0
  274. package/dist/server/peer/ClusterAuditLog.js.map +1 -0
  275. package/dist/server/peer/ClusterJobRunner.d.ts +43 -0
  276. package/dist/server/peer/ClusterJobRunner.d.ts.map +1 -0
  277. package/dist/server/peer/ClusterJobRunner.js +119 -0
  278. package/dist/server/peer/ClusterJobRunner.js.map +1 -0
  279. package/dist/server/peer/ClusterManager.d.ts +149 -0
  280. package/dist/server/peer/ClusterManager.d.ts.map +1 -0
  281. package/dist/server/peer/ClusterManager.js +292 -0
  282. package/dist/server/peer/ClusterManager.js.map +1 -0
  283. package/dist/server/peer/PeerAuthService.d.ts +69 -0
  284. package/dist/server/peer/PeerAuthService.d.ts.map +1 -0
  285. package/dist/server/peer/PeerAuthService.js +207 -0
  286. package/dist/server/peer/PeerAuthService.js.map +1 -0
  287. package/dist/server/peer/PeerReplicator.d.ts +303 -0
  288. package/dist/server/peer/PeerReplicator.d.ts.map +1 -0
  289. package/dist/server/peer/PeerReplicator.js +1072 -0
  290. package/dist/server/peer/PeerReplicator.js.map +1 -0
  291. package/dist/server/peer/clusterHttp.d.ts +113 -0
  292. package/dist/server/peer/clusterHttp.d.ts.map +1 -0
  293. package/dist/server/peer/clusterHttp.js +290 -0
  294. package/dist/server/peer/clusterHttp.js.map +1 -0
  295. package/dist/server/peer/types.d.ts +244 -0
  296. package/dist/server/peer/types.d.ts.map +1 -0
  297. package/dist/server/peer/types.js +189 -0
  298. package/dist/server/peer/types.js.map +1 -0
  299. package/dist/server/rateLimits.d.ts +119 -0
  300. package/dist/server/rateLimits.d.ts.map +1 -0
  301. package/dist/server/rateLimits.js +159 -0
  302. package/dist/server/rateLimits.js.map +1 -0
  303. package/dist/server/serverConfig.d.ts +37 -0
  304. package/dist/server/serverConfig.d.ts.map +1 -0
  305. package/dist/server/serverConfig.js +251 -0
  306. package/dist/server/serverConfig.js.map +1 -0
  307. package/dist/server/timestampProxy.d.ts +129 -0
  308. package/dist/server/timestampProxy.d.ts.map +1 -0
  309. package/dist/server/timestampProxy.js +361 -0
  310. package/dist/server/timestampProxy.js.map +1 -0
  311. package/dist/server/types.d.ts +267 -0
  312. package/dist/server/types.d.ts.map +1 -0
  313. package/dist/server/types.js +56 -0
  314. package/dist/server/types.js.map +1 -0
  315. package/dist/server/validation.d.ts +43 -0
  316. package/dist/server/validation.d.ts.map +1 -0
  317. package/dist/server/validation.js +104 -0
  318. package/dist/server/validation.js.map +1 -0
  319. 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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"}