@mdbase-dev/sdk 0.0.0-stage → 0.1.0-beta.153

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 (900) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +844 -2
  3. package/dist/account-key.d.ts +176 -0
  4. package/dist/account-key.js +409 -0
  5. package/dist/account-key.js.map +1 -0
  6. package/dist/account.d.ts +11 -0
  7. package/dist/account.js +9 -0
  8. package/dist/account.js.map +1 -0
  9. package/dist/app-grant/client.d.ts +209 -0
  10. package/dist/app-grant/client.js +930 -0
  11. package/dist/app-grant/client.js.map +1 -0
  12. package/dist/app-grant/grant-store.d.ts +77 -0
  13. package/dist/app-grant/grant-store.js +201 -0
  14. package/dist/app-grant/grant-store.js.map +1 -0
  15. package/dist/app-grant/index.d.ts +11 -0
  16. package/dist/app-grant/index.js +10 -0
  17. package/dist/app-grant/index.js.map +1 -0
  18. package/dist/app-grant/native-completion.d.ts +22 -0
  19. package/dist/app-grant/native-completion.js +63 -0
  20. package/dist/app-grant/native-completion.js.map +1 -0
  21. package/dist/app-grant/people.d.ts +10 -0
  22. package/dist/app-grant/people.js +84 -0
  23. package/dist/app-grant/people.js.map +1 -0
  24. package/dist/app-grant/setup-attempt.d.ts +12 -0
  25. package/dist/app-grant/setup-attempt.js +62 -0
  26. package/dist/app-grant/setup-attempt.js.map +1 -0
  27. package/dist/app-grant/setup-producer.d.ts +31 -0
  28. package/dist/app-grant/setup-producer.js +65 -0
  29. package/dist/app-grant/setup-producer.js.map +1 -0
  30. package/dist/app-grant/setup.d.ts +11 -0
  31. package/dist/app-grant/setup.js +222 -0
  32. package/dist/app-grant/setup.js.map +1 -0
  33. package/dist/app-host/app-environment.d.ts +27 -0
  34. package/dist/app-host/app-environment.js +48 -0
  35. package/dist/app-host/app-environment.js.map +1 -0
  36. package/dist/app-host/app-origin.d.ts +7 -0
  37. package/dist/app-host/app-origin.js +48 -0
  38. package/dist/app-host/app-origin.js.map +1 -0
  39. package/dist/app-host/bases-pages.d.ts +29 -0
  40. package/dist/app-host/bases-pages.js +42 -0
  41. package/dist/app-host/bases-pages.js.map +1 -0
  42. package/dist/app-host/bases-wire.d.ts +159 -0
  43. package/dist/app-host/bases-wire.js +376 -0
  44. package/dist/app-host/bases-wire.js.map +1 -0
  45. package/dist/app-host/browser-direct-access.d.ts +18 -0
  46. package/dist/app-host/browser-direct-access.js +17 -0
  47. package/dist/app-host/browser-direct-access.js.map +1 -0
  48. package/dist/app-host/cloud-copy-bootstrap.d.ts +127 -0
  49. package/dist/app-host/cloud-copy-bootstrap.js +606 -0
  50. package/dist/app-host/cloud-copy-bootstrap.js.map +1 -0
  51. package/dist/app-host/cloud-copy-host.d.ts +248 -0
  52. package/dist/app-host/cloud-copy-host.js +1028 -0
  53. package/dist/app-host/cloud-copy-host.js.map +1 -0
  54. package/dist/app-host/cloud-copy-persistence-idb.d.ts +33 -0
  55. package/dist/app-host/cloud-copy-persistence-idb.js +255 -0
  56. package/dist/app-host/cloud-copy-persistence-idb.js.map +1 -0
  57. package/dist/app-host/cloud-copy-persistence.d.ts +57 -0
  58. package/dist/app-host/cloud-copy-persistence.js +341 -0
  59. package/dist/app-host/cloud-copy-persistence.js.map +1 -0
  60. package/dist/app-host/collection-control.d.ts +111 -0
  61. package/dist/app-host/collection-control.js +604 -0
  62. package/dist/app-host/collection-control.js.map +1 -0
  63. package/dist/app-host/collection-delete.d.ts +7 -0
  64. package/dist/app-host/collection-delete.js +54 -0
  65. package/dist/app-host/collection-delete.js.map +1 -0
  66. package/dist/app-host/collection-display-name.d.ts +2 -0
  67. package/dist/app-host/collection-display-name.js +22 -0
  68. package/dist/app-host/collection-display-name.js.map +1 -0
  69. package/dist/app-host/collection-join-ledger.d.ts +52 -0
  70. package/dist/app-host/collection-join-ledger.js +208 -0
  71. package/dist/app-host/collection-join-ledger.js.map +1 -0
  72. package/dist/app-host/collection-people.d.ts +32 -0
  73. package/dist/app-host/collection-people.js +119 -0
  74. package/dist/app-host/collection-people.js.map +1 -0
  75. package/dist/app-host/collection-readiness.d.ts +119 -0
  76. package/dist/app-host/collection-readiness.js +649 -0
  77. package/dist/app-host/collection-readiness.js.map +1 -0
  78. package/dist/app-host/collection-setup-journal.d.ts +59 -0
  79. package/dist/app-host/collection-setup-journal.js +813 -0
  80. package/dist/app-host/collection-setup-journal.js.map +1 -0
  81. package/dist/app-host/collection-setup-types.d.ts +155 -0
  82. package/dist/app-host/collection-setup-types.js +10 -0
  83. package/dist/app-host/collection-setup-types.js.map +1 -0
  84. package/dist/app-host/cp-authority.d.ts +65 -0
  85. package/dist/app-host/cp-authority.js +243 -0
  86. package/dist/app-host/cp-authority.js.map +1 -0
  87. package/dist/app-host/cp-people.d.ts +23 -0
  88. package/dist/app-host/cp-people.js +145 -0
  89. package/dist/app-host/cp-people.js.map +1 -0
  90. package/dist/app-host/cp-problem.d.ts +34 -0
  91. package/dist/app-host/cp-problem.js +114 -0
  92. package/dist/app-host/cp-problem.js.map +1 -0
  93. package/dist/app-host/device-key-custody.d.ts +51 -0
  94. package/dist/app-host/device-key-custody.js +128 -0
  95. package/dist/app-host/device-key-custody.js.map +1 -0
  96. package/dist/app-host/device-key-idb.d.ts +31 -0
  97. package/dist/app-host/device-key-idb.js +176 -0
  98. package/dist/app-host/device-key-idb.js.map +1 -0
  99. package/dist/app-host/device-key-provider.d.ts +33 -0
  100. package/dist/app-host/device-key-provider.js +181 -0
  101. package/dist/app-host/device-key-provider.js.map +1 -0
  102. package/dist/app-host/device-registration.d.ts +51 -0
  103. package/dist/app-host/device-registration.js +180 -0
  104. package/dist/app-host/device-registration.js.map +1 -0
  105. package/dist/app-host/foreground-wake.d.ts +43 -0
  106. package/dist/app-host/foreground-wake.js +113 -0
  107. package/dist/app-host/foreground-wake.js.map +1 -0
  108. package/dist/app-host/handover.d.ts +27 -0
  109. package/dist/app-host/handover.js +82 -0
  110. package/dist/app-host/handover.js.map +1 -0
  111. package/dist/app-host/http-log.d.ts +96 -0
  112. package/dist/app-host/http-log.js +608 -0
  113. package/dist/app-host/http-log.js.map +1 -0
  114. package/dist/app-host/index.d.ts +63 -0
  115. package/dist/app-host/index.js +33 -0
  116. package/dist/app-host/index.js.map +1 -0
  117. package/dist/app-host/initial-sync.d.ts +22 -0
  118. package/dist/app-host/initial-sync.js +41 -0
  119. package/dist/app-host/initial-sync.js.map +1 -0
  120. package/dist/app-host/installation-sign-in.d.ts +319 -0
  121. package/dist/app-host/installation-sign-in.js +1231 -0
  122. package/dist/app-host/installation-sign-in.js.map +1 -0
  123. package/dist/app-host/installation-store.d.ts +56 -0
  124. package/dist/app-host/installation-store.js +285 -0
  125. package/dist/app-host/installation-store.js.map +1 -0
  126. package/dist/app-host/ledger-rows.d.ts +3 -0
  127. package/dist/app-host/ledger-rows.js +23 -0
  128. package/dist/app-host/ledger-rows.js.map +1 -0
  129. package/dist/app-host/local-facade.d.ts +24 -0
  130. package/dist/app-host/local-facade.js +361 -0
  131. package/dist/app-host/local-facade.js.map +1 -0
  132. package/dist/app-host/log-pump.d.ts +124 -0
  133. package/dist/app-host/log-pump.js +326 -0
  134. package/dist/app-host/log-pump.js.map +1 -0
  135. package/dist/app-host/log-push.d.ts +90 -0
  136. package/dist/app-host/log-push.js +376 -0
  137. package/dist/app-host/log-push.js.map +1 -0
  138. package/dist/app-host/log-token-cache.d.ts +28 -0
  139. package/dist/app-host/log-token-cache.js +104 -0
  140. package/dist/app-host/log-token-cache.js.map +1 -0
  141. package/dist/app-host/native-sign-in.d.ts +27 -0
  142. package/dist/app-host/native-sign-in.js +12 -0
  143. package/dist/app-host/native-sign-in.js.map +1 -0
  144. package/dist/app-host/noise-custody.d.ts +62 -0
  145. package/dist/app-host/noise-custody.js +238 -0
  146. package/dist/app-host/noise-custody.js.map +1 -0
  147. package/dist/app-host/noise-idb.d.ts +33 -0
  148. package/dist/app-host/noise-idb.js +199 -0
  149. package/dist/app-host/noise-idb.js.map +1 -0
  150. package/dist/app-host/open-wait.d.ts +3 -0
  151. package/dist/app-host/open-wait.js +17 -0
  152. package/dist/app-host/open-wait.js.map +1 -0
  153. package/dist/app-host/opening-progress.d.ts +3 -0
  154. package/dist/app-host/opening-progress.js +5 -0
  155. package/dist/app-host/opening-progress.js.map +1 -0
  156. package/dist/app-host/owner.d.ts +103 -0
  157. package/dist/app-host/owner.js +262 -0
  158. package/dist/app-host/owner.js.map +1 -0
  159. package/dist/app-host/private-bootstrap.d.ts +78 -0
  160. package/dist/app-host/private-bootstrap.js +230 -0
  161. package/dist/app-host/private-bootstrap.js.map +1 -0
  162. package/dist/app-host/private-persistence-idb.d.ts +32 -0
  163. package/dist/app-host/private-persistence-idb.js +188 -0
  164. package/dist/app-host/private-persistence-idb.js.map +1 -0
  165. package/dist/app-host/private-persistence.d.ts +55 -0
  166. package/dist/app-host/private-persistence.js +257 -0
  167. package/dist/app-host/private-persistence.js.map +1 -0
  168. package/dist/app-host/scoped-sign-in-session.d.ts +49 -0
  169. package/dist/app-host/scoped-sign-in-session.js +243 -0
  170. package/dist/app-host/scoped-sign-in-session.js.map +1 -0
  171. package/dist/app-host/setup-engine.d.ts +14 -0
  172. package/dist/app-host/setup-engine.js +73 -0
  173. package/dist/app-host/setup-engine.js.map +1 -0
  174. package/dist/app-host/sign-out-erase.d.ts +37 -0
  175. package/dist/app-host/sign-out-erase.js +139 -0
  176. package/dist/app-host/sign-out-erase.js.map +1 -0
  177. package/dist/app-host/status.d.ts +62 -0
  178. package/dist/app-host/status.js +43 -0
  179. package/dist/app-host/status.js.map +1 -0
  180. package/dist/app-host/storage-probe.d.ts +46 -0
  181. package/dist/app-host/storage-probe.js +63 -0
  182. package/dist/app-host/storage-probe.js.map +1 -0
  183. package/dist/app-host/timer-port.d.ts +29 -0
  184. package/dist/app-host/timer-port.js +483 -0
  185. package/dist/app-host/timer-port.js.map +1 -0
  186. package/dist/app-host/wasm-runtime.d.ts +302 -0
  187. package/dist/app-host/wasm-runtime.js +1050 -0
  188. package/dist/app-host/wasm-runtime.js.map +1 -0
  189. package/dist/app-host/web-collection.d.ts +78 -0
  190. package/dist/app-host/web-collection.js +671 -0
  191. package/dist/app-host/web-collection.js.map +1 -0
  192. package/dist/app-host/web-sign-in-problem.d.ts +17 -0
  193. package/dist/app-host/web-sign-in-problem.js +59 -0
  194. package/dist/app-host/web-sign-in-problem.js.map +1 -0
  195. package/dist/app-host/web-sign-in-session.d.ts +367 -0
  196. package/dist/app-host/web-sign-in-session.js +1258 -0
  197. package/dist/app-host/web-sign-in-session.js.map +1 -0
  198. package/dist/app-storage/app-binary-index.d.ts +33 -0
  199. package/dist/app-storage/app-binary-index.js +274 -0
  200. package/dist/app-storage/app-binary-index.js.map +1 -0
  201. package/dist/app-storage/app-sqlite-index.d.ts +40 -0
  202. package/dist/app-storage/app-sqlite-index.js +102 -0
  203. package/dist/app-storage/app-sqlite-index.js.map +1 -0
  204. package/dist/app-storage/collection-sql.d.ts +39 -0
  205. package/dist/app-storage/collection-sql.js +93 -0
  206. package/dist/app-storage/collection-sql.js.map +1 -0
  207. package/dist/app-storage/index.d.ts +10 -0
  208. package/dist/app-storage/index.js +7 -0
  209. package/dist/app-storage/index.js.map +1 -0
  210. package/dist/app-storage/sqlite-index.d.ts +95 -0
  211. package/dist/app-storage/sqlite-index.js +280 -0
  212. package/dist/app-storage/sqlite-index.js.map +1 -0
  213. package/dist/application/asset-loader.d.ts +22 -0
  214. package/dist/application/asset-loader.js +130 -0
  215. package/dist/application/asset-loader.js.map +1 -0
  216. package/dist/application/asset-pins.json +24 -0
  217. package/dist/application/browser-capabilities.d.ts +48 -0
  218. package/dist/application/browser-capabilities.js +87 -0
  219. package/dist/application/browser-capabilities.js.map +1 -0
  220. package/dist/application/browser-selection.d.ts +58 -0
  221. package/dist/application/browser-selection.js +160 -0
  222. package/dist/application/browser-selection.js.map +1 -0
  223. package/dist/application/capabilities.d.ts +20 -0
  224. package/dist/application/capabilities.js +22 -0
  225. package/dist/application/capabilities.js.map +1 -0
  226. package/dist/application/collection-selection.d.ts +147 -0
  227. package/dist/application/collection-selection.js +351 -0
  228. package/dist/application/collection-selection.js.map +1 -0
  229. package/dist/application/configuration.d.ts +52 -0
  230. package/dist/application/configuration.js +568 -0
  231. package/dist/application/configuration.js.map +1 -0
  232. package/dist/application/declaration.d.ts +51 -0
  233. package/dist/application/declaration.js +100 -0
  234. package/dist/application/declaration.js.map +1 -0
  235. package/dist/application/entry.d.ts +343 -0
  236. package/dist/application/entry.js +945 -0
  237. package/dist/application/entry.js.map +1 -0
  238. package/dist/application/file-access.d.ts +55 -0
  239. package/dist/application/file-access.js +93 -0
  240. package/dist/application/file-access.js.map +1 -0
  241. package/dist/application/file-readiness.d.ts +16 -0
  242. package/dist/application/file-readiness.js +53 -0
  243. package/dist/application/file-readiness.js.map +1 -0
  244. package/dist/application/forgotten.d.ts +15 -0
  245. package/dist/application/forgotten.js +70 -0
  246. package/dist/application/forgotten.js.map +1 -0
  247. package/dist/application/front-door.d.ts +68 -0
  248. package/dist/application/front-door.js +66 -0
  249. package/dist/application/front-door.js.map +1 -0
  250. package/dist/application/local-build.d.ts +5 -0
  251. package/dist/application/local-build.js +22 -0
  252. package/dist/application/local-build.js.map +1 -0
  253. package/dist/application/manifest.d.ts +16 -0
  254. package/dist/application/manifest.js +31 -0
  255. package/dist/application/manifest.js.map +1 -0
  256. package/dist/application/native-assets.d.ts +25 -0
  257. package/dist/application/native-assets.js +29 -0
  258. package/dist/application/native-assets.js.map +1 -0
  259. package/dist/application/native-authorization-rpc.d.ts +23 -0
  260. package/dist/application/native-authorization-rpc.js +54 -0
  261. package/dist/application/native-authorization-rpc.js.map +1 -0
  262. package/dist/application/notification-readiness.d.ts +33 -0
  263. package/dist/application/notification-readiness.js +222 -0
  264. package/dist/application/notification-readiness.js.map +1 -0
  265. package/dist/application/packaged-assets.d.ts +5 -0
  266. package/dist/application/packaged-assets.js +55 -0
  267. package/dist/application/packaged-assets.js.map +1 -0
  268. package/dist/application/packaged-trust.d.ts +5 -0
  269. package/dist/application/packaged-trust.js +10 -0
  270. package/dist/application/packaged-trust.js.map +1 -0
  271. package/dist/application/people-readiness.d.ts +23 -0
  272. package/dist/application/people-readiness.js +213 -0
  273. package/dist/application/people-readiness.js.map +1 -0
  274. package/dist/application/phase.d.ts +108 -0
  275. package/dist/application/phase.js +113 -0
  276. package/dist/application/phase.js.map +1 -0
  277. package/dist/application/portal-reservation.d.ts +38 -0
  278. package/dist/application/portal-reservation.js +183 -0
  279. package/dist/application/portal-reservation.js.map +1 -0
  280. package/dist/application/private-collections.d.ts +114 -0
  281. package/dist/application/private-collections.js +415 -0
  282. package/dist/application/private-collections.js.map +1 -0
  283. package/dist/application/readiness.d.ts +59 -0
  284. package/dist/application/readiness.js +223 -0
  285. package/dist/application/readiness.js.map +1 -0
  286. package/dist/application/registration-refusal.d.ts +16 -0
  287. package/dist/application/registration-refusal.js +41 -0
  288. package/dist/application/registration-refusal.js.map +1 -0
  289. package/dist/application/registration.d.ts +26 -0
  290. package/dist/application/registration.js +372 -0
  291. package/dist/application/registration.js.map +1 -0
  292. package/dist/application/return-url.d.ts +1 -0
  293. package/dist/application/return-url.js +40 -0
  294. package/dist/application/return-url.js.map +1 -0
  295. package/dist/application/runtime.d.ts +107 -0
  296. package/dist/application/runtime.js +379 -0
  297. package/dist/application/runtime.js.map +1 -0
  298. package/dist/application/scope.d.ts +34 -0
  299. package/dist/application/scope.js +164 -0
  300. package/dist/application/scope.js.map +1 -0
  301. package/dist/application/session-hint.d.ts +21 -0
  302. package/dist/application/session-hint.js +87 -0
  303. package/dist/application/session-hint.js.map +1 -0
  304. package/dist/application/setup.d.ts +105 -0
  305. package/dist/application/setup.js +137 -0
  306. package/dist/application/setup.js.map +1 -0
  307. package/dist/application/sign-out.d.ts +17 -0
  308. package/dist/application/sign-out.js +28 -0
  309. package/dist/application/sign-out.js.map +1 -0
  310. package/dist/application/storage-scope.d.ts +8 -0
  311. package/dist/application/storage-scope.js +15 -0
  312. package/dist/application/storage-scope.js.map +1 -0
  313. package/dist/application/tabs.d.ts +98 -0
  314. package/dist/application/tabs.js +407 -0
  315. package/dist/application/tabs.js.map +1 -0
  316. package/dist/application/timer-criteria.d.ts +5 -0
  317. package/dist/application/timer-criteria.js +15 -0
  318. package/dist/application/timer-criteria.js.map +1 -0
  319. package/dist/application/ui-connections.d.ts +35 -0
  320. package/dist/application/ui-connections.js +129 -0
  321. package/dist/application/ui-connections.js.map +1 -0
  322. package/dist/application/worker-client.d.ts +59 -0
  323. package/dist/application/worker-client.js +381 -0
  324. package/dist/application/worker-client.js.map +1 -0
  325. package/dist/application/worker-host.d.ts +84 -0
  326. package/dist/application/worker-host.js +547 -0
  327. package/dist/application/worker-host.js.map +1 -0
  328. package/dist/application/worker-protocol.d.ts +40 -0
  329. package/dist/application/worker-protocol.js +83 -0
  330. package/dist/application/worker-protocol.js.map +1 -0
  331. package/dist/application/worker-session.d.ts +45 -0
  332. package/dist/application/worker-session.js +37 -0
  333. package/dist/application/worker-session.js.map +1 -0
  334. package/dist/application/worker.d.ts +1 -0
  335. package/dist/application/worker.js +34835 -0
  336. package/dist/application/worker.js.map +1 -0
  337. package/dist/attachment-wire.d.ts +15 -0
  338. package/dist/attachment-wire.js +47 -0
  339. package/dist/attachment-wire.js.map +1 -0
  340. package/dist/browser/mdbase-sdk.js +49398 -0
  341. package/dist/browser/mdbase-sdk.min.js +130 -0
  342. package/dist/browser.d.ts +4 -0
  343. package/dist/browser.js +5 -0
  344. package/dist/browser.js.map +1 -0
  345. package/dist/cbor.d.ts +52 -0
  346. package/dist/cbor.js +480 -0
  347. package/dist/cbor.js.map +1 -0
  348. package/dist/client.d.ts +658 -0
  349. package/dist/client.js +1966 -0
  350. package/dist/client.js.map +1 -0
  351. package/dist/codec.d.ts +82 -0
  352. package/dist/codec.js +388 -0
  353. package/dist/codec.js.map +1 -0
  354. package/dist/collection-availability.d.ts +34 -0
  355. package/dist/collection-availability.js +63 -0
  356. package/dist/collection-availability.js.map +1 -0
  357. package/dist/contract-query.d.ts +31 -0
  358. package/dist/contract-query.js +13 -0
  359. package/dist/contract-query.js.map +1 -0
  360. package/dist/contract-records.d.ts +51 -0
  361. package/dist/contract-records.js +14 -0
  362. package/dist/contract-records.js.map +1 -0
  363. package/dist/describe-error.d.ts +61 -0
  364. package/dist/describe-error.js +452 -0
  365. package/dist/describe-error.js.map +1 -0
  366. package/dist/errors.d.ts +65 -0
  367. package/dist/errors.js +94 -0
  368. package/dist/errors.js.map +1 -0
  369. package/dist/files.d.ts +147 -0
  370. package/dist/files.js +537 -0
  371. package/dist/files.js.map +1 -0
  372. package/dist/holds.d.ts +74 -0
  373. package/dist/holds.js +118 -0
  374. package/dist/holds.js.map +1 -0
  375. package/dist/index.d.ts +36 -0
  376. package/dist/index.js +22 -0
  377. package/dist/index.js.map +1 -0
  378. package/dist/keys.d.ts +40 -0
  379. package/dist/keys.js +181 -0
  380. package/dist/keys.js.map +1 -0
  381. package/dist/live.d.ts +38 -0
  382. package/dist/live.js +82 -0
  383. package/dist/live.js.map +1 -0
  384. package/dist/local-build.d.ts +13 -0
  385. package/dist/local-build.js +47 -0
  386. package/dist/local-build.js.map +1 -0
  387. package/dist/native/provenance.json +23 -0
  388. package/dist/native/runtime.wasm +0 -0
  389. package/dist/native/sqlite3.d.ts +5 -0
  390. package/dist/native/sqlite3.js +17392 -0
  391. package/dist/native/sqlite3.js.map +1 -0
  392. package/dist/native/sqlite3.wasm +0 -0
  393. package/dist/node.d.ts +63 -0
  394. package/dist/node.js +255 -0
  395. package/dist/node.js.map +1 -0
  396. package/dist/notifications.d.ts +95 -0
  397. package/dist/notifications.js +226 -0
  398. package/dist/notifications.js.map +1 -0
  399. package/dist/offline-shell-build.d.ts +25 -0
  400. package/dist/offline-shell-build.js +78 -0
  401. package/dist/offline-shell-build.js.map +1 -0
  402. package/dist/offline-shell-worker.d.ts +46 -0
  403. package/dist/offline-shell-worker.js +115 -0
  404. package/dist/offline-shell-worker.js.map +1 -0
  405. package/dist/people.d.ts +82 -0
  406. package/dist/people.js +199 -0
  407. package/dist/people.js.map +1 -0
  408. package/dist/presence.d.ts +21 -0
  409. package/dist/presence.js +109 -0
  410. package/dist/presence.js.map +1 -0
  411. package/dist/private-account.d.ts +197 -0
  412. package/dist/private-account.js +510 -0
  413. package/dist/private-account.js.map +1 -0
  414. package/dist/private.d.ts +55 -0
  415. package/dist/private.js +69 -0
  416. package/dist/private.js.map +1 -0
  417. package/dist/read-helpers.d.ts +32 -0
  418. package/dist/read-helpers.js +181 -0
  419. package/dist/read-helpers.js.map +1 -0
  420. package/dist/records/session.d.ts +60 -0
  421. package/dist/records/session.js +534 -0
  422. package/dist/records/session.js.map +1 -0
  423. package/dist/records/types.d.ts +76 -0
  424. package/dist/records/types.js +2 -0
  425. package/dist/records/types.js.map +1 -0
  426. package/dist/records/witness.d.ts +19 -0
  427. package/dist/records/witness.js +64 -0
  428. package/dist/records/witness.js.map +1 -0
  429. package/dist/records.d.ts +23 -0
  430. package/dist/records.js +234 -0
  431. package/dist/records.js.map +1 -0
  432. package/dist/runtime/wasm.d.ts +69 -0
  433. package/dist/runtime/wasm.js +274 -0
  434. package/dist/runtime/wasm.js.map +1 -0
  435. package/dist/runtime-wire.d.ts +71 -0
  436. package/dist/runtime-wire.js +71 -0
  437. package/dist/runtime-wire.js.map +1 -0
  438. package/dist/saved-views.d.ts +29 -0
  439. package/dist/saved-views.js +171 -0
  440. package/dist/saved-views.js.map +1 -0
  441. package/dist/semver.d.ts +22 -0
  442. package/dist/semver.js +63 -0
  443. package/dist/semver.js.map +1 -0
  444. package/dist/session.d.ts +65 -0
  445. package/dist/session.js +332 -0
  446. package/dist/session.js.map +1 -0
  447. package/dist/status.d.ts +46 -0
  448. package/dist/status.js +59 -0
  449. package/dist/status.js.map +1 -0
  450. package/dist/strength.d.ts +12 -0
  451. package/dist/strength.js +194 -0
  452. package/dist/strength.js.map +1 -0
  453. package/dist/testing/application.d.ts +59 -0
  454. package/dist/testing/application.js +230 -0
  455. package/dist/testing/application.js.map +1 -0
  456. package/dist/testing/index.d.ts +10 -0
  457. package/dist/testing/index.js +6 -0
  458. package/dist/testing/index.js.map +1 -0
  459. package/dist/testing/memory-contracts.d.ts +40 -0
  460. package/dist/testing/memory-contracts.js +127 -0
  461. package/dist/testing/memory-contracts.js.map +1 -0
  462. package/dist/testing/memory-replica.d.ts +191 -0
  463. package/dist/testing/memory-replica.js +1465 -0
  464. package/dist/testing/memory-replica.js.map +1 -0
  465. package/dist/testing/noise-server.d.ts +11 -0
  466. package/dist/testing/noise-server.js +65 -0
  467. package/dist/testing/noise-server.js.map +1 -0
  468. package/dist/testing/test-app.d.ts +93 -0
  469. package/dist/testing/test-app.js +140 -0
  470. package/dist/testing/test-app.js.map +1 -0
  471. package/dist/thin-client.d.ts +67 -0
  472. package/dist/thin-client.js +42 -0
  473. package/dist/thin-client.js.map +1 -0
  474. package/dist/timers.d.ts +158 -0
  475. package/dist/timers.js +258 -0
  476. package/dist/timers.js.map +1 -0
  477. package/dist/transport/bases-rpc.d.ts +15 -0
  478. package/dist/transport/bases-rpc.js +61 -0
  479. package/dist/transport/bases-rpc.js.map +1 -0
  480. package/dist/transport/control-route.d.ts +34 -0
  481. package/dist/transport/control-route.js +84 -0
  482. package/dist/transport/control-route.js.map +1 -0
  483. package/dist/transport/inprocess.d.ts +13 -0
  484. package/dist/transport/inprocess.js +37 -0
  485. package/dist/transport/inprocess.js.map +1 -0
  486. package/dist/transport/local-link.d.ts +53 -0
  487. package/dist/transport/local-link.js +66 -0
  488. package/dist/transport/local-link.js.map +1 -0
  489. package/dist/transport/next-relay.d.ts +64 -0
  490. package/dist/transport/next-relay.js +222 -0
  491. package/dist/transport/next-relay.js.map +1 -0
  492. package/dist/transport/noise-session.d.ts +88 -0
  493. package/dist/transport/noise-session.js +264 -0
  494. package/dist/transport/noise-session.js.map +1 -0
  495. package/dist/transport/noise.d.ts +102 -0
  496. package/dist/transport/noise.js +307 -0
  497. package/dist/transport/noise.js.map +1 -0
  498. package/dist/transport/original-session.d.ts +6 -0
  499. package/dist/transport/original-session.js +6 -0
  500. package/dist/transport/original-session.js.map +1 -0
  501. package/dist/transport/port.d.ts +67 -0
  502. package/dist/transport/port.js +184 -0
  503. package/dist/transport/port.js.map +1 -0
  504. package/dist/transport/read-fence-policy.d.ts +3 -0
  505. package/dist/transport/read-fence-policy.js +11 -0
  506. package/dist/transport/read-fence-policy.js.map +1 -0
  507. package/dist/transport/relay-close.d.ts +31 -0
  508. package/dist/transport/relay-close.js +23 -0
  509. package/dist/transport/relay-close.js.map +1 -0
  510. package/dist/transport/relay-pipe.d.ts +15 -0
  511. package/dist/transport/relay-pipe.js +190 -0
  512. package/dist/transport/relay-pipe.js.map +1 -0
  513. package/dist/transport/relay.d.ts +36 -0
  514. package/dist/transport/relay.js +45 -0
  515. package/dist/transport/relay.js.map +1 -0
  516. package/dist/type-packs.d.ts +124 -0
  517. package/dist/type-packs.js +188 -0
  518. package/dist/type-packs.js.map +1 -0
  519. package/dist/validation.d.ts +30 -0
  520. package/dist/validation.js +125 -0
  521. package/dist/validation.js.map +1 -0
  522. package/dist/values.d.ts +37 -0
  523. package/dist/values.js +133 -0
  524. package/dist/values.js.map +1 -0
  525. package/dist/view-sources.d.ts +31 -0
  526. package/dist/view-sources.js +78 -0
  527. package/dist/view-sources.js.map +1 -0
  528. package/dist/wire.d.ts +857 -0
  529. package/dist/wire.js +915 -0
  530. package/dist/wire.js.map +1 -0
  531. package/dist/witness.d.ts +7 -0
  532. package/dist/witness.js +82 -0
  533. package/dist/witness.js.map +1 -0
  534. package/dist/write-ledger.d.ts +41 -0
  535. package/dist/write-ledger.js +184 -0
  536. package/dist/write-ledger.js.map +1 -0
  537. package/node_modules/@mdbase-dev/connect-protocol/dist/application-authorization.d.ts +32 -0
  538. package/node_modules/@mdbase-dev/connect-protocol/dist/application-authorization.js +207 -0
  539. package/node_modules/@mdbase-dev/connect-protocol/dist/application-contract.d.ts +23 -0
  540. package/node_modules/@mdbase-dev/connect-protocol/dist/application-contract.js +76 -0
  541. package/node_modules/@mdbase-dev/connect-protocol/dist/application-declaration.d.ts +120 -0
  542. package/node_modules/@mdbase-dev/connect-protocol/dist/application-declaration.js +1 -0
  543. package/node_modules/@mdbase-dev/connect-protocol/dist/authorization-errors.d.ts +34 -0
  544. package/node_modules/@mdbase-dev/connect-protocol/dist/authorization-errors.js +52 -0
  545. package/node_modules/@mdbase-dev/connect-protocol/dist/capabilities.d.ts +73 -0
  546. package/node_modules/@mdbase-dev/connect-protocol/dist/capabilities.js +92 -0
  547. package/node_modules/@mdbase-dev/connect-protocol/dist/change-events.generated.d.ts +48 -0
  548. package/node_modules/@mdbase-dev/connect-protocol/dist/change-events.generated.js +18 -0
  549. package/node_modules/@mdbase-dev/connect-protocol/dist/collection-setup.d.ts +93 -0
  550. package/node_modules/@mdbase-dev/connect-protocol/dist/collection-setup.js +7 -0
  551. package/node_modules/@mdbase-dev/connect-protocol/dist/compatibility.d.ts +37 -0
  552. package/node_modules/@mdbase-dev/connect-protocol/dist/compatibility.js +65 -0
  553. package/node_modules/@mdbase-dev/connect-protocol/dist/connect-problems.generated.d.ts +1533 -0
  554. package/node_modules/@mdbase-dev/connect-protocol/dist/connect-problems.generated.js +598 -0
  555. package/node_modules/@mdbase-dev/connect-protocol/dist/files.d.ts +288 -0
  556. package/node_modules/@mdbase-dev/connect-protocol/dist/files.js +426 -0
  557. package/node_modules/@mdbase-dev/connect-protocol/dist/index.d.ts +723 -0
  558. package/node_modules/@mdbase-dev/connect-protocol/dist/index.js +104 -0
  559. package/node_modules/@mdbase-dev/connect-protocol/dist/manifest-validators.generated.d.ts +13 -0
  560. package/node_modules/@mdbase-dev/connect-protocol/dist/manifest-validators.generated.js +7940 -0
  561. package/node_modules/@mdbase-dev/connect-protocol/dist/manifest.d.ts +72 -0
  562. package/node_modules/@mdbase-dev/connect-protocol/dist/manifest.js +643 -0
  563. package/node_modules/@mdbase-dev/connect-protocol/dist/mutation-fingerprint.d.ts +6 -0
  564. package/node_modules/@mdbase-dev/connect-protocol/dist/mutation-fingerprint.js +116 -0
  565. package/node_modules/@mdbase-dev/connect-protocol/dist/next-authorization.d.ts +30 -0
  566. package/node_modules/@mdbase-dev/connect-protocol/dist/next-authorization.js +90 -0
  567. package/node_modules/@mdbase-dev/connect-protocol/dist/operations.d.ts +15 -0
  568. package/node_modules/@mdbase-dev/connect-protocol/dist/operations.js +196 -0
  569. package/node_modules/@mdbase-dev/connect-protocol/dist/people.d.ts +33 -0
  570. package/node_modules/@mdbase-dev/connect-protocol/dist/people.js +26 -0
  571. package/node_modules/@mdbase-dev/connect-protocol/dist/records.d.ts +108 -0
  572. package/node_modules/@mdbase-dev/connect-protocol/dist/records.js +3 -0
  573. package/node_modules/@mdbase-dev/connect-protocol/dist/type-packs.d.ts +154 -0
  574. package/node_modules/@mdbase-dev/connect-protocol/dist/type-packs.js +30 -0
  575. package/node_modules/@mdbase-dev/connect-protocol/package.json +49 -0
  576. package/node_modules/@mdbase-dev/connect-protocol/schemas/application-capability-catalog.v1.json +40 -0
  577. package/node_modules/@mdbase-dev/connect-protocol/schemas/application-capability-catalog.v2.json +68 -0
  578. package/node_modules/@mdbase-dev/connect-protocol/schemas/catalog.json +17 -0
  579. package/node_modules/@mdbase-dev/connect-protocol/schemas/change-events.v1.json +48 -0
  580. package/node_modules/@mdbase-dev/connect-protocol/schemas/connect-problem.v1.schema.json +5665 -0
  581. package/node_modules/@mdbase-dev/connect-protocol/schemas/connect-problems.v1.catalog.json +373 -0
  582. package/node_modules/@mdbase-dev/connect-protocol/schemas/connect-protocol.v1.schema.json +901 -0
  583. package/node_modules/@mdbase-dev/connect-protocol/schemas/data-contract.schema.json +163 -0
  584. package/node_modules/@mdbase-dev/connect-protocol/schemas/encrypted-relay.v1.schema.json +63 -0
  585. package/node_modules/@mdbase-dev/connect-protocol/schemas/encrypted-relay.v2.schema.json +63 -0
  586. package/node_modules/@mdbase-dev/connect-protocol/schemas/encrypted-relay.v3.schema.json +64 -0
  587. package/node_modules/@mdbase-dev/connect-protocol/schemas/files.v1.schema.json +551 -0
  588. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/action-cancellation.schema.json +6 -0
  589. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/action-invocation.schema.json +6 -0
  590. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/action-outcome.schema.json +6 -0
  591. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/action-provider-declaration.schema.json +6 -0
  592. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/action-request.schema.json +6 -0
  593. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/conformance-claim.schema.json +6 -0
  594. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/event-source-declaration.schema.json +6 -0
  595. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/event.schema.json +6 -0
  596. package/node_modules/@mdbase-dev/connect-protocol/schemas/interop/v0.1/profile.schema.json +456 -0
  597. package/node_modules/@mdbase-dev/connect-protocol/schemas/mdbase-app.legacy-v1.schema.json +430 -0
  598. package/node_modules/@mdbase-dev/connect-protocol/schemas/mdbase-app.schema.json +437 -0
  599. package/node_modules/@mdbase-dev/connect-protocol/schemas/mdbase-query.v0.3.schema.json +176 -0
  600. package/node_modules/@mdbase-dev/connect-protocol/schemas/next-trust.v1.schema.json +54 -0
  601. package/node_modules/@mdbase-dev/connect-protocol/schemas/notification-webhook.v1.schema.json +56 -0
  602. package/node_modules/@mdbase-dev/connect-protocol/schemas/operation-catalog.v1.json +43 -0
  603. package/node_modules/@mdbase-dev/connect-protocol/schemas/operation-mutation-classification.v1.json +554 -0
  604. package/node_modules/@mdbase-dev/connect-protocol/schemas/sync.v1.schema.json +483 -0
  605. package/node_modules/@noble/hashes/LICENSE +21 -0
  606. package/node_modules/@noble/hashes/README.md +478 -0
  607. package/node_modules/@noble/hashes/_blake.d.ts +20 -0
  608. package/node_modules/@noble/hashes/_blake.js +59 -0
  609. package/node_modules/@noble/hashes/_md.d.ts +95 -0
  610. package/node_modules/@noble/hashes/_md.js +209 -0
  611. package/node_modules/@noble/hashes/_u64.d.ts +36 -0
  612. package/node_modules/@noble/hashes/_u64.js +77 -0
  613. package/node_modules/@noble/hashes/argon2.d.ts +148 -0
  614. package/node_modules/@noble/hashes/argon2.js +577 -0
  615. package/node_modules/@noble/hashes/blake1.d.ts +162 -0
  616. package/node_modules/@noble/hashes/blake1.js +630 -0
  617. package/node_modules/@noble/hashes/blake2.d.ts +203 -0
  618. package/node_modules/@noble/hashes/blake2.js +573 -0
  619. package/node_modules/@noble/hashes/blake3.d.ts +68 -0
  620. package/node_modules/@noble/hashes/blake3.js +310 -0
  621. package/node_modules/@noble/hashes/eskdf.d.ts +91 -0
  622. package/node_modules/@noble/hashes/eskdf.js +225 -0
  623. package/node_modules/@noble/hashes/hkdf.d.ts +70 -0
  624. package/node_modules/@noble/hashes/hkdf.js +152 -0
  625. package/node_modules/@noble/hashes/hmac.d.ts +50 -0
  626. package/node_modules/@noble/hashes/hmac.js +93 -0
  627. package/node_modules/@noble/hashes/index.d.ts +1 -0
  628. package/node_modules/@noble/hashes/index.js +34 -0
  629. package/node_modules/@noble/hashes/legacy.d.ts +107 -0
  630. package/node_modules/@noble/hashes/legacy.js +348 -0
  631. package/node_modules/@noble/hashes/package.json +91 -0
  632. package/node_modules/@noble/hashes/pbkdf2.d.ts +66 -0
  633. package/node_modules/@noble/hashes/pbkdf2.js +176 -0
  634. package/node_modules/@noble/hashes/scrypt.d.ts +98 -0
  635. package/node_modules/@noble/hashes/scrypt.js +304 -0
  636. package/node_modules/@noble/hashes/sha2.d.ts +176 -0
  637. package/node_modules/@noble/hashes/sha2.js +446 -0
  638. package/node_modules/@noble/hashes/sha3-addons.d.ts +533 -0
  639. package/node_modules/@noble/hashes/sha3-addons.js +973 -0
  640. package/node_modules/@noble/hashes/sha3.d.ts +208 -0
  641. package/node_modules/@noble/hashes/sha3.js +475 -0
  642. package/node_modules/@noble/hashes/src/_blake.ts +67 -0
  643. package/node_modules/@noble/hashes/src/_md.ts +227 -0
  644. package/node_modules/@noble/hashes/src/_u64.ts +111 -0
  645. package/node_modules/@noble/hashes/src/argon2.ts +693 -0
  646. package/node_modules/@noble/hashes/src/blake1.ts +677 -0
  647. package/node_modules/@noble/hashes/src/blake2.ts +648 -0
  648. package/node_modules/@noble/hashes/src/blake3.ts +344 -0
  649. package/node_modules/@noble/hashes/src/eskdf.ts +265 -0
  650. package/node_modules/@noble/hashes/src/hkdf.ts +161 -0
  651. package/node_modules/@noble/hashes/src/hmac.ts +130 -0
  652. package/node_modules/@noble/hashes/src/index.ts +33 -0
  653. package/node_modules/@noble/hashes/src/legacy.ts +361 -0
  654. package/node_modules/@noble/hashes/src/pbkdf2.ts +219 -0
  655. package/node_modules/@noble/hashes/src/scrypt.ts +375 -0
  656. package/node_modules/@noble/hashes/src/sha2.ts +486 -0
  657. package/node_modules/@noble/hashes/src/sha3-addons.ts +1157 -0
  658. package/node_modules/@noble/hashes/src/sha3.ts +525 -0
  659. package/node_modules/@noble/hashes/src/utils.ts +978 -0
  660. package/node_modules/@noble/hashes/src/webcrypto.ts +283 -0
  661. package/node_modules/@noble/hashes/utils.d.ts +560 -0
  662. package/node_modules/@noble/hashes/utils.js +687 -0
  663. package/node_modules/@noble/hashes/webcrypto.d.ts +121 -0
  664. package/node_modules/@noble/hashes/webcrypto.js +228 -0
  665. package/node_modules/yaml/LICENSE +13 -0
  666. package/node_modules/yaml/README.md +172 -0
  667. package/node_modules/yaml/bin.mjs +11 -0
  668. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  669. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  670. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  671. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  672. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  673. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  674. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  675. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  676. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  677. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  678. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +226 -0
  679. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  680. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  681. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  682. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  683. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  684. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  685. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  686. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  687. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  688. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  689. package/node_modules/yaml/browser/dist/errors.js +57 -0
  690. package/node_modules/yaml/browser/dist/index.js +17 -0
  691. package/node_modules/yaml/browser/dist/log.js +11 -0
  692. package/node_modules/yaml/browser/dist/nodes/Alias.js +118 -0
  693. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  694. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  695. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  696. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  697. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  698. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  699. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  700. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  701. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  702. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  703. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  704. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  705. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  706. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  707. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  708. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  709. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  710. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  711. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  712. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  713. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  714. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  715. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  716. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  717. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  718. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  719. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  720. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  721. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  722. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  723. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  724. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  725. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  726. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  727. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  728. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  729. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  730. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  731. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  732. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  733. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  734. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  735. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  736. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  737. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  738. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  739. package/node_modules/yaml/browser/dist/util.js +11 -0
  740. package/node_modules/yaml/browser/dist/visit.js +233 -0
  741. package/node_modules/yaml/browser/index.js +5 -0
  742. package/node_modules/yaml/browser/package.json +3 -0
  743. package/node_modules/yaml/dist/cli.d.ts +8 -0
  744. package/node_modules/yaml/dist/cli.mjs +201 -0
  745. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  746. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  747. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  748. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  749. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  750. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  751. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  752. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  753. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  754. package/node_modules/yaml/dist/compose/composer.js +224 -0
  755. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  756. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  757. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  758. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  759. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  760. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  761. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  762. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  763. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  764. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  765. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  766. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +228 -0
  767. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  768. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  769. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  770. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  771. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  772. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  773. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  774. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  775. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  776. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  777. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  778. package/node_modules/yaml/dist/doc/Document.js +337 -0
  779. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  780. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  781. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  782. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  783. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  784. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  785. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  786. package/node_modules/yaml/dist/doc/directives.js +178 -0
  787. package/node_modules/yaml/dist/errors.d.ts +21 -0
  788. package/node_modules/yaml/dist/errors.js +62 -0
  789. package/node_modules/yaml/dist/index.d.ts +25 -0
  790. package/node_modules/yaml/dist/index.js +50 -0
  791. package/node_modules/yaml/dist/log.d.ts +3 -0
  792. package/node_modules/yaml/dist/log.js +19 -0
  793. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  794. package/node_modules/yaml/dist/nodes/Alias.js +120 -0
  795. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  796. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  797. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  798. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  799. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  800. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  801. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  802. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  803. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  804. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  805. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  806. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  807. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  808. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  809. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  810. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  811. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  812. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  813. package/node_modules/yaml/dist/options.d.ts +350 -0
  814. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  815. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  816. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  817. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  818. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  819. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  820. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  821. package/node_modules/yaml/dist/parse/cst.js +112 -0
  822. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  823. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  824. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  825. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  826. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  827. package/node_modules/yaml/dist/parse/parser.js +980 -0
  828. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  829. package/node_modules/yaml/dist/public-api.js +107 -0
  830. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  831. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  832. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  833. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  834. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  835. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  836. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  837. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  838. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  839. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  840. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  841. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  842. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  843. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  844. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  845. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  846. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  847. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  848. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  849. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  850. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  851. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  852. package/node_modules/yaml/dist/schema/tags.js +99 -0
  853. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  854. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  855. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  856. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  857. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  858. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  859. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  860. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  861. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  862. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  863. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  864. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  865. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  866. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  867. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  868. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  869. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  870. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  871. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  872. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  873. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  874. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  875. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  876. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  877. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  878. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  879. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  880. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  881. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  882. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  883. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  884. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  885. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  886. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  887. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  888. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  889. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  890. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  891. package/node_modules/yaml/dist/test-events.js +134 -0
  892. package/node_modules/yaml/dist/util.d.ts +16 -0
  893. package/node_modules/yaml/dist/util.js +28 -0
  894. package/node_modules/yaml/dist/visit.d.ts +102 -0
  895. package/node_modules/yaml/dist/visit.js +236 -0
  896. package/node_modules/yaml/package.json +97 -0
  897. package/node_modules/yaml/util.js +2 -0
  898. package/package.json +108 -4
  899. package/vendor/mdbase-connect-sdk-e6e66bcd172f.json +13 -0
  900. package/vendor/mdbase-dev-connect-protocol-0.1.0-beta.145-e6e66bcd172f.tgz +0 -0
@@ -0,0 +1,930 @@
1
+ /**
2
+ * Application grants for web apps: OAuth authorization code + PKCE against the
3
+ * Connect portal, with the grant's Noise client key registered at consent
4
+ * (`client_noise_key`, attested by the grant signing key), then thin-client sessions
5
+ * to a Private collection over the relay (Noise IK to one of the account's devices).
6
+ *
7
+ * The CP grant is only an offer: the collection's replica admits the app after the
8
+ * user approves it in the mdbase desktop app. Until then the collection is listed as
9
+ * `unavailable/approval_required`.
10
+ *
11
+ * Storage: see `grant-store.ts`. Access tokens stay in memory; the refresh token is
12
+ * encrypted under a non-extractable key; the Noise key is non-extractable.
13
+ */
14
+ import { APPLICATION_AUTHORIZATION_PROTOCOL_VERSION, AUTHORITY_PROOF_DOMAIN, AUTHORITY_PROOF_HEADERS, AUTHORITY_PROOF_VERSION, applicationInstallationIdFromPublicKey, authorizationSigningMessage, } from "@mdbase-dev/connect-protocol";
15
+ import { selectAppEnvironment } from "../app-host/app-environment.js";
16
+ import { applicationDeclaration } from "../application/declaration.js";
17
+ import { applicationStorageNamespace, applicationStorageOwner } from "../application/storage-scope.js";
18
+ import { compileApplicationManifest } from "../application/manifest.js";
19
+ import { appReleaseTrust } from "../application/packaged-trust.js";
20
+ import { resolveApplicationRegistration } from "../application/registration.js";
21
+ import { uuidToBytes } from "../codec.js";
22
+ import { collectionUnavailableError, parseCollectionAvailability, } from "../collection-availability.js";
23
+ import { isMdbaseError, mdbaseError } from "../errors.js";
24
+ import { orderTargets } from "../transport/next-relay.js";
25
+ import { clientPrologue } from "../transport/noise.js";
26
+ import { noiseConnector } from "../transport/noise-session.js";
27
+ import { registerNextRelayFence } from "../transport/read-fence-policy.js";
28
+ import { relayPipeCarrier } from "../transport/relay-pipe.js";
29
+ import { MdbasePeopleClient } from "../people.js";
30
+ import { appGrantPeopleAuthority } from "./people.js";
31
+ import { privateCollectionSetup } from "./setup.js";
32
+ import { protectedSetupJournal } from "./setup-attempt.js";
33
+ import { bindOriginalAppGrant, originalAppGrant } from "../transport/original-session.js";
34
+ import { indexedDbAppGrantStore } from "./grant-store.js";
35
+ import { nativeCompletionFromToken } from "./native-completion.js";
36
+ const ROLES = new Set(["owner", "editor", "viewer"]);
37
+ const CHANNEL = "mdbase.app-grant.v1";
38
+ const UUID = /^[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
39
+ const REQUEST_MS = 15_000;
40
+ function canonicalChallengeNonce(value) {
41
+ try {
42
+ const bytes = Uint8Array.from(atob(value.replaceAll("-", "+").replaceAll("_", "/")), c => c.charCodeAt(0));
43
+ return bytes.length === 32 && b64u(bytes) === value;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ const P256_ORDER = BigInt("0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551");
50
+ const NOISE_KEY_DOMAIN = new TextEncoder().encode("mdbase-next client noise key v1\0");
51
+ /** Call from the redirect page with `location.href`; the waiting flow picks it up. */
52
+ export function deliverAppGrantCallback(url) {
53
+ const Channel = globalThis.BroadcastChannel;
54
+ if (!Channel)
55
+ throw mdbaseError("unavailable", "BroadcastChannel is not available", "authorization_callback");
56
+ const channel = new Channel(CHANNEL);
57
+ channel.postMessage({ type: "callback", url: String(url) });
58
+ channel.close();
59
+ }
60
+ function broadcastCallbacks() {
61
+ return {
62
+ subscribe(listener) {
63
+ const Channel = globalThis.BroadcastChannel;
64
+ if (!Channel)
65
+ throw mdbaseError("unavailable", "BroadcastChannel is not available", "authorization_callback");
66
+ const channel = new Channel(CHANNEL);
67
+ channel.onmessage = (event) => {
68
+ const data = event.data;
69
+ if (data?.type === "callback" && typeof data.url === "string")
70
+ listener(data.url);
71
+ };
72
+ return () => channel.close();
73
+ },
74
+ };
75
+ }
76
+ /** Cloud copies from the installation sign-in plus Private collections, by name. */
77
+ export function mergeCollectionEntries(cloud, privates) {
78
+ const out = new Map();
79
+ for (const c of cloud) {
80
+ out.set(c.collectionId, Object.freeze({ collectionId: c.collectionId, displayName: c.displayName, kind: "cloud_copy", availability: c.availability ?? Object.freeze({ state: "available" }), role: c.role }));
81
+ }
82
+ for (const p of privates) {
83
+ if (!out.has(p.collectionId))
84
+ out.set(p.collectionId, Object.freeze({ collectionId: p.collectionId, displayName: p.displayName, kind: "private", availability: p.availability, role: p.role }));
85
+ }
86
+ return [...out.values()].sort((a, b) => a.displayName.localeCompare(b.displayName) || a.collectionId.localeCompare(b.collectionId));
87
+ }
88
+ const b64u = (bytes) => {
89
+ let s = "";
90
+ for (const b of bytes)
91
+ s += String.fromCharCode(b);
92
+ return btoa(s).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/u, "");
93
+ };
94
+ const random = (n) => crypto.getRandomValues(new Uint8Array(n));
95
+ const u32 = (n) => { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, n); return b; };
96
+ const concat = (...parts) => {
97
+ const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));
98
+ let off = 0;
99
+ for (const p of parts) {
100
+ out.set(p, off);
101
+ off += p.length;
102
+ }
103
+ return out;
104
+ };
105
+ /** Low-S P1363 ECDSA P-256 signature (what Connect and the daemon accept). */
106
+ async function signP256(key, message) {
107
+ const sig = new Uint8Array(await crypto.subtle.sign({ name: "ECDSA", hash: "SHA-256" }, key, message));
108
+ if (sig.length !== 64)
109
+ throw mdbaseError("internal", "unexpected signature length", "authorization_signature");
110
+ let s = 0n;
111
+ for (const b of sig.subarray(32))
112
+ s = (s << 8n) | BigInt(b);
113
+ if (s <= P256_ORDER / 2n)
114
+ return sig;
115
+ let low = P256_ORDER - s;
116
+ for (let i = 63; i >= 32; i--) {
117
+ sig[i] = Number(low & 0xffn);
118
+ low >>= 8n;
119
+ }
120
+ return sig;
121
+ }
122
+ const sha256b64u = async (text) => b64u(new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text))));
123
+ /** Connect's authority request proof headers: the grant's signing key over the
124
+ * request (method, target, body and credential digests, time and nonce). */
125
+ async function authorityProof(key, target, body, credential) {
126
+ const timestamp = Math.floor(Date.now() / 1000);
127
+ const nonce = crypto.randomUUID();
128
+ const message = [AUTHORITY_PROOF_DOMAIN, AUTHORITY_PROOF_VERSION, "POST", target,
129
+ await sha256b64u(body), await sha256b64u(credential), timestamp, nonce].join("\n");
130
+ return {
131
+ [AUTHORITY_PROOF_HEADERS.version]: String(AUTHORITY_PROOF_VERSION),
132
+ [AUTHORITY_PROOF_HEADERS.timestamp]: String(timestamp),
133
+ [AUTHORITY_PROOF_HEADERS.nonce]: nonce,
134
+ [AUTHORITY_PROOF_HEADERS.signature]: b64u(await signP256(key, new TextEncoder().encode(message))),
135
+ };
136
+ }
137
+ async function p256Pair(usages, algorithm) {
138
+ const pair = (await crypto.subtle.generateKey({ name: algorithm, namedCurve: "P-256" }, false, usages));
139
+ return { privateKey: pair.privateKey, publicKey: b64u(new Uint8Array(await crypto.subtle.exportKey("raw", pair.publicKey))) };
140
+ }
141
+ async function noisePair() {
142
+ let pair;
143
+ try {
144
+ pair = (await crypto.subtle.generateKey({ name: "X25519" }, false, ["deriveBits"]));
145
+ }
146
+ catch {
147
+ throw mdbaseError("unavailable", "this browser cannot keep a non-extractable X25519 key", "browser_unsupported");
148
+ }
149
+ if (pair.privateKey.extractable)
150
+ throw mdbaseError("unavailable", "the Noise key must be non-extractable", "browser_unsupported");
151
+ return { privateKey: pair.privateKey, publicKey: new Uint8Array(await crypto.subtle.exportKey("raw", pair.publicKey)) };
152
+ }
153
+ function staticKeyOf(grant) {
154
+ return {
155
+ publicKey: grant.noisePublicKey.slice(),
156
+ dh: async (remote) => {
157
+ const pub = await crypto.subtle.importKey("raw", remote, { name: "X25519" }, false, []);
158
+ return new Uint8Array(await crypto.subtle.deriveBits({ name: "X25519", public: pub }, grant.noisePrivateKey, 256));
159
+ },
160
+ };
161
+ }
162
+ function bounded(signal, ms) {
163
+ const control = new AbortController();
164
+ const abort = () => control.abort();
165
+ const timer = setTimeout(abort, ms);
166
+ timer.unref?.();
167
+ signal?.addEventListener("abort", abort, { once: true });
168
+ if (signal?.aborted)
169
+ control.abort();
170
+ return { signal: control.signal, done: () => { clearTimeout(timer); signal?.removeEventListener("abort", abort); } };
171
+ }
172
+ const equalBytes = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
173
+ const sameGrant = (a, b) => !!b && a.collection === b.collection && a.owner === b.owner && equalBytes(a.noisePublicKey, b.noisePublicKey);
174
+ const sameRevision = (a, b) => sameGrant(a, b) && equalBytes(a.refresh, b.refresh);
175
+ const grantChanged = () => mdbaseError("cancelled", "the stored grant changed during this operation");
176
+ // Shared across instances in this host. Without Web Locks this is NOT a
177
+ // cross-process/tab fence; browser writers all use the same exclusive Web Lock.
178
+ const localLocks = new Map();
179
+ async function exclusive(name, work) {
180
+ const locks = globalThis.navigator?.locks;
181
+ if (locks)
182
+ return locks.request(name, { mode: "exclusive" }, work);
183
+ const previous = localLocks.get(name) ?? Promise.resolve();
184
+ let release;
185
+ const pending = new Promise((resolve) => { release = resolve; });
186
+ localLocks.set(name, pending);
187
+ await previous;
188
+ try {
189
+ return await work();
190
+ }
191
+ finally {
192
+ release();
193
+ if (localLocks.get(name) === pending)
194
+ localLocks.delete(name);
195
+ }
196
+ }
197
+ /**
198
+ * Application grants of one app installation (a browser profile) against its
199
+ * Connect environment. Generic: no app-specific behaviour.
200
+ */
201
+ export class MdbaseAppGrants {
202
+ options;
203
+ declaration;
204
+ cpOrigin;
205
+ redirect;
206
+ fetcher;
207
+ callbacks;
208
+ storeValue;
209
+ registration = null;
210
+ tokens = new Map();
211
+ refreshing = new Map();
212
+ forgotten = new Set();
213
+ /** Bumped by every whole-store wipe: work prepared under an older epoch
214
+ * (an authorization or token commit racing sign-out) must not re-save. */
215
+ epoch = 0;
216
+ constructor(options) {
217
+ this.options = options;
218
+ this.declaration = applicationDeclaration(options.declaration);
219
+ this.cpOrigin = selectAppEnvironment({ environment: this.declaration.environment, appOrigin: this.declaration.origin, release: appReleaseTrust() }).cpOrigin;
220
+ try {
221
+ this.redirect = new URL(options.redirectUri);
222
+ }
223
+ catch {
224
+ throw mdbaseError("invalid_request", "redirectUri must be an absolute URL", "redirect_uri");
225
+ }
226
+ if (this.redirect.origin !== this.declaration.origin || this.redirect.hash) {
227
+ throw mdbaseError("invalid_request", "redirectUri must be on the app's origin, without a fragment", "redirect_uri");
228
+ }
229
+ this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);
230
+ this.callbacks = options.callbacks ?? broadcastCallbacks();
231
+ this.storeValue = options.store ?? null;
232
+ }
233
+ register() {
234
+ const pending = this.registration ??= resolveApplicationRegistration({
235
+ declaration: this.options.declaration, signal: new AbortController().signal, isCurrent: () => true, fetch: this.fetcher,
236
+ });
237
+ pending.catch(() => { if (this.registration === pending)
238
+ this.registration = null; });
239
+ return pending;
240
+ }
241
+ ownerValue = null;
242
+ /**
243
+ * The local owner of this app's grants: its manifest family from the ORIGINAL
244
+ * declaration plus an optional storage namespace, never the CP-assigned id.
245
+ * It labels the default store and binds
246
+ * the refresh ciphertext, so a wrong registration id cannot select, use or
247
+ * delete another app's grants.
248
+ */
249
+ owner() {
250
+ return this.ownerValue ??= applicationStorageOwner(compileApplicationManifest(this.declaration).manifest.id, applicationStorageNamespace(this.declaration));
251
+ }
252
+ async store() {
253
+ if (this.storeValue)
254
+ return this.storeValue;
255
+ const owner = this.owner();
256
+ return (this.storeValue = indexedDbAppGrantStore(this.cpOrigin, (await this.register()).id, { owner }));
257
+ }
258
+ async identity() {
259
+ const store = await this.store();
260
+ const existing = await store.getIdentity();
261
+ if (existing)
262
+ return existing;
263
+ const created = await p256Pair(["sign"], "ECDSA");
264
+ return store.putIdentityIfAbsent({ version: 1, privateKey: created.privateKey, publicKey: created.publicKey });
265
+ }
266
+ async request(path, init, signal) {
267
+ const budget = bounded(signal, REQUEST_MS);
268
+ try {
269
+ let res;
270
+ try {
271
+ res = await this.fetcher(`${this.cpOrigin}${path}`, { ...init, redirect: "error", signal: budget.signal });
272
+ }
273
+ catch {
274
+ if (signal?.aborted)
275
+ throw mdbaseError("cancelled", "request cancelled");
276
+ throw mdbaseError("unavailable", "cannot reach the control plane", "control_unreachable");
277
+ }
278
+ let body = null;
279
+ try {
280
+ const parsed = await res.json();
281
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
282
+ body = parsed;
283
+ }
284
+ catch {
285
+ body = null;
286
+ }
287
+ return { status: res.status, body };
288
+ }
289
+ finally {
290
+ budget.done();
291
+ }
292
+ }
293
+ /**
294
+ * Ask the person for access in the popup: Connect's consent lists their
295
+ * collections, including Private ones. Resolves with the approved collection.
296
+ * The collection then usually reports `approval_required` until the person also
297
+ * approves the app in the mdbase desktop app.
298
+ */
299
+ async authorize(o) {
300
+ o = Object.freeze({ ...o });
301
+ const prepared = await this.prepareAuthorization(o).catch(error => { o.popup.close(); throw error; });
302
+ try {
303
+ o.popup.navigate(prepared.authorizationUri);
304
+ const { collectionId } = await prepared.finish(o);
305
+ return { collectionId };
306
+ }
307
+ finally {
308
+ prepared.cancel();
309
+ try {
310
+ o.popup.close();
311
+ }
312
+ catch { /* original popup only */ }
313
+ }
314
+ }
315
+ async prepareAuthorization(o = {}) {
316
+ o = Object.freeze({ ...o });
317
+ if (o.collection !== undefined && !UUID.test(o.collection))
318
+ throw mdbaseError("invalid_request", "collection must be a UUID");
319
+ if (o.expectedAccountId !== undefined && (!UUID.test(o.expectedAccountId) || !o.authorizationNonce))
320
+ throw mdbaseError("invalid_request", "original account and challenge required", "authorization_binding");
321
+ if (o.authorizationNonce !== undefined && (!/^[A-Za-z0-9_-]{43}$/.test(o.authorizationNonce) || !canonicalChallengeNonce(o.authorizationNonce)))
322
+ throw mdbaseError("invalid_request", "invalid original challenge", "authorization_binding");
323
+ const life = new AbortController();
324
+ const signal = o.signal ? AbortSignal.any([o.signal, life.signal]) : life.signal;
325
+ const epoch = this.epoch;
326
+ const check = () => { if (signal.aborted)
327
+ throw mdbaseError("cancelled", "authorization fenced", "authorization_cancelled"); if (epoch !== this.epoch)
328
+ throw grantChanged(); };
329
+ check();
330
+ const registration = await this.register();
331
+ const compiled = compileApplicationManifest(this.declaration);
332
+ const identity = await this.identity();
333
+ const grantAgreement = await p256Pair(["deriveBits"], "ECDH");
334
+ const grantSigning = await p256Pair(["sign"], "ECDSA");
335
+ const noise = await noisePair();
336
+ const verifier = b64u(random(32));
337
+ const challenge = b64u(new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier))));
338
+ const state = b64u(random(24));
339
+ const authorizationId = crypto.randomUUID();
340
+ const issued = new Date();
341
+ const binding = {
342
+ protocol_version: APPLICATION_AUTHORIZATION_PROTOCOL_VERSION,
343
+ authorization_id: authorizationId,
344
+ application_id: registration.id,
345
+ application_declaration_id: String(compiled.manifest.id),
346
+ application_manifest_digest: registration.manifestDigest,
347
+ application_installation_id: await applicationInstallationIdFromPublicKey(identity.publicKey),
348
+ installation_signing_public_key: identity.publicKey,
349
+ grant_agreement_public_key: grantAgreement.publicKey,
350
+ grant_signing_public_key: grantSigning.publicKey,
351
+ flow: "authorization_code",
352
+ authorization_nonce: o.authorizationNonce ?? b64u(random(32)),
353
+ issued_at: issued.toISOString(),
354
+ expires_at: new Date(issued.getTime() + 10 * 60_000).toISOString(),
355
+ redirect_uri: this.redirect.href,
356
+ state,
357
+ code_challenge: challenge,
358
+ contracts: compiled.contracts,
359
+ requested_operations: [...compiled.operations],
360
+ ...(compiled.files ? { requested_files: compiled.files } : {}),
361
+ ...(o.collection ? { collection_id: o.collection } : {}),
362
+ };
363
+ const proof = { binding, signature: b64u(await signP256(identity.privateKey, authorizationSigningMessage(binding))) };
364
+ const keyMessage = concat(NOISE_KEY_DOMAIN, u32(16), uuidToBytes(authorizationId), u32(32), noise.publicKey);
365
+ const clientNoiseKey = { public_key: b64u(noise.publicKey), signature: b64u(await signP256(grantSigning.privateKey, keyMessage)) };
366
+ check();
367
+ const started = await this.request("/oauth/authorization_request", {
368
+ method: "POST",
369
+ headers: { "content-type": "application/x-www-form-urlencoded" },
370
+ body: new URLSearchParams({
371
+ client_id: registration.id,
372
+ redirect_uri: this.redirect.href,
373
+ code_challenge: challenge,
374
+ code_challenge_method: "S256",
375
+ state,
376
+ operations: compiled.operations.join(","),
377
+ ...(o.collection ? { collection_id: o.collection } : {}),
378
+ application_authorization: JSON.stringify(proof),
379
+ client_noise_key: JSON.stringify(clientNoiseKey),
380
+ }),
381
+ }, signal);
382
+ check();
383
+ const uri = started.body?.authorization_uri;
384
+ if (started.status !== 200 || started.body?.authorization_id !== authorizationId || typeof uri !== "string"
385
+ || !uri.startsWith(`${this.cpOrigin}/oauth/authorize?`)) {
386
+ throw mdbaseError("unavailable", `authorization could not be started (${started.status})`, "authorization_start");
387
+ }
388
+ // Listen BEFORE attaching this request to the chooser: the normal callback
389
+ // may arrive before finish is invoked. Keep original state/keys/PKCE only.
390
+ let popup = null;
391
+ const callback = this.awaitCallback(state, { navigate() { }, close() { }, get closed() { return popup?.closed === true; } }, { popup: { navigate() { }, close() { } }, signal, timeoutMs: o.timeoutMs });
392
+ void callback.catch(() => { });
393
+ let consumed = false;
394
+ return Object.freeze({ applicationId: registration.id, manifestDigest: registration.manifestDigest, authorizationId, authorizationUri: uri,
395
+ cancel: () => life.abort(),
396
+ finish: async (finish) => {
397
+ finish = Object.freeze({ ...finish });
398
+ if (consumed)
399
+ throw mdbaseError("invalid_request", "original authorization already consumed", "authorization_binding");
400
+ consumed = true;
401
+ popup = finish.popup;
402
+ const abort = () => life.abort();
403
+ finish.signal?.addEventListener("abort", abort, { once: true });
404
+ if (finish.signal?.aborted)
405
+ life.abort();
406
+ try {
407
+ check();
408
+ const collection = finish.collection ?? o.collection;
409
+ if (collection !== undefined && !UUID.test(collection))
410
+ throw mdbaseError("invalid_request", "invalid approved collection", "authorization_binding");
411
+ if (o.collection && collection !== o.collection)
412
+ throw mdbaseError("forbidden", "a different collection was approved", "collection_mismatch");
413
+ if (o.expectedAccountId && !collection)
414
+ throw mdbaseError("invalid_request", "original Private choice required", "authorization_binding");
415
+ const code = await callback;
416
+ check();
417
+ const exchanged = await this.request("/oauth/token", {
418
+ method: "POST",
419
+ headers: { "content-type": "application/x-www-form-urlencoded" },
420
+ body: new URLSearchParams({ grant_type: "authorization_code", code, client_id: registration.id, redirect_uri: this.redirect.href, code_verifier: verifier }),
421
+ }, signal);
422
+ check();
423
+ const nativeCompletion = o.expectedAccountId ? nativeCompletionFromToken(exchanged.body, {
424
+ accountId: o.expectedAccountId, authorizationRequestId: authorizationId,
425
+ applicationId: registration.id, declarationId: binding.application_declaration_id,
426
+ manifestDigest: registration.manifestDigest, applicationInstallationId: binding.application_installation_id,
427
+ applicationOrigin: this.redirect.origin, collectionId: collection,
428
+ grantSigningPublicKey: grantSigning.publicKey, clientNoisePublicKey: b64u(noise.publicKey),
429
+ }) : undefined;
430
+ const collectionId = await this.saveTokens(exchanged, { noise, signing: grantSigning.privateKey, collection, check });
431
+ check();
432
+ return { collectionId, ...(nativeCompletion ? { nativeCompletion } : {}) };
433
+ }
434
+ finally {
435
+ finish.signal?.removeEventListener("abort", abort);
436
+ life.abort();
437
+ }
438
+ },
439
+ });
440
+ }
441
+ awaitCallback(state, popup, o) {
442
+ const timeoutMs = Math.min(Math.max(o.timeoutMs ?? 10 * 60_000, 1_000), 30 * 60_000);
443
+ return new Promise((resolve, reject) => {
444
+ let closedSince = null;
445
+ const finish = (f) => { unsubscribe(); clearTimeout(timer); clearInterval(watch); o.signal?.removeEventListener("abort", abort); f(); };
446
+ const abort = () => finish(() => reject(mdbaseError("cancelled", "authorization cancelled", "authorization_cancelled")));
447
+ const unsubscribe = this.callbacks.subscribe((raw) => {
448
+ let url;
449
+ try {
450
+ url = new URL(raw);
451
+ }
452
+ catch {
453
+ return;
454
+ }
455
+ if (url.origin !== this.redirect.origin || url.pathname !== this.redirect.pathname || url.searchParams.get("state") !== state)
456
+ return;
457
+ const error = url.searchParams.get("error");
458
+ if (error)
459
+ return finish(() => reject(mdbaseError("forbidden", "access was not approved", "authorization_denied")));
460
+ const code = url.searchParams.get("code");
461
+ if (!code)
462
+ return finish(() => reject(mdbaseError("unavailable", "the authorization callback has no code", "authorization_callback")));
463
+ finish(() => resolve(code));
464
+ });
465
+ const timer = setTimeout(() => finish(() => reject(mdbaseError("cancelled", "authorization timed out", "authorization_timed_out"))), timeoutMs);
466
+ // A closed popup ends the wait after a short grace for its final callback.
467
+ const watch = setInterval(() => {
468
+ let closed = false;
469
+ try {
470
+ closed = popup.closed === true;
471
+ }
472
+ catch {
473
+ closed = false;
474
+ }
475
+ if (!closed) {
476
+ closedSince = null;
477
+ return;
478
+ }
479
+ closedSince ??= Date.now();
480
+ if (Date.now() - closedSince >= 3_000)
481
+ finish(() => reject(mdbaseError("cancelled", "the authorization window was closed", "authorization_cancelled")));
482
+ }, 500);
483
+ o.signal?.addEventListener("abort", abort, { once: true });
484
+ if (o.signal?.aborted)
485
+ abort();
486
+ });
487
+ }
488
+ async saveTokens(res, from) {
489
+ const b = res.body;
490
+ if (res.status !== 200 || !b) {
491
+ if (res.status === 400 && b && typeof b.error === "string" && b.error === "invalid_grant") {
492
+ throw mdbaseError("unauthenticated", "the grant is no longer valid", "grant_invalid");
493
+ }
494
+ if (res.status === 400)
495
+ throw collectionUnavailableError("sync_required");
496
+ throw mdbaseError("unavailable", `token request failed (${res.status})`, "token_error");
497
+ }
498
+ const access = b.access_token, refresh = b.refresh_token, collection = b.collection_id;
499
+ const expiresIn = b.expires_in, refreshExpiresIn = b.refresh_expires_in;
500
+ if (typeof access !== "string" || typeof refresh !== "string" || typeof collection !== "string" || !UUID.test(collection)
501
+ || typeof expiresIn !== "number" || !(expiresIn > 0) || typeof refreshExpiresIn !== "number" || !(refreshExpiresIn > 0)) {
502
+ throw mdbaseError("unavailable", "invalid token response", "token_response");
503
+ }
504
+ const id = collection.toLowerCase();
505
+ if (from.collection && from.collection.toLowerCase() !== id)
506
+ throw mdbaseError("forbidden", "a different collection was approved", "collection_mismatch");
507
+ if (from.previous && from.previous.collection !== id)
508
+ throw mdbaseError("unavailable", "the token names another collection", "token_response");
509
+ const refreshKey = from.previous?.refreshKey
510
+ ?? (await crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]));
511
+ const iv = random(12);
512
+ const sealed = new Uint8Array(await crypto.subtle.encrypt({ name: "AES-GCM", iv, additionalData: this.aad(id) }, refreshKey, new TextEncoder().encode(refresh)));
513
+ const noise = from.noise ?? { privateKey: from.previous.noisePrivateKey, publicKey: from.previous.noisePublicKey };
514
+ const signing = from.signing ?? from.previous?.signingPrivateKey;
515
+ const next = {
516
+ version: 1, collection: id, noisePrivateKey: noise.privateKey, noisePublicKey: noise.publicKey,
517
+ refreshKey, refresh: concat(iv, sealed), refreshExpiresAt: Date.now() + refreshExpiresIn * 1000,
518
+ ...(signing ? { signingPrivateKey: signing } : {}),
519
+ ...(from.previous?.owner ? { owner: from.previous.owner } : {}),
520
+ };
521
+ const epoch = this.epoch;
522
+ await this.withLock(id, "commit", async () => {
523
+ const store = await this.store();
524
+ if (epoch !== this.epoch)
525
+ throw grantChanged();
526
+ if (from.previous && !sameRevision(from.previous, await store.getGrant(id)))
527
+ throw grantChanged();
528
+ from.check?.();
529
+ await store.putGrant(next);
530
+ const written = await store.getGrant(id);
531
+ if (!written || !equalBytes(next.noisePublicKey, written.noisePublicKey) || !equalBytes(next.refresh, written.refresh))
532
+ throw grantChanged();
533
+ // Commit and cache publication share the writer lock. The cache's original
534
+ // identity is also checked on every use (including after another tab writes).
535
+ from.check?.();
536
+ this.tokens.set(id, { access, expiresAt: Date.now() + expiresIn * 1000, collection: id, owner: written.owner, noisePublicKey: written.noisePublicKey.slice() });
537
+ this.forgotten.delete(id);
538
+ });
539
+ return id;
540
+ }
541
+ aad(collection) {
542
+ return new TextEncoder().encode(`mdbase.app-grant.v2\0${this.cpOrigin}\0${this.owner()}\0${collection}`);
543
+ }
544
+ /** A current access token for the collection's grant, refreshing when needed. */
545
+ async accessToken(collection, force = false) {
546
+ const grant = await this.heldGrant(collection);
547
+ const cached = this.tokens.get(collection);
548
+ if (!force && cached && sameGrant(grant, cached) && cached.expiresAt - Date.now() > 60_000)
549
+ return cached.access;
550
+ const running = this.refreshing.get(collection);
551
+ if (running && sameRevision(grant, running.grant)) {
552
+ const token = await running.work;
553
+ await this.assertCurrent(grant);
554
+ return token;
555
+ }
556
+ const work = this.withLock(collection, "refresh", async () => {
557
+ const current = await this.assertCurrent(grant);
558
+ return this.refresh(collection, current);
559
+ });
560
+ const pending = { grant, work };
561
+ this.refreshing.set(collection, pending);
562
+ try {
563
+ const token = await work;
564
+ await this.assertCurrent(grant);
565
+ return token;
566
+ }
567
+ finally {
568
+ if (this.refreshing.get(collection) === pending)
569
+ this.refreshing.delete(collection);
570
+ }
571
+ }
572
+ // Network refresh serialization is separate from the short commit lock, so
573
+ // explicit consent can commit while an old network response is held.
574
+ withLock(collection, kind, f) {
575
+ // Original local declaration, not a network/registration alias. This broader
576
+ // namespace also lets a fresh custom-store owner forget keys while offline.
577
+ return exclusive(`mdbase.app-grant.${kind}:${JSON.stringify([this.cpOrigin, this.owner(), collection])}`, f);
578
+ }
579
+ async heldGrant(collection) {
580
+ const grant = await (await this.store()).getGrant(collection);
581
+ if (!grant)
582
+ throw collectionUnavailableError("sync_required");
583
+ return { ...grant, noisePublicKey: grant.noisePublicKey.slice(), refresh: grant.refresh.slice() };
584
+ }
585
+ async assertCurrent(grant) {
586
+ const current = await (await this.store()).getGrant(grant.collection);
587
+ if (!sameGrant(grant, current))
588
+ throw grantChanged();
589
+ return current;
590
+ }
591
+ async refresh(collection, grant) {
592
+ if (grant.refreshExpiresAt <= Date.now())
593
+ throw collectionUnavailableError("sync_required");
594
+ let refresh;
595
+ try {
596
+ const plain = await crypto.subtle.decrypt({ name: "AES-GCM", iv: grant.refresh.slice(0, 12), additionalData: this.aad(collection) }, grant.refreshKey, grant.refresh.slice(12));
597
+ refresh = new TextDecoder().decode(plain);
598
+ }
599
+ catch {
600
+ throw mdbaseError("unauthenticated", "the stored grant could not be read", "grant_storage");
601
+ }
602
+ const registration = await this.register();
603
+ // Connect checks this field order when it verifies the proof over the body.
604
+ const body = new URLSearchParams({ grant_type: "refresh_token", refresh_token: refresh, client_id: registration.id });
605
+ // The grant's proof key is its signing key: Connect refuses an unsigned refresh.
606
+ const proof = grant.signingPrivateKey ? await authorityProof(grant.signingPrivateKey, "/oauth/token", body.toString(), refresh) : {};
607
+ const res = await this.request("/oauth/token", {
608
+ method: "POST",
609
+ headers: { "content-type": "application/x-www-form-urlencoded", ...proof },
610
+ body,
611
+ });
612
+ try {
613
+ await this.saveTokens(res, { previous: grant });
614
+ }
615
+ catch (e) {
616
+ // A refused refresh token will never work again: forget the grant locally.
617
+ if (isMdbaseError(e, "unauthenticated") && e.reason === "grant_invalid") {
618
+ await this.withLock(collection, "commit", async () => {
619
+ const store = await this.store();
620
+ if (!sameRevision(grant, await store.getGrant(collection)))
621
+ throw grantChanged();
622
+ await store.deleteGrant(collection);
623
+ this.forgotten.add(collection);
624
+ const cached = this.tokens.get(collection);
625
+ if (cached && sameGrant(grant, cached))
626
+ this.tokens.delete(collection);
627
+ });
628
+ }
629
+ throw e;
630
+ }
631
+ // Never read a newer consent's cache as the result of this older refresh.
632
+ return res.body.access_token;
633
+ }
634
+ /** Fetch the route; one forced refresh on 401. */
635
+ async route(collection, signal) {
636
+ for (let attempt = 0;; attempt++) {
637
+ const token = await this.accessToken(collection, attempt > 0);
638
+ const res = await this.request(`/v1/next/collections/${encodeURIComponent(collection)}/route`, { headers: { authorization: `Bearer ${token}` } }, signal);
639
+ if (res.status === 401 && attempt === 0)
640
+ continue;
641
+ if (res.status === 401)
642
+ throw mdbaseError("unauthenticated", "the control plane refused the access token");
643
+ if (res.status === 409)
644
+ throw mdbaseError("unauthenticated", "this app's key is not registered with its grant", "client_key_required");
645
+ if (res.status !== 200 || !res.body)
646
+ throw mdbaseError("unavailable", `control plane answered ${res.status}`, "control_error");
647
+ const route = res.body;
648
+ if (typeof route.collection !== "string" || route.collection.toLowerCase() !== collection || !Array.isArray(route.targets)) {
649
+ throw mdbaseError("unauthenticated", "the route does not match this collection's grant", "route_mismatch");
650
+ }
651
+ const parsed = parseCollectionAvailability(route.availability);
652
+ const availability = parsed ?? (orderTargets(route, null).length
653
+ ? { state: "available" } : { state: "unavailable", reason: route.reason === "no_device_registered" ? "no_device_registered" : "device_offline" });
654
+ return { token, route, availability };
655
+ }
656
+ }
657
+ /** Private collections this app has a grant for, with their availability. */
658
+ async verifiedStoredNativeGrant(completion) {
659
+ const registration = await this.register(), grant = await (await this.store()).getGrant(completion.collection_id);
660
+ return !!grant && completion.application_id === registration.id && completion.application_origin === this.declaration.origin && grant.owner === this.owner() && b64u(grant.noisePublicKey) === completion.client_noise_public_key;
661
+ }
662
+ async collections(options = {}) {
663
+ const records = await (await this.store()).listGrants();
664
+ const local = [];
665
+ for (const record of records) {
666
+ if (options.bindings === undefined || options.bindings.some(c => c.collection_id === record.collection && c.application_origin === this.declaration.origin && b64u(record.noisePublicKey) === c.client_noise_public_key))
667
+ local.push(record);
668
+ }
669
+ const held = new Set(local.map((g) => g.collection));
670
+ for (const grant of local) {
671
+ let token;
672
+ try {
673
+ token = await this.accessToken(grant.collection);
674
+ }
675
+ catch (e) {
676
+ if (isMdbaseError(e) && ((e.code === "unauthenticated" && e.reason === "grant_invalid") || (e.code === "forbidden" && e.reason === "sync_required")))
677
+ continue;
678
+ throw e; // Failed/cancelled inventory is never an empty COMPLETE inventory.
679
+ }
680
+ await this.assertCurrent(grant);
681
+ const res = await this.request("/v1/next/apps/collections", { headers: { authorization: `Bearer ${token}` } }, options.signal);
682
+ await this.assertCurrent(grant);
683
+ if (res.status === 401) {
684
+ await this.withLock(grant.collection, "commit", async () => {
685
+ await this.assertCurrent(grant);
686
+ const cached = this.tokens.get(grant.collection);
687
+ if (cached?.access !== token || !sameGrant(grant, cached))
688
+ throw grantChanged();
689
+ this.tokens.delete(grant.collection);
690
+ });
691
+ // A rejected access token is failed metadata, not proof the grant ended.
692
+ throw mdbaseError("unauthenticated", "the control plane refused the collection listing token");
693
+ }
694
+ if (res.status !== 200 || !Array.isArray(res.body?.collections))
695
+ throw mdbaseError("unavailable", `control plane answered ${res.status}`, "control_error");
696
+ const out = [];
697
+ for (const raw of res.body.collections) {
698
+ const id = typeof raw.collection === "string" ? raw.collection.toLowerCase() : "";
699
+ if (!UUID.test(id) || out.some((c) => c.collectionId === id))
700
+ continue;
701
+ const parsed = parseCollectionAvailability(raw.availability);
702
+ if (raw.state !== "synced_e2e" && !parsed)
703
+ continue; // other collections open through the installation
704
+ const availability = !held.has(id)
705
+ ? { state: "unavailable", reason: "sync_required" } // no key in this browser
706
+ : parsed ?? { state: "opening" }; // the grant is still being published to the collection
707
+ out.push(Object.freeze({
708
+ collectionId: id,
709
+ displayName: typeof raw.name === "string" ? raw.name : "Collection",
710
+ operations: Object.freeze(Array.isArray(raw.operations) ? raw.operations.filter((x) => typeof x === "string") : []),
711
+ availability: Object.freeze(availability),
712
+ role: ROLES.has(raw.role) ? raw.role : null,
713
+ }));
714
+ }
715
+ return out;
716
+ }
717
+ return [];
718
+ }
719
+ /** The collection's availability now, from its route. Never throws for `unavailable`. */
720
+ async availability(collection, options = {}) {
721
+ const id = collection.toLowerCase();
722
+ try {
723
+ return (await this.route(id, options.signal)).availability;
724
+ }
725
+ catch (e) {
726
+ if (isMdbaseError(e) && e.details instanceof Map && typeof e.details.get("availability") === "string") {
727
+ return parseCollectionAvailability({ state: "unavailable", reason: e.details.get("availability") });
728
+ }
729
+ throw e;
730
+ }
731
+ }
732
+ /**
733
+ * Wait, bounded, until the collection is available: e.g. while the person opens
734
+ * the desktop app or approves this app there. Resolves with the last availability
735
+ * (still `unavailable` on timeout); never waits on `sync_required` or `access_removed`.
736
+ */
737
+ async waitForAvailable(collection, o = {}) {
738
+ const deadline = Date.now() + Math.min(Math.max(o.timeoutMs ?? 60_000, 0), 10 * 60_000);
739
+ const interval = Math.max(o.intervalMs ?? 3_000, 1_000);
740
+ let last = null;
741
+ for (;;) {
742
+ if (o.signal?.aborted)
743
+ throw mdbaseError("cancelled", "wait cancelled");
744
+ const now = await this.availability(collection, o.signal ? { signal: o.signal } : {});
745
+ if (!last || now.state !== last.state || (now.state === "unavailable" && last.state === "unavailable" && now.reason !== last.reason))
746
+ o.onAvailability?.(now);
747
+ last = now;
748
+ if (now.state === "available" || (now.state === "unavailable" && (now.reason === "sync_required" || now.reason === "access_removed")))
749
+ return now;
750
+ const left = deadline - Date.now();
751
+ if (left <= 0)
752
+ return now;
753
+ await new Promise((resolve) => {
754
+ const t = setTimeout(done, Math.min(interval, left));
755
+ function done() { clearTimeout(t); o.signal?.removeEventListener("abort", done); resolve(); }
756
+ o.signal?.addEventListener("abort", done, { once: true });
757
+ });
758
+ }
759
+ }
760
+ /**
761
+ * A connector for `connect()`: every (re)connect resolves the route, refuses an
762
+ * unavailable collection with its reason, and opens a Noise IK session through the
763
+ * relay to a serving device (sticky while it stays listed). The first open pins
764
+ * its original consent/key identity; new consent requires a new connector.
765
+ */
766
+ connector(collection) {
767
+ const id = collection.toLowerCase();
768
+ if (!UUID.test(id))
769
+ throw mdbaseError("invalid_request", "collection must be a UUID");
770
+ let sticky = null;
771
+ const webSocket = this.options.webSocket;
772
+ let original;
773
+ return registerNextRelayFence({
774
+ description: `app-grant:${id}`,
775
+ open: async (hello, signal) => {
776
+ const grant = await (original ??= this.heldGrant(id));
777
+ await this.assertCurrent(grant);
778
+ const connector = noiseConnector({
779
+ description: `app-grant:${id}`,
780
+ staticKey: staticKeyOf(grant),
781
+ target: async (s) => {
782
+ await this.assertCurrent(grant);
783
+ const { token, route, availability } = await this.route(id, s);
784
+ await this.assertCurrent(grant);
785
+ if (availability.state === "unavailable")
786
+ throw collectionUnavailableError(availability.reason);
787
+ if (!UUID.test(route.grant))
788
+ throw mdbaseError("unauthenticated", "the route names no grant", "route_mismatch");
789
+ const target = orderTargets(route, sticky)[0];
790
+ if (!target)
791
+ throw collectionUnavailableError("device_offline");
792
+ const remoteStatic = new Uint8Array(32);
793
+ for (let i = 0; i < 32; i++)
794
+ remoteStatic[i] = parseInt(target.noise_pk.slice(2 * i, 2 * i + 2), 16);
795
+ return {
796
+ prologue: clientPrologue(uuidToBytes(target.relay_collection), uuidToBytes(route.grant), uuidToBytes(target.device)),
797
+ remoteStatic,
798
+ device: target.device,
799
+ openCarrier: async (carrierSignal) => {
800
+ await this.assertCurrent(grant);
801
+ const carrier = await relayPipeCarrier(target.url, {
802
+ accessToken: token, collection: target.relay_collection, grant: route.grant, device: target.device, devicePublicKey: remoteStatic,
803
+ }, webSocket, carrierSignal);
804
+ try {
805
+ await this.assertCurrent(grant);
806
+ return carrier;
807
+ }
808
+ catch (e) {
809
+ carrier.close();
810
+ throw e;
811
+ }
812
+ },
813
+ };
814
+ },
815
+ });
816
+ const opened = await connector.open(hello, signal);
817
+ try {
818
+ await this.assertCurrent(grant);
819
+ }
820
+ catch (e) {
821
+ opened.port.close();
822
+ throw e;
823
+ }
824
+ bindOriginalAppGrant(opened.port, grant);
825
+ sticky = opened.device ?? null;
826
+ return opened;
827
+ },
828
+ get target() { return sticky; },
829
+ });
830
+ }
831
+ /**
832
+ * People metadata and Person records for a Private collection: the same
833
+ * `MdbasePeopleClient` as cloud copies, over `client` (opened with
834
+ * `connector(collection)`) and Connect's people metadata for this grant. Until a
835
+ * computer approves the app, metadata fails with availability `approval_required`.
836
+ */
837
+ people(collection, client) {
838
+ const id = collection.toLowerCase();
839
+ if (!UUID.test(id))
840
+ throw mdbaseError("invalid_request", "collection must be a UUID");
841
+ return new MdbasePeopleClient(client, appGrantPeopleAuthority(id, {
842
+ cpOrigin: this.cpOrigin,
843
+ fetch: this.fetcher,
844
+ accessToken: (c, force) => this.accessToken(c, force),
845
+ holds: (c) => !this.forgotten.has(c),
846
+ }));
847
+ }
848
+ /**
849
+ * Setup and readiness for a Private collection, over `client` (opened with
850
+ * `connector(collection)`): the same plan, review wording and guarded apply as
851
+ * a hosted collection's setup. Native verifies and plans the original signed
852
+ * declaration; the SDK retains an encrypted original MID before apply and
853
+ * reconciles receipts without replaying resource operations.
854
+ */
855
+ setup(client) {
856
+ const compiled = compileApplicationManifest(this.declaration);
857
+ let original;
858
+ const grant = async () => {
859
+ const session = client.currentSession(), held = session && originalAppGrant(session);
860
+ if (!held || held.collection !== client.collection)
861
+ throw grantChanged();
862
+ original ??= held;
863
+ if (!sameGrant(original, held))
864
+ throw grantChanged();
865
+ return original;
866
+ };
867
+ const assertCurrent = async () => this.assertCurrent(await grant());
868
+ return privateCollectionSetup({
869
+ assertCurrent,
870
+ journal: protectedSetupJournal({ store: () => this.store(), grant, assertCurrent: g => this.assertCurrent(g), aad: this.aad(client.collection) }),
871
+ client, manifest: compiled.manifest, operations: compiled.operations,
872
+ });
873
+ }
874
+ /** Forget a grant in this browser (its keys and refresh token). Does not revoke it at Connect. */
875
+ async forget(collection, options = {}) {
876
+ const id = collection.toLowerCase(), expected = options.expectedNoisePublicKey;
877
+ await this.withLock(id, "commit", async () => {
878
+ const store = await this.store(), current = await store.getGrant(id);
879
+ if (expected !== undefined && current && b64u(current.noisePublicKey) !== expected)
880
+ throw grantChanged();
881
+ await store.deleteGrant(id);
882
+ this.forgotten.add(id);
883
+ this.tokens.delete(id);
884
+ });
885
+ }
886
+ /**
887
+ * Sign-out: wipe EVERY grant this browser holds (and their Native setup
888
+ * attempts), not just ones a caller listed. Grants carry no account, so
889
+ * anything left behind could be used while a different account is signed
890
+ * in on a shared browser. The app identity stays (it is the app's
891
+ * registration, not account authority). Idempotent and safe to run from
892
+ * several tabs at once; throws when the wipe could not complete, so the
893
+ * caller can tell the person some local data remains.
894
+ *
895
+ * Race safety: the epoch bump fences authorizations and token commits
896
+ * prepared before the wipe; the wipe then clears the store while holding
897
+ * every known grant's commit lock (sorted, the same order in every tab),
898
+ * so a refresh committing at that moment either lands first and is wiped,
899
+ * or runs after and fails its revision/epoch check instead of re-saving.
900
+ */
901
+ async forgetAllGrants() {
902
+ this.epoch++;
903
+ const store = await this.store();
904
+ let ids = [];
905
+ // The list only picks the locks; clearGrants below is the authority.
906
+ try {
907
+ ids = (await store.listGrants()).map(g => g.collection).sort();
908
+ }
909
+ catch { /* clearGrants reports */ }
910
+ for (const id of ids)
911
+ this.forgotten.add(id);
912
+ const locked = async (rest, work) => rest.length ? this.withLock(rest[0], "commit", () => locked(rest.slice(1), work)) : work();
913
+ await locked(ids, async () => {
914
+ this.tokens.clear();
915
+ if (typeof store.clearGrants === "function") {
916
+ await store.clearGrants();
917
+ return;
918
+ }
919
+ // A store built before clearGrants existed: enumerate, delete, prove empty.
920
+ for (const grant of await store.listGrants()) {
921
+ await store.deleteGrant(grant.collection);
922
+ this.forgotten.add(grant.collection);
923
+ }
924
+ if ((await store.listGrants()).length)
925
+ throw mdbaseError("unavailable", "grant storage could not be cleared", "grant_storage");
926
+ });
927
+ this.tokens.clear();
928
+ }
929
+ }
930
+ //# sourceMappingURL=client.js.map