@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,135 @@
1
+ import { canonicalize } from '../schema/expression.js';
2
+ import { cidFromBytes, sha256 } from '../utils/hash.js';
3
+ import { base64UrlDecode, base64UrlEncode, utf8Encode } from '../utils/encoding.js';
4
+ import { publicKeyToDid, didToPublicKey, P256_MULTICODEC } from '../identity/did.js';
5
+ import { checkRole } from './roles.js';
6
+ const READ_INFO = 'weave/space-read/v1';
7
+ const INVITE_INFO = 'weave/space-invite/v1';
8
+ /** A fresh secret for an invite link */
9
+ export function generateInviteSecret() {
10
+ return globalThis.crypto.getRandomValues(new Uint8Array(32));
11
+ }
12
+ async function expand(secret, info) {
13
+ const material = await globalThis.crypto.subtle.importKey('raw', secret, 'HKDF', false, ['deriveBits']);
14
+ const bits = await globalThis.crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(0), info: utf8Encode(info) }, material, 256);
15
+ return new Uint8Array(bits);
16
+ }
17
+ /**
18
+ * A key pair from a secret, for one purpose. The secret is expanded under its
19
+ * own label first, so no two uses of one secret — nor an account seed that
20
+ * happened to equal it — ever give the same key.
21
+ */
22
+ async function derivePair(secret, info, provider) {
23
+ const pair = await provider.deriveKeyPairFromSeed(await expand(secret, info));
24
+ const did = publicKeyToDid(await provider.exportPublicKey(pair.publicKey), P256_MULTICODEC);
25
+ return Object.freeze({ did, privateKey: pair.privateKey });
26
+ }
27
+ /** The key pair an invite link's secret stands for */
28
+ export function deriveInviteKey(secret, provider) {
29
+ return derivePair(secret, INVITE_INFO, provider);
30
+ }
31
+ /** The read key pair of a private space, from its AES key */
32
+ export async function deriveReadKey(spaceKey, provider) {
33
+ return readKeyFromSeed(await deriveReadSeed(spaceKey), provider);
34
+ }
35
+ /**
36
+ * What the read key pair is made from — one way from the space key, so
37
+ * holding it proves you may read without letting you decrypt anything. It is
38
+ * what a pass hands a node that carries a space it cannot read (`space/pass.ts`).
39
+ */
40
+ export async function deriveReadSeed(spaceKey) {
41
+ const raw = new Uint8Array(await globalThis.crypto.subtle.exportKey('raw', spaceKey.key));
42
+ return expand(raw, READ_INFO);
43
+ }
44
+ /** The read key pair, from its seed */
45
+ export async function readKeyFromSeed(seed, provider) {
46
+ const pair = await provider.deriveKeyPairFromSeed(seed);
47
+ const did = publicKeyToDid(await provider.exportPublicKey(pair.publicKey), P256_MULTICODEC);
48
+ return Object.freeze({ did, privateKey: pair.privateKey });
49
+ }
50
+ /** The fields of a space its id is made from */
51
+ export function spaceGenesis(space) {
52
+ return {
53
+ v: 2,
54
+ creator: space.creator,
55
+ visibility: space.visibility,
56
+ roles: space.roles,
57
+ creatorRole: space.creatorRole,
58
+ createdAt: space.createdAt,
59
+ nonce: space.nonce,
60
+ ...(space.readKey ? { readKey: space.readKey } : {}),
61
+ ...(space.encryptionKeyId ? { encryptionKeyId: space.encryptionKeyId } : {}),
62
+ };
63
+ }
64
+ /** The id a space with this genesis has */
65
+ export function spaceIdOf(genesis) {
66
+ return cidFromBytes(utf8Encode(canonicalize(genesis)));
67
+ }
68
+ /** Why a set of starting roles cannot found a space, or null */
69
+ export function checkStartingRoles(roles, creatorRole) {
70
+ if (!Array.isArray(roles) || roles.length === 0 || roles.length > 64)
71
+ return 'A space starts with 1–64 roles';
72
+ for (const role of roles) {
73
+ const problem = checkRole(role);
74
+ if (problem)
75
+ return problem;
76
+ }
77
+ if (new Set(roles.map((role) => role.name)).size !== roles.length)
78
+ return 'Two starting roles share a name';
79
+ if (!roles.some((role) => role.name === creatorRole))
80
+ return 'The creator\'s role is not one of the starting roles';
81
+ return null;
82
+ }
83
+ /**
84
+ * Why a space someone handed over cannot be trusted, or null when it can:
85
+ * its id must be its genesis's hash, and it must have the keys its kind needs.
86
+ */
87
+ export async function checkSpace(space) {
88
+ if (typeof space?.id !== 'string' || typeof space.nonce !== 'string' || typeof space.creator !== 'string') {
89
+ return 'It is missing what identifies it';
90
+ }
91
+ if (space.visibility !== 'public' && space.visibility !== 'private')
92
+ return 'Its visibility is not public or private';
93
+ const roles = checkStartingRoles(space.roles, space.creatorRole);
94
+ if (roles)
95
+ return roles;
96
+ if (space.visibility === 'private' && (!space.readKey || !space.encryptionKeyId))
97
+ return 'A private space must name its read key';
98
+ if (space.visibility === 'public' && (space.readKey || space.encryptionKeyId))
99
+ return 'A public space has no read key';
100
+ if ((await spaceIdOf(spaceGenesis(space))) !== space.id)
101
+ return 'Its id does not match what it says about itself';
102
+ return null;
103
+ }
104
+ // ─── Record keys in the access history ────────────────────────────────
105
+ //
106
+ // Record keys are lower case; DIDs and CIDs are not. So a key names a hash of
107
+ // the thing, and the record's body names the thing itself.
108
+ async function hashKey(prefix, value) {
109
+ const digest = await sha256(utf8Encode(value));
110
+ return `${prefix}:${Array.from(digest.subarray(0, 20), (b) => b.toString(16).padStart(2, '0')).join('')}`;
111
+ }
112
+ /** The key of an account's member record */
113
+ export const memberKey = (did) => hashKey('member', did);
114
+ /** The key of an invite's record, from its public key */
115
+ export const inviteKey = (inviteDid) => hashKey('invite', inviteDid);
116
+ /** The key of the record revoking a note, from the note's CID */
117
+ export const revokeKey = (noteCid) => hashKey('revoke', noteCid);
118
+ /** The key of a role's record */
119
+ export const roleKey = (name) => `role:${name}`;
120
+ const inviteLabel = (spaceId, did) => utf8Encode(`${INVITE_INFO}|${spaceId}|${did}`);
121
+ /** An invite key's signature, letting `did` join `spaceId` — what a member record carries when it joins by invite */
122
+ export async function signInvite(spaceId, did, invite, provider) {
123
+ return base64UrlEncode(await provider.sign(invite.privateKey, inviteLabel(spaceId, did)));
124
+ }
125
+ /** Whether an invite key signed for `did` to join `spaceId` */
126
+ export async function verifyInvite(spaceId, did, inviteDid, signature, provider) {
127
+ try {
128
+ const publicKey = await provider.importPublicKey(didToPublicKey(inviteDid).publicKeyBytes);
129
+ return await provider.verify(publicKey, base64UrlDecode(signature), inviteLabel(spaceId, did));
130
+ }
131
+ catch {
132
+ return false;
133
+ }
134
+ }
135
+ //# sourceMappingURL=space-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-access.js","sourceRoot":"","sources":["../../src/space/space-access.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @module space-manager
3
+ * Spaces — the cryptographic containers everything else lives in — as this
4
+ * node holds them: the space, its key if it is private, and anything waiting
5
+ * to be done with it.
6
+ *
7
+ * A space is `public` or `private` (whether bodies are encrypted), fixed at
8
+ * creation. Who may write is not a property of the space but of its access
9
+ * history: roles and members, as records in it (`space/roles.ts`).
10
+ */
11
+ import type { CryptoProvider, Space, SpaceRole, SpaceVisibility, StorageAdapter } from '../types.js';
12
+ import { type SpaceKey } from '../privacy/space-encryption.js';
13
+ import { type SpaceKeyPair } from './space-access.js';
14
+ /** A space plus the secrets this node holds for it */
15
+ export interface SpaceRecord {
16
+ readonly space: Space;
17
+ /** The AES key that reads a private space */
18
+ readonly key: SpaceKey | null;
19
+ /**
20
+ * An invite link's secret, held until this account's member record is
21
+ * written with it — which needs the invite's own record to have arrived.
22
+ * Null once joined, or for a view-only invite.
23
+ */
24
+ readonly invite: Uint8Array | null;
25
+ /** The role this account last held here, as the space's access history said — a hint for listing, not a gate */
26
+ readonly role: string | null;
27
+ /**
28
+ * The read key pair, for a node that carries a private space without its
29
+ * key (`space/pass.ts`). With the key it is derived from that instead.
30
+ */
31
+ readonly read?: SpaceKeyPair | null;
32
+ }
33
+ export interface CreateSpaceParams {
34
+ readonly name: string;
35
+ readonly visibility: SpaceVisibility;
36
+ readonly creator: string;
37
+ /** The roles it starts with. Default: the creator alone, holding everything (`presets.solo`). */
38
+ readonly roles?: ReadonlyArray<SpaceRole>;
39
+ readonly creatorRole?: string;
40
+ }
41
+ /** What an invite carries: enough to find the space, to read it if it is private, and to join it if it says so */
42
+ export interface SpaceInvite {
43
+ readonly space: Space;
44
+ /** Raw AES key material, base64url — present only for private spaces */
45
+ readonly key?: string;
46
+ /** The invite link's secret, base64url — absent in a view-only invite */
47
+ readonly invite?: string;
48
+ /** The role the invite is for, for showing before joining. The space's own record is what counts. */
49
+ readonly role?: string;
50
+ readonly invitedBy: string;
51
+ }
52
+ export interface InviteOptions {
53
+ /** The secret behind an invite record already written for a role. Absent: a view-only invite. */
54
+ readonly secret?: Uint8Array;
55
+ readonly role?: string;
56
+ }
57
+ export interface SpaceManager {
58
+ create(params: CreateSpaceParams): Promise<SpaceRecord>;
59
+ get(spaceId: string): Promise<SpaceRecord | null>;
60
+ list(): Promise<ReadonlyArray<SpaceRecord>>;
61
+ remove(spaceId: string): Promise<void>;
62
+ /** Encodes a space, its key if private, and an invite's secret if given, as a shareable string */
63
+ createInvite(spaceId: string, invitedBy: string, options?: InviteOptions): Promise<string>;
64
+ /**
65
+ * Stores a space received as an invite, so it can be opened and synced.
66
+ * Refuses a space whose id does not match what it says about itself, and
67
+ * a key that does not belong to it. An invite's secret is held until it is used.
68
+ */
69
+ join(invite: string): Promise<SpaceRecord>;
70
+ /** Forgets an invite's secret once it has been used */
71
+ clearInvite(spaceId: string): Promise<void>;
72
+ /** Remembers the role this account holds, for listing */
73
+ setRole(spaceId: string, role: string | null): Promise<void>;
74
+ }
75
+ /**
76
+ * Creates a space manager backed by a storage adapter.
77
+ * @param adapter Where spaces and their keys are kept
78
+ * @returns The space manager
79
+ */
80
+ export declare function createSpaceManager(adapter: StorageAdapter, provider?: CryptoProvider): SpaceManager;
81
+ /**
82
+ * Decodes an invite without touching storage.
83
+ * @param invite The encoded invite string
84
+ * @returns The space it describes, and its key when private
85
+ */
86
+ export declare function parseSpaceInvite(invite: string): SpaceInvite;
87
+ //# sourceMappingURL=space-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../src/space/space-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGrG,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAA2F,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG/I,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,gHAAgH;IAChH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,kHAAkH;AAClH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qGAAqG;IACrG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClD,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,kGAAkG;IAClG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3F;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,uDAAuD;IACvD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,yDAAyD;IACzD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAoCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,GAAE,cAAqC,GAAG,YAAY,CAwIzH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAU5D"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * @module space-manager
3
+ * Spaces — the cryptographic containers everything else lives in — as this
4
+ * node holds them: the space, its key if it is private, and anything waiting
5
+ * to be done with it.
6
+ *
7
+ * A space is `public` or `private` (whether bodies are encrypted), fixed at
8
+ * creation. Who may write is not a property of the space but of its access
9
+ * history: roles and members, as records in it (`space/roles.ts`).
10
+ */
11
+ import { createP256Provider } from '../identity/crypto-p256.js';
12
+ import { base64UrlEncode, base64UrlDecode, utf8Encode, utf8Decode } from '../utils/encoding.js';
13
+ import { generateSpaceKey } from '../privacy/space-encryption.js';
14
+ import { checkSpace, checkStartingRoles, deriveInviteKey, deriveReadKey, spaceGenesis, spaceIdOf } from './space-access.js';
15
+ import { solo } from './presets.js';
16
+ const SPACE_PREFIX = 'space:';
17
+ const KEY_PREFIX = 'spacekey:';
18
+ const INVITE_PREFIX = 'spaceinvite:';
19
+ const ROLE_PREFIX = 'spacerole:';
20
+ async function exportKey(key) {
21
+ const raw = await globalThis.crypto.subtle.exportKey('raw', key.key);
22
+ return {
23
+ id: key.id,
24
+ raw: base64UrlEncode(new Uint8Array(raw)),
25
+ createdAt: key.createdAt,
26
+ version: key.version,
27
+ };
28
+ }
29
+ async function importKey(stored) {
30
+ const key = await globalThis.crypto.subtle.importKey('raw', base64UrlDecode(stored.raw), { name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
31
+ return Object.freeze({ id: stored.id, key, createdAt: stored.createdAt, version: stored.version });
32
+ }
33
+ /**
34
+ * Creates a space manager backed by a storage adapter.
35
+ * @param adapter Where spaces and their keys are kept
36
+ * @returns The space manager
37
+ */
38
+ export function createSpaceManager(adapter, provider = createP256Provider()) {
39
+ async function readSpace(spaceId) {
40
+ const bytes = await adapter.get(`${SPACE_PREFIX}${spaceId}`);
41
+ return bytes ? JSON.parse(utf8Decode(bytes)) : null;
42
+ }
43
+ async function writeSpace(space) {
44
+ await adapter.put(`${SPACE_PREFIX}${space.id}`, utf8Encode(JSON.stringify(space)));
45
+ }
46
+ async function readKey(spaceId) {
47
+ const bytes = await adapter.get(`${KEY_PREFIX}${spaceId}`);
48
+ if (!bytes)
49
+ return null;
50
+ return importKey(JSON.parse(utf8Decode(bytes)));
51
+ }
52
+ async function writeKey(spaceId, key) {
53
+ const stored = await exportKey(key);
54
+ await adapter.put(`${KEY_PREFIX}${spaceId}`, utf8Encode(JSON.stringify(stored)));
55
+ }
56
+ async function readText(prefix, spaceId) {
57
+ const bytes = await adapter.get(`${prefix}${spaceId}`);
58
+ return bytes ? utf8Decode(bytes) : null;
59
+ }
60
+ async function load(spaceId) {
61
+ const space = await readSpace(spaceId);
62
+ if (!space)
63
+ return null;
64
+ const invite = await readText(INVITE_PREFIX, spaceId);
65
+ return {
66
+ space,
67
+ key: await readKey(spaceId),
68
+ invite: invite ? base64UrlDecode(invite) : null,
69
+ role: await readText(ROLE_PREFIX, spaceId),
70
+ };
71
+ }
72
+ return Object.freeze({
73
+ async create(params) {
74
+ const createdAt = new Date().toISOString();
75
+ // A nonce keeps two spaces made alike from colliding on one id.
76
+ const nonce = base64UrlEncode(globalThis.crypto.getRandomValues(new Uint8Array(12)));
77
+ const roles = params.roles ?? solo.roles;
78
+ const creatorRole = params.creatorRole ?? (params.roles ? [...roles].sort((a, b) => b.rank - a.rank)[0]?.name : solo.creatorRole) ?? '';
79
+ const problem = checkStartingRoles(roles, creatorRole);
80
+ if (problem)
81
+ throw new Error(problem);
82
+ const key = params.visibility === 'private' ? await generateSpaceKey() : null;
83
+ const fixed = {
84
+ visibility: params.visibility,
85
+ creator: params.creator,
86
+ roles: roles.map((role) => Object.freeze({ ...role, permissions: Object.freeze([...role.permissions]) })),
87
+ creatorRole,
88
+ createdAt,
89
+ nonce,
90
+ ...(key ? { readKey: (await deriveReadKey(key, provider)).did, encryptionKeyId: key.id } : {}),
91
+ };
92
+ const id = await spaceIdOf(spaceGenesis(fixed));
93
+ const space = Object.freeze({ id, ...fixed, name: params.name });
94
+ await writeSpace(space);
95
+ if (key)
96
+ await writeKey(id, key);
97
+ await adapter.put(`${ROLE_PREFIX}${id}`, utf8Encode(creatorRole));
98
+ return { space, key, invite: null, role: creatorRole };
99
+ },
100
+ async get(spaceId) {
101
+ return load(spaceId);
102
+ },
103
+ async list() {
104
+ const keys = await adapter.list(SPACE_PREFIX);
105
+ const records = await Promise.all(keys.map((key) => load(key.slice(SPACE_PREFIX.length))));
106
+ return records
107
+ .filter((record) => record !== null)
108
+ .sort((a, b) => a.space.createdAt.localeCompare(b.space.createdAt));
109
+ },
110
+ async remove(spaceId) {
111
+ for (const prefix of [SPACE_PREFIX, KEY_PREFIX, INVITE_PREFIX, ROLE_PREFIX])
112
+ await adapter.delete(`${prefix}${spaceId}`);
113
+ },
114
+ async createInvite(spaceId, invitedBy, options = {}) {
115
+ const record = await load(spaceId);
116
+ if (!record)
117
+ throw new Error(`Unknown space: ${spaceId}`);
118
+ // The key rides along for private spaces — which is why an invite is a
119
+ // secret, and why it belongs in a URL fragment rather than a path.
120
+ const invite = {
121
+ space: record.space,
122
+ invitedBy,
123
+ ...(record.key ? { key: (await exportKey(record.key)).raw } : {}),
124
+ ...(options.secret ? { invite: base64UrlEncode(options.secret) } : {}),
125
+ ...(options.secret && options.role ? { role: options.role } : {}),
126
+ };
127
+ return base64UrlEncode(utf8Encode(JSON.stringify(invite)));
128
+ },
129
+ async join(invite) {
130
+ const parsed = parseSpaceInvite(invite);
131
+ // Whoever made the invite could have edited it. The space must hash to
132
+ // its id, and its key must be the one the space names.
133
+ const problem = await checkSpace(parsed.space);
134
+ if (problem)
135
+ throw new Error(`That invite does not describe a real space: ${problem.charAt(0).toLowerCase()}${problem.slice(1)}.`);
136
+ const key = parsed.key
137
+ ? await importKey({ id: parsed.space.encryptionKeyId ?? '', raw: parsed.key, createdAt: parsed.space.createdAt, version: 1 })
138
+ : null;
139
+ if (key && (await deriveReadKey(key, provider)).did !== parsed.space.readKey) {
140
+ throw new Error('That invite carries a key that does not belong to its space.');
141
+ }
142
+ const secret = parsed.invite ? base64UrlDecode(parsed.invite) : null;
143
+ // A secret of the wrong length cannot be an invite's; refuse it here rather than wait on it forever.
144
+ if (secret && secret.length !== 32)
145
+ throw new Error('That invite carries a secret that is not an invite\'s.');
146
+ if (secret)
147
+ await deriveInviteKey(secret, provider);
148
+ const space = Object.freeze({ ...parsed.space });
149
+ await writeSpace(space);
150
+ if (key)
151
+ await writeKey(space.id, key);
152
+ // Joining again with a secret while one is waiting keeps the newer one.
153
+ if (secret)
154
+ await adapter.put(`${INVITE_PREFIX}${space.id}`, utf8Encode(base64UrlEncode(secret)));
155
+ return (await load(space.id));
156
+ },
157
+ async clearInvite(spaceId) {
158
+ await adapter.delete(`${INVITE_PREFIX}${spaceId}`);
159
+ },
160
+ async setRole(spaceId, role) {
161
+ if (!(await readSpace(spaceId)))
162
+ return;
163
+ if (role === null)
164
+ await adapter.delete(`${ROLE_PREFIX}${spaceId}`);
165
+ else
166
+ await adapter.put(`${ROLE_PREFIX}${spaceId}`, utf8Encode(role));
167
+ },
168
+ });
169
+ }
170
+ /**
171
+ * Decodes an invite without touching storage.
172
+ * @param invite The encoded invite string
173
+ * @returns The space it describes, and its key when private
174
+ */
175
+ export function parseSpaceInvite(invite) {
176
+ try {
177
+ const parsed = JSON.parse(utf8Decode(base64UrlDecode(invite.trim())));
178
+ if (!parsed?.space?.id || !parsed.space.name) {
179
+ throw new Error('missing space');
180
+ }
181
+ return parsed;
182
+ }
183
+ catch {
184
+ throw new Error('That invite could not be read — it may be truncated or from another app.');
185
+ }
186
+ }
187
+ //# sourceMappingURL=space-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-manager.js","sourceRoot":"","sources":["../../src/space/space-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @module directory-access
3
+ * Getting hold of the user's data folder, and getting it back on the next visit.
4
+ *
5
+ * A directory handle is the one capability a web page can hold that outlives the
6
+ * origin sandbox, so the browser guards it carefully: it can only be obtained
7
+ * from a user gesture, and permission has to be re-confirmed when a new session
8
+ * starts. The handle itself is structured-cloneable, which means it can be kept
9
+ * in IndexedDB — origin-local storage of a *pointer* to origin-independent data.
10
+ */
11
+ import type { DirectoryHandleLike } from './folder-adapter.js';
12
+ /** Read or read-write, in the browser's vocabulary */
13
+ export type FolderAccessMode = 'read' | 'readwrite';
14
+ /**
15
+ * Whether this browser can hand out a directory at all.
16
+ *
17
+ * Chrome, Edge and Opera on the desktop can. Firefox and Safari cannot, and
18
+ * neither can any mobile browser, so a caller has to have something else to
19
+ * offer — this returning false is a normal state, not a broken one.
20
+ *
21
+ * @returns Whether {@link pickDataFolder} will work here
22
+ */
23
+ export declare function isFolderStorageAvailable(): boolean;
24
+ /**
25
+ * Asks the user to choose their data folder. Must be called from a click.
26
+ *
27
+ * @param options.id Groups the picker's memory of where it last opened. Keeping
28
+ * this stable across apps means the second view of the same data opens the
29
+ * picker already pointing at the right folder.
30
+ * @returns The chosen directory
31
+ */
32
+ export declare function pickDataFolder(options?: {
33
+ id?: string;
34
+ }): Promise<DirectoryHandleLike>;
35
+ /**
36
+ * Asks what this origin is currently allowed to do with a folder.
37
+ * @param handle The directory in question
38
+ * @param mode The access being asked about
39
+ * @returns `granted`, `denied`, or `prompt` when the user has yet to be asked
40
+ */
41
+ export declare function queryFolderPermission(handle: DirectoryHandleLike, mode?: FolderAccessMode): Promise<PermissionState>;
42
+ /**
43
+ * Makes sure this origin may use a folder, prompting if it has to.
44
+ *
45
+ * The prompt needs a user gesture, so `request` should only be true on a path
46
+ * that began with a click — call it with `false` on page load to find out
47
+ * whether a button needs showing at all.
48
+ *
49
+ * @param handle The directory to check
50
+ * @param options.request Whether to prompt when permission is not already given
51
+ * @param options.mode The access needed
52
+ * @returns Whether the folder is usable
53
+ */
54
+ export declare function ensureFolderPermission(handle: DirectoryHandleLike, options?: {
55
+ request?: boolean;
56
+ mode?: FolderAccessMode;
57
+ }): Promise<boolean>;
58
+ /**
59
+ * Remembers a folder so the next visit can skip the picker.
60
+ *
61
+ * Only the handle is stored, never the contents — this origin keeps a pointer,
62
+ * and the data stays where the user put it.
63
+ *
64
+ * @param handle The directory to remember
65
+ */
66
+ export declare function rememberDataFolder(handle: DirectoryHandleLike): Promise<void>;
67
+ /**
68
+ * The folder this origin used last, if the browser still has it.
69
+ *
70
+ * Says nothing about permission — a recalled handle usually needs
71
+ * {@link ensureFolderPermission} with a gesture before it can be read.
72
+ *
73
+ * @returns The remembered directory, or null
74
+ */
75
+ export declare function recallDataFolder(): Promise<DirectoryHandleLike | null>;
76
+ /** Forgets the remembered folder. The folder and everything in it stay put. */
77
+ export declare function forgetDataFolder(): Promise<void>;
78
+ //# sourceMappingURL=directory-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-access.d.ts","sourceRoot":"","sources":["../../src/storage/directory-access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,sDAAsD;AACtD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,CAAC;AAkBpD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgB5F;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,GAAE,gBAA8B,GACnC,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACvD,OAAO,CAAC,OAAO,CAAC,CAQlB;AAmBD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAgB5E;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBtD"}