@weaveprotocol/core 0.1.0

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 (430) hide show
  1. package/README.md +1106 -0
  2. package/dist/elements/auth-styles.d.ts +18 -0
  3. package/dist/elements/auth-styles.d.ts.map +1 -0
  4. package/dist/elements/auth-styles.js +150 -0
  5. package/dist/elements/auth-styles.js.map +1 -0
  6. package/dist/elements/dom.d.ts +28 -0
  7. package/dist/elements/dom.d.ts.map +1 -0
  8. package/dist/elements/dom.js +74 -0
  9. package/dist/elements/dom.js.map +1 -0
  10. package/dist/elements/index.d.ts +13 -0
  11. package/dist/elements/index.d.ts.map +1 -0
  12. package/dist/elements/index.js +11 -0
  13. package/dist/elements/index.js.map +1 -0
  14. package/dist/elements/weave-auth.d.ts +52 -0
  15. package/dist/elements/weave-auth.d.ts.map +1 -0
  16. package/dist/elements/weave-auth.js +427 -0
  17. package/dist/elements/weave-auth.js.map +1 -0
  18. package/dist/identity/account-store.d.ts +113 -0
  19. package/dist/identity/account-store.d.ts.map +1 -0
  20. package/dist/identity/account-store.js +305 -0
  21. package/dist/identity/account-store.js.map +1 -0
  22. package/dist/identity/account-vault.d.ts +199 -0
  23. package/dist/identity/account-vault.d.ts.map +1 -0
  24. package/dist/identity/account-vault.js +251 -0
  25. package/dist/identity/account-vault.js.map +1 -0
  26. package/dist/identity/agent-note.d.ts +19 -0
  27. package/dist/identity/agent-note.d.ts.map +1 -0
  28. package/dist/identity/agent-note.js +29 -0
  29. package/dist/identity/agent-note.js.map +1 -0
  30. package/dist/identity/crypto-p256.d.ts +7 -0
  31. package/dist/identity/crypto-p256.d.ts.map +1 -0
  32. package/dist/identity/crypto-p256.js +84 -0
  33. package/dist/identity/crypto-p256.js.map +1 -0
  34. package/dist/identity/device-key.d.ts +60 -0
  35. package/dist/identity/device-key.d.ts.map +1 -0
  36. package/dist/identity/device-key.js +103 -0
  37. package/dist/identity/device-key.js.map +1 -0
  38. package/dist/identity/did.d.ts +22 -0
  39. package/dist/identity/did.d.ts.map +1 -0
  40. package/dist/identity/did.js +37 -0
  41. package/dist/identity/did.js.map +1 -0
  42. package/dist/identity/folder-account.d.ts +65 -0
  43. package/dist/identity/folder-account.d.ts.map +1 -0
  44. package/dist/identity/folder-account.js +115 -0
  45. package/dist/identity/folder-account.js.map +1 -0
  46. package/dist/identity/identity-manager.d.ts +36 -0
  47. package/dist/identity/identity-manager.d.ts.map +1 -0
  48. package/dist/identity/identity-manager.js +115 -0
  49. package/dist/identity/identity-manager.js.map +1 -0
  50. package/dist/identity/index.d.ts +10 -0
  51. package/dist/identity/index.d.ts.map +1 -0
  52. package/dist/identity/index.js +10 -0
  53. package/dist/identity/index.js.map +1 -0
  54. package/dist/identity/keys.d.ts +24 -0
  55. package/dist/identity/keys.d.ts.map +1 -0
  56. package/dist/identity/keys.js +38 -0
  57. package/dist/identity/keys.js.map +1 -0
  58. package/dist/identity/pairing.d.ts +83 -0
  59. package/dist/identity/pairing.d.ts.map +1 -0
  60. package/dist/identity/pairing.js +120 -0
  61. package/dist/identity/pairing.js.map +1 -0
  62. package/dist/identity/passkey-diagnostics.d.ts +54 -0
  63. package/dist/identity/passkey-diagnostics.d.ts.map +1 -0
  64. package/dist/identity/passkey-diagnostics.js +178 -0
  65. package/dist/identity/passkey-diagnostics.js.map +1 -0
  66. package/dist/identity/recovery-code.d.ts +50 -0
  67. package/dist/identity/recovery-code.d.ts.map +1 -0
  68. package/dist/identity/recovery-code.js +116 -0
  69. package/dist/identity/recovery-code.js.map +1 -0
  70. package/dist/identity/root-signer.d.ts +59 -0
  71. package/dist/identity/root-signer.d.ts.map +1 -0
  72. package/dist/identity/root-signer.js +44 -0
  73. package/dist/identity/root-signer.js.map +1 -0
  74. package/dist/identity/ucan.d.ts +164 -0
  75. package/dist/identity/ucan.d.ts.map +1 -0
  76. package/dist/identity/ucan.js +273 -0
  77. package/dist/identity/ucan.js.map +1 -0
  78. package/dist/identity/webauthn.d.ts +87 -0
  79. package/dist/identity/webauthn.d.ts.map +1 -0
  80. package/dist/identity/webauthn.js +155 -0
  81. package/dist/identity/webauthn.js.map +1 -0
  82. package/dist/index.d.ts +116 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +85 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/network/index.d.ts +17 -0
  87. package/dist/network/index.d.ts.map +1 -0
  88. package/dist/network/index.js +10 -0
  89. package/dist/network/index.js.map +1 -0
  90. package/dist/network/introductions.d.ts +85 -0
  91. package/dist/network/introductions.d.ts.map +1 -0
  92. package/dist/network/introductions.js +94 -0
  93. package/dist/network/introductions.js.map +1 -0
  94. package/dist/network/local-transport.d.ts +22 -0
  95. package/dist/network/local-transport.d.ts.map +1 -0
  96. package/dist/network/local-transport.js +55 -0
  97. package/dist/network/local-transport.js.map +1 -0
  98. package/dist/network/mesh.d.ts +31 -0
  99. package/dist/network/mesh.d.ts.map +1 -0
  100. package/dist/network/mesh.js +332 -0
  101. package/dist/network/mesh.js.map +1 -0
  102. package/dist/network/multi-signaling.d.ts +29 -0
  103. package/dist/network/multi-signaling.d.ts.map +1 -0
  104. package/dist/network/multi-signaling.js +125 -0
  105. package/dist/network/multi-signaling.js.map +1 -0
  106. package/dist/network/network-manager.d.ts +37 -0
  107. package/dist/network/network-manager.d.ts.map +1 -0
  108. package/dist/network/network-manager.js +64 -0
  109. package/dist/network/network-manager.js.map +1 -0
  110. package/dist/network/peer-auth.d.ts +98 -0
  111. package/dist/network/peer-auth.d.ts.map +1 -0
  112. package/dist/network/peer-auth.js +86 -0
  113. package/dist/network/peer-auth.js.map +1 -0
  114. package/dist/network/rtc-transport.d.ts +18 -0
  115. package/dist/network/rtc-transport.d.ts.map +1 -0
  116. package/dist/network/rtc-transport.js +149 -0
  117. package/dist/network/rtc-transport.js.map +1 -0
  118. package/dist/network/signaling.d.ts +40 -0
  119. package/dist/network/signaling.d.ts.map +1 -0
  120. package/dist/network/signaling.js +124 -0
  121. package/dist/network/signaling.js.map +1 -0
  122. package/dist/network/transport.d.ts +50 -0
  123. package/dist/network/transport.d.ts.map +1 -0
  124. package/dist/network/transport.js +13 -0
  125. package/dist/network/transport.js.map +1 -0
  126. package/dist/network/ws-transport.d.ts +42 -0
  127. package/dist/network/ws-transport.d.ts.map +1 -0
  128. package/dist/network/ws-transport.js +194 -0
  129. package/dist/network/ws-transport.js.map +1 -0
  130. package/dist/node/actions.d.ts +62 -0
  131. package/dist/node/actions.d.ts.map +1 -0
  132. package/dist/node/actions.js +500 -0
  133. package/dist/node/actions.js.map +1 -0
  134. package/dist/node/carrier.d.ts +85 -0
  135. package/dist/node/carrier.d.ts.map +1 -0
  136. package/dist/node/carrier.js +192 -0
  137. package/dist/node/carrier.js.map +1 -0
  138. package/dist/node/copy.d.ts +38 -0
  139. package/dist/node/copy.d.ts.map +1 -0
  140. package/dist/node/copy.js +53 -0
  141. package/dist/node/copy.js.map +1 -0
  142. package/dist/node/index.d.ts +16 -0
  143. package/dist/node/index.d.ts.map +1 -0
  144. package/dist/node/index.js +11 -0
  145. package/dist/node/index.js.map +1 -0
  146. package/dist/node/node.d.ts +12 -0
  147. package/dist/node/node.d.ts.map +1 -0
  148. package/dist/node/node.js +872 -0
  149. package/dist/node/node.js.map +1 -0
  150. package/dist/node/space-runtime.d.ts +144 -0
  151. package/dist/node/space-runtime.d.ts.map +1 -0
  152. package/dist/node/space-runtime.js +1221 -0
  153. package/dist/node/space-runtime.js.map +1 -0
  154. package/dist/node/stores.d.ts +45 -0
  155. package/dist/node/stores.d.ts.map +1 -0
  156. package/dist/node/stores.js +31 -0
  157. package/dist/node/stores.js.map +1 -0
  158. package/dist/node/types.d.ts +508 -0
  159. package/dist/node/types.d.ts.map +1 -0
  160. package/dist/node/types.js +2 -0
  161. package/dist/node/types.js.map +1 -0
  162. package/dist/privacy/index.d.ts +4 -0
  163. package/dist/privacy/index.d.ts.map +1 -0
  164. package/dist/privacy/index.js +4 -0
  165. package/dist/privacy/index.js.map +1 -0
  166. package/dist/privacy/key-distribution.d.ts +42 -0
  167. package/dist/privacy/key-distribution.d.ts.map +1 -0
  168. package/dist/privacy/key-distribution.js +50 -0
  169. package/dist/privacy/key-distribution.js.map +1 -0
  170. package/dist/privacy/privacy-guard.d.ts +24 -0
  171. package/dist/privacy/privacy-guard.d.ts.map +1 -0
  172. package/dist/privacy/privacy-guard.js +87 -0
  173. package/dist/privacy/privacy-guard.js.map +1 -0
  174. package/dist/privacy/space-encryption.d.ts +48 -0
  175. package/dist/privacy/space-encryption.d.ts.map +1 -0
  176. package/dist/privacy/space-encryption.js +61 -0
  177. package/dist/privacy/space-encryption.js.map +1 -0
  178. package/dist/query/engine.d.ts +27 -0
  179. package/dist/query/engine.d.ts.map +1 -0
  180. package/dist/query/engine.js +84 -0
  181. package/dist/query/engine.js.map +1 -0
  182. package/dist/query/filter.d.ts +15 -0
  183. package/dist/query/filter.d.ts.map +1 -0
  184. package/dist/query/filter.js +207 -0
  185. package/dist/query/filter.js.map +1 -0
  186. package/dist/query/types.d.ts +144 -0
  187. package/dist/query/types.d.ts.map +1 -0
  188. package/dist/query/types.js +22 -0
  189. package/dist/query/types.js.map +1 -0
  190. package/dist/react/context.d.ts +81 -0
  191. package/dist/react/context.d.ts.map +1 -0
  192. package/dist/react/context.js +95 -0
  193. package/dist/react/context.js.map +1 -0
  194. package/dist/react/index.d.ts +40 -0
  195. package/dist/react/index.d.ts.map +1 -0
  196. package/dist/react/index.js +36 -0
  197. package/dist/react/index.js.map +1 -0
  198. package/dist/react/use-live.d.ts +16 -0
  199. package/dist/react/use-live.d.ts.map +1 -0
  200. package/dist/react/use-live.js +55 -0
  201. package/dist/react/use-live.js.map +1 -0
  202. package/dist/react/use-query.d.ts +17 -0
  203. package/dist/react/use-query.d.ts.map +1 -0
  204. package/dist/react/use-query.js +23 -0
  205. package/dist/react/use-query.js.map +1 -0
  206. package/dist/react/use-space.d.ts +29 -0
  207. package/dist/react/use-space.d.ts.map +1 -0
  208. package/dist/react/use-space.js +48 -0
  209. package/dist/react/use-space.js.map +1 -0
  210. package/dist/react/use-spaces.d.ts +19 -0
  211. package/dist/react/use-spaces.d.ts.map +1 -0
  212. package/dist/react/use-spaces.js +55 -0
  213. package/dist/react/use-spaces.js.map +1 -0
  214. package/dist/react/use-weave-auth.d.ts +10 -0
  215. package/dist/react/use-weave-auth.d.ts.map +1 -0
  216. package/dist/react/use-weave-auth.js +15 -0
  217. package/dist/react/use-weave-auth.js.map +1 -0
  218. package/dist/react/weave-auth.d.ts +17 -0
  219. package/dist/react/weave-auth.d.ts.map +1 -0
  220. package/dist/react/weave-auth.js +38 -0
  221. package/dist/react/weave-auth.js.map +1 -0
  222. package/dist/records/describe.d.ts +38 -0
  223. package/dist/records/describe.d.ts.map +1 -0
  224. package/dist/records/describe.js +101 -0
  225. package/dist/records/describe.js.map +1 -0
  226. package/dist/records/links.d.ts +14 -0
  227. package/dist/records/links.d.ts.map +1 -0
  228. package/dist/records/links.js +25 -0
  229. package/dist/records/links.js.map +1 -0
  230. package/dist/records/rules.d.ts +59 -0
  231. package/dist/records/rules.d.ts.map +1 -0
  232. package/dist/records/rules.js +118 -0
  233. package/dist/records/rules.js.map +1 -0
  234. package/dist/records/version.d.ts +54 -0
  235. package/dist/records/version.d.ts.map +1 -0
  236. package/dist/records/version.js +70 -0
  237. package/dist/records/version.js.map +1 -0
  238. package/dist/schema/collection-def.d.ts +96 -0
  239. package/dist/schema/collection-def.d.ts.map +1 -0
  240. package/dist/schema/collection-def.js +272 -0
  241. package/dist/schema/collection-def.js.map +1 -0
  242. package/dist/schema/expression.d.ts +69 -0
  243. package/dist/schema/expression.d.ts.map +1 -0
  244. package/dist/schema/expression.js +92 -0
  245. package/dist/schema/expression.js.map +1 -0
  246. package/dist/schema/index.d.ts +4 -0
  247. package/dist/schema/index.d.ts.map +1 -0
  248. package/dist/schema/index.js +4 -0
  249. package/dist/schema/index.js.map +1 -0
  250. package/dist/schema/schema-engine.d.ts +42 -0
  251. package/dist/schema/schema-engine.d.ts.map +1 -0
  252. package/dist/schema/schema-engine.js +36 -0
  253. package/dist/schema/schema-engine.js.map +1 -0
  254. package/dist/schema/signer.d.ts +27 -0
  255. package/dist/schema/signer.d.ts.map +1 -0
  256. package/dist/schema/signer.js +36 -0
  257. package/dist/schema/signer.js.map +1 -0
  258. package/dist/schemas/apps.d.ts +88 -0
  259. package/dist/schemas/apps.d.ts.map +1 -0
  260. package/dist/schemas/apps.js +168 -0
  261. package/dist/schemas/apps.js.map +1 -0
  262. package/dist/schemas/index.d.ts +410 -0
  263. package/dist/schemas/index.d.ts.map +1 -0
  264. package/dist/schemas/index.js +208 -0
  265. package/dist/schemas/index.js.map +1 -0
  266. package/dist/schemas/screens.d.ts +67 -0
  267. package/dist/schemas/screens.d.ts.map +1 -0
  268. package/dist/schemas/screens.js +242 -0
  269. package/dist/schemas/screens.js.map +1 -0
  270. package/dist/session/agent-link.d.ts +79 -0
  271. package/dist/session/agent-link.d.ts.map +1 -0
  272. package/dist/session/agent-link.js +251 -0
  273. package/dist/session/agent-link.js.map +1 -0
  274. package/dist/session/auth.d.ts +233 -0
  275. package/dist/session/auth.d.ts.map +1 -0
  276. package/dist/session/auth.js +783 -0
  277. package/dist/session/auth.js.map +1 -0
  278. package/dist/session/connect.d.ts +211 -0
  279. package/dist/session/connect.d.ts.map +1 -0
  280. package/dist/session/connect.js +355 -0
  281. package/dist/session/connect.js.map +1 -0
  282. package/dist/session/connection.d.ts +70 -0
  283. package/dist/session/connection.d.ts.map +1 -0
  284. package/dist/session/connection.js +120 -0
  285. package/dist/session/connection.js.map +1 -0
  286. package/dist/session/credentials.d.ts +44 -0
  287. package/dist/session/credentials.d.ts.map +1 -0
  288. package/dist/session/credentials.js +60 -0
  289. package/dist/session/credentials.js.map +1 -0
  290. package/dist/session/index.d.ts +25 -0
  291. package/dist/session/index.d.ts.map +1 -0
  292. package/dist/session/index.js +18 -0
  293. package/dist/session/index.js.map +1 -0
  294. package/dist/session/pairing.d.ts +59 -0
  295. package/dist/session/pairing.d.ts.map +1 -0
  296. package/dist/session/pairing.js +144 -0
  297. package/dist/session/pairing.js.map +1 -0
  298. package/dist/session/places.d.ts +62 -0
  299. package/dist/session/places.d.ts.map +1 -0
  300. package/dist/session/places.js +101 -0
  301. package/dist/session/places.js.map +1 -0
  302. package/dist/session/stay-signed-in.d.ts +37 -0
  303. package/dist/session/stay-signed-in.d.ts.map +1 -0
  304. package/dist/session/stay-signed-in.js +124 -0
  305. package/dist/session/stay-signed-in.js.map +1 -0
  306. package/dist/space/account-registry.d.ts +64 -0
  307. package/dist/space/account-registry.d.ts.map +1 -0
  308. package/dist/space/account-registry.js +66 -0
  309. package/dist/space/account-registry.js.map +1 -0
  310. package/dist/space/index.d.ts +3 -0
  311. package/dist/space/index.d.ts.map +1 -0
  312. package/dist/space/index.js +3 -0
  313. package/dist/space/index.js.map +1 -0
  314. package/dist/space/pass.d.ts +63 -0
  315. package/dist/space/pass.d.ts.map +1 -0
  316. package/dist/space/pass.js +54 -0
  317. package/dist/space/pass.js.map +1 -0
  318. package/dist/space/presets.d.ts +31 -0
  319. package/dist/space/presets.d.ts.map +1 -0
  320. package/dist/space/presets.js +24 -0
  321. package/dist/space/presets.js.map +1 -0
  322. package/dist/space/roles.d.ts +186 -0
  323. package/dist/space/roles.d.ts.map +1 -0
  324. package/dist/space/roles.js +500 -0
  325. package/dist/space/roles.js.map +1 -0
  326. package/dist/space/space-access.d.ts +80 -0
  327. package/dist/space/space-access.d.ts.map +1 -0
  328. package/dist/space/space-access.js +135 -0
  329. package/dist/space/space-access.js.map +1 -0
  330. package/dist/space/space-manager.d.ts +87 -0
  331. package/dist/space/space-manager.d.ts.map +1 -0
  332. package/dist/space/space-manager.js +187 -0
  333. package/dist/space/space-manager.js.map +1 -0
  334. package/dist/storage/directory-access.d.ts +78 -0
  335. package/dist/storage/directory-access.d.ts.map +1 -0
  336. package/dist/storage/directory-access.js +164 -0
  337. package/dist/storage/directory-access.js.map +1 -0
  338. package/dist/storage/encrypted-adapter.d.ts +49 -0
  339. package/dist/storage/encrypted-adapter.d.ts.map +1 -0
  340. package/dist/storage/encrypted-adapter.js +106 -0
  341. package/dist/storage/encrypted-adapter.js.map +1 -0
  342. package/dist/storage/folder-adapter.d.ts +105 -0
  343. package/dist/storage/folder-adapter.d.ts.map +1 -0
  344. package/dist/storage/folder-adapter.js +280 -0
  345. package/dist/storage/folder-adapter.js.map +1 -0
  346. package/dist/storage/folder-reconcile.d.ts +53 -0
  347. package/dist/storage/folder-reconcile.d.ts.map +1 -0
  348. package/dist/storage/folder-reconcile.js +65 -0
  349. package/dist/storage/folder-reconcile.js.map +1 -0
  350. package/dist/storage/index.d.ts +10 -0
  351. package/dist/storage/index.d.ts.map +1 -0
  352. package/dist/storage/index.js +9 -0
  353. package/dist/storage/index.js.map +1 -0
  354. package/dist/storage/indexeddb-adapter.d.ts +12 -0
  355. package/dist/storage/indexeddb-adapter.d.ts.map +1 -0
  356. package/dist/storage/indexeddb-adapter.js +190 -0
  357. package/dist/storage/indexeddb-adapter.js.map +1 -0
  358. package/dist/storage/mst.d.ts +121 -0
  359. package/dist/storage/mst.d.ts.map +1 -0
  360. package/dist/storage/mst.js +402 -0
  361. package/dist/storage/mst.js.map +1 -0
  362. package/dist/storage/storage-provider.d.ts +85 -0
  363. package/dist/storage/storage-provider.d.ts.map +1 -0
  364. package/dist/storage/storage-provider.js +220 -0
  365. package/dist/storage/storage-provider.js.map +1 -0
  366. package/dist/sync/anti-entropy.d.ts +49 -0
  367. package/dist/sync/anti-entropy.d.ts.map +1 -0
  368. package/dist/sync/anti-entropy.js +62 -0
  369. package/dist/sync/anti-entropy.js.map +1 -0
  370. package/dist/sync/index.d.ts +4 -0
  371. package/dist/sync/index.d.ts.map +1 -0
  372. package/dist/sync/index.js +4 -0
  373. package/dist/sync/index.js.map +1 -0
  374. package/dist/sync/sync-engine.d.ts +71 -0
  375. package/dist/sync/sync-engine.d.ts.map +1 -0
  376. package/dist/sync/sync-engine.js +309 -0
  377. package/dist/sync/sync-engine.js.map +1 -0
  378. package/dist/sync/sync-messages.d.ts +75 -0
  379. package/dist/sync/sync-messages.d.ts.map +1 -0
  380. package/dist/sync/sync-messages.js +12 -0
  381. package/dist/sync/sync-messages.js.map +1 -0
  382. package/dist/types.d.ts +243 -0
  383. package/dist/types.d.ts.map +1 -0
  384. package/dist/types.js +7 -0
  385. package/dist/types.js.map +1 -0
  386. package/dist/utils/encoding.d.ts +63 -0
  387. package/dist/utils/encoding.d.ts.map +1 -0
  388. package/dist/utils/encoding.js +130 -0
  389. package/dist/utils/encoding.js.map +1 -0
  390. package/dist/utils/errors.d.ts +43 -0
  391. package/dist/utils/errors.d.ts.map +1 -0
  392. package/dist/utils/errors.js +28 -0
  393. package/dist/utils/errors.js.map +1 -0
  394. package/dist/utils/events.d.ts +19 -0
  395. package/dist/utils/events.d.ts.map +1 -0
  396. package/dist/utils/events.js +27 -0
  397. package/dist/utils/events.js.map +1 -0
  398. package/dist/utils/hash.d.ts +23 -0
  399. package/dist/utils/hash.d.ts.map +1 -0
  400. package/dist/utils/hash.js +49 -0
  401. package/dist/utils/hash.js.map +1 -0
  402. package/dist/utils/index.d.ts +9 -0
  403. package/dist/utils/index.d.ts.map +1 -0
  404. package/dist/utils/index.js +9 -0
  405. package/dist/utils/index.js.map +1 -0
  406. package/dist/validation/capability-gate.d.ts +50 -0
  407. package/dist/validation/capability-gate.d.ts.map +1 -0
  408. package/dist/validation/capability-gate.js +71 -0
  409. package/dist/validation/capability-gate.js.map +1 -0
  410. package/dist/validation/crypto-gate.d.ts +16 -0
  411. package/dist/validation/crypto-gate.d.ts.map +1 -0
  412. package/dist/validation/crypto-gate.js +37 -0
  413. package/dist/validation/crypto-gate.js.map +1 -0
  414. package/dist/validation/index.d.ts +6 -0
  415. package/dist/validation/index.d.ts.map +1 -0
  416. package/dist/validation/index.js +6 -0
  417. package/dist/validation/index.js.map +1 -0
  418. package/dist/validation/stateful-gate.d.ts +15 -0
  419. package/dist/validation/stateful-gate.d.ts.map +1 -0
  420. package/dist/validation/stateful-gate.js +50 -0
  421. package/dist/validation/stateful-gate.js.map +1 -0
  422. package/dist/validation/structural-gate.d.ts +18 -0
  423. package/dist/validation/structural-gate.d.ts.map +1 -0
  424. package/dist/validation/structural-gate.js +54 -0
  425. package/dist/validation/structural-gate.js.map +1 -0
  426. package/dist/validation/validation-engine.d.ts +28 -0
  427. package/dist/validation/validation-engine.d.ts.map +1 -0
  428. package/dist/validation/validation-engine.js +38 -0
  429. package/dist/validation/validation-engine.js.map +1 -0
  430. package/package.json +107 -0
@@ -0,0 +1,220 @@
1
+ /**
2
+ * @module storage-provider
3
+ * A space's store: record versions, and the Merkle Search Tree that indexes them.
4
+ *
5
+ * The tree maps **record keys to version ids**:
6
+ *
7
+ * ```
8
+ * r/<key> → the current version (every record)
9
+ * g/<key> → the record's first version (once it has been edited)
10
+ * h/<key>/<seq>/<id> → a superseded version (only if marked `retain`)
11
+ * ```
12
+ *
13
+ * A version that arrives is compared with the one at `r/<key>` by the ordering
14
+ * rule (`records/version.ts`). The winner takes `r/<key>`; the loser's body is
15
+ * dropped — unless it is the record's first version, kept as proof of who
16
+ * created it, or its writer marked it `retain`. The same set of versions gives
17
+ * the same tree whatever order they arrive in, which is what lets two peers
18
+ * converge.
19
+ */
20
+ import { insertIntoMST, deleteFromMST, lookupInMST, listMSTEntries, collectReachableCids } from './mst.js';
21
+ import { byVersion, supersedes } from '../records/version.js';
22
+ import { utf8Encode, utf8Decode } from '../utils/encoding.js';
23
+ const ROOT_KEY = '__mst_root';
24
+ /** Unreachable nodes found by the last compaction, and when */
25
+ const CONDEMNED_KEY = '__condemned';
26
+ /** A tree node's key in the store: its CID, `b` and 52 base32 characters */
27
+ const NODE_KEY = /^b[a-z2-7]{52}$/;
28
+ export const CURRENT_PREFIX = 'r/';
29
+ export const GENESIS_PREFIX = 'g/';
30
+ export const HISTORY_PREFIX = 'h/';
31
+ const currentKey = (key) => `${CURRENT_PREFIX}${key}`;
32
+ const genesisKey = (key) => `${GENESIS_PREFIX}${key}`;
33
+ /** `seq` padded so a key's history lists in order */
34
+ const historyKey = (e) => `${HISTORY_PREFIX}${e.key}/${String(e.seq).padStart(15, '0')}/${e.id}`;
35
+ /**
36
+ * Creates a StorageProvider wrapping an adapter.
37
+ * @param adapter The initialized storage adapter.
38
+ * @returns The StorageProvider orchestrator.
39
+ */
40
+ export function createStorageProvider(adapter, options = {}) {
41
+ async function getRootCid(store = adapter) {
42
+ const bytes = await store.get(ROOT_KEY);
43
+ return bytes ? utf8Decode(bytes) : null;
44
+ }
45
+ // Every change reads the root, rewrites the path to one entry, and writes a
46
+ // new root. Two of those interleaved would each start from the same root and
47
+ // the second would silently drop the first's entry. So changes take turns.
48
+ let tail = Promise.resolve();
49
+ const exclusively = (change) => {
50
+ const run = tail.then(change, change);
51
+ tail = run.catch(() => { });
52
+ return run;
53
+ };
54
+ /**
55
+ * Runs one change of the tree. Its node writes are held and made in one
56
+ * batch with the new root, so a change lands whole or not at all, in one
57
+ * transaction rather than one per node. Versions it drops are deleted only
58
+ * after, so the tree never names a record that is gone.
59
+ */
60
+ const change = (run) => exclusively(async () => {
61
+ const writes = new Map();
62
+ const tree = {
63
+ ...adapter,
64
+ get: async (key) => (writes.has(key) ? writes.get(key) : adapter.get(key)),
65
+ has: async (key) => (writes.has(key) ? writes.get(key) !== null : adapter.has(key)),
66
+ put: async (key, value) => void writes.set(key, value),
67
+ delete: async (key) => void writes.set(key, null),
68
+ };
69
+ const dropped = [];
70
+ const before = await getRootCid();
71
+ const root = await run(tree, before, (id) => dropped.push(id));
72
+ if (root === before && writes.size === 0 && dropped.length === 0)
73
+ return root;
74
+ writes.set(ROOT_KEY, root ? utf8Encode(root) : null);
75
+ await adapter.batch([...writes].map(([key, value]) => (value ? { type: 'put', key, value } : { type: 'delete', key })));
76
+ for (const id of dropped)
77
+ await adapter.deleteExpression(id);
78
+ changed();
79
+ return root;
80
+ });
81
+ const graceMs = options.graceMs ?? 60_000;
82
+ const compact = () => exclusively(async () => {
83
+ const reachable = await collectReachableCids(adapter, await getRootCid());
84
+ const dead = (await adapter.list('b')).filter((key) => NODE_KEY.test(key) && !reachable.has(key));
85
+ const saved = await adapter.get(CONDEMNED_KEY);
86
+ const earlier = saved ? JSON.parse(utf8Decode(saved)) : null;
87
+ const ripe = graceMs === 0 ? dead : earlier && Date.now() - earlier.at >= graceMs ? earlier.cids : null;
88
+ const condemn = (cids) => ({ type: 'put', key: CONDEMNED_KEY, value: utf8Encode(JSON.stringify({ at: Date.now(), cids })) });
89
+ // Too soon to delete anything: remember what is dead now, unless an earlier list is already waiting.
90
+ if (ripe === null) {
91
+ if (!earlier)
92
+ await adapter.batch([condemn(dead)]);
93
+ return 0;
94
+ }
95
+ const doomed = new Set(ripe);
96
+ const deleting = dead.filter((key) => doomed.has(key));
97
+ await adapter.batch([...deleting.map((key) => ({ type: 'delete', key })), condemn(dead.filter((key) => !doomed.has(key)))]);
98
+ return deleting.length;
99
+ });
100
+ let changes = 0;
101
+ /** Counts a change, and compacts once enough have piled up */
102
+ const changed = () => {
103
+ if (options.compactEvery && ++changes >= options.compactEvery) {
104
+ changes = 0;
105
+ void compact().catch(() => { });
106
+ }
107
+ };
108
+ /**
109
+ * Places a version that is not current: the record's first version if it is
110
+ * the lowest-id one seen, history if retained, otherwise gone.
111
+ */
112
+ async function demote(tree, root, version, current, drop) {
113
+ // A first version is kept as proof of who created the record — the one
114
+ // with the lowest id, if several devices each created the same chosen key.
115
+ // Not while the record is still at seq 0: then the current version is it.
116
+ if (version.seq === 0 && current.seq > 0) {
117
+ const heldId = await lookupInMST(tree, root, genesisKey(version.key));
118
+ if (heldId === version.id)
119
+ return root;
120
+ if (heldId === null || version.id < heldId) {
121
+ await adapter.putExpression(version);
122
+ root = await insertIntoMST(tree, root, genesisKey(version.key), version.id);
123
+ const displaced = heldId ? await adapter.getExpression(heldId) : null;
124
+ return displaced ? keepOrDrop(tree, root, displaced, drop) : root;
125
+ }
126
+ }
127
+ return keepOrDrop(tree, root, version, drop);
128
+ }
129
+ async function keepOrDrop(tree, root, version, drop) {
130
+ if (version.retain) {
131
+ await adapter.putExpression(version);
132
+ return insertIntoMST(tree, root, historyKey(version), version.id);
133
+ }
134
+ drop(version.id);
135
+ return root;
136
+ }
137
+ const load = async (ids) => (await Promise.all([...ids].map((id) => adapter.getExpression(id)))).filter((v) => v !== null);
138
+ async function histories(prefix) {
139
+ const root = await getRootCid();
140
+ const ids = new Map();
141
+ for (const tree of [CURRENT_PREFIX, GENESIS_PREFIX, HISTORY_PREFIX]) {
142
+ for (const entry of await listMSTEntries(adapter, root, `${tree}${prefix}`)) {
143
+ // `r/<key>`, `g/<key>`, `h/<key>/<seq>/<id>` — a record key holds no `/`.
144
+ const key = entry.key.split('/')[1];
145
+ (ids.get(key) ?? ids.set(key, new Set()).get(key)).add(entry.value);
146
+ }
147
+ }
148
+ const result = new Map();
149
+ for (const [key, held] of ids)
150
+ result.set(key, (await load(held)).sort(byVersion));
151
+ return result;
152
+ }
153
+ async function currentOf(tree, root, key) {
154
+ const id = await lookupInMST(tree, root, currentKey(key));
155
+ return id ? adapter.getExpression(id) : null;
156
+ }
157
+ return Object.freeze({
158
+ addExpression(incoming) {
159
+ return change(async (tree, root, drop) => {
160
+ const current = await currentOf(tree, root, incoming.key);
161
+ if (current?.id === incoming.id)
162
+ return root;
163
+ if (current && !supersedes(incoming, current))
164
+ return demote(tree, root, incoming, current, drop);
165
+ await adapter.putExpression(incoming);
166
+ root = await insertIntoMST(tree, root, currentKey(incoming.key), incoming.id);
167
+ return current ? demote(tree, root, current, incoming, drop) : root;
168
+ });
169
+ },
170
+ removeExpression(id) {
171
+ return change(async (tree, root, drop) => {
172
+ const version = await adapter.getExpression(id);
173
+ for (const key of version ? [currentKey(version.key), genesisKey(version.key), historyKey(version)] : []) {
174
+ if ((await lookupInMST(tree, root, key)) === id)
175
+ root = await deleteFromMST(tree, root, key);
176
+ }
177
+ drop(id);
178
+ return root;
179
+ });
180
+ },
181
+ async getExpression(id) {
182
+ return adapter.getExpression(id);
183
+ },
184
+ async getCurrent(key) {
185
+ return currentOf(adapter, await getRootCid(), key);
186
+ },
187
+ async getGenesis(key) {
188
+ const id = await lookupInMST(adapter, await getRootCid(), genesisKey(key));
189
+ return id ? adapter.getExpression(id) : null;
190
+ },
191
+ async history(key) {
192
+ return (await histories(key)).get(key) ?? [];
193
+ },
194
+ histories,
195
+ async listCurrent() {
196
+ return load((await listMSTEntries(adapter, await getRootCid(), CURRENT_PREFIX)).map((e) => e.value));
197
+ },
198
+ async queryExpressions(collection) {
199
+ // The index holds every version kept, not only current ones; the tree says which is current.
200
+ const root = await getRootCid();
201
+ const held = await adapter.queryExpressions(collection, Infinity);
202
+ const current = await Promise.all(held.map(async (v) => (await lookupInMST(adapter, root, currentKey(v.key))) === v.id));
203
+ return held.filter((_, i) => current[i]);
204
+ },
205
+ async entries() {
206
+ return listMSTEntries(adapter, await getRootCid());
207
+ },
208
+ async getRootCid() {
209
+ return getRootCid();
210
+ },
211
+ compact,
212
+ getAdapter() {
213
+ return adapter;
214
+ },
215
+ async close() {
216
+ await adapter.close();
217
+ }
218
+ });
219
+ }
220
+ //# sourceMappingURL=storage-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-provider.js","sourceRoot":"","sources":["../../src/storage/storage-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @module anti-entropy
3
+ * The pieces of reconciliation that do not depend on messages.
4
+ *
5
+ * Two peers reconcile by walking each other's Merkle Search Tree from the root,
6
+ * descending only into subtrees they do not already have. Nodes are content
7
+ * addressed, so a subtree whose CID you hold is one you have and can be
8
+ * skipped whole. Two trees differing by one entry exchange only
9
+ * the nodes on the path to it — a handful at any size — instead of every key.
10
+ */
11
+ import type { StorageAdapter } from '../types.js';
12
+ import { type MSTNode } from '../storage/mst.js';
13
+ /**
14
+ * Checks a node a peer sent: it must be well formed, and hash to the CID it
15
+ * was sent as.
16
+ *
17
+ * A peer can send anything. Only the four fields of a node are read, and they
18
+ * are hashed the one canonical way — so whatever else came with it, a node
19
+ * that checks out is exactly the node that CID names.
20
+ *
21
+ * @returns The node, or null when it is malformed or does not match the CID
22
+ */
23
+ export declare function verifyNode(cid: string, value: unknown): Promise<MSTNode | null>;
24
+ /**
25
+ * The children of a peer's node worth fetching: those this store does not hold.
26
+ *
27
+ * A node is only ever stored by building this store's own tree, so holding
28
+ * one means holding — or having since superseded — every entry beneath it,
29
+ * whether or not the current root still reaches it. Asking the store is one
30
+ * lookup per child, where collecting the local tree first read all of it.
31
+ *
32
+ * @param adapter The local store
33
+ * @param node A node from the peer's tree
34
+ */
35
+ export declare function unknownChildren(adapter: StorageAdapter, node: MSTNode): Promise<string[]>;
36
+ /**
37
+ * The version ids a peer's node names that differ from this store's.
38
+ *
39
+ * A key is a record key under a prefix (`r/`, `g/`, `h/`) and its value a
40
+ * version id, so two peers can hold the same key with different values — two
41
+ * versions of one record. Either way the other side's version is worth
42
+ * fetching: the ordering rule decides, on arrival, whether it is kept.
43
+ *
44
+ * @param adapter The local store
45
+ * @param localRoot The local tree's root
46
+ * @param node A node from the peer's tree
47
+ */
48
+ export declare function differingEntries(adapter: StorageAdapter, localRoot: string | null, node: MSTNode): Promise<string[]>;
49
+ //# sourceMappingURL=anti-entropy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-entropy.d.ts","sourceRoot":"","sources":["../../src/sync/anti-entropy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIxE;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAWrF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAI/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ1H"}
@@ -0,0 +1,62 @@
1
+ import { hashNode, lookupInMST } from '../storage/mst.js';
2
+ const isString = (value) => typeof value === 'string';
3
+ /**
4
+ * Checks a node a peer sent: it must be well formed, and hash to the CID it
5
+ * was sent as.
6
+ *
7
+ * A peer can send anything. Only the four fields of a node are read, and they
8
+ * are hashed the one canonical way — so whatever else came with it, a node
9
+ * that checks out is exactly the node that CID names.
10
+ *
11
+ * @returns The node, or null when it is malformed or does not match the CID
12
+ */
13
+ export async function verifyNode(cid, value) {
14
+ const { height, keys, values, children } = (value ?? {});
15
+ if (!Number.isSafeInteger(height) ||
16
+ !Array.isArray(keys) || !keys.every(isString) ||
17
+ !Array.isArray(values) || values.length !== keys.length || !values.every(isString) ||
18
+ !Array.isArray(children) || children.length !== keys.length + 1 ||
19
+ !children.every((child) => child === null || isString(child)))
20
+ return null;
21
+ const node = { height: height, keys, values, children };
22
+ return (await hashNode(node)) === cid ? node : null;
23
+ }
24
+ /**
25
+ * The children of a peer's node worth fetching: those this store does not hold.
26
+ *
27
+ * A node is only ever stored by building this store's own tree, so holding
28
+ * one means holding — or having since superseded — every entry beneath it,
29
+ * whether or not the current root still reaches it. Asking the store is one
30
+ * lookup per child, where collecting the local tree first read all of it.
31
+ *
32
+ * @param adapter The local store
33
+ * @param node A node from the peer's tree
34
+ */
35
+ export async function unknownChildren(adapter, node) {
36
+ const children = node.children.filter((child) => child !== null);
37
+ const held = await Promise.all(children.map((child) => adapter.has(child)));
38
+ return children.filter((_, i) => !held[i]);
39
+ }
40
+ /**
41
+ * The version ids a peer's node names that differ from this store's.
42
+ *
43
+ * A key is a record key under a prefix (`r/`, `g/`, `h/`) and its value a
44
+ * version id, so two peers can hold the same key with different values — two
45
+ * versions of one record. Either way the other side's version is worth
46
+ * fetching: the ordering rule decides, on arrival, whether it is kept.
47
+ *
48
+ * @param adapter The local store
49
+ * @param localRoot The local tree's root
50
+ * @param node A node from the peer's tree
51
+ */
52
+ export async function differingEntries(adapter, localRoot, node) {
53
+ const ours = await Promise.all(node.keys.map((key) => lookupInMST(adapter, localRoot, key)));
54
+ const wanted = [];
55
+ for (let i = 0; i < node.keys.length; i++) {
56
+ const theirs = node.values[i];
57
+ if (typeof theirs === 'string' && ours[i] !== theirs && !(await adapter.getExpression(theirs)))
58
+ wanted.push(theirs);
59
+ }
60
+ return wanted;
61
+ }
62
+ //# sourceMappingURL=anti-entropy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-entropy.js","sourceRoot":"","sources":["../../src/sync/anti-entropy.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAgB,MAAM,mBAAmB,CAAC;AAExE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,KAAc;IAC1D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4C,CAAC;IACpG,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7C,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAClF,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;QAC/D,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,MAAM,IAAI,GAAY,EAAE,MAAM,EAAE,MAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC3E,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAuB,EAAE,IAAa;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAuB,EAAE,SAAwB,EAAE,IAAa;IACrG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './sync-messages.js';
2
+ export * from './anti-entropy.js';
3
+ export * from './sync-engine.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './sync-messages.js';
2
+ export * from './anti-entropy.js';
3
+ export * from './sync-engine.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @module sync-engine
3
+ * Keeps one store in step with its peers.
4
+ *
5
+ * Reconciliation is a pull, and both sides do it:
6
+ *
7
+ * 1. A tells B its root. Equal roots mean identical data — one round trip, done.
8
+ * 2. Otherwise each walks the other's tree from the root, asking for nodes in
9
+ * batches and skipping any subtree that is already part of its own tree.
10
+ * 3. The keys found in the nodes it fetched, less the records it already
11
+ * holds, are what it is missing. It asks for those, and every one of them
12
+ * passes the gatekeeper before it is stored.
13
+ *
14
+ * Cost follows the difference, not the size: two trees differing by one entry
15
+ * exchange the few nodes on the path to it.
16
+ */
17
+ import type { Expression } from '../types.js';
18
+ import type { StorageProvider } from '../storage/storage-provider.js';
19
+ import { type SyncMessage } from './sync-messages.js';
20
+ /** Verdict on an expression that arrived from a peer */
21
+ export interface IncomingValidation {
22
+ readonly valid: boolean;
23
+ readonly reason?: string;
24
+ /**
25
+ * Not judged yet, rather than refused: it depends on something that has not
26
+ * arrived — a record's first version, the definition it was written under.
27
+ * It is held and tried again as other records come in, and fetched again on
28
+ * the next round if it is still waiting.
29
+ */
30
+ readonly later?: boolean;
31
+ }
32
+ export interface SyncEngineConfig {
33
+ readonly storageProvider: StorageProvider;
34
+ readonly sendToPeer: (peerId: string, message: SyncMessage) => void;
35
+ readonly heartbeatInterval?: number;
36
+ /**
37
+ * Gatekeeper for expressions arriving from peers — typically a
38
+ * `ValidationEngine`. Anything it rejects is dropped instead of committed,
39
+ * and surfaces as a `rejected` event.
40
+ *
41
+ * Leaving it out accepts whatever peers send, which is only ever appropriate
42
+ * for a trusted transport or a test.
43
+ */
44
+ readonly validate?: (expression: Expression) => Promise<IncomingValidation>;
45
+ }
46
+ export type SyncEvent = 'synced' | 'expression-received' | 'rejected' | 'error';
47
+ type EventHandler = (...args: any[]) => void;
48
+ export interface SyncEngine {
49
+ start(): void;
50
+ stop(): void;
51
+ /** Handles whatever a peer sent; anything that is not a sync message this peer speaks is ignored. */
52
+ handleMessage(peerId: string, message: unknown): Promise<void>;
53
+ notifyPeers(peers: ReadonlyArray<string>): void;
54
+ onLocalChange(expression: Expression): void;
55
+ addPeer(peerId: string): void;
56
+ removePeer(peerId: string): void;
57
+ on(event: SyncEvent, callback: EventHandler): void;
58
+ off(event: SyncEvent, callback: EventHandler): void;
59
+ }
60
+ /** Nodes asked for in one message. Nodes are small; this keeps round trips few. */
61
+ export declare const MAX_CIDS_PER_REQUEST = 64;
62
+ /** Records asked for in one message. */
63
+ export declare const MAX_IDS_PER_REQUEST = 200;
64
+ /**
65
+ * Creates a sync engine orchestrator.
66
+ * @param config Sync engine configuration.
67
+ * @returns A sync engine instance.
68
+ */
69
+ export declare function createSyncEngine(config: SyncEngineConfig): SyncEngine;
70
+ export {};
71
+ //# sourceMappingURL=sync-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/sync/sync-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,OAAO,EAA2C,KAAK,WAAW,EAAwB,MAAM,oBAAoB,CAAC;AAGrH,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAQD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC7E;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,qBAAqB,GAAG,UAAU,GAAG,OAAO,CAAC;AAChF,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,qGAAqG;IACrG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChD,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACnD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CACrD;AAED,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,wCAAwC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AA0BvC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA6RrE"}