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 @@
1
+ {"version":3,"file":"PeerAuthService.d.ts","sourceRoot":"","sources":["../../../src/server/peer/PeerAuthService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAeD,qBAAa,eAAe;IAUxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAXrC,OAAO,CAAC,UAAU,CAA2C;IAC7D,gFAAgF;IAChF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAU;IAEhD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAGxB,aAAa,EAAE,aAAa;IAC7C,wEAAwE;IACvD,kBAAkB,EAAE,MAAM,aAAa,EAAE,EAC1D,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,UAAU,CAAC;QACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IAQH,4EAA4E;IAC5E,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IASnE;;;;OAIG;IACG,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBzD,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BhE;;;;OAIG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAsCtD,eAAe;YAyBf,aAAa;IAyB3B,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,kBAAkB;CAQ3B"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ /**
3
+ * Peer (server-to-server) authentication for `/system/peer/*`.
4
+ *
5
+ * Same Ed25519 challenge-response as the tenant sync handshake, but the key
6
+ * lookup goes to `trusted-servers.json` instead of a tenant directory. The
7
+ * issued JWT is deliberately a **different token class** from the system-admin
8
+ * JWT: `/system/peer/*` accepts only peer tokens and `/system/cluster/*` only
9
+ * admin tokens, so a peer can never administer this node and an admin can never
10
+ * write as a peer.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PeerAuthService = void 0;
14
+ const AuthChallenge_1 = require("../../core/crypto/AuthChallenge");
15
+ /** Whitespace-insensitive PEM comparison (JSON transport reflows line endings). */
16
+ function normalizePem(pem) {
17
+ return pem.replace(/\s+/g, "");
18
+ }
19
+ class PeerAuthService {
20
+ constructor(cryptoAdapter,
21
+ /** Live view of `trusted-servers.json` — re-read on every handshake. */
22
+ listTrustedServers, options) {
23
+ this.cryptoAdapter = cryptoAdapter;
24
+ this.listTrustedServers = listTrustedServers;
25
+ this.challenges = new Map();
26
+ this.jwtSecret =
27
+ options?.jwtSecret ?? cryptoAdapter.getRandomValues(new Uint8Array(32));
28
+ this.challengeExpirationMs = options?.challengeExpirationMs ?? 5 * 60 * 1000;
29
+ this.tokenExpirationMs = options?.tokenExpirationMs ?? 60 * 60 * 1000;
30
+ }
31
+ /** Resolve a trusted server by its signing key (the canonical identity). */
32
+ findTrustedServerByKey(publicsignkey) {
33
+ const wanted = normalizePem(publicsignkey);
34
+ return (this.listTrustedServers().find((server) => normalizePem(server.signingPublicKey) === wanted) ?? null);
35
+ }
36
+ /**
37
+ * Issue a challenge for a peer identified by its signing key.
38
+ *
39
+ * @throws Error("Unknown peer") when the key is not in trusted-servers.json.
40
+ */
41
+ async generateChallenge(publicsignkey) {
42
+ const server = this.findTrustedServerByKey(publicsignkey);
43
+ if (!server) {
44
+ throw new Error("Unknown peer");
45
+ }
46
+ const challenge = (0, AuthChallenge_1.issueAuthChallenge)();
47
+ this.challenges.set(challenge, {
48
+ challenge,
49
+ serverName: server.name,
50
+ publicsignkey: server.signingPublicKey,
51
+ expiresAt: Date.now() + this.challengeExpirationMs,
52
+ used: false,
53
+ });
54
+ this.cleanupExpiredChallenges();
55
+ this.evictChallengesOverCap();
56
+ return challenge;
57
+ }
58
+ async authenticate(challenge, signature) {
59
+ const stored = this.challenges.get(challenge);
60
+ if (!stored) {
61
+ return { success: false, error: "Challenge not found or expired" };
62
+ }
63
+ if (Date.now() > stored.expiresAt) {
64
+ this.challenges.delete(challenge);
65
+ return { success: false, error: "Challenge expired" };
66
+ }
67
+ if (stored.used) {
68
+ return { success: false, error: "Challenge already used" };
69
+ }
70
+ stored.used = true;
71
+ // Re-resolve against the live trust list: an operator may have removed the
72
+ // peer between challenge and response.
73
+ if (!this.findTrustedServerByKey(stored.publicsignkey)) {
74
+ return { success: false, error: "Peer is no longer trusted" };
75
+ }
76
+ const valid = await this.verifySignature(challenge, signature, stored.publicsignkey);
77
+ if (!valid) {
78
+ return { success: false, error: "Invalid signature" };
79
+ }
80
+ const token = await this.generateToken(stored.serverName, stored.publicsignkey);
81
+ return { success: true, token };
82
+ }
83
+ /**
84
+ * Validate a peer JWT. Returns null unless the token carries `peer: true`
85
+ * *and* the signing key is still trusted — revoking trust must cut off
86
+ * outstanding tokens, not just future handshakes.
87
+ */
88
+ async validateToken(token) {
89
+ const parts = token.split(".");
90
+ if (parts.length !== 3)
91
+ return null;
92
+ const [headerB64, payloadB64, signatureB64] = parts;
93
+ try {
94
+ // Pin the algorithm to HS256 to block algorithm-confusion attacks.
95
+ const header = JSON.parse(this.base64UrlDecode(headerB64));
96
+ if (header.alg !== "HS256")
97
+ return null;
98
+ const subtle = this.cryptoAdapter.getSubtle();
99
+ const signingKey = await subtle.importKey("raw", this.jwtSecret.buffer, { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
100
+ const dataToVerify = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
101
+ const sig = this.base64UrlToUint8Array(signatureB64);
102
+ const isValid = await subtle.verify("HMAC", signingKey, sig.buffer.slice(sig.byteOffset, sig.byteOffset + sig.byteLength), dataToVerify.buffer);
103
+ if (!isValid)
104
+ return null;
105
+ const payload = JSON.parse(this.base64UrlDecode(payloadB64));
106
+ if (payload.peer !== true)
107
+ return null;
108
+ if (payload.exp < Math.floor(Date.now() / 1000))
109
+ return null;
110
+ if (!this.findTrustedServerByKey(payload.publicsignkey))
111
+ return null;
112
+ return payload;
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ async verifySignature(message, signature, publicKeyPem) {
119
+ const subtle = this.cryptoAdapter.getSubtle();
120
+ try {
121
+ const pemContents = publicKeyPem
122
+ .replace(/-----BEGIN PUBLIC KEY-----/g, "")
123
+ .replace(/-----END PUBLIC KEY-----/g, "")
124
+ .replace(/\s/g, "");
125
+ const keyData = this.base64ToUint8Array(pemContents);
126
+ const publicKey = await subtle.importKey("spki", keyData.buffer, { name: "Ed25519" }, false, ["verify"]);
127
+ return await (0, AuthChallenge_1.verifyAuthChallengeSignature)(subtle, publicKey, message, signature);
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ async generateToken(serverName, publicsignkey) {
134
+ const subtle = this.cryptoAdapter.getSubtle();
135
+ const now = Math.floor(Date.now() / 1000);
136
+ const payload = {
137
+ sub: serverName,
138
+ publicsignkey,
139
+ peer: true,
140
+ iat: now,
141
+ exp: now + Math.floor(this.tokenExpirationMs / 1000),
142
+ };
143
+ const headerB64 = this.base64UrlEncode(JSON.stringify({ alg: "HS256", typ: "JWT" }));
144
+ const payloadB64 = this.base64UrlEncode(JSON.stringify(payload));
145
+ const signingKey = await subtle.importKey("raw", this.jwtSecret.buffer, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
146
+ const dataToSign = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
147
+ const signature = await subtle.sign("HMAC", signingKey, dataToSign.buffer);
148
+ return `${headerB64}.${payloadB64}.${this.uint8ArrayToBase64Url(new Uint8Array(signature))}`;
149
+ }
150
+ cleanupExpiredChallenges() {
151
+ const now = Date.now();
152
+ for (const [key, challenge] of this.challenges) {
153
+ if (challenge.expiresAt < now) {
154
+ this.challenges.delete(key);
155
+ }
156
+ }
157
+ }
158
+ evictChallengesOverCap() {
159
+ let overflow = this.challenges.size - PeerAuthService.MAX_CHALLENGES;
160
+ if (overflow <= 0)
161
+ return;
162
+ for (const key of this.challenges.keys()) {
163
+ if (overflow-- <= 0)
164
+ break;
165
+ this.challenges.delete(key);
166
+ }
167
+ }
168
+ base64UrlEncode(str) {
169
+ return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
170
+ }
171
+ base64UrlDecode(str) {
172
+ let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
173
+ while (base64.length % 4)
174
+ base64 += "=";
175
+ return atob(base64);
176
+ }
177
+ uint8ArrayToBase64Url(bytes) {
178
+ let binary = "";
179
+ for (let i = 0; i < bytes.length; i++) {
180
+ binary += String.fromCharCode(bytes[i]);
181
+ }
182
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
183
+ }
184
+ base64UrlToUint8Array(str) {
185
+ let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
186
+ while (base64.length % 4)
187
+ base64 += "=";
188
+ const binary = atob(base64);
189
+ const bytes = new Uint8Array(binary.length);
190
+ for (let i = 0; i < binary.length; i++) {
191
+ bytes[i] = binary.charCodeAt(i);
192
+ }
193
+ return bytes;
194
+ }
195
+ base64ToUint8Array(base64) {
196
+ const binary = atob(base64);
197
+ const bytes = new Uint8Array(binary.length);
198
+ for (let i = 0; i < binary.length; i++) {
199
+ bytes[i] = binary.charCodeAt(i);
200
+ }
201
+ return bytes;
202
+ }
203
+ }
204
+ exports.PeerAuthService = PeerAuthService;
205
+ /** Challenge creation is unauthenticated, so the map is bounded (DoS guard). */
206
+ PeerAuthService.MAX_CHALLENGES = 10000;
207
+ //# sourceMappingURL=PeerAuthService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeerAuthService.js","sourceRoot":"","sources":["../../../src/server/peer/PeerAuthService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Server-to-server replication with one trusted peer.
3
+ *
4
+ * One replicator instance per entry in `trusted-servers.json` that carries a
5
+ * `url`. It owns everything about that link: the peer session, the set of
6
+ * tenants both sides hold, the mirror loop over every database, the live push
7
+ * out of {@link SyncEventBus}, and the SSE subscription that pulls the other
8
+ * direction.
9
+ *
10
+ * ## What it replicates
11
+ *
12
+ * Everything both servers already have in common, and nothing else. The tenant
13
+ * set is intersected via a Bloom summary (see {@link refreshIntersection}), so
14
+ * a server never learns which tenants it does *not* host on the other side. For
15
+ * each shared tenant it mirrors **all** databases — the union of the local and
16
+ * remote database lists — in both stores (`docs` and `attachments`).
17
+ *
18
+ * ## Convergence invariants
19
+ *
20
+ * 1. **Directory first.** Databases are ordered by
21
+ * {@link orderDatabasesForReplication}: `directory`, then `userdirectory`,
22
+ * then the rest. An application entry signed by a key the peer does not
23
+ * trust yet is rejected per entry, so the grants have to land first.
24
+ * 2. **Cursor holds on rejection.** Unlike a client, a peer must not skip past
25
+ * a rejected entry — that is permanent divergence between two servers that
26
+ * are supposed to be identical. The peer path passes
27
+ * `rejectionPolicy: "hold"`, which clamps the cursor so the next run
28
+ * re-offers the entry once the missing trust has replicated.
29
+ * 3. **Receipts are preserved, not re-stamped.** Enforced on the receiving side
30
+ * in `ServerNetworkContentAddressedStore`; this side just transports.
31
+ */
32
+ import type { IrohStreamIO } from "../../core/appendonlystores/network/IrohStreamIO";
33
+ import { StoreKind, type ContentAddressedStore } from "../../core/types";
34
+ import type { CryptoAdapter } from "../../core/crypto/CryptoAdapter";
35
+ import { Logger } from "../../core/logging";
36
+ import type { TrustedServer } from "../types";
37
+ import type { SyncEventBus, SyncChangeEvent } from "../SyncEventBus";
38
+ import { type ClusterHealth, type ClusterHealthReason, type ClusterPeerStatus, type ClusterTenantStatus, type ClusterTopologyPeer, type PeerRole } from "./types";
39
+ /**
40
+ * An established Iroh connection to a peer (Node: `IrohPeerLink`). Injected so
41
+ * the replicator itself does not depend on Iroh; hosts without Iroh leave it
42
+ * out and `iroh:` peer urls fail with a clear error.
43
+ */
44
+ export interface PeerIrohLink {
45
+ rpc(method: string, args: unknown[]): Promise<unknown>;
46
+ asStreamIO(): IrohStreamIO;
47
+ subscribeEvents(token: string, onEvent: (event: SyncChangeEvent) => void, signal: AbortSignal): Promise<void>;
48
+ close(): Promise<void>;
49
+ }
50
+ export interface PeerTransferLimits {
51
+ /** Batches transferred in parallel per store pair. */
52
+ maxConcurrentBatches?: number;
53
+ /** Entries per batch for document stores. */
54
+ docsBatchSize?: number;
55
+ /** Entries per batch for attachment stores (chunks of up to 256 KB each). */
56
+ attachmentsBatchSize?: number;
57
+ }
58
+ /** What a replicator needs from the surrounding server to do its job. */
59
+ export interface PeerReplicatorHost {
60
+ cryptoAdapter: CryptoAdapter;
61
+ /** This server's name, as the peer knows it in its own trusted-servers list. */
62
+ localServerName: string;
63
+ /** This server's Ed25519 public key (PEM) — how the peer looks us up. */
64
+ localSigningPublicKey: string;
65
+ /** This node's own mesh role, which decides whether spoke-to-spoke is suppressed. */
66
+ localRole: PeerRole;
67
+ /** Ed25519 signing key, for the peer challenge. */
68
+ getSigningKey(): Promise<CryptoKey | undefined>;
69
+ /** RSA private key, to unwrap entries the peer sends us. */
70
+ getEncryptionKey(): Promise<CryptoKey | undefined>;
71
+ /** Tenant ids hosted locally. */
72
+ listTenants(): string[];
73
+ /** Database ids held locally for a tenant. */
74
+ listDatabases(tenantId: string): string[] | Promise<string[]>;
75
+ /** Local store for a (tenant, db, kind) triple, created on demand. */
76
+ getLocalStore(tenantId: string, dbId: string, storeKind: StoreKind): Promise<ContentAddressedStore>;
77
+ eventBus: SyncEventBus;
78
+ /** Bound Iroh endpoint for `iroh:` peer urls. Missing / null → reconnect. */
79
+ getIrohStreamIO?: () => IrohStreamIO | null;
80
+ /** Dial a peer over Iroh; required for `iroh:` peer urls. */
81
+ openIrohLink?: (io: IrohStreamIO, ticket: string) => PeerIrohLink;
82
+ /**
83
+ * Keep a Server-Sent-Events subscription to the peer open so its changes
84
+ * are pulled right away (default). A host that cannot hold a connection
85
+ * open cheaply turns this off and pulls on a schedule instead.
86
+ */
87
+ liveEventStream?: boolean;
88
+ /**
89
+ * Bounds on what one transfer holds in memory, for hosts with a small heap
90
+ * (Cloudflare: 128 MB per isolate). Default: the sync defaults (up to 250
91
+ * entries per batch, 3 batches in parallel).
92
+ */
93
+ transferLimits?: PeerTransferLimits;
94
+ /**
95
+ * Documents purged from a database on this server (the purge registry).
96
+ * Entries of these documents are refused when pulled from the peer, the
97
+ * same way the server refuses them on a push (docs/accesscontrol.md §13).
98
+ */
99
+ getPurgedDocIds?(tenantId: string, dbId: string): ReadonlySet<string>;
100
+ /**
101
+ * Called after a pull brought new `directory` entries, before the tenant's
102
+ * other databases are mirrored: executes purge requests that arrived by
103
+ * replication, which no client push would otherwise trigger here.
104
+ */
105
+ onDirectoryPulled?(tenantId: string): Promise<void>;
106
+ logger?: Logger;
107
+ }
108
+ export interface PeerSyncScope {
109
+ tenantId?: string;
110
+ dbId?: string;
111
+ /**
112
+ * Stop starting new store pairs after this time (epoch ms), for hosts that
113
+ * limit how long one invocation may run. The next run resumes with the
114
+ * tenant this one did not finish.
115
+ */
116
+ deadline?: number;
117
+ }
118
+ export interface PeerSyncRunResult {
119
+ peer: string;
120
+ tenants: number;
121
+ databases: number;
122
+ pushed: number;
123
+ pulled: number;
124
+ rejected: number;
125
+ /** Pairs whose cursor is clamped waiting for trust to replicate (invariant 2). */
126
+ held: number;
127
+ errors: string[];
128
+ /** The deadline ended the run before every store pair was mirrored. */
129
+ deferred?: boolean;
130
+ }
131
+ export declare class PeerReplicator {
132
+ private peer;
133
+ private readonly host;
134
+ private readonly logger;
135
+ private direction;
136
+ private role;
137
+ private attachments;
138
+ private running;
139
+ private paused;
140
+ private sessionState;
141
+ private eventsConnected;
142
+ private token;
143
+ private tokenIssuedAt;
144
+ private tokenPromise;
145
+ private intersection;
146
+ /** Tenant a run that hit its deadline did not finish; the next run starts there. */
147
+ private resumeTenantId;
148
+ private intersectionAt;
149
+ private tenants;
150
+ private transferredEntries;
151
+ private transferredBytes;
152
+ private syncInFlight;
153
+ private pendingScopes;
154
+ private pushTimer;
155
+ private idleTimer;
156
+ private reconnectTimer;
157
+ private reconnectAttempt;
158
+ private sseAbort;
159
+ private irohLink;
160
+ private unsubscribeBus;
161
+ private lastError;
162
+ private lastErrorClass;
163
+ private lastErrorAt;
164
+ private lastSyncAt;
165
+ /**
166
+ * Scan cursors, per (source, target) store pair.
167
+ *
168
+ * In-process only, deliberately: a restarted server pays one metadata scan
169
+ * per pair and then re-establishes the fast path from the store head. Cheap
170
+ * enough, and it avoids a second on-disk format to keep consistent with the
171
+ * stores it describes.
172
+ */
173
+ private readonly cursors;
174
+ constructor(peer: TrustedServer, host: PeerReplicatorHost);
175
+ get name(): string;
176
+ get url(): string | undefined;
177
+ /** Replace the peer config in place (peer CRUD) without dropping cursors. */
178
+ updatePeer(peer: TrustedServer): void;
179
+ /** Roles and endpoint, for `GET /system/cluster/topology`. */
180
+ topologyEntry(): ClusterTopologyPeer;
181
+ start(): void;
182
+ stop(): Promise<void>;
183
+ pause(): void;
184
+ resume(): void;
185
+ private bootstrap;
186
+ private scheduleReconnect;
187
+ private ensureToken;
188
+ private authenticate;
189
+ private isIrohPeer;
190
+ private getIrohLink;
191
+ private peerFetch;
192
+ private irohPeerFetch;
193
+ /**
194
+ * Recompute the set of tenants both servers host.
195
+ *
196
+ * We send a Bloom summary of our tenant ids; the peer answers with the ids on
197
+ * *its* side that the filter might contain. Those are candidates only — a
198
+ * Bloom filter has false positives — so the result is intersected against the
199
+ * authoritative local list before anything is replicated. That second step is
200
+ * what makes the false-positive rate a performance question rather than a
201
+ * correctness one.
202
+ */
203
+ refreshIntersection(): Promise<string[]>;
204
+ /**
205
+ * Run one full replication pass, optionally narrowed to a tenant or database.
206
+ *
207
+ * Concurrent calls collapse onto the in-flight run: the caller that arrives
208
+ * second gets the same promise rather than a second parallel mirror of the
209
+ * same stores.
210
+ */
211
+ syncNow(scope?: PeerSyncScope): Promise<PeerSyncRunResult>;
212
+ /**
213
+ * Re-offer entries the peer rejected.
214
+ *
215
+ * Under the hold policy the cursor is already clamped, so a plain sync run is
216
+ * the retry — this exists as a named admin action so the UI has something to
217
+ * call that says what it does.
218
+ */
219
+ retryRejected(scope?: PeerSyncScope): Promise<PeerSyncRunResult>;
220
+ private runSync;
221
+ /**
222
+ * The (database, store) pairs to mirror for one tenant, in order.
223
+ *
224
+ * `eager` interleaves — each database's documents are immediately followed by
225
+ * its attachments, so a database is complete before the next one starts.
226
+ * `lazy` runs every document store first and only then the attachment stores:
227
+ * a run that is interrupted (or a link that is slow) has then spent its
228
+ * bandwidth on the text, which is what makes documents readable, rather than
229
+ * on blobs that can be fetched later. `never` skips attachments entirely.
230
+ *
231
+ * Database order comes from {@link orderDatabasesForReplication} either way —
232
+ * invariant 1 outranks the attachment policy.
233
+ */
234
+ private mirrorPlan;
235
+ /**
236
+ * Databases to mirror for a tenant: the union of both sides, in invariant
237
+ * order (invariant 1).
238
+ *
239
+ * Union rather than intersection, because a database that exists only on the
240
+ * peer is exactly the thing a fresh mirror needs to pull.
241
+ */
242
+ private databasesFor;
243
+ private syncStorePair;
244
+ /**
245
+ * One leg of a store pair, with a batch-wide denial folded into `held`.
246
+ *
247
+ * See {@link syncStorePair}: a denial means "not now", so the cursor must
248
+ * stay put and the pair is retried on the next run. Any other failure is a
249
+ * real error and propagates to the tenant loop.
250
+ */
251
+ private transfer;
252
+ private createRemoteStore;
253
+ private cursorStore;
254
+ private acceptsLocalChange;
255
+ /**
256
+ * Push a local change now and resolve when done, instead of coalescing it
257
+ * on a timer. For hosts that cannot rely on timers outliving the request
258
+ * that reported the change.
259
+ */
260
+ replicateLocalChange(event: SyncChangeEvent): Promise<void>;
261
+ private onLocalChange;
262
+ /**
263
+ * Round-robin over the pending (tenant, db) scopes.
264
+ *
265
+ * Sequential on purpose: a hub with many spokes should not open a hundred
266
+ * parallel sessions to one peer, and one busy tenant must not starve the
267
+ * others — each pending scope gets its turn in the order it was queued.
268
+ */
269
+ private flushScopes;
270
+ private startEventStream;
271
+ private consumeEventStream;
272
+ private consumeIrohEventStream;
273
+ private handleEventFrame;
274
+ private handleChangeEvent;
275
+ private recordError;
276
+ /**
277
+ * Status snapshot for `GET /system/cluster/status`.
278
+ *
279
+ * Read straight from in-memory replication state — no store scans — so the
280
+ * admin UI can poll it without competing with replication for I/O. Contains
281
+ * counts and classified reasons only: never a docId, never an author key.
282
+ */
283
+ snapshot(): ClusterPeerStatus;
284
+ tenantSnapshot(tenantId: string): ClusterTenantStatus | null;
285
+ private tenantStatus;
286
+ /** Reasons that come from the link itself rather than from any one tenant. */
287
+ private peerLevelReasons;
288
+ }
289
+ /**
290
+ * Collapse reasons into one health verdict, shared by the per-tenant, per-peer
291
+ * and per-node rollups so all three agree on the thresholds.
292
+ *
293
+ * `stalled` outranks `degraded` deliberately. A clamped cursor is the visible
294
+ * precursor of divergence: the link looks healthy, entries keep flowing, and
295
+ * yet one database is quietly stuck behind an entry the peer will not accept
296
+ * until the directory catches up. That is the state an operator most needs to
297
+ * see, so a transient error elsewhere must not mask it.
298
+ */
299
+ export declare function rollUpHealth(tenants: ClusterTenantStatus[], extraReasons?: ClusterHealthReason[]): {
300
+ health: ClusterHealth;
301
+ reasons: ClusterHealthReason[];
302
+ };
303
+ //# sourceMappingURL=PeerReplicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeerReplicator.d.ts","sourceRoot":"","sources":["../../../src/server/peer/PeerReplicator.ts"],"names":[],"mappings":"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"}