@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,22 @@
1
+ /**
2
+ * @module network/local-transport
3
+ * Peers in one process, linked directly — no relay, no socket.
4
+ *
5
+ * A carrier keeps a space twice: in its own database, and in the person's pod
6
+ * folder when it can reach it. Rather than a second way of copying records,
7
+ * the two copies are two peers on a local link, and the sync that already runs
8
+ * between devices keeps them in step — the pod catching up with whatever
9
+ * arrived while it was out of reach, and the database hearing about writes
10
+ * another site made to the folder.
11
+ *
12
+ * `createLocalHub()` is a switchboard: every transport made from it that has
13
+ * connected is linked to every other. Delivery is always on a later task, as
14
+ * on a real wire.
15
+ */
16
+ import type { PeerTransport } from './transport.js';
17
+ export interface LocalHub {
18
+ /** A transport for `did`. It links to the others once `connect()` is called, and leaves on `closeAll()`. */
19
+ transport(did: string): PeerTransport;
20
+ }
21
+ export declare function createLocalHub(): LocalHub;
22
+ //# sourceMappingURL=local-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-transport.d.ts","sourceRoot":"","sources":["../../src/network/local-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,gBAAgB,CAAC;AAGzE,MAAM,WAAW,QAAQ;IACvB,4GAA4G;IAC5G,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CACvC;AASD,wBAAgB,cAAc,IAAI,QAAQ,CA+CzC"}
@@ -0,0 +1,55 @@
1
+ import { createEmitter } from '../utils/events.js';
2
+ const later = (fn) => void setTimeout(fn, 0);
3
+ export function createLocalHub() {
4
+ /** Transports that have connected, by DID */
5
+ const connected = new Map();
6
+ const unlink = (a, b) => {
7
+ const ea = connected.get(a);
8
+ const eb = connected.get(b);
9
+ if (ea?.links.delete(b))
10
+ later(() => ea.emit('disconnected', b));
11
+ if (eb?.links.delete(a))
12
+ later(() => eb.emit('disconnected', a));
13
+ };
14
+ return {
15
+ transport(did) {
16
+ const { on, off, emit } = createEmitter();
17
+ const endpoint = { links: new Set(), emit };
18
+ return Object.freeze({
19
+ async connect() {
20
+ connected.set(did, endpoint);
21
+ for (const [other, peer] of connected) {
22
+ if (other === did || endpoint.links.has(other))
23
+ continue;
24
+ endpoint.links.add(other);
25
+ peer.links.add(did);
26
+ later(() => {
27
+ endpoint.emit('connected', other);
28
+ peer.emit('connected', did);
29
+ });
30
+ }
31
+ },
32
+ send(peerId, data) {
33
+ if (!endpoint.links.has(peerId))
34
+ return;
35
+ // Copied, as a wire would: the receiver must not share the sender's buffer.
36
+ const copy = new Uint8Array(data);
37
+ later(() => {
38
+ if (endpoint.links.has(peerId))
39
+ connected.get(peerId)?.emit('data', did, copy);
40
+ });
41
+ },
42
+ close: (peerId) => unlink(did, peerId),
43
+ closeAll() {
44
+ for (const peer of [...endpoint.links])
45
+ unlink(did, peer);
46
+ if (connected.get(did) === endpoint)
47
+ connected.delete(did);
48
+ },
49
+ on,
50
+ off,
51
+ });
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=local-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-transport.js","sourceRoot":"","sources":["../../src/network/local-transport.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYnD,MAAM,KAAK,GAAG,CAAC,EAAc,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEzD,MAAM,UAAU,cAAc;IAC5B,6CAA6C;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,OAAO;QACL,SAAS,CAAC,GAAW;YACnB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,aAAa,EAAuB,CAAC;YAC/D,MAAM,QAAQ,GAAa,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;YAEtD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,KAAK,CAAC,OAAO;oBACX,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;wBACtC,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;4BAAE,SAAS;wBACzD,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACpB,KAAK,CAAC,GAAG,EAAE;4BACT,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;4BAClC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;wBAC9B,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,MAAc,EAAE,IAAgB;oBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;wBAAE,OAAO;oBACxC,4EAA4E;oBAC5E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;oBAClC,KAAK,CAAC,GAAG,EAAE;wBACT,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;4BAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACjF,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,KAAK,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;gBAC9C,QAAQ;oBACN,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;wBAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC1D,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ;wBAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,CAAC;gBACD,EAAE;gBACF,GAAG;aACJ,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { SignalledTransport } from './transport.js';
2
+ import { type MeshAuth } from './peer-auth.js';
3
+ import type { NetworkManager } from './network-manager.js';
4
+ export interface MeshConfig {
5
+ readonly did: string;
6
+ /** Relays, used all at once (`multi-signaling.ts`) */
7
+ readonly relays: ReadonlyArray<string>;
8
+ readonly iceServers?: ReadonlyArray<RTCIceServer>;
9
+ /**
10
+ * Let connected peers introduce the peers they know, so the relay is only
11
+ * needed for the first connection. On by default.
12
+ */
13
+ readonly introductions?: boolean;
14
+ /** How connections are made. WebRTC unless a test says otherwise. */
15
+ readonly createTransport?: () => SignalledTransport;
16
+ /** How long a peer has to prove itself in a room. Default 10 s. */
17
+ readonly authTimeoutMs?: number;
18
+ }
19
+ export interface Mesh {
20
+ /**
21
+ * A space's share of the mesh: the peers that proved themselves in its room.
22
+ * `connect()` enters the room and `disconnect()` leaves it; the relays and
23
+ * connections are held while any room is.
24
+ *
25
+ * @param room The space's room — a hash of its id
26
+ * @param auth What peers must prove here; null lets anyone in the room in
27
+ */
28
+ join(room: string, auth?: MeshAuth | null): NetworkManager;
29
+ }
30
+ export declare function createMesh(config: MeshConfig): Mesh;
31
+ //# sourceMappingURL=mesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.d.ts","sourceRoot":"","sources":["../../src/network/mesh.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiB1E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,kBAAkB,CAAC;IACpD,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,IAAI;IACnB;;;;;;;OAOG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,cAAc,CAAC;CAC5D;AAwBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAuTnD"}
@@ -0,0 +1,332 @@
1
+ import { utf8Encode, utf8Decode } from '../utils/encoding.js';
2
+ import { createEmitter } from '../utils/events.js';
3
+ import { createMultiSignalingClient } from './multi-signaling.js';
4
+ import { createRTCTransport } from './rtc-transport.js';
5
+ import { peerNonce } from './peer-auth.js';
6
+ import { PEERS_MESSAGE, SIGNAL_MESSAGE, AUTH_HELLO_MESSAGE, AUTH_PROOF_MESSAGE, LEAVE_MESSAGE, MAX_HOPS, MAX_INTRODUCED, isPeerDid, isControlMessage, shouldInitiate, createSeenSignals, signalId, } from './introductions.js';
7
+ export function createMesh(config) {
8
+ const { did } = config;
9
+ const transport = config.createTransport?.() ?? createRTCTransport({ iceServers: config.iceServers });
10
+ const signaling = createMultiSignalingClient(config.relays, did);
11
+ const introduce = config.introductions !== false;
12
+ const authTimeoutMs = config.authTimeoutMs ?? 10_000;
13
+ const rooms = new Map();
14
+ /** Connections that are open */
15
+ const links = new Set();
16
+ /** Peers a connection has been started with, so hearing of one twice does not open it twice */
17
+ const attempted = new Set();
18
+ /** Rooms to greet a peer in once its connection opens */
19
+ const expected = new Map();
20
+ /** Connections waiting to be put to use in some room, or closed */
21
+ const idle = new Map();
22
+ const seenSignals = createSeenSignals();
23
+ let started = null;
24
+ const fail = (error) => {
25
+ const err = error instanceof Error ? error : new Error(String(error));
26
+ for (const room of rooms.values())
27
+ room.events.emit('error', err);
28
+ };
29
+ const sendFrame = (peer, frame) => {
30
+ try {
31
+ transport.send(peer, utf8Encode(JSON.stringify({ ...frame, from: did })));
32
+ }
33
+ catch {
34
+ // The channel closed between listing the peer and writing to it. The
35
+ // disconnect event will tidy up.
36
+ }
37
+ };
38
+ /** Peers proved in at least one room — the only ones anything but a handshake is taken from */
39
+ const isAdmitted = (peer) => [...rooms.values()].some((room) => room.peers.has(peer));
40
+ /** Forgets a connection — closed by either side. */
41
+ const lost = (peer) => {
42
+ clearTimeout(idle.get(peer));
43
+ idle.delete(peer);
44
+ links.delete(peer);
45
+ attempted.delete(peer);
46
+ expected.delete(peer);
47
+ for (const room of rooms.values())
48
+ drop(room, peer);
49
+ };
50
+ /** Closes a connection that no room has a use for. */
51
+ const closeIfIdle = (peer) => {
52
+ if (!links.has(peer))
53
+ return;
54
+ if ([...rooms.values()].some((room) => room.peers.has(peer) || room.handshakes.has(peer)))
55
+ return;
56
+ transport.close(peer);
57
+ // Closing it here is not always reported back as a disconnect.
58
+ lost(peer);
59
+ };
60
+ // ─── Proving, per room ──────────────────────────────────────────────
61
+ const endHandshake = (room, peer) => {
62
+ const handshake = room.handshakes.get(peer);
63
+ if (handshake)
64
+ clearTimeout(handshake.timer);
65
+ room.handshakes.delete(peer);
66
+ };
67
+ const refuse = (room, peer) => {
68
+ endHandshake(room, peer);
69
+ closeIfIdle(peer);
70
+ };
71
+ /** Starts proving ourselves to a peer in a room, unless that is under way or done. */
72
+ const greet = (name, peer) => {
73
+ const room = rooms.get(name);
74
+ if (!room || room.peers.has(peer))
75
+ return null;
76
+ let handshake = room.handshakes.get(peer);
77
+ if (!handshake) {
78
+ handshake = { nonce: peerNonce(), proved: false, verified: room.auth === null, timer: setTimeout(() => refuse(room, peer), authTimeoutMs) };
79
+ room.handshakes.set(peer, handshake);
80
+ sendFrame(peer, { room: name, type: AUTH_HELLO_MESSAGE, payload: { nonce: handshake.nonce } });
81
+ }
82
+ return handshake;
83
+ };
84
+ const onHandshake = async (name, peer, type, payload) => {
85
+ const room = rooms.get(name);
86
+ if (!room)
87
+ return;
88
+ const binding = transport.binding?.(peer) ?? null;
89
+ if (type === AUTH_HELLO_MESSAGE) {
90
+ const handshake = greet(name, peer);
91
+ const nonce = payload?.nonce;
92
+ if (!handshake || handshake.proved || typeof nonce !== 'string')
93
+ return;
94
+ handshake.proved = true;
95
+ if (room.auth)
96
+ sendFrame(peer, { room: name, type: AUTH_PROOF_MESSAGE, payload: await room.auth.prove(peer, nonce, binding) });
97
+ }
98
+ else {
99
+ const handshake = room.handshakes.get(peer);
100
+ if (!handshake || handshake.verified || !room.auth)
101
+ return;
102
+ if (!(await room.auth.check(peer, handshake.nonce, binding, payload)))
103
+ return refuse(room, peer);
104
+ handshake.verified = true;
105
+ }
106
+ const handshake = room.handshakes.get(peer);
107
+ if (handshake?.proved && handshake.verified && rooms.get(name) === room) {
108
+ endHandshake(room, peer);
109
+ admit(name, room, peer);
110
+ }
111
+ };
112
+ /** A connection becomes a peer in a room: announced, and introduced to the room's others. */
113
+ const admit = (name, room, peer) => {
114
+ const info = { did: peer, connectionId: peer, connectedAt: new Date().toISOString() };
115
+ room.peers.set(peer, info);
116
+ room.events.emit('peer-connected', info);
117
+ if (!introduce)
118
+ return;
119
+ // Introduce in both directions. Telling only the newcomer would leave the
120
+ // side with the higher identifier waiting for an offer nobody will send.
121
+ const others = [...room.peers.keys()].filter((other) => other !== peer);
122
+ if (others.length === 0)
123
+ return;
124
+ sendFrame(peer, { room: name, type: PEERS_MESSAGE, payload: others });
125
+ for (const other of others)
126
+ sendFrame(other, { room: name, type: PEERS_MESSAGE, payload: [peer] });
127
+ };
128
+ const drop = (room, peer) => {
129
+ endHandshake(room, peer);
130
+ const info = room.peers.get(peer);
131
+ if (info && room.peers.delete(peer))
132
+ room.events.emit('peer-disconnected', info);
133
+ };
134
+ // ─── Connecting ─────────────────────────────────────────────────────
135
+ //
136
+ // A relay gets you your first connection. After that the peers you can
137
+ // already reach are the best source of the ones you cannot: their data
138
+ // channels carry connection offers just as happily as they carry todos.
139
+ /** Pushes somebody's signaling out across the mesh, skipping where it came from. */
140
+ const floodSignal = (signal, except) => {
141
+ for (const peer of links) {
142
+ if (peer !== except && isAdmitted(peer))
143
+ sendFrame(peer, { type: SIGNAL_MESSAGE, payload: signal });
144
+ }
145
+ };
146
+ const throughMesh = (target) => (kind, data) => floodSignal({ id: signalId(), origin: did, target, kind, data, hops: MAX_HOPS });
147
+ const throughRelay = (target) => (kind, data) => signaling.signal(kind, target, data);
148
+ const offerTo = async (peer, deliver) => {
149
+ try {
150
+ const offer = await transport.createOffer(peer, (candidate) => deliver('candidate', candidate));
151
+ deliver('offer', offer);
152
+ }
153
+ catch (err) {
154
+ fail(err);
155
+ }
156
+ };
157
+ /** Acts on a peer's offer, answer or candidate, sending replies back the way it came. */
158
+ const onSignal = async (peer, kind, data, deliver) => {
159
+ // A connection that has proved itself is not replaced by an offer that has
160
+ // not: anyone can put someone else's name on one.
161
+ if (!data || typeof data !== 'object' || isAdmitted(peer))
162
+ return;
163
+ try {
164
+ if (kind === 'offer') {
165
+ attempted.add(peer);
166
+ const answer = await transport.handleOffer(peer, data, (candidate) => deliver('candidate', candidate));
167
+ deliver('answer', answer);
168
+ }
169
+ else if (kind === 'answer') {
170
+ await transport.handleAnswer(peer, data);
171
+ }
172
+ else {
173
+ await transport.addIceCandidate(peer, data);
174
+ }
175
+ }
176
+ catch (err) {
177
+ fail(err);
178
+ }
179
+ };
180
+ /** Learned that a peer is in a room: greet it there, or connect first. */
181
+ const meet = (name, peer, offer) => {
182
+ if (peer === did || !rooms.has(name))
183
+ return;
184
+ if (links.has(peer)) {
185
+ greet(name, peer);
186
+ return;
187
+ }
188
+ (expected.get(peer) ?? expected.set(peer, new Set()).get(peer)).add(name);
189
+ if (offer && !attempted.has(peer)) {
190
+ attempted.add(peer);
191
+ void offerTo(peer, offer);
192
+ }
193
+ };
194
+ signaling.on('peer-joined', (peer, room) => meet(room, peer, throughRelay(peer)));
195
+ signaling.on('signal', (message) => void onSignal(message.from, message.type, message.payload, throughRelay(message.from)));
196
+ /** Acts on somebody's introduction of the peers in a room. */
197
+ const handlePeerList = (name, peers) => {
198
+ if (!introduce || !Array.isArray(peers))
199
+ return;
200
+ for (const peer of peers.slice(0, MAX_INTRODUCED)) {
201
+ if (!isPeerDid(peer))
202
+ continue;
203
+ // Both sides are told about each other at the same moment, so without a
204
+ // rule both would offer and there would be two half-open connections to
205
+ // unpick. Comparing identifiers is free and both sides always agree.
206
+ meet(name, peer, shouldInitiate(did, peer) ? throughMesh(peer) : null);
207
+ }
208
+ };
209
+ const onRelayedSignal = (from, signal) => {
210
+ // Flooding means the same signal can arrive by several routes; act once.
211
+ if (typeof signal?.id !== 'string' || signal.id.length > 64 || !seenSignals.accept(signal.id))
212
+ return;
213
+ if (!isPeerDid(signal.origin) || !isPeerDid(signal.target) || !['offer', 'answer', 'candidate'].includes(signal.kind))
214
+ return;
215
+ if (signal.target === did) {
216
+ void onSignal(signal.origin, signal.kind, signal.data, throughMesh(signal.origin));
217
+ }
218
+ else if (typeof signal.hops === 'number' && signal.hops > 0) {
219
+ // The sender says how far it may go; never further than we would send it.
220
+ floodSignal({ ...signal, hops: Math.min(signal.hops, MAX_HOPS) - 1 }, from);
221
+ }
222
+ };
223
+ transport.on('connected', (peer) => {
224
+ links.add(peer);
225
+ attempted.add(peer);
226
+ for (const name of expected.get(peer) ?? [])
227
+ greet(name, peer);
228
+ expected.delete(peer);
229
+ // The other side greets in the rooms it knows we share; if none does, the connection has no use.
230
+ idle.set(peer, setTimeout(() => {
231
+ idle.delete(peer);
232
+ closeIfIdle(peer);
233
+ }, authTimeoutMs));
234
+ });
235
+ transport.on('disconnected', lost);
236
+ transport.on('data', (peer, data) => {
237
+ let frame;
238
+ try {
239
+ frame = JSON.parse(utf8Decode(data));
240
+ }
241
+ catch {
242
+ return fail(new Error('Failed to parse incoming message'));
243
+ }
244
+ const { type, payload } = frame;
245
+ const name = typeof frame.room === 'string' ? frame.room : null;
246
+ if (typeof type !== 'string')
247
+ return;
248
+ // Before a peer has proved itself somewhere, the handshake is all there is.
249
+ if (type === AUTH_HELLO_MESSAGE || type === AUTH_PROOF_MESSAGE) {
250
+ if (name)
251
+ void onHandshake(name, peer, type, payload).catch(() => { const room = rooms.get(name); if (room)
252
+ refuse(room, peer); });
253
+ return;
254
+ }
255
+ if (!isAdmitted(peer))
256
+ return;
257
+ if (type === SIGNAL_MESSAGE)
258
+ return onRelayedSignal(peer, payload);
259
+ const room = name ? rooms.get(name) : undefined;
260
+ if (!name || !room?.peers.has(peer))
261
+ return;
262
+ if (type === PEERS_MESSAGE)
263
+ return handlePeerList(name, payload);
264
+ if (type === LEAVE_MESSAGE) {
265
+ drop(room, peer);
266
+ return closeIfIdle(peer);
267
+ }
268
+ // Mesh housekeeping never reaches the space. The sender is the connection
269
+ // it arrived on, not whatever the frame claims.
270
+ if (!isControlMessage(type))
271
+ room.events.emit('message', { type, from: peer, payload });
272
+ });
273
+ transport.on('error', (peer, error) => fail(new Error(`Transport error with peer ${peer}: ${error.message}`)));
274
+ // ─── Rooms ──────────────────────────────────────────────────────────
275
+ const start = () => {
276
+ started ??= signaling.connect().catch((error) => {
277
+ started = null;
278
+ throw error;
279
+ });
280
+ return started;
281
+ };
282
+ return {
283
+ join(name, auth = null) {
284
+ const room = { auth, peers: new Map(), handshakes: new Map(), events: createEmitter() };
285
+ const send = (peer, message) => {
286
+ if (room.peers.has(peer))
287
+ sendFrame(peer, { room: name, type: message.type, payload: message.payload });
288
+ };
289
+ return Object.freeze({
290
+ async connect() {
291
+ if (rooms.has(name))
292
+ throw new Error('This mesh is already in that room');
293
+ rooms.set(name, room);
294
+ signaling.join(name);
295
+ await start();
296
+ },
297
+ disconnect() {
298
+ if (rooms.get(name) !== room)
299
+ return;
300
+ for (const peer of room.peers.keys())
301
+ sendFrame(peer, { room: name, type: LEAVE_MESSAGE });
302
+ for (const peer of [...room.handshakes.keys()])
303
+ endHandshake(room, peer);
304
+ room.peers.clear();
305
+ rooms.delete(name);
306
+ signaling.leave(name);
307
+ for (const peer of [...links])
308
+ closeIfIdle(peer);
309
+ if (rooms.size === 0) {
310
+ for (const timer of idle.values())
311
+ clearTimeout(timer);
312
+ idle.clear();
313
+ signaling.disconnect();
314
+ started = null;
315
+ }
316
+ },
317
+ send,
318
+ broadcast: (message) => {
319
+ for (const peer of room.peers.keys())
320
+ send(peer, message);
321
+ },
322
+ getPeers: () => [...room.peers.values()],
323
+ on: room.events.on,
324
+ off: room.events.off,
325
+ // Connected means reachable, which after the first introduction no longer
326
+ // depends on a relay being up.
327
+ isConnected: () => signaling.isConnected() || room.peers.size > 0,
328
+ });
329
+ },
330
+ };
331
+ }
332
+ //# sourceMappingURL=mesh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.js","sourceRoot":"","sources":["../../src/network/mesh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @module multi-signaling
3
+ * Several rendezvous points behind one interface.
4
+ *
5
+ * A relay is a phone book, not an authority: it forwards connection offers and
6
+ * never sees an expression. But with exactly one of them configured there is
7
+ * still, in practice, a single point of failure and a single operator who can
8
+ * decide nobody gets introduced today. Pointing at several removes that without
9
+ * changing what any of them can do.
10
+ *
11
+ * They are used all at once rather than in order. Failover would still leave two
12
+ * people stranded when one is on the first relay and the other on the second;
13
+ * being present on all of them means they meet wherever either is looking. The
14
+ * cost is a handful of websockets, which is what a torrent client has always
15
+ * done with its tracker list.
16
+ *
17
+ * Peers are announced once per room however many relays mention them, because a
18
+ * duplicate announcement would have both sides opening a second connection.
19
+ */
20
+ import { type SignalingClient } from './signaling.js';
21
+ /**
22
+ * Creates a signaling client spanning several relays.
23
+ *
24
+ * @param urls The relays to use. One is fine; none is a programming error.
25
+ * @param did This peer's identifier
26
+ * @returns A client with the same contract as a single-relay one
27
+ */
28
+ export declare function createMultiSignalingClient(urls: ReadonlyArray<string>, did: string): SignalingClient;
29
+ //# sourceMappingURL=multi-signaling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-signaling.d.ts","sourceRoot":"","sources":["../../src/network/multi-signaling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAyB,KAAK,eAAe,EAAyC,MAAM,gBAAgB,CAAC;AAEpH;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,GAAG,EAAE,MAAM,GACV,eAAe,CAwGjB"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @module multi-signaling
3
+ * Several rendezvous points behind one interface.
4
+ *
5
+ * A relay is a phone book, not an authority: it forwards connection offers and
6
+ * never sees an expression. But with exactly one of them configured there is
7
+ * still, in practice, a single point of failure and a single operator who can
8
+ * decide nobody gets introduced today. Pointing at several removes that without
9
+ * changing what any of them can do.
10
+ *
11
+ * They are used all at once rather than in order. Failover would still leave two
12
+ * people stranded when one is on the first relay and the other on the second;
13
+ * being present on all of them means they meet wherever either is looking. The
14
+ * cost is a handful of websockets, which is what a torrent client has always
15
+ * done with its tracker list.
16
+ *
17
+ * Peers are announced once per room however many relays mention them, because a
18
+ * duplicate announcement would have both sides opening a second connection.
19
+ */
20
+ import { createEmitter } from '../utils/events.js';
21
+ import { createSignalingClient } from './signaling.js';
22
+ /**
23
+ * Creates a signaling client spanning several relays.
24
+ *
25
+ * @param urls The relays to use. One is fine; none is a programming error.
26
+ * @param did This peer's identifier
27
+ * @returns A client with the same contract as a single-relay one
28
+ */
29
+ export function createMultiSignalingClient(urls, did) {
30
+ if (urls.length === 0) {
31
+ throw new Error('At least one relay is needed to introduce peers.');
32
+ }
33
+ const clients = urls.map((url) => createSignalingClient(url, did));
34
+ const { on, off, emit } = createEmitter();
35
+ /** Which relays a peer has been seen on, so replies go back the same way. */
36
+ const routes = new Map();
37
+ /** Relays that have said a peer is in a room, by `room did` — announced upward once, gone once none do. */
38
+ const presence = new Map();
39
+ const connectedCount = () => clients.filter((client) => client.isConnected()).length;
40
+ /** Remembers that a peer is reachable through this relay. */
41
+ const remember = (peer, client) => {
42
+ (routes.get(peer) ?? routes.set(peer, new Set()).get(peer)).add(client);
43
+ };
44
+ /** The relays worth trying for a peer, best guess first. */
45
+ const routesFor = (peer) => {
46
+ const known = [...(routes.get(peer) ?? [])].filter((client) => client.isConnected());
47
+ // Nothing known yet — an answer to an offer that arrived before this client
48
+ // saw the peer join. Shout on every relay rather than dropping it.
49
+ return known.length > 0 ? known : clients.filter((client) => client.isConnected());
50
+ };
51
+ for (const client of clients) {
52
+ client.on('peer-joined', (peer, room) => {
53
+ remember(peer, client);
54
+ if (peer === did)
55
+ return;
56
+ const where = `${room} ${peer}`;
57
+ const seenBy = presence.get(where) ?? presence.set(where, new Set()).get(where);
58
+ seenBy.add(client);
59
+ if (seenBy.size === 1)
60
+ emit('peer-joined', peer, room);
61
+ });
62
+ client.on('peer-left', (peer, room) => {
63
+ const where = `${room} ${peer}`;
64
+ const seenBy = presence.get(where);
65
+ // Still in the room through another relay: not gone, just quieter.
66
+ if (!seenBy?.delete(client) || seenBy.size > 0)
67
+ return;
68
+ presence.delete(where);
69
+ emit('peer-left', peer, room);
70
+ });
71
+ client.on('signal', (message) => {
72
+ remember(message.from, client);
73
+ emit('signal', message);
74
+ });
75
+ client.on('connected', () => {
76
+ if (connectedCount() === 1)
77
+ emit('connected');
78
+ });
79
+ client.on('disconnected', () => {
80
+ if (connectedCount() === 0)
81
+ emit('disconnected');
82
+ });
83
+ // A relay being down is normal when several are configured, so it is not
84
+ // worth surfacing on its own. Total failure shows up through `connect`.
85
+ client.on('error', () => { });
86
+ }
87
+ /**
88
+ * Connects to every relay, succeeding if any of them answers.
89
+ * @returns Once at least one relay is usable
90
+ */
91
+ const connect = async () => {
92
+ const results = await Promise.allSettled(clients.map((client) => client.connect()));
93
+ if (results.some((result) => result.status === 'fulfilled'))
94
+ return;
95
+ throw new Error(`None of the ${clients.length} configured relays could be reached: ${urls.join(', ')}`);
96
+ };
97
+ return Object.freeze({
98
+ connect,
99
+ disconnect: () => {
100
+ for (const client of clients)
101
+ client.disconnect();
102
+ routes.clear();
103
+ presence.clear();
104
+ },
105
+ join: (room) => {
106
+ for (const client of clients)
107
+ client.join(room);
108
+ },
109
+ leave: (room) => {
110
+ for (const client of clients)
111
+ client.leave(room);
112
+ for (const where of presence.keys())
113
+ if (where.startsWith(`${room} `))
114
+ presence.delete(where);
115
+ },
116
+ signal: (kind, target, payload) => {
117
+ for (const client of routesFor(target))
118
+ client.signal(kind, target, payload);
119
+ },
120
+ on,
121
+ off,
122
+ isConnected: () => connectedCount() > 0,
123
+ });
124
+ }
125
+ //# sourceMappingURL=multi-signaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-signaling.js","sourceRoot":"","sources":["../../src/network/multi-signaling.ts"],"names":[],"mappings":"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"}