@noy-db/hub 0.3.0-pre.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (955) hide show
  1. package/dist/aggregate/index.js +9 -8
  2. package/dist/aggregate/index.js.map +1 -1
  3. package/dist/api-ZGS6LCOF.js +20 -0
  4. package/dist/as/index.js +11 -11
  5. package/dist/attestation/index.js +18 -18
  6. package/dist/backup-BJ57IKAO.js +242 -0
  7. package/dist/backup-BJ57IKAO.js.map +1 -0
  8. package/dist/blobs/index.js +13 -11
  9. package/dist/blobs/index.js.map +1 -1
  10. package/dist/broker/index.js +92 -0
  11. package/dist/broker/index.js.map +1 -0
  12. package/dist/bundle/index.js +25 -22
  13. package/dist/bundle/index.js.map +1 -1
  14. package/dist/by/index.js +2 -2
  15. package/dist/cargo/index.js +31 -31
  16. package/dist/chunk-2NVOWNI3.js +167 -0
  17. package/dist/chunk-2NVOWNI3.js.map +1 -0
  18. package/dist/chunk-3B5VVCNY.js +71 -0
  19. package/dist/chunk-3LQ2YKO4.js +230 -0
  20. package/dist/chunk-3QCRBHCY.js +54 -0
  21. package/dist/chunk-454JXE57.js +1697 -0
  22. package/dist/chunk-454JXE57.js.map +1 -0
  23. package/dist/chunk-4CTHCN4J.js +480 -0
  24. package/dist/chunk-4CTHCN4J.js.map +1 -0
  25. package/dist/chunk-4GPE63GU.js +111 -0
  26. package/dist/chunk-4GPE63GU.js.map +1 -0
  27. package/dist/chunk-4JBYV75E.js +150 -0
  28. package/dist/chunk-4NXKCLLQ.js +97 -0
  29. package/dist/chunk-4VNQOLML.js +29 -0
  30. package/dist/chunk-4VNQOLML.js.map +1 -0
  31. package/dist/chunk-5M5DVGV7.js +69 -0
  32. package/dist/chunk-5O3XF4DV.js +150 -0
  33. package/dist/chunk-5O3XF4DV.js.map +1 -0
  34. package/dist/chunk-5YOLBEQ6.js +30 -0
  35. package/dist/chunk-6CRIV7DE.js +129 -0
  36. package/dist/chunk-6JTIAGHD.js +621 -0
  37. package/dist/chunk-6JTIAGHD.js.map +1 -0
  38. package/dist/chunk-6QTNZJBS.js +255 -0
  39. package/dist/chunk-6T2SCQRU.js +86 -0
  40. package/dist/chunk-7DSTRQIJ.js +45 -0
  41. package/dist/chunk-AUSTCW2X.js +589 -0
  42. package/dist/chunk-B3HJYUOF.js +209 -0
  43. package/dist/chunk-BDVFPG6Y.js +164 -0
  44. package/dist/chunk-BIOUI4HL.js +1554 -0
  45. package/dist/chunk-BIOUI4HL.js.map +1 -0
  46. package/dist/chunk-CAF6WOK7.js +36 -0
  47. package/dist/chunk-CDUQTA3Z.js +381 -0
  48. package/dist/chunk-CDUQTA3Z.js.map +1 -0
  49. package/dist/chunk-CIE2BASH.js +404 -0
  50. package/dist/chunk-CRI4OUV4.js +42 -0
  51. package/dist/chunk-DLG74CNB.js +91 -0
  52. package/dist/chunk-E5ZQT5KX.js +30 -0
  53. package/dist/chunk-E5ZQT5KX.js.map +1 -0
  54. package/dist/chunk-EQO2UVP4.js +247 -0
  55. package/dist/chunk-EQO2UVP4.js.map +1 -0
  56. package/dist/chunk-ERJ7FU55.js +367 -0
  57. package/dist/chunk-EVVGJDRQ.js +205 -0
  58. package/dist/chunk-EVX47VBM.js +74 -0
  59. package/dist/chunk-EVX47VBM.js.map +1 -0
  60. package/dist/chunk-EXK7QRWF.js +59 -0
  61. package/dist/chunk-EYZ6IQ6X.js +202 -0
  62. package/dist/chunk-F64IRYG3.js +45 -0
  63. package/dist/chunk-FHS2HQSH.js +823 -0
  64. package/dist/chunk-FM3G3NOY.js +206 -0
  65. package/dist/chunk-FM3G3NOY.js.map +1 -0
  66. package/dist/chunk-FUG4SFN3.js +36 -0
  67. package/dist/chunk-FUG4SFN3.js.map +1 -0
  68. package/dist/chunk-GKEWXIV5.js +80 -0
  69. package/dist/chunk-GTGPO5KW.js +59 -0
  70. package/dist/chunk-HB3RFQSC.js +95 -0
  71. package/dist/chunk-HDMEGAQE.js +957 -0
  72. package/dist/chunk-HDMEGAQE.js.map +1 -0
  73. package/dist/chunk-HDQIIUPH.js +135 -0
  74. package/dist/chunk-HDQIIUPH.js.map +1 -0
  75. package/dist/chunk-HTJQYHZP.js +344 -0
  76. package/dist/chunk-HTJQYHZP.js.map +1 -0
  77. package/dist/chunk-I6GALP6E.js +99 -0
  78. package/dist/chunk-IGJCYUT5.js +99 -0
  79. package/dist/chunk-IGJCYUT5.js.map +1 -0
  80. package/dist/chunk-IL6POWCW.js +130 -0
  81. package/dist/chunk-IU6SNYX6.js +117 -0
  82. package/dist/chunk-J2ZX2XUV.js +778 -0
  83. package/dist/chunk-JIF24JPM.js +495 -0
  84. package/dist/chunk-JIF24JPM.js.map +1 -0
  85. package/dist/chunk-JK733I5V.js +23 -0
  86. package/dist/chunk-JK733I5V.js.map +1 -0
  87. package/dist/chunk-JKJOGPZN.js +29 -0
  88. package/dist/chunk-JNAI2HN2.js +32 -0
  89. package/dist/chunk-JNAI2HN2.js.map +1 -0
  90. package/dist/chunk-JZUV47FZ.js +41 -0
  91. package/dist/chunk-K5IMOGHB.js +30 -0
  92. package/dist/chunk-KPZS5QAQ.js +151 -0
  93. package/dist/chunk-KPZS5QAQ.js.map +1 -0
  94. package/dist/chunk-KSKBRKGJ.js +291 -0
  95. package/dist/chunk-KSKBRKGJ.js.map +1 -0
  96. package/dist/chunk-LASZKVMO.js +382 -0
  97. package/dist/chunk-LXEXBTKL.js +515 -0
  98. package/dist/chunk-LXEXBTKL.js.map +1 -0
  99. package/dist/chunk-M4CV6BRT.js +524 -0
  100. package/dist/chunk-M4CV6BRT.js.map +1 -0
  101. package/dist/chunk-MEFJPTZ4.js +371 -0
  102. package/dist/chunk-MEFJPTZ4.js.map +1 -0
  103. package/dist/chunk-MV43JSJF.js +265 -0
  104. package/dist/chunk-MV43JSJF.js.map +1 -0
  105. package/dist/chunk-NJ4EOKMB.js +392 -0
  106. package/dist/chunk-NJ4EOKMB.js.map +1 -0
  107. package/dist/chunk-NR5LT5RY.js +135 -0
  108. package/dist/chunk-NWSGI5C7.js +261 -0
  109. package/dist/chunk-NWSGI5C7.js.map +1 -0
  110. package/dist/chunk-OSDB5WW3.js +739 -0
  111. package/dist/chunk-OSDB5WW3.js.map +1 -0
  112. package/dist/chunk-PN2XMATY.js +37 -0
  113. package/dist/chunk-PN2XMATY.js.map +1 -0
  114. package/dist/chunk-Q5VNKNE5.js +70 -0
  115. package/dist/chunk-QLWMEXCT.js +21 -0
  116. package/dist/chunk-QRB7NAOJ.js +123 -0
  117. package/dist/chunk-R4ROFEYC.js +74 -0
  118. package/dist/chunk-RCVJZMFE.js +164 -0
  119. package/dist/chunk-RCVJZMFE.js.map +1 -0
  120. package/dist/chunk-RIX4V2TB.js +367 -0
  121. package/dist/chunk-RYCTDFUX.js +40 -0
  122. package/dist/chunk-RZ5SVOYR.js +155 -0
  123. package/dist/chunk-SLFHQTTW.js +99 -0
  124. package/dist/chunk-SNZ6URZZ.js +2782 -0
  125. package/dist/chunk-SNZ6URZZ.js.map +1 -0
  126. package/dist/chunk-T2FFWNPK.js +75 -0
  127. package/dist/chunk-T2FFWNPK.js.map +1 -0
  128. package/dist/chunk-UNFPPVNI.js +23 -0
  129. package/dist/chunk-VFUPHI2Z.js +333 -0
  130. package/dist/chunk-VFUPHI2Z.js.map +1 -0
  131. package/dist/chunk-VLFCJYTL.js +235 -0
  132. package/dist/chunk-VN3DBQAU.js +124 -0
  133. package/dist/chunk-VYYM3MEN.js +98 -0
  134. package/dist/chunk-VYYM3MEN.js.map +1 -0
  135. package/dist/chunk-VZRODIM3.js +49 -0
  136. package/dist/chunk-W22IKJE2.js +94 -0
  137. package/dist/chunk-X3YYQWOQ.js +155 -0
  138. package/dist/chunk-X7QBD67R.js +14405 -0
  139. package/dist/chunk-X7QBD67R.js.map +1 -0
  140. package/dist/chunk-XDYREZWE.js +1128 -0
  141. package/dist/chunk-XDYREZWE.js.map +1 -0
  142. package/dist/chunk-XWZVFISC.js +720 -0
  143. package/dist/chunk-XWZVFISC.js.map +1 -0
  144. package/dist/chunk-YFXZEAYK.js +85 -0
  145. package/dist/chunk-ZAJAVEXY.js +50 -0
  146. package/dist/chunk-ZICD77GM.js +34 -0
  147. package/dist/chunk-ZJ2AK4V7.js +38 -0
  148. package/dist/chunk-ZJ2AK4V7.js.map +1 -0
  149. package/dist/chunk-ZUODRVHY.js +14 -0
  150. package/dist/classified/index.js +5 -3
  151. package/dist/classified-marker-CZKA6ITE.js +28 -0
  152. package/dist/classified-marker-CZKA6ITE.js.map +1 -0
  153. package/dist/collection-facade-TLWIPI76.js +44 -0
  154. package/dist/computed-ZIQTYTDI.js +11 -0
  155. package/dist/consent/index.js +9 -9
  156. package/dist/crdt/index.js +1 -1
  157. package/dist/dead-filter-ESOBZZP5.js +28 -0
  158. package/dist/delegation-W7ZV2322.js +25 -0
  159. package/dist/derivations/index.js +12 -11
  160. package/dist/derive-H2BJTLUI.js +21 -0
  161. package/dist/enclave-AP3I5W7O.js +141 -0
  162. package/dist/executor-KGWTNEQD.js +9 -0
  163. package/dist/executor-OVEXR6RT.js +9 -0
  164. package/dist/executor-UNEH5ZYH.js +25 -0
  165. package/dist/export-accessible-PCMXSUZS.js +23 -0
  166. package/dist/extract-partition-SWHFSYJO.js +38 -0
  167. package/dist/fanout-sidecar-A765THMX.js +74 -0
  168. package/dist/find-N6345CNT.js +11 -0
  169. package/dist/forget/index.js +10 -10
  170. package/dist/forget/index.js.map +1 -1
  171. package/dist/guards/index.js +6 -6
  172. package/dist/history/index.js +14 -11
  173. package/dist/history/index.js.map +1 -1
  174. package/dist/i18n/index.js +50 -37
  175. package/dist/i18n/index.js.map +1 -1
  176. package/dist/index.d.ts +307 -1459
  177. package/dist/index.js +595 -198
  178. package/dist/index.js.map +1 -1
  179. package/dist/indexing/index.js +7 -7
  180. package/dist/indexing/index.js.map +1 -1
  181. package/dist/issue-5OKB6I2R.js +19 -0
  182. package/dist/kernel/best-effort-revert.d.ts +52 -0
  183. package/dist/kernel/cache/index.d.ts +10 -0
  184. package/dist/kernel/cache/lru.d.ts +97 -0
  185. package/dist/kernel/cache/policy.d.ts +32 -0
  186. package/dist/kernel/collection-config.d.ts +809 -0
  187. package/dist/kernel/collection.d.ts +1522 -0
  188. package/dist/kernel/constants.d.ts +18 -0
  189. package/dist/kernel/debug.d.ts +25 -0
  190. package/dist/kernel/enclave/broker/proof.d.ts +154 -0
  191. package/dist/kernel/enclave/classify/bidx.d.ts +77 -0
  192. package/dist/kernel/enclave/classify/compare.d.ts +10 -0
  193. package/dist/kernel/enclave/classify/digest.d.ts +8 -0
  194. package/dist/kernel/enclave/classify/find.d.ts +36 -0
  195. package/dist/kernel/enclave/classify/kofn.d.ts +7 -0
  196. package/dist/kernel/enclave/classify/normalize.d.ts +7 -0
  197. package/dist/kernel/enclave/classify/reveal.d.ts +10 -0
  198. package/dist/kernel/enclave/classify/vdig.d.ts +39 -0
  199. package/dist/kernel/enclave/classify/verify.d.ts +36 -0
  200. package/dist/kernel/enclave/classify/write.d.ts +8 -0
  201. package/dist/kernel/enclave/crypto.d.ts +263 -0
  202. package/dist/kernel/enclave/index.d.ts +79 -0
  203. package/dist/kernel/enclave/record-keys/deterministic.d.ts +55 -0
  204. package/dist/kernel/enclave/record-keys/envelope-body.d.ts +79 -0
  205. package/dist/kernel/enclave/record-keys/lifecycle.d.ts +107 -0
  206. package/dist/kernel/enclave/record-keys/record-codec.d.ts +328 -0
  207. package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +14 -0
  208. package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +123 -0
  209. package/dist/kernel/enclave/record-keys/sealing.d.ts +70 -0
  210. package/dist/kernel/enclave/record-keys/tombstone.d.ts +57 -0
  211. package/dist/kernel/env-check.d.ts +1 -0
  212. package/dist/kernel/errors.d.ts +1922 -0
  213. package/dist/kernel/events.d.ts +11 -0
  214. package/dist/kernel/lazy-count.d.ts +13 -0
  215. package/dist/kernel/memory-store.d.ts +17 -0
  216. package/dist/kernel/mutation.d.ts +14 -0
  217. package/dist/kernel/noydb.d.ts +826 -0
  218. package/dist/kernel/paths.d.ts +25 -0
  219. package/dist/kernel/query/builder.d.ts +520 -0
  220. package/dist/kernel/query/index.d.ts +31 -0
  221. package/dist/kernel/query/join.d.ts +205 -0
  222. package/dist/kernel/query/live.d.ts +111 -0
  223. package/dist/kernel/query/predicate.d.ts +139 -0
  224. package/dist/kernel/query/scan-builder.d.ts +334 -0
  225. package/dist/kernel/refs.d.ts +205 -0
  226. package/dist/kernel/schema.d.ts +134 -0
  227. package/dist/kernel/sync-policy.d.ts +188 -0
  228. package/dist/kernel/tier-visibility.d.ts +54 -0
  229. package/dist/kernel/types.d.ts +3239 -0
  230. package/dist/kernel/util/discriminant.d.ts +58 -0
  231. package/dist/kernel/util/index.d.ts +14 -0
  232. package/dist/kernel/util/sanitize-filename.d.ts +75 -0
  233. package/dist/kernel/validation.d.ts +130 -0
  234. package/dist/kernel/vault.d.ts +1740 -0
  235. package/dist/kernel/via/compose.d.ts +144 -0
  236. package/dist/kernel/via/dispatch.d.ts +195 -0
  237. package/dist/kernel/via/graph-wiring.d.ts +145 -0
  238. package/dist/kernel/via/graph.d.ts +166 -0
  239. package/dist/kernel/via/index.d.ts +200 -0
  240. package/dist/kernel/via/pipeline.d.ts +266 -0
  241. package/dist/kernel/via/reconcile.d.ts +153 -0
  242. package/dist/kernel/via/taint-binding.d.ts +66 -0
  243. package/dist/kernel/write-queue.d.ts +46 -0
  244. package/dist/ledger-GFBKVPV4.js +42 -0
  245. package/dist/legacy/bundle.d.ts +30 -0
  246. package/dist/legacy/kernel.d.ts +33 -0
  247. package/dist/liberate-3VDOT4KO.js +24 -0
  248. package/dist/link-set-Z7Q2ASFX.js +31 -0
  249. package/dist/materialized-views/index.js +19 -15
  250. package/dist/noydb-ZCJOYBDI.js +68 -0
  251. package/dist/on/index.js +9 -9
  252. package/dist/overlay-views/index.js +4 -4
  253. package/dist/periods/index.js +12 -12
  254. package/dist/pod/index.js +11 -11
  255. package/dist/policy-Z3RUAIY2.js +41 -0
  256. package/dist/port/as/index.d.ts +26 -0
  257. package/dist/port/at/index.d.ts +18 -0
  258. package/dist/port/by/default-provider.d.ts +9 -0
  259. package/dist/port/by/index.d.ts +17 -0
  260. package/dist/port/by/types.d.ts +86 -0
  261. package/dist/port/in/index.d.ts +21 -0
  262. package/dist/port/on/index.d.ts +27 -0
  263. package/dist/port/to/index.d.ts +19 -0
  264. package/dist/port/ui/index.d.ts +21 -0
  265. package/dist/port/with/blob-strategy.d.ts +98 -0
  266. package/dist/port/with/broker-strategy.d.ts +84 -0
  267. package/dist/port/with/capabilities.d.ts +31 -0
  268. package/dist/port/with/classified-marker.d.ts +9 -0
  269. package/dist/port/with/classified-strategy.d.ts +62 -0
  270. package/dist/port/with/computed-strategy.d.ts +19 -0
  271. package/dist/port/with/i18n-strategy.d.ts +175 -0
  272. package/dist/port/with/index.d.ts +18 -0
  273. package/dist/port/with/lazy-strategy.d.ts +48 -0
  274. package/dist/port/with/lookup-strategy.d.ts +129 -0
  275. package/dist/port/with/service-bus.d.ts +156 -0
  276. package/dist/port/with/team-strategy.d.ts +36 -0
  277. package/dist/port/with/write-hooks.d.ts +34 -0
  278. package/dist/portability/index.js +8 -8
  279. package/dist/post-register-JTH76BLY.js +60 -0
  280. package/dist/post-register-JTH76BLY.js.map +1 -0
  281. package/dist/public-envelope-B4KNWVUA.js +32 -0
  282. package/dist/purge-scope-FGNNLWHD.js +24 -0
  283. package/dist/purge-scope-FGNNLWHD.js.map +1 -0
  284. package/dist/query/index.js +9 -6
  285. package/dist/read-only-facade-CHCKSEPD.js +8 -0
  286. package/dist/register-VAHONCID.js +23 -0
  287. package/dist/registry-7MLVD3VO.js +19 -0
  288. package/dist/registry-EPKPD5SM.js +18 -0
  289. package/dist/registry-P5T7PS2U.js +9 -0
  290. package/dist/request-withdrawal-TI3A5WPS.js +31 -0
  291. package/dist/reveal-DIBHLUZX.js +38 -0
  292. package/dist/reveal-DIBHLUZX.js.map +1 -0
  293. package/dist/revoke-FDRD6GRW.js +24 -0
  294. package/dist/satellites/index.js +1 -1
  295. package/dist/sealed-record/index.js +12 -12
  296. package/dist/seed-Q6M2IZFL.js +231 -0
  297. package/dist/seed-Q6M2IZFL.js.map +1 -0
  298. package/dist/session/index.js +9 -9
  299. package/dist/shadow/index.js +2 -2
  300. package/dist/signer-MUWEIUI6.js +25 -0
  301. package/dist/snapshots/index.js +10 -10
  302. package/dist/stale-OSQ7J3AA.js +29 -0
  303. package/dist/storage-MVFCGEQE.js +23 -0
  304. package/dist/store-coordination-provider-64OEZFGS.js +142 -0
  305. package/dist/sync/index.js +9 -9
  306. package/dist/team/index.js +15 -15
  307. package/dist/tiers/index.js +14 -10
  308. package/dist/to/index.js +1 -2
  309. package/dist/tx/index.js +3 -3
  310. package/dist/util/index.js +1 -1
  311. package/dist/verify-ZASTRNPR.js +140 -0
  312. package/dist/verify-ZASTRNPR.js.map +1 -0
  313. package/dist/via/blob/active.d.ts +34 -0
  314. package/dist/via/blob/binding.d.ts +86 -0
  315. package/dist/via/blob/index.d.ts +34 -0
  316. package/dist/via/classified/active.d.ts +3 -0
  317. package/dist/via/classified/binding.d.ts +83 -0
  318. package/dist/via/classified/config-drift.d.ts +34 -0
  319. package/dist/via/classified/descriptor.d.ts +66 -0
  320. package/dist/via/classified/errors.d.ts +19 -0
  321. package/dist/via/classified/guards.d.ts +23 -0
  322. package/dist/via/classified/index.d.ts +11 -0
  323. package/dist/via/classified/presets.d.ts +65 -0
  324. package/dist/via/classified/resolve.d.ts +9 -0
  325. package/dist/via/classified/strategy.d.ts +11 -0
  326. package/dist/via/classified/validators.d.ts +3 -0
  327. package/dist/via/classified/write.d.ts +4 -0
  328. package/dist/via/computed/binding.d.ts +34 -0
  329. package/dist/via/computed/descriptor.d.ts +35 -0
  330. package/dist/via/i18n/active.d.ts +28 -0
  331. package/dist/via/i18n/binding.d.ts +36 -0
  332. package/dist/via/i18n/core.d.ts +267 -0
  333. package/dist/via/i18n/densify.d.ts +24 -0
  334. package/dist/via/i18n/dictionary.d.ts +200 -0
  335. package/dist/via/i18n/index.d.ts +21 -0
  336. package/dist/via/i18n/policy.d.ts +44 -0
  337. package/dist/via/i18n/script.d.ts +26 -0
  338. package/dist/via/i18n/strategy.d.ts +13 -0
  339. package/dist/via/lookup/active.d.ts +19 -0
  340. package/dist/via/lookup/binding.d.ts +99 -0
  341. package/dist/via/lookup/descriptor.d.ts +123 -0
  342. package/dist/via/lookup/handle.d.ts +220 -0
  343. package/dist/via/lookup/index.d.ts +17 -0
  344. package/dist/via/lookup/registry.d.ts +228 -0
  345. package/dist/via/lookup/snapshot.d.ts +67 -0
  346. package/dist/via/money/arith.d.ts +68 -0
  347. package/dist/via/money/binding.d.ts +21 -0
  348. package/dist/via/money/branded.d.ts +61 -0
  349. package/dist/via/money/descriptor.d.ts +73 -0
  350. package/dist/via/money/fixed-point.d.ts +51 -0
  351. package/dist/via/money/index.d.ts +15 -0
  352. package/dist/via/money/iso4217.d.ts +6 -0
  353. package/dist/via/money/money-reducer.d.ts +33 -0
  354. package/dist/via/money/normalize.d.ts +105 -0
  355. package/dist/via/money/paths.d.ts +61 -0
  356. package/dist/via/money/where.d.ts +127 -0
  357. package/dist/walk-SVNDIZ62.js +241 -0
  358. package/dist/with/index.js +11 -11
  359. package/dist/with-audit/attestation/active.d.ts +10 -0
  360. package/dist/with-audit/attestation/index.d.ts +16 -0
  361. package/dist/with-audit/attestation/issue.d.ts +29 -0
  362. package/dist/with-audit/attestation/revoke.d.ts +15 -0
  363. package/dist/with-audit/attestation/signer.d.ts +33 -0
  364. package/dist/with-audit/attestation/strategy.d.ts +44 -0
  365. package/dist/with-audit/attestation/vault-facade.d.ts +62 -0
  366. package/dist/with-audit/consent/active.d.ts +14 -0
  367. package/dist/with-audit/consent/consent.d.ts +114 -0
  368. package/dist/with-audit/consent/index.d.ts +14 -0
  369. package/dist/with-audit/consent/strategy.d.ts +36 -0
  370. package/dist/with-audit/forget/active.d.ts +31 -0
  371. package/dist/with-audit/forget/index.d.ts +28 -0
  372. package/dist/with-audit/forget/purge-scope.d.ts +54 -0
  373. package/dist/with-audit/forget/strategy.d.ts +199 -0
  374. package/dist/with-audit/forget/subject-index.d.ts +83 -0
  375. package/dist/with-audit/guards/executor.d.ts +26 -0
  376. package/dist/with-audit/guards/immutable-guard.d.ts +63 -0
  377. package/dist/with-audit/guards/index.d.ts +10 -0
  378. package/dist/with-audit/guards/read-only-facade.d.ts +31 -0
  379. package/dist/with-audit/guards/registry.d.ts +83 -0
  380. package/dist/with-audit/guards/transition-guard.d.ts +82 -0
  381. package/dist/with-audit/guards/types.d.ts +134 -0
  382. package/dist/with-audit/guards/with-guard.d.ts +15 -0
  383. package/dist/with-audit/periods/active.d.ts +11 -0
  384. package/dist/with-audit/periods/index.d.ts +18 -0
  385. package/dist/with-audit/periods/periods.d.ts +417 -0
  386. package/dist/with-audit/periods/strategy.d.ts +32 -0
  387. package/dist/with-audit/periods/vault-facade.d.ts +95 -0
  388. package/dist/with-audit/portability/active.d.ts +11 -0
  389. package/dist/with-audit/portability/export-accessible.d.ts +46 -0
  390. package/dist/with-audit/portability/index.d.ts +18 -0
  391. package/dist/with-audit/portability/request-withdrawal.d.ts +85 -0
  392. package/dist/with-audit/portability/strategy.d.ts +31 -0
  393. package/dist/with-audit/portability/withdraw-accessible.d.ts +82 -0
  394. package/dist/with-audit/sealed-record/active.d.ts +9 -0
  395. package/dist/with-audit/sealed-record/index.d.ts +55 -0
  396. package/dist/with-audit/sealed-record/strategy.d.ts +34 -0
  397. package/dist/with-audit/sealed-record/types.d.ts +27 -0
  398. package/dist/with-audit/tiers/active.d.ts +9 -0
  399. package/dist/with-audit/tiers/index.d.ts +394 -0
  400. package/dist/with-audit/tiers/strategy.d.ts +36 -0
  401. package/dist/with-cargo/active.d.ts +11 -0
  402. package/dist/with-cargo/adopt-partition.d.ts +81 -0
  403. package/dist/with-cargo/decrypt-partition.d.ts +19 -0
  404. package/dist/with-cargo/describe-extraction.d.ts +41 -0
  405. package/dist/with-cargo/extract-partition.d.ts +155 -0
  406. package/dist/with-cargo/index.d.ts +33 -0
  407. package/dist/with-cargo/strategy.d.ts +30 -0
  408. package/dist/with-cargo/vault-diff.d.ts +144 -0
  409. package/dist/with-cargo/walk-closure.d.ts +67 -0
  410. package/dist/with-commit/crdt/active.d.ts +25 -0
  411. package/dist/with-commit/crdt/crdt.d.ts +42 -0
  412. package/dist/with-commit/crdt/index.d.ts +16 -0
  413. package/dist/with-commit/crdt/strategy.d.ts +25 -0
  414. package/dist/with-commit/history/active.d.ts +40 -0
  415. package/dist/with-commit/history/diff.d.ts +23 -0
  416. package/dist/with-commit/history/history.d.ts +73 -0
  417. package/dist/with-commit/history/index.d.ts +30 -0
  418. package/dist/with-commit/history/ledger/constants.d.ts +37 -0
  419. package/dist/with-commit/history/ledger/entry.d.ts +195 -0
  420. package/dist/with-commit/history/ledger/hash.d.ts +30 -0
  421. package/dist/with-commit/history/ledger/index.d.ts +19 -0
  422. package/dist/with-commit/history/ledger/patch.d.ts +99 -0
  423. package/dist/with-commit/history/ledger/store.d.ts +356 -0
  424. package/dist/with-commit/history/strategy.d.ts +136 -0
  425. package/dist/with-commit/history/time-machine.d.ts +202 -0
  426. package/dist/with-commit/numbering/descriptor.d.ts +27 -0
  427. package/dist/with-commit/numbering/index.d.ts +69 -0
  428. package/dist/with-commit/sequence/active.d.ts +10 -0
  429. package/dist/with-commit/sequence/index.d.ts +150 -0
  430. package/dist/with-commit/sequence/strategy.d.ts +26 -0
  431. package/dist/with-commit/tx/active.d.ts +27 -0
  432. package/dist/with-commit/tx/dry-run.d.ts +29 -0
  433. package/dist/with-commit/tx/elevated-handle.d.ts +59 -0
  434. package/dist/with-commit/tx/index.d.ts +13 -0
  435. package/dist/with-commit/tx/invariants.d.ts +68 -0
  436. package/dist/with-commit/tx/strategy.d.ts +23 -0
  437. package/dist/with-commit/tx/transaction.d.ts +212 -0
  438. package/dist/with-fork/archive/engine.d.ts +71 -0
  439. package/dist/with-fork/archive/index.d.ts +23 -0
  440. package/dist/with-fork/shadow/active.d.ts +6 -0
  441. package/dist/with-fork/shadow/index.d.ts +14 -0
  442. package/dist/with-fork/shadow/strategy.d.ts +28 -0
  443. package/dist/with-fork/shadow/vault-frame.d.ts +93 -0
  444. package/dist/with-fork/snapshots/active.d.ts +20 -0
  445. package/dist/with-fork/snapshots/engine.d.ts +36 -0
  446. package/dist/with-fork/snapshots/index.d.ts +5 -0
  447. package/dist/with-fork/snapshots/noydb-facade.d.ts +64 -0
  448. package/dist/with-fork/snapshots/policy.d.ts +23 -0
  449. package/dist/with-fork/snapshots/scheduler.d.ts +34 -0
  450. package/dist/with-fork/snapshots/strategy.d.ts +48 -0
  451. package/dist/with-formula/computed/index.d.ts +48 -0
  452. package/dist/with-formula/computed/lazy.d.ts +13 -0
  453. package/dist/with-formula/derivations/executor.d.ts +61 -0
  454. package/dist/with-formula/derivations/fanout-sidecar.d.ts +75 -0
  455. package/dist/with-formula/derivations/index.d.ts +6 -0
  456. package/dist/with-formula/derivations/registry.d.ts +67 -0
  457. package/dist/with-formula/derivations/stale.d.ts +39 -0
  458. package/dist/with-formula/derivations/strategy-hash.d.ts +1 -0
  459. package/dist/with-formula/derivations/types.d.ts +248 -0
  460. package/dist/with-formula/derivations/with-derivation.d.ts +10 -0
  461. package/dist/with-formula/derivations/with-rollup.d.ts +34 -0
  462. package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +58 -0
  463. package/dist/with-formula/materialized-views/executor.d.ts +80 -0
  464. package/dist/with-formula/materialized-views/index.d.ts +11 -0
  465. package/dist/with-formula/materialized-views/query-hash.d.ts +23 -0
  466. package/dist/with-formula/materialized-views/registry.d.ts +99 -0
  467. package/dist/with-formula/materialized-views/stale.d.ts +113 -0
  468. package/dist/with-formula/materialized-views/types.d.ts +318 -0
  469. package/dist/with-formula/materialized-views/with-materialized-view.d.ts +24 -0
  470. package/dist/with-formula/overlay-views/index.d.ts +5 -0
  471. package/dist/with-formula/overlay-views/registry.d.ts +42 -0
  472. package/dist/with-formula/overlay-views/types.d.ts +97 -0
  473. package/dist/with-formula/overlay-views/virtual-collection.d.ts +90 -0
  474. package/dist/with-formula/overlay-views/with-overlayed-view.d.ts +9 -0
  475. package/dist/with-lookup/aggregate/active.d.ts +33 -0
  476. package/dist/with-lookup/aggregate/aggregation.d.ts +166 -0
  477. package/dist/with-lookup/aggregate/canonical-key.d.ts +16 -0
  478. package/dist/with-lookup/aggregate/groupby.d.ts +280 -0
  479. package/dist/with-lookup/aggregate/index.d.ts +23 -0
  480. package/dist/with-lookup/aggregate/reducers.d.ts +257 -0
  481. package/dist/with-lookup/aggregate/strategy.d.ts +59 -0
  482. package/dist/with-lookup/embeddings/cosine.d.ts +2 -0
  483. package/dist/with-lookup/embeddings/descriptor.d.ts +8 -0
  484. package/dist/with-lookup/embeddings/index.d.ts +4 -0
  485. package/dist/with-lookup/embeddings/vec-id.d.ts +47 -0
  486. package/dist/with-lookup/embeddings/vector-set.d.ts +19 -0
  487. package/dist/with-lookup/indexing/active.d.ts +30 -0
  488. package/dist/with-lookup/indexing/collection-facade.d.ts +157 -0
  489. package/dist/with-lookup/indexing/eager-indexes.d.ts +122 -0
  490. package/dist/with-lookup/indexing/index.d.ts +27 -0
  491. package/dist/with-lookup/indexing/lazy-builder.d.ts +102 -0
  492. package/dist/with-lookup/indexing/persisted-indexes.d.ts +229 -0
  493. package/dist/with-lookup/indexing/strategy.d.ts +56 -0
  494. package/dist/with-lookup/indexing/unique-constraints.d.ts +74 -0
  495. package/dist/with-lookup/search/active.d.ts +10 -0
  496. package/dist/with-lookup/search/build-docs.d.ts +15 -0
  497. package/dist/with-lookup/search/collection-facade.d.ts +163 -0
  498. package/dist/with-lookup/search/fuse.d.ts +22 -0
  499. package/dist/with-lookup/search/index-store.d.ts +19 -0
  500. package/dist/with-lookup/search/index.d.ts +19 -0
  501. package/dist/with-lookup/search/inverted-index.d.ts +47 -0
  502. package/dist/with-lookup/search/persisted-index-store.d.ts +121 -0
  503. package/dist/with-lookup/search/retrieve-types.d.ts +29 -0
  504. package/dist/with-lookup/search/scan.d.ts +28 -0
  505. package/dist/with-lookup/search/segment.d.ts +15 -0
  506. package/dist/with-lookup/search/serialize.d.ts +4 -0
  507. package/dist/with-lookup/search/snippet.d.ts +5 -0
  508. package/dist/with-lookup/search/strategy.d.ts +41 -0
  509. package/dist/with-lookup/search/tokenize.d.ts +12 -0
  510. package/dist/with-party/auth-introspection/index.d.ts +44 -0
  511. package/dist/with-party/broker/active.d.ts +23 -0
  512. package/dist/with-party/broker/index.d.ts +28 -0
  513. package/dist/with-party/broker/seed.d.ts +77 -0
  514. package/dist/with-party/custody/active.d.ts +10 -0
  515. package/dist/with-party/custody/index.d.ts +69 -0
  516. package/dist/with-party/custody/liberate.d.ts +64 -0
  517. package/dist/with-party/custody/strategy.d.ts +48 -0
  518. package/dist/with-party/directory/index.d.ts +11 -0
  519. package/dist/with-party/directory/public-envelope/index.d.ts +12 -0
  520. package/dist/with-party/directory/public-envelope/schema.d.ts +24 -0
  521. package/dist/with-party/directory/public-envelope/storage.d.ts +59 -0
  522. package/dist/with-party/directory/public-envelope/types.d.ts +80 -0
  523. package/dist/with-party/directory/storage.d.ts +33 -0
  524. package/dist/with-party/directory/types.d.ts +43 -0
  525. package/dist/with-party/directory/user-envelope/api.d.ts +201 -0
  526. package/dist/with-party/directory/user-envelope/index.d.ts +12 -0
  527. package/dist/with-party/directory/user-envelope/storage.d.ts +54 -0
  528. package/dist/with-party/directory/visibility.d.ts +47 -0
  529. package/dist/with-party/policy/engine.d.ts +60 -0
  530. package/dist/with-party/policy/index.d.ts +15 -0
  531. package/dist/with-party/policy/noydb-facade.d.ts +39 -0
  532. package/dist/with-party/policy/presets.d.ts +38 -0
  533. package/dist/with-party/policy/storage.d.ts +31 -0
  534. package/dist/with-party/session/active.d.ts +34 -0
  535. package/dist/with-party/session/dev-unlock.d.ts +128 -0
  536. package/dist/with-party/session/index.d.ts +23 -0
  537. package/dist/with-party/session/session-policy.d.ts +92 -0
  538. package/dist/with-party/session/session.d.ts +131 -0
  539. package/dist/with-party/session/strategy.d.ts +42 -0
  540. package/dist/with-party/session/unlock-state.d.ts +47 -0
  541. package/dist/with-party/sync/index.d.ts +31 -0
  542. package/dist/with-party/tab-coordination.d.ts +73 -0
  543. package/dist/with-party/tab-write-relay.d.ts +39 -0
  544. package/dist/with-party/team/active.d.ts +13 -0
  545. package/dist/with-party/team/authenticators.d.ts +95 -0
  546. package/dist/with-party/team/deed.d.ts +97 -0
  547. package/dist/with-party/team/delegation.d.ts +88 -0
  548. package/dist/with-party/team/index.d.ts +38 -0
  549. package/dist/with-party/team/keyring.d.ts +318 -0
  550. package/dist/with-party/team/magic-link-grant.d.ts +152 -0
  551. package/dist/with-party/team/managed-passphrase.d.ts +280 -0
  552. package/dist/with-party/team/noydb-facade.d.ts +484 -0
  553. package/dist/with-party/team/peer-recover.d.ts +81 -0
  554. package/dist/with-party/team/presence.d.ts +81 -0
  555. package/dist/with-party/team/recovery.d.ts +191 -0
  556. package/dist/with-party/team/reserved-secret-collections.d.ts +41 -0
  557. package/dist/with-party/team/rotate-recover.d.ts +275 -0
  558. package/dist/with-party/team/shamir-recovery-provider.d.ts +15 -0
  559. package/dist/with-party/team/strategy.d.ts +9 -0
  560. package/dist/with-party/team/sync-active.d.ts +33 -0
  561. package/dist/with-party/team/sync-credentials.d.ts +113 -0
  562. package/dist/with-party/team/sync-strategy.d.ts +67 -0
  563. package/dist/with-party/team/sync-transaction.d.ts +39 -0
  564. package/dist/with-party/team/sync.d.ts +174 -0
  565. package/dist/with-party/team/tiers.d.ts +39 -0
  566. package/dist/with-party/team/wrapped-deks.d.ts +86 -0
  567. package/dist/with-pod/backup.d.ts +74 -0
  568. package/dist/with-pod/bundle.d.ts +414 -0
  569. package/dist/with-pod/format.d.ts +203 -0
  570. package/dist/with-pod/index.d.ts +20 -0
  571. package/dist/with-pod/pod-store.d.ts +54 -0
  572. package/dist/with-pod/ulid.d.ts +64 -0
  573. package/dist/with-shape/blobs/blob-compaction.d.ts +170 -0
  574. package/dist/with-shape/blobs/blob-intent.d.ts +153 -0
  575. package/dist/with-shape/blobs/blob-set.d.ts +1286 -0
  576. package/dist/with-shape/blobs/export-blobs.d.ts +110 -0
  577. package/dist/with-shape/blobs/import-external.d.ts +50 -0
  578. package/dist/with-shape/blobs/mime-magic.d.ts +48 -0
  579. package/dist/with-shape/blobs/object-projection.d.ts +70 -0
  580. package/dist/with-shape/introspection/describe.d.ts +237 -0
  581. package/dist/with-shape/introspection/field-meta.d.ts +61 -0
  582. package/dist/with-shape/introspection/fields.d.ts +14 -0
  583. package/dist/with-shape/introspection/index.d.ts +12 -0
  584. package/dist/with-shape/introspection/json-schema.d.ts +13 -0
  585. package/dist/with-shape/introspection/meta.d.ts +22 -0
  586. package/dist/with-shape/introspection/projection.d.ts +13 -0
  587. package/dist/with-shape/introspection/types.d.ts +154 -0
  588. package/dist/with-shape/introspection/walk.d.ts +50 -0
  589. package/dist/with-shape/links/lazy-handle.d.ts +36 -0
  590. package/dist/with-shape/links/link-set.d.ts +67 -0
  591. package/dist/with-shape/links/names.d.ts +65 -0
  592. package/dist/with-shape/links/vault-facade.d.ts +211 -0
  593. package/dist/with-shape/persisted-schemas/canonicalize.d.ts +11 -0
  594. package/dist/with-shape/persisted-schemas/derive.d.ts +29 -0
  595. package/dist/with-shape/persisted-schemas/index.d.ts +21 -0
  596. package/dist/with-shape/persisted-schemas/register.d.ts +66 -0
  597. package/dist/with-shape/persisted-schemas/storage.d.ts +61 -0
  598. package/dist/with-shape/persisted-schemas/types.d.ts +54 -0
  599. package/dist/with-shape/satellites/dead-filter.d.ts +21 -0
  600. package/dist/with-shape/satellites/declare.d.ts +60 -0
  601. package/dist/with-shape/satellites/existence.d.ts +5 -0
  602. package/dist/with-shape/satellites/fanout.d.ts +38 -0
  603. package/dist/with-shape/satellites/forget.d.ts +47 -0
  604. package/dist/with-shape/satellites/index.d.ts +3 -0
  605. package/dist/with-shape/satellites/joined.d.ts +19 -0
  606. package/dist/with-shape/satellites/marker.d.ts +10 -0
  607. package/dist/with-shape/satellites/migrate-cek.d.ts +26 -0
  608. package/dist/with-shape/satellites/post-register.d.ts +6 -0
  609. package/dist/with-shape/satellites/proxy.d.ts +37 -0
  610. package/dist/with-shape/satellites/raw-target.d.ts +14 -0
  611. package/dist/with-shape/satellites/registry.d.ts +19 -0
  612. package/dist/with-shape/satellites/types.d.ts +37 -0
  613. package/dist/with-shape/satellites/validate.d.ts +17 -0
  614. package/dist/with-shape/schema-update/client-registry.d.ts +35 -0
  615. package/dist/with-shape/schema-update/cutover.d.ts +5 -0
  616. package/dist/with-shape/schema-update/delta.d.ts +2 -0
  617. package/dist/with-shape/schema-update/dispatch.d.ts +3 -0
  618. package/dist/with-shape/schema-update/fence-controller.d.ts +62 -0
  619. package/dist/with-shape/schema-update/fence-watcher.d.ts +37 -0
  620. package/dist/with-shape/schema-update/fence.d.ts +15 -0
  621. package/dist/with-shape/schema-update/gate.d.ts +16 -0
  622. package/dist/with-shape/schema-update/index.d.ts +6 -0
  623. package/dist/with-shape/schema-update/store-coordination-provider.d.ts +29 -0
  624. package/dist/with-shape/schema-update/strategies.d.ts +12 -0
  625. package/dist/with-shape/schema-update/types.d.ts +53 -0
  626. package/dist/with-store/index.d.ts +15 -0
  627. package/dist/with-store/lazy/active.d.ts +12 -0
  628. package/dist/with-store/lazy/index.d.ts +14 -0
  629. package/dist/with-store/lazy/strategy.d.ts +9 -0
  630. package/dist/with-store/route-store.d.ts +259 -0
  631. package/dist/with-store/store-middleware.d.ts +189 -0
  632. package/dist/withdraw-accessible-WZIEVWSR.js +28 -0
  633. package/package.json +47 -55
  634. package/dist/adapter/index.d.ts +0 -5
  635. package/dist/adapter/index.js +0 -15
  636. package/dist/aggregate/index.d.ts +0 -42
  637. package/dist/api-JDWL67WL.js +0 -20
  638. package/dist/as/index.d.ts +0 -7
  639. package/dist/at/index.d.ts +0 -5
  640. package/dist/attestation/index.d.ts +0 -20
  641. package/dist/backup-WRGNTGJF.js +0 -225
  642. package/dist/backup-WRGNTGJF.js.map +0 -1
  643. package/dist/blobs/index.d.ts +0 -44
  644. package/dist/bundle/index.d.ts +0 -122
  645. package/dist/bundle-DzWtVw7w.d.ts +0 -548
  646. package/dist/by/index.d.ts +0 -1
  647. package/dist/cargo/index.d.ts +0 -9
  648. package/dist/chunk-25G7PUTA.js +0 -235
  649. package/dist/chunk-26FSVNBL.js +0 -34
  650. package/dist/chunk-2PJB6H3H.js +0 -167
  651. package/dist/chunk-2PJB6H3H.js.map +0 -1
  652. package/dist/chunk-37JZR7CY.js +0 -91
  653. package/dist/chunk-3KBK5LU4.js +0 -117
  654. package/dist/chunk-3YKBGS3I.js +0 -686
  655. package/dist/chunk-3YKBGS3I.js.map +0 -1
  656. package/dist/chunk-44DV37ZV.js +0 -75
  657. package/dist/chunk-44DV37ZV.js.map +0 -1
  658. package/dist/chunk-47C4CI7R.js +0 -108
  659. package/dist/chunk-47C4CI7R.js.map +0 -1
  660. package/dist/chunk-4VDFUBTS.js +0 -275
  661. package/dist/chunk-4VDFUBTS.js.map +0 -1
  662. package/dist/chunk-55LSDABW.js +0 -94
  663. package/dist/chunk-56JB2BGI.js +0 -13003
  664. package/dist/chunk-56JB2BGI.js.map +0 -1
  665. package/dist/chunk-5GQE5IDB.js +0 -513
  666. package/dist/chunk-5GQE5IDB.js.map +0 -1
  667. package/dist/chunk-5HRJQSKN.js +0 -202
  668. package/dist/chunk-5HZULLHE.js +0 -404
  669. package/dist/chunk-5JQMX2EH.js +0 -50
  670. package/dist/chunk-5UOPIPZC.js +0 -95
  671. package/dist/chunk-5YBUFCFF.js +0 -135
  672. package/dist/chunk-62APEMF3.js +0 -280
  673. package/dist/chunk-62APEMF3.js.map +0 -1
  674. package/dist/chunk-6P5AJ2ZS.js +0 -120
  675. package/dist/chunk-6P5AJ2ZS.js.map +0 -1
  676. package/dist/chunk-6PALJTC2.js +0 -430
  677. package/dist/chunk-6PALJTC2.js.map +0 -1
  678. package/dist/chunk-6S7T6WC4.js +0 -111
  679. package/dist/chunk-6S7T6WC4.js.map +0 -1
  680. package/dist/chunk-6Z435B6N.js +0 -1656
  681. package/dist/chunk-6Z435B6N.js.map +0 -1
  682. package/dist/chunk-723XB5NX.js +0 -86
  683. package/dist/chunk-7CZ6YXMO.js +0 -124
  684. package/dist/chunk-7KTL4RHZ.js +0 -120
  685. package/dist/chunk-7KTL4RHZ.js.map +0 -1
  686. package/dist/chunk-7TAV3BFQ.js +0 -766
  687. package/dist/chunk-7TAV3BFQ.js.map +0 -1
  688. package/dist/chunk-BASCPHNM.js +0 -380
  689. package/dist/chunk-BASCPHNM.js.map +0 -1
  690. package/dist/chunk-BGIZAFY7.js +0 -1
  691. package/dist/chunk-BJ2XF2RC.js +0 -823
  692. package/dist/chunk-BM6E4MUT.js +0 -881
  693. package/dist/chunk-BM6E4MUT.js.map +0 -1
  694. package/dist/chunk-BTFTHF6Q.js +0 -42
  695. package/dist/chunk-C4NOLA5X.js +0 -132
  696. package/dist/chunk-C4NOLA5X.js.map +0 -1
  697. package/dist/chunk-CHK5VVMI.js +0 -155
  698. package/dist/chunk-DCVVCJVB.js +0 -45
  699. package/dist/chunk-EU7HDMT3.js +0 -54
  700. package/dist/chunk-F3EKFGUS.js +0 -99
  701. package/dist/chunk-FCOZ7DEC.js +0 -355
  702. package/dist/chunk-FCOZ7DEC.js.map +0 -1
  703. package/dist/chunk-FWART3VA.js +0 -205
  704. package/dist/chunk-FZK3JJJK.js +0 -150
  705. package/dist/chunk-GDOOG5YQ.js +0 -382
  706. package/dist/chunk-GLVXQU3E.js +0 -155
  707. package/dist/chunk-HU55NPHZ.js +0 -80
  708. package/dist/chunk-I6JJ6VJS.js +0 -97
  709. package/dist/chunk-I6URUNTD.js +0 -59
  710. package/dist/chunk-IARAK3PK.js +0 -14
  711. package/dist/chunk-II6DLDZM.js +0 -30
  712. package/dist/chunk-J5YUA6JB.js +0 -23
  713. package/dist/chunk-J7OH6R4K.js +0 -49
  714. package/dist/chunk-K2WCO3NX.js +0 -1
  715. package/dist/chunk-L6Q5NA22.js +0 -40
  716. package/dist/chunk-LFGJG4XZ.js +0 -30
  717. package/dist/chunk-M3OYTM5Z.js +0 -85
  718. package/dist/chunk-MOQ5M46U.js +0 -209
  719. package/dist/chunk-NTPWQH4S.js +0 -589
  720. package/dist/chunk-OJ64XMPJ.js +0 -1434
  721. package/dist/chunk-OJ64XMPJ.js.map +0 -1
  722. package/dist/chunk-OWGAXPRE.js +0 -129
  723. package/dist/chunk-P2PEPSPK.js +0 -230
  724. package/dist/chunk-P6TZ3IVN.js +0 -453
  725. package/dist/chunk-P6TZ3IVN.js.map +0 -1
  726. package/dist/chunk-PAJCRV7O.js +0 -123
  727. package/dist/chunk-PMMV5SQC.js +0 -416
  728. package/dist/chunk-PMMV5SQC.js.map +0 -1
  729. package/dist/chunk-PPPZIBKY.js +0 -261
  730. package/dist/chunk-PPPZIBKY.js.map +0 -1
  731. package/dist/chunk-PVC2FBCQ.js +0 -45
  732. package/dist/chunk-PYIUDUGS.js +0 -36
  733. package/dist/chunk-QABECTNN.js +0 -255
  734. package/dist/chunk-QYMMMKOO.js +0 -164
  735. package/dist/chunk-R4IVPJHN.js +0 -130
  736. package/dist/chunk-REWTMYSF.js +0 -32
  737. package/dist/chunk-REWTMYSF.js.map +0 -1
  738. package/dist/chunk-RNYDHIQL.js +0 -367
  739. package/dist/chunk-RUIMKQTA.js +0 -23
  740. package/dist/chunk-RUIMKQTA.js.map +0 -1
  741. package/dist/chunk-TCGVRKOS.js +0 -367
  742. package/dist/chunk-TIAYXOEI.js +0 -99
  743. package/dist/chunk-TQ3REHVF.js +0 -95
  744. package/dist/chunk-TQ3REHVF.js.map +0 -1
  745. package/dist/chunk-TUL5YQWF.js +0 -777
  746. package/dist/chunk-U7LV2DUN.js +0 -74
  747. package/dist/chunk-UB3XHGFG.js +0 -181
  748. package/dist/chunk-UB3XHGFG.js.map +0 -1
  749. package/dist/chunk-UMH35AQV.js +0 -70
  750. package/dist/chunk-UWZ7O4NR.js +0 -29
  751. package/dist/chunk-V76PHWLE.js +0 -41
  752. package/dist/chunk-VFQOE76I.js +0 -69
  753. package/dist/chunk-VIWOGJ2O.js +0 -71
  754. package/dist/chunk-VK6OC22R.js +0 -37
  755. package/dist/chunk-VK6OC22R.js.map +0 -1
  756. package/dist/chunk-VVLOWY74.js +0 -150
  757. package/dist/chunk-VVLOWY74.js.map +0 -1
  758. package/dist/chunk-W3JABOVB.js +0 -53
  759. package/dist/chunk-W3JABOVB.js.map +0 -1
  760. package/dist/chunk-WPNP3NF5.js +0 -1221
  761. package/dist/chunk-WPNP3NF5.js.map +0 -1
  762. package/dist/chunk-X5QZAJDB.js +0 -59
  763. package/dist/chunk-X6VNIRHS.js +0 -239
  764. package/dist/chunk-X6VNIRHS.js.map +0 -1
  765. package/dist/chunk-XBPUVQDO.js +0 -664
  766. package/dist/chunk-XBPUVQDO.js.map +0 -1
  767. package/dist/chunk-XW5LZYV4.js +0 -21
  768. package/dist/chunk-YTCCC6NG.js +0 -320
  769. package/dist/chunk-YTCCC6NG.js.map +0 -1
  770. package/dist/classified/index.d.ts +0 -17
  771. package/dist/collection-facade-EJVIN2BY.js +0 -39
  772. package/dist/computed-6FOFXQPE.js +0 -11
  773. package/dist/config-drift-RFEVGBKR.js +0 -24
  774. package/dist/config-drift-RFEVGBKR.js.map +0 -1
  775. package/dist/consent/index.d.ts +0 -23
  776. package/dist/crdt/index.d.ts +0 -34
  777. package/dist/dead-filter-RHMNYOXP.js +0 -28
  778. package/dist/decrypt-partition-IHtxEnTi.d.ts +0 -21
  779. package/dist/delegation-IHXOASHV.js +0 -25
  780. package/dist/derivations/index.d.ts +0 -70
  781. package/dist/derive-CD3ZVIXK.js +0 -21
  782. package/dist/describe/index.d.ts +0 -1
  783. package/dist/describe/index.js +0 -1
  784. package/dist/describe-C6iHNlqJ.d.ts +0 -162
  785. package/dist/dev-unlock-wgQ7Ci5I.d.ts +0 -263
  786. package/dist/discriminant-BN9REW3o.d.ts +0 -60
  787. package/dist/enclave-KGEUW2GL.js +0 -123
  788. package/dist/executor-EUPYHCLU.js +0 -9
  789. package/dist/executor-KZ4B3PRT.js +0 -9
  790. package/dist/executor-MHUM2VZK.js +0 -21
  791. package/dist/export-accessible-Z3NSZZHN.js +0 -23
  792. package/dist/extract-partition-VSKT35JG.js +0 -36
  793. package/dist/fanout-sidecar-NBDKKCHT.js +0 -74
  794. package/dist/find-OH4BEULF.js +0 -11
  795. package/dist/forget/index.d.ts +0 -36
  796. package/dist/guards/index.d.ts +0 -35
  797. package/dist/hash-CwHnoKyW.d.ts +0 -72
  798. package/dist/history/index.d.ts +0 -61
  799. package/dist/i18n/index.d.ts +0 -37
  800. package/dist/in/index.d.ts +0 -5
  801. package/dist/index-B9QdHytu.d.ts +0 -123
  802. package/dist/index-CTvUp94-.d.ts +0 -123
  803. package/dist/index-Dn5GzPg_.d.ts +0 -22138
  804. package/dist/indexing/index.d.ts +0 -39
  805. package/dist/issue-AEOL6RXA.js +0 -19
  806. package/dist/kernel/index.d.ts +0 -32
  807. package/dist/kernel/index.js +0 -59
  808. package/dist/lazy/index.d.ts +0 -21
  809. package/dist/ledger-3LR3YO2W.js +0 -42
  810. package/dist/liberate-XSEPRWEA.js +0 -24
  811. package/dist/link-set-NSUIX6BR.js +0 -31
  812. package/dist/materialized-views/index.d.ts +0 -173
  813. package/dist/mime-magic-CYbFNQ4h.d.ts +0 -103
  814. package/dist/noydb-POVTIVQ6.js +0 -62
  815. package/dist/on/index.d.ts +0 -5
  816. package/dist/overlay-views/index.d.ts +0 -98
  817. package/dist/periods/index.d.ts +0 -20
  818. package/dist/pod/index.d.ts +0 -63
  819. package/dist/policy-Y7HL2KGA.js +0 -41
  820. package/dist/portability/index.d.ts +0 -20
  821. package/dist/post-register-KOFRTCDD.js +0 -55
  822. package/dist/post-register-KOFRTCDD.js.map +0 -1
  823. package/dist/public-envelope-NC7SPNMV.js +0 -32
  824. package/dist/query/index.d.ts +0 -5
  825. package/dist/read-only-facade-5ADRJVTM.js +0 -8
  826. package/dist/register-3D6R2MKN.js +0 -23
  827. package/dist/registry-AI4E46PD.js +0 -19
  828. package/dist/registry-HSNQ4NBP.js +0 -9
  829. package/dist/registry-WIX6QCV5.js +0 -17
  830. package/dist/request-withdrawal-GU4XS2R5.js +0 -31
  831. package/dist/reveal-5Y777N5Q.js +0 -38
  832. package/dist/reveal-5Y777N5Q.js.map +0 -1
  833. package/dist/revoke-ZFETCLYV.js +0 -24
  834. package/dist/revoke-ZFETCLYV.js.map +0 -1
  835. package/dist/satellites/index.d.ts +0 -5
  836. package/dist/sealed-record/index.d.ts +0 -69
  837. package/dist/session/index.d.ts +0 -44
  838. package/dist/shadow/index.d.ts +0 -15
  839. package/dist/signer-GAIMQQ2J.js +0 -25
  840. package/dist/signer-GAIMQQ2J.js.map +0 -1
  841. package/dist/snapshots/index.d.ts +0 -26
  842. package/dist/stale-77LP2EEF.js +0 -14
  843. package/dist/stale-77LP2EEF.js.map +0 -1
  844. package/dist/storage-KEXIXLGM.js +0 -23
  845. package/dist/storage-KEXIXLGM.js.map +0 -1
  846. package/dist/store-coordination-provider-NJDDZ264.js +0 -142
  847. package/dist/subject-index-O75wKshW.d.ts +0 -362
  848. package/dist/sync/index.d.ts +0 -41
  849. package/dist/team/index.d.ts +0 -155
  850. package/dist/tiers/index.d.ts +0 -5
  851. package/dist/to/index.d.ts +0 -5
  852. package/dist/transition-guard-D5RLJv8S.d.ts +0 -165
  853. package/dist/tx/index.d.ts +0 -35
  854. package/dist/ui/index.d.ts +0 -1
  855. package/dist/ulid-DRH25k3y.d.ts +0 -66
  856. package/dist/util/index.d.ts +0 -79
  857. package/dist/validators-C3lrVF-c.d.ts +0 -101
  858. package/dist/vault-diff-_LSIcOMv.d.ts +0 -147
  859. package/dist/verify-CAYGXYNO.js +0 -139
  860. package/dist/verify-CAYGXYNO.js.map +0 -1
  861. package/dist/walk-SMAE4IEI.js +0 -241
  862. package/dist/with/index.d.ts +0 -38
  863. package/dist/with-materialized-view-Xv1-9Bh0.d.ts +0 -27
  864. package/dist/with-overlayed-view-CuWhq_-C.d.ts +0 -12
  865. package/dist/with-rollup-K_iwal4b.d.ts +0 -47
  866. package/dist/withdraw-accessible-Q7BULAN5.js +0 -28
  867. package/dist/withdraw-accessible-Q7BULAN5.js.map +0 -1
  868. /package/dist/{adapter/index.js.map → api-ZGS6LCOF.js.map} +0 -0
  869. /package/dist/{chunk-VIWOGJ2O.js.map → chunk-3B5VVCNY.js.map} +0 -0
  870. /package/dist/{chunk-P2PEPSPK.js.map → chunk-3LQ2YKO4.js.map} +0 -0
  871. /package/dist/{chunk-EU7HDMT3.js.map → chunk-3QCRBHCY.js.map} +0 -0
  872. /package/dist/{chunk-FZK3JJJK.js.map → chunk-4JBYV75E.js.map} +0 -0
  873. /package/dist/{chunk-I6JJ6VJS.js.map → chunk-4NXKCLLQ.js.map} +0 -0
  874. /package/dist/{chunk-VFQOE76I.js.map → chunk-5M5DVGV7.js.map} +0 -0
  875. /package/dist/{chunk-LFGJG4XZ.js.map → chunk-5YOLBEQ6.js.map} +0 -0
  876. /package/dist/{chunk-OWGAXPRE.js.map → chunk-6CRIV7DE.js.map} +0 -0
  877. /package/dist/{chunk-QABECTNN.js.map → chunk-6QTNZJBS.js.map} +0 -0
  878. /package/dist/{chunk-723XB5NX.js.map → chunk-6T2SCQRU.js.map} +0 -0
  879. /package/dist/{chunk-PVC2FBCQ.js.map → chunk-7DSTRQIJ.js.map} +0 -0
  880. /package/dist/{chunk-NTPWQH4S.js.map → chunk-AUSTCW2X.js.map} +0 -0
  881. /package/dist/{chunk-MOQ5M46U.js.map → chunk-B3HJYUOF.js.map} +0 -0
  882. /package/dist/{chunk-QYMMMKOO.js.map → chunk-BDVFPG6Y.js.map} +0 -0
  883. /package/dist/{chunk-PYIUDUGS.js.map → chunk-CAF6WOK7.js.map} +0 -0
  884. /package/dist/{chunk-5HZULLHE.js.map → chunk-CIE2BASH.js.map} +0 -0
  885. /package/dist/{chunk-BTFTHF6Q.js.map → chunk-CRI4OUV4.js.map} +0 -0
  886. /package/dist/{chunk-37JZR7CY.js.map → chunk-DLG74CNB.js.map} +0 -0
  887. /package/dist/{chunk-TCGVRKOS.js.map → chunk-ERJ7FU55.js.map} +0 -0
  888. /package/dist/{chunk-FWART3VA.js.map → chunk-EVVGJDRQ.js.map} +0 -0
  889. /package/dist/{chunk-X5QZAJDB.js.map → chunk-EXK7QRWF.js.map} +0 -0
  890. /package/dist/{chunk-5HRJQSKN.js.map → chunk-EYZ6IQ6X.js.map} +0 -0
  891. /package/dist/{chunk-DCVVCJVB.js.map → chunk-F64IRYG3.js.map} +0 -0
  892. /package/dist/{chunk-BJ2XF2RC.js.map → chunk-FHS2HQSH.js.map} +0 -0
  893. /package/dist/{chunk-HU55NPHZ.js.map → chunk-GKEWXIV5.js.map} +0 -0
  894. /package/dist/{chunk-I6URUNTD.js.map → chunk-GTGPO5KW.js.map} +0 -0
  895. /package/dist/{chunk-5UOPIPZC.js.map → chunk-HB3RFQSC.js.map} +0 -0
  896. /package/dist/{chunk-F3EKFGUS.js.map → chunk-I6GALP6E.js.map} +0 -0
  897. /package/dist/{chunk-R4IVPJHN.js.map → chunk-IL6POWCW.js.map} +0 -0
  898. /package/dist/{chunk-3KBK5LU4.js.map → chunk-IU6SNYX6.js.map} +0 -0
  899. /package/dist/{chunk-TUL5YQWF.js.map → chunk-J2ZX2XUV.js.map} +0 -0
  900. /package/dist/{chunk-UWZ7O4NR.js.map → chunk-JKJOGPZN.js.map} +0 -0
  901. /package/dist/{chunk-V76PHWLE.js.map → chunk-JZUV47FZ.js.map} +0 -0
  902. /package/dist/{chunk-II6DLDZM.js.map → chunk-K5IMOGHB.js.map} +0 -0
  903. /package/dist/{chunk-GDOOG5YQ.js.map → chunk-LASZKVMO.js.map} +0 -0
  904. /package/dist/{chunk-5YBUFCFF.js.map → chunk-NR5LT5RY.js.map} +0 -0
  905. /package/dist/{chunk-UMH35AQV.js.map → chunk-Q5VNKNE5.js.map} +0 -0
  906. /package/dist/{chunk-XW5LZYV4.js.map → chunk-QLWMEXCT.js.map} +0 -0
  907. /package/dist/{chunk-PAJCRV7O.js.map → chunk-QRB7NAOJ.js.map} +0 -0
  908. /package/dist/{chunk-U7LV2DUN.js.map → chunk-R4ROFEYC.js.map} +0 -0
  909. /package/dist/{chunk-RNYDHIQL.js.map → chunk-RIX4V2TB.js.map} +0 -0
  910. /package/dist/{chunk-L6Q5NA22.js.map → chunk-RYCTDFUX.js.map} +0 -0
  911. /package/dist/{chunk-CHK5VVMI.js.map → chunk-RZ5SVOYR.js.map} +0 -0
  912. /package/dist/{chunk-TIAYXOEI.js.map → chunk-SLFHQTTW.js.map} +0 -0
  913. /package/dist/{chunk-J5YUA6JB.js.map → chunk-UNFPPVNI.js.map} +0 -0
  914. /package/dist/{chunk-25G7PUTA.js.map → chunk-VLFCJYTL.js.map} +0 -0
  915. /package/dist/{chunk-7CZ6YXMO.js.map → chunk-VN3DBQAU.js.map} +0 -0
  916. /package/dist/{chunk-J7OH6R4K.js.map → chunk-VZRODIM3.js.map} +0 -0
  917. /package/dist/{chunk-55LSDABW.js.map → chunk-W22IKJE2.js.map} +0 -0
  918. /package/dist/{chunk-GLVXQU3E.js.map → chunk-X3YYQWOQ.js.map} +0 -0
  919. /package/dist/{chunk-M3OYTM5Z.js.map → chunk-YFXZEAYK.js.map} +0 -0
  920. /package/dist/{chunk-5JQMX2EH.js.map → chunk-ZAJAVEXY.js.map} +0 -0
  921. /package/dist/{chunk-26FSVNBL.js.map → chunk-ZICD77GM.js.map} +0 -0
  922. /package/dist/{chunk-IARAK3PK.js.map → chunk-ZUODRVHY.js.map} +0 -0
  923. /package/dist/{api-JDWL67WL.js.map → collection-facade-TLWIPI76.js.map} +0 -0
  924. /package/dist/{chunk-BGIZAFY7.js.map → computed-ZIQTYTDI.js.map} +0 -0
  925. /package/dist/{dead-filter-RHMNYOXP.js.map → dead-filter-ESOBZZP5.js.map} +0 -0
  926. /package/dist/{chunk-K2WCO3NX.js.map → delegation-W7ZV2322.js.map} +0 -0
  927. /package/dist/{collection-facade-EJVIN2BY.js.map → derive-H2BJTLUI.js.map} +0 -0
  928. /package/dist/{computed-6FOFXQPE.js.map → enclave-AP3I5W7O.js.map} +0 -0
  929. /package/dist/{delegation-IHXOASHV.js.map → executor-KGWTNEQD.js.map} +0 -0
  930. /package/dist/{derive-CD3ZVIXK.js.map → executor-OVEXR6RT.js.map} +0 -0
  931. /package/dist/{describe/index.js.map → executor-UNEH5ZYH.js.map} +0 -0
  932. /package/dist/{enclave-KGEUW2GL.js.map → export-accessible-PCMXSUZS.js.map} +0 -0
  933. /package/dist/{executor-EUPYHCLU.js.map → extract-partition-SWHFSYJO.js.map} +0 -0
  934. /package/dist/{fanout-sidecar-NBDKKCHT.js.map → fanout-sidecar-A765THMX.js.map} +0 -0
  935. /package/dist/{executor-KZ4B3PRT.js.map → find-N6345CNT.js.map} +0 -0
  936. /package/dist/{executor-MHUM2VZK.js.map → issue-5OKB6I2R.js.map} +0 -0
  937. /package/dist/{export-accessible-Z3NSZZHN.js.map → ledger-GFBKVPV4.js.map} +0 -0
  938. /package/dist/{extract-partition-VSKT35JG.js.map → liberate-3VDOT4KO.js.map} +0 -0
  939. /package/dist/{find-OH4BEULF.js.map → link-set-Z7Q2ASFX.js.map} +0 -0
  940. /package/dist/{issue-AEOL6RXA.js.map → noydb-ZCJOYBDI.js.map} +0 -0
  941. /package/dist/{kernel/index.js.map → policy-Z3RUAIY2.js.map} +0 -0
  942. /package/dist/{ledger-3LR3YO2W.js.map → public-envelope-B4KNWVUA.js.map} +0 -0
  943. /package/dist/{liberate-XSEPRWEA.js.map → read-only-facade-CHCKSEPD.js.map} +0 -0
  944. /package/dist/{link-set-NSUIX6BR.js.map → register-VAHONCID.js.map} +0 -0
  945. /package/dist/{noydb-POVTIVQ6.js.map → registry-7MLVD3VO.js.map} +0 -0
  946. /package/dist/{policy-Y7HL2KGA.js.map → registry-EPKPD5SM.js.map} +0 -0
  947. /package/dist/{public-envelope-NC7SPNMV.js.map → registry-P5T7PS2U.js.map} +0 -0
  948. /package/dist/{read-only-facade-5ADRJVTM.js.map → request-withdrawal-TI3A5WPS.js.map} +0 -0
  949. /package/dist/{register-3D6R2MKN.js.map → revoke-FDRD6GRW.js.map} +0 -0
  950. /package/dist/{registry-AI4E46PD.js.map → signer-MUWEIUI6.js.map} +0 -0
  951. /package/dist/{registry-HSNQ4NBP.js.map → stale-OSQ7J3AA.js.map} +0 -0
  952. /package/dist/{registry-WIX6QCV5.js.map → storage-MVFCGEQE.js.map} +0 -0
  953. /package/dist/{store-coordination-provider-NJDDZ264.js.map → store-coordination-provider-64OEZFGS.js.map} +0 -0
  954. /package/dist/{walk-SMAE4IEI.js.map → walk-SVNDIZ62.js.map} +0 -0
  955. /package/dist/{request-withdrawal-GU4XS2R5.js.map → withdraw-accessible-WZIEVWSR.js.map} +0 -0
@@ -1,1221 +0,0 @@
1
- import {
2
- openEnvelopeJson
3
- } from "./chunk-7TAV3BFQ.js";
4
- import {
5
- NOYDB_FORMAT_VERSION
6
- } from "./chunk-REWTMYSF.js";
7
- import {
8
- base64ToBuffer,
9
- bufferToBase64,
10
- decryptBytesWithAAD,
11
- encrypt,
12
- encryptBytesWithAAD,
13
- generateDEK,
14
- hmacSha256Hex,
15
- sha256Hex,
16
- unwrapCek,
17
- wrapCek
18
- } from "./chunk-5HZULLHE.js";
19
- import {
20
- ConflictError,
21
- NotFoundError
22
- } from "./chunk-OJ64XMPJ.js";
23
-
24
- // src/with-shape/blobs/mime-magic.ts
25
- function hex(s) {
26
- return new Uint8Array(s.split(" ").map((b) => parseInt(b, 16)));
27
- }
28
- var MAGIC_RULES = [
29
- // ── Images ───────────────────────────────────────────────────────────
30
- // #2 PNG — full 8-byte signature (RFC 2083)
31
- { mime: "image/png", format: "PNG", bytes: hex("89 50 4E 47 0D 0A 1A 0A"), preCompressed: true },
32
- // #1 JPEG — FF D8 FF (third byte is start of APP marker, always FF)
33
- { mime: "image/jpeg", format: "JPEG", bytes: hex("FF D8 FF"), preCompressed: true },
34
- // #7 WebP — RIFF compound: bytes 0-3 = RIFF, bytes 8-11 = WEBP
35
- {
36
- mime: "image/webp",
37
- format: "WebP",
38
- bytes: hex("52 49 46 46"),
39
- secondaryBytes: hex("57 45 42 50"),
40
- secondaryOffset: 8,
41
- preCompressed: true
42
- },
43
- // #5 TIFF (little-endian) — II + version 42
44
- { mime: "image/tiff", format: "TIFF", bytes: hex("49 49 2A 00") },
45
- // #6 TIFF (big-endian) — MM + version 42
46
- { mime: "image/tiff", format: "TIFF", bytes: hex("4D 4D 00 2A") },
47
- // #3 GIF — GIF8 (covers GIF87a and GIF89a)
48
- { mime: "image/gif", format: "GIF", bytes: hex("47 49 46 38"), preCompressed: true },
49
- // #4 BMP — BM
50
- { mime: "image/bmp", format: "BMP", bytes: hex("42 4D") },
51
- // PSD — 8BPS
52
- { mime: "image/vnd.adobe.photoshop", format: "PSD", bytes: hex("38 42 50 53") },
53
- // #8 ICO — 00 00 01 00 (note: 00 00 02 00 is CUR cursor format)
54
- { mime: "image/x-icon", format: "ICO", bytes: hex("00 00 01 00") },
55
- // #9 HEIC — ISOBMFF: ftyp at offset 4, brand "heic" at offset 8
56
- {
57
- mime: "image/heic",
58
- format: "HEIC",
59
- bytes: hex("66 74 79 70"),
60
- offset: 4,
61
- secondaryBytes: hex("68 65 69 63"),
62
- secondaryOffset: 8,
63
- preCompressed: true
64
- },
65
- // ── Documents ────────────────────────────────────────────────────────
66
- // PDF — %PDF
67
- { mime: "application/pdf", format: "PDF", bytes: hex("25 50 44 46") },
68
- // RTF — {\rtf
69
- { mime: "application/rtf", format: "RTF", bytes: hex("7B 5C 72 74 66") },
70
- // ── Archives & compression ───────────────────────────────────────────
71
- // RAR v5 — 8-byte signature (test before RAR v4)
72
- { mime: "application/vnd.rar", format: "RAR v5", bytes: hex("52 61 72 21 1A 07 01 00"), preCompressed: true },
73
- // RAR v4 — 7-byte signature
74
- { mime: "application/vnd.rar", format: "RAR v4", bytes: hex("52 61 72 21 1A 07 00"), preCompressed: true },
75
- // 7-Zip — 6-byte signature
76
- { mime: "application/x-7z-compressed", format: "7Z", bytes: hex("37 7A BC AF 27 1C"), preCompressed: true },
77
- // XZ — 6-byte stream header
78
- { mime: "application/x-xz", format: "XZ", bytes: hex("FD 37 7A 58 5A 00"), preCompressed: true },
79
- // ZIP — PK\x03\x04 (local file header)
80
- { mime: "application/zip", format: "ZIP", bytes: hex("50 4B 03 04"), preCompressed: true },
81
- // GZIP — 1F 8B
82
- { mime: "application/gzip", format: "GZIP", bytes: hex("1F 8B"), preCompressed: true },
83
- // BZIP2 — BZh
84
- { mime: "application/x-bzip2", format: "BZIP2", bytes: hex("42 5A 68"), preCompressed: true },
85
- // LZIP — LZIP
86
- { mime: "application/x-lzip", format: "LZIP", bytes: hex("4C 5A 49 50"), preCompressed: true },
87
- // ── Audio ────────────────────────────────────────────────────────────
88
- // WAV — RIFF compound: bytes 0-3 = RIFF, bytes 8-11 = WAVE
89
- {
90
- mime: "audio/wav",
91
- format: "WAV",
92
- bytes: hex("52 49 46 46"),
93
- secondaryBytes: hex("57 41 56 45"),
94
- secondaryOffset: 8
95
- },
96
- // AIFF — FORM compound: bytes 0-3 = FORM, bytes 8-11 = AIFF
97
- {
98
- mime: "audio/aiff",
99
- format: "AIFF",
100
- bytes: hex("46 4F 52 4D"),
101
- secondaryBytes: hex("41 49 46 46"),
102
- secondaryOffset: 8
103
- },
104
- // FLAC — fLaC
105
- { mime: "audio/flac", format: "FLAC", bytes: hex("66 4C 61 43") },
106
- // OGG — OggS (container — may hold Vorbis, Opus, Theora, etc.)
107
- { mime: "application/ogg", format: "OGG", bytes: hex("4F 67 67 53") },
108
- // MIDI — MThd
109
- { mime: "audio/midi", format: "MIDI", bytes: hex("4D 54 68 64") },
110
- // MP3 (ID3-tagged) — ID3
111
- { mime: "audio/mpeg", format: "MP3", bytes: hex("49 44 33"), preCompressed: true },
112
- // ── Video ────────────────────────────────────────────────────────────
113
- // AVI — RIFF compound: bytes 0-3 = RIFF, bytes 8-11 = AVI\x20
114
- {
115
- mime: "video/x-msvideo",
116
- format: "AVI",
117
- bytes: hex("52 49 46 46"),
118
- secondaryBytes: hex("41 56 49 20"),
119
- secondaryOffset: 8,
120
- preCompressed: true
121
- },
122
- // WMV/ASF — 8-byte ASF header GUID prefix
123
- { mime: "video/x-ms-wmv", format: "WMV", bytes: hex("30 26 B2 75 8E 66 CF 11"), preCompressed: true },
124
- // MKV/WebM — EBML header (Matroska container)
125
- { mime: "video/x-matroska", format: "MKV", bytes: hex("1A 45 DF A3"), preCompressed: true },
126
- // FLV — FLV
127
- { mime: "video/x-flv", format: "FLV", bytes: hex("46 4C 56"), preCompressed: true },
128
- // MOV — ISOBMFF: ftyp at offset 4, brand "qt " at offset 8
129
- {
130
- mime: "video/quicktime",
131
- format: "MOV",
132
- bytes: hex("66 74 79 70"),
133
- offset: 4,
134
- secondaryBytes: hex("71 74 20 20"),
135
- secondaryOffset: 8,
136
- preCompressed: true
137
- },
138
- // MP4 — ISOBMFF: ftyp at offset 4 (brands vary: isom, mp41, mp42, etc.)
139
- // Tested AFTER MOV and HEIC so their specific brands match first.
140
- { mime: "video/mp4", format: "MP4", bytes: hex("66 74 79 70"), offset: 4, preCompressed: true },
141
- // ── Executables & binaries ───────────────────────────────────────────
142
- // SQLite — "SQLite 3" (first 8 bytes of the 16-byte header)
143
- { mime: "application/vnd.sqlite3", format: "SQLite", bytes: hex("53 51 4C 69 74 65 20 33") },
144
- // WASM — \0asm
145
- { mime: "application/wasm", format: "WASM", bytes: hex("00 61 73 6D") },
146
- // ELF — \x7FELF
147
- { mime: "application/x-elf", format: "ELF", bytes: hex("7F 45 4C 46") },
148
- // PE (EXE/DLL) — MZ
149
- { mime: "application/vnd.microsoft.portable-executable", format: "PE", bytes: hex("4D 5A") },
150
- // Mach-O — all four single-arch variants
151
- { mime: "application/x-mach-binary", format: "Mach-O 64 LE", bytes: hex("CF FA ED FE") },
152
- { mime: "application/x-mach-binary", format: "Mach-O 64 BE", bytes: hex("FE ED FA CF") },
153
- { mime: "application/x-mach-binary", format: "Mach-O 32 LE", bytes: hex("CE FA ED FE") },
154
- { mime: "application/x-mach-binary", format: "Mach-O 32 BE", bytes: hex("FE ED FA CE") },
155
- // Java Class — CA FE BA BE
156
- // Note: collides with Mach-O Universal Binary. Disambiguated by checking
157
- // bytes 4-7: Java class version is >= 0x002D (45), while fat binary
158
- // arch count is a small number (typically 0x00000002).
159
- // We place Java after Mach-O single-arch entries so the more common
160
- // Mach-O variants match first. The CA FE BA BE collision between Java
161
- // and Mach-O fat binary is resolved by the caller if needed.
162
- { mime: "application/java-vm", format: "Java Class", bytes: hex("CA FE BA BE") },
163
- // DEX — dex\n (Android Dalvik Executable)
164
- { mime: "application/vnd.android.dex", format: "DEX", bytes: hex("64 65 78 0A") },
165
- // ── Package formats ──────────────────────────────────────────────────
166
- // DEB — !<arch> (ar archive; DEB-specific member follows)
167
- { mime: "application/vnd.debian.binary-package", format: "DEB", bytes: hex("21 3C 61 72 63 68 3E") },
168
- // RPM — ED AB EE DB
169
- { mime: "application/x-rpm", format: "RPM", bytes: hex("ED AB EE DB") },
170
- // CAB — MSCF
171
- { mime: "application/vnd.ms-cab-compressed", format: "CAB", bytes: hex("4D 53 43 46"), preCompressed: true },
172
- // ── Capture & Flash ──────────────────────────────────────────────────
173
- // PCAP (little-endian) — D4 C3 B2 A1
174
- { mime: "application/vnd.tcpdump.pcap", format: "PCAP", bytes: hex("D4 C3 B2 A1") },
175
- // PCAP (big-endian) — A1 B2 C3 D4
176
- { mime: "application/vnd.tcpdump.pcap", format: "PCAP BE", bytes: hex("A1 B2 C3 D4") },
177
- // PCAPNG — Section Header Block
178
- { mime: "application/x-pcapng", format: "PCAPNG", bytes: hex("0A 0D 0D 0A") },
179
- // SWF — all three variants (uncompressed, zlib, LZMA)
180
- { mime: "application/x-shockwave-flash", format: "SWF", bytes: hex("46 57 53") },
181
- { mime: "application/x-shockwave-flash", format: "SWF zlib", bytes: hex("43 57 53"), preCompressed: true },
182
- { mime: "application/x-shockwave-flash", format: "SWF LZMA", bytes: hex("5A 57 53"), preCompressed: true },
183
- // ── Data formats ─────────────────────────────────────────────────────
184
- // Parquet — PAR1 (no registered IANA MIME; using Apache's informal type)
185
- { mime: "application/vnd.apache.parquet", format: "Parquet", bytes: hex("50 41 52 31") },
186
- // Avro Object Container — Obj\x01
187
- { mime: "application/avro", format: "Avro", bytes: hex("4F 62 6A 01") },
188
- // NES ROM — NES\x1A (iNES header)
189
- { mime: "application/x-nintendo-nes-rom", format: "NES ROM", bytes: hex("4E 45 53 1A") }
190
- ];
191
- function isMp3SyncWord(byte0, byte1) {
192
- return byte0 === 255 && (byte1 & 224) === 224;
193
- }
194
- function detectMimeType(header) {
195
- const result = detectMagic(header);
196
- return result?.mime ?? "application/octet-stream";
197
- }
198
- function detectMagic(header) {
199
- for (const rule of MAGIC_RULES) {
200
- if (matchRule(header, rule)) {
201
- return {
202
- mime: rule.mime,
203
- format: rule.format,
204
- preCompressed: rule.preCompressed ?? false
205
- };
206
- }
207
- }
208
- if (header.length >= 2 && isMp3SyncWord(header[0], header[1])) {
209
- return { mime: "audio/mpeg", format: "MP3", preCompressed: true };
210
- }
211
- return null;
212
- }
213
- function isPreCompressed(mimeType) {
214
- return PRE_COMPRESSED_MIMES.has(mimeType);
215
- }
216
- function matchRule(header, rule) {
217
- const offset = rule.offset ?? 0;
218
- const end = offset + rule.bytes.length;
219
- if (header.length < end) return false;
220
- for (let i = 0; i < rule.bytes.length; i++) {
221
- if (header[offset + i] !== rule.bytes[i]) return false;
222
- }
223
- if (rule.secondaryBytes && rule.secondaryOffset !== void 0) {
224
- const sEnd = rule.secondaryOffset + rule.secondaryBytes.length;
225
- if (header.length < sEnd) return false;
226
- for (let i = 0; i < rule.secondaryBytes.length; i++) {
227
- if (header[rule.secondaryOffset + i] !== rule.secondaryBytes[i]) return false;
228
- }
229
- }
230
- return true;
231
- }
232
- var PRE_COMPRESSED_MIMES = new Set(
233
- MAGIC_RULES.filter((r) => r.preCompressed).map((r) => r.mime)
234
- );
235
-
236
- // src/with-shape/blobs/blob-set.ts
237
- var BLOB_COLLECTION = "_blob";
238
- var BLOB_INDEX_COLLECTION = "_blob_index";
239
- var BLOB_CHUNKS_COLLECTION = "_blob_chunks";
240
- var BLOB_SLOTS_PREFIX = "_blob_slots_";
241
- var BLOB_VERSIONS_PREFIX = "_blob_versions_";
242
- var DEFAULT_CHUNK_SIZE = 256 * 1024;
243
- var MAX_CAS_RETRIES = 5;
244
- async function compressBytes(data) {
245
- if (typeof CompressionStream === "undefined") {
246
- return { bytes: data, algorithm: "none" };
247
- }
248
- const piped = new Response(data).body.pipeThrough(new CompressionStream("gzip"));
249
- const buf = await new Response(piped).arrayBuffer();
250
- return { bytes: new Uint8Array(buf), algorithm: "gzip" };
251
- }
252
- async function decompressBytes(data) {
253
- if (typeof DecompressionStream === "undefined") {
254
- throw new Error(
255
- "[noy-db] DecompressionStream not available \u2014 cannot decompress blob chunk"
256
- );
257
- }
258
- const piped = new Response(data).body.pipeThrough(new DecompressionStream("gzip"));
259
- const buf = await new Response(piped).arrayBuffer();
260
- return new Uint8Array(buf);
261
- }
262
- function concatChunks(chunks) {
263
- const total = chunks.reduce((s, c) => s + c.byteLength, 0);
264
- const out = new Uint8Array(total);
265
- let offset = 0;
266
- for (const c of chunks) {
267
- out.set(c, offset);
268
- offset += c.byteLength;
269
- }
270
- return out;
271
- }
272
- function chunkAAD(eTag, chunkIndex, chunkCount) {
273
- return new TextEncoder().encode(`${eTag}:${chunkIndex}:${chunkCount}`);
274
- }
275
- var BlobSet = class {
276
- store;
277
- vault;
278
- collection;
279
- recordId;
280
- getDEK;
281
- encrypted;
282
- userId;
283
- maxBlobBytes;
284
- erasableBlobs;
285
- debugPlaintext;
286
- objectStore;
287
- blobFields;
288
- constructor(opts) {
289
- this.store = opts.store;
290
- this.vault = opts.vault;
291
- this.collection = opts.collection;
292
- this.recordId = opts.recordId;
293
- this.getDEK = opts.getDEK;
294
- this.encrypted = opts.encrypted;
295
- this.userId = opts.userId;
296
- this.maxBlobBytes = opts.maxBlobBytes;
297
- this.erasableBlobs = opts.erasableBlobs === true;
298
- this.debugPlaintext = opts.debugPlaintext === true;
299
- this.objectStore = opts.objectStore;
300
- this.blobFields = opts.blobFields;
301
- }
302
- /**
303
- * Resolve the key the blob's CHUNKS are encrypted under.
304
- *
305
- * - `_cek` present (erasable blob) → unwrap the per-blob content CEK under
306
- * the `_blob` DEK. Deleting the BlobObject (at `refCount → 0`) makes this
307
- * key unrecoverable → the chunks are crypto-shredded.
308
- * - `_cek` absent (legacy) → the `_blob` DEK encrypts chunks directly.
309
- * - unencrypted vault → `null` (chunks stored as plaintext base64).
310
- */
311
- async resolveChunkKey(blob) {
312
- if (!this.encrypted) return null;
313
- const blobDEK = await this.getDEK(BLOB_COLLECTION);
314
- return blob._cek !== void 0 ? await unwrapCek(blob._cek, blobDEK) : blobDEK;
315
- }
316
- /** The internal collection that holds slot metadata for this collection's blobs. */
317
- get slotsCollection() {
318
- return `${BLOB_SLOTS_PREFIX}${this.collection}`;
319
- }
320
- /** The internal collection that holds published versions for this collection's blobs. */
321
- get versionsCollection() {
322
- return `${BLOB_VERSIONS_PREFIX}${this.collection}`;
323
- }
324
- // ─── Slot Metadata I/O (CAS-protected) ─────────────────────────────
325
- async loadSlots() {
326
- const envelope = await this.store.get(this.vault, this.slotsCollection, this.recordId);
327
- if (!envelope) return { slots: {}, version: 0 };
328
- if (!this.encrypted) {
329
- return {
330
- slots: JSON.parse(envelope._data),
331
- version: envelope._v
332
- };
333
- }
334
- const dek = await this.getDEK(this.collection);
335
- const json = await openEnvelopeJson(envelope, dek);
336
- return {
337
- slots: JSON.parse(json),
338
- version: envelope._v
339
- };
340
- }
341
- async saveSlots(slots, currentVersion) {
342
- const json = JSON.stringify(slots);
343
- const now = (/* @__PURE__ */ new Date()).toISOString();
344
- let envelope;
345
- if (this.encrypted) {
346
- const dek = await this.getDEK(this.collection);
347
- const { iv, data } = await encrypt(json, dek);
348
- envelope = {
349
- _noydb: NOYDB_FORMAT_VERSION,
350
- _v: currentVersion + 1,
351
- _ts: now,
352
- _iv: iv,
353
- _data: data
354
- };
355
- } else {
356
- envelope = {
357
- _noydb: NOYDB_FORMAT_VERSION,
358
- _v: currentVersion + 1,
359
- _ts: now,
360
- _iv: "",
361
- _data: json
362
- };
363
- }
364
- await this.store.put(
365
- this.vault,
366
- this.slotsCollection,
367
- this.recordId,
368
- envelope,
369
- currentVersion > 0 ? currentVersion : void 0
370
- );
371
- }
372
- /**
373
- * CAS retry loop for slot metadata updates. Re-reads slots on conflict
374
- * and re-applies the mutation function.
375
- */
376
- async casUpdateSlots(mutate) {
377
- for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
378
- const { slots, version } = await this.loadSlots();
379
- const updated = mutate(slots);
380
- if (updated === null) return;
381
- try {
382
- await this.saveSlots(updated, version);
383
- return;
384
- } catch (err) {
385
- if (err instanceof ConflictError && attempt < MAX_CAS_RETRIES - 1) continue;
386
- throw err;
387
- }
388
- }
389
- }
390
- // ─── Blob Index I/O (versioned for CAS refCount) ──────────────────
391
- async loadBlobObject(eTag) {
392
- const envelope = await this.store.get(this.vault, BLOB_INDEX_COLLECTION, eTag);
393
- if (!envelope) return null;
394
- if (!this.encrypted) {
395
- return { blob: JSON.parse(envelope._data), version: envelope._v };
396
- }
397
- const dek = await this.getDEK(BLOB_COLLECTION);
398
- const json = await openEnvelopeJson(envelope, dek);
399
- return { blob: JSON.parse(json), version: envelope._v };
400
- }
401
- async writeBlobObject(blob, expectedVersion) {
402
- const json = JSON.stringify(blob);
403
- const now = (/* @__PURE__ */ new Date()).toISOString();
404
- const newVersion = (expectedVersion ?? 0) + 1;
405
- let envelope;
406
- if (this.encrypted) {
407
- const dek = await this.getDEK(BLOB_COLLECTION);
408
- const { iv, data } = await encrypt(json, dek);
409
- envelope = { _noydb: NOYDB_FORMAT_VERSION, _v: newVersion, _ts: now, _iv: iv, _data: data };
410
- } else {
411
- envelope = { _noydb: NOYDB_FORMAT_VERSION, _v: newVersion, _ts: now, _iv: "", _data: json };
412
- }
413
- await this.store.put(
414
- this.vault,
415
- BLOB_INDEX_COLLECTION,
416
- blob.eTag,
417
- envelope,
418
- expectedVersion
419
- );
420
- }
421
- /**
422
- * CAS retry loop for refCount changes on a BlobObject.
423
- */
424
- async casUpdateRefCount(eTag, delta) {
425
- for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
426
- const result = await this.loadBlobObject(eTag);
427
- if (!result) throw new NotFoundError(`BlobObject ${eTag} not found`);
428
- const { blob, version } = result;
429
- const updated = { ...blob, refCount: blob.refCount + delta };
430
- try {
431
- await this.writeBlobObject(updated, version);
432
- return updated.refCount;
433
- } catch (err) {
434
- if (err instanceof ConflictError && attempt < MAX_CAS_RETRIES - 1) continue;
435
- throw err;
436
- }
437
- }
438
- throw new ConflictError(-1);
439
- }
440
- /**
441
- * Release `n` references to a blob and reclaim it at refCount 0.
442
- *
443
- * The single reclaim choke point for every reference-drop path — slot
444
- * delete/overwrite, published-version delete, and `forget()` shred — so the
445
- * refCount-0 policy is uniform:
446
- * - **erasable blob** (`_cek` present) → delete the `BlobObject` (the SOLE
447
- * copy of the wrapped content CEK → chunks permanently undecryptable) and
448
- * reclaim the chunks. The crypto-shred is EAGER on every path: GDPR erasure
449
- * must not wait on orphan retention.
450
- * - **legacy blob** (no `_cek`) → reclaimed only when `reclaimLegacy` (the
451
- * `forget()` erasure path); otherwise left for deferred GC so the existing
452
- * `BlobLifecyclePolicy.orphanRetentionDays` semantics are preserved.
453
- *
454
- * @returns `'shredded'` (erasable, refCount 0, chunks dead) · `'retainedShared'`
455
- * (erasable, still referenced) · `'residue'` (legacy — not a crypto-shred).
456
- */
457
- async releaseRef(eTag, n, reclaimLegacy) {
458
- const loaded = await this.loadBlobObject(eTag);
459
- if (!loaded) return "shredded";
460
- const erasable = loaded.blob._cek !== void 0;
461
- const remaining = await this.casUpdateRefCount(eTag, -n);
462
- if (remaining > 0) return erasable ? "retainedShared" : "residue";
463
- if (erasable || reclaimLegacy) {
464
- await this.store.delete(this.vault, BLOB_INDEX_COLLECTION, eTag);
465
- for (let i = 0; i < loaded.blob.chunkCount; i++) {
466
- await this.store.delete(this.vault, BLOB_CHUNKS_COLLECTION, `${eTag}_${i}`);
467
- }
468
- }
469
- return erasable ? "shredded" : "residue";
470
- }
471
- /**
472
- * Crypto-shred this record's blob attachments — called by
473
- * `vault.forget()`.
474
- *
475
- * For each distinct eTag the record references (a record may attach the same
476
- * content under several slot names → several refCount holds): decrement the
477
- * blob's refCount by that many. When it reaches 0:
478
- * - **erasable blob** (`_cek` present) → delete the `BlobObject` (the SOLE
479
- * recoverable copy of the wrapped content CEK → chunks permanently
480
- * undecryptable) and reclaim the chunk bytes. This is the crypto-shred.
481
- * - **legacy blob** (no `_cek`) → chunks are under the shared `_blob` DEK and
482
- * stay decryptable until byte-deleted; we delete the orphaned chunks +
483
- * index but report it as residue, not a cryptographic erasure.
484
- * When refCount stays > 0 the content legitimately persists for its other
485
- * owner — reported as `retainedShared` (or `residue` if legacy).
486
- *
487
- * Finally drops the record's slot map, severing the subject's link.
488
- */
489
- async shredAllForRecord() {
490
- const { slots } = await this.loadSlots();
491
- const slotNames = Object.keys(slots);
492
- const shredded = [];
493
- const retainedShared = [];
494
- const residue = [];
495
- if (slotNames.length === 0) return { shredded, retainedShared, residue };
496
- const holds = /* @__PURE__ */ new Map();
497
- for (const name of slotNames) {
498
- const eTag = slots[name].eTag;
499
- holds.set(eTag, (holds.get(eTag) ?? 0) + 1);
500
- }
501
- for (const [eTag, n] of holds) {
502
- const outcome = await this.releaseRef(eTag, n, true);
503
- if (outcome === "shredded") shredded.push(eTag);
504
- else if (outcome === "retainedShared") retainedShared.push(eTag);
505
- else residue.push(eTag);
506
- }
507
- await this.store.delete(this.vault, this.slotsCollection, this.recordId);
508
- return { shredded, retainedShared, residue };
509
- }
510
- /** CAS retry loop for an arbitrary BlobObject mutation. */
511
- async casUpdateBlobObject(eTag, mutate) {
512
- for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
513
- const result = await this.loadBlobObject(eTag);
514
- if (!result) throw new NotFoundError(`BlobObject ${eTag} not found`);
515
- try {
516
- await this.writeBlobObject(mutate(result.blob), result.version);
517
- return;
518
- } catch (err) {
519
- if (err instanceof ConflictError && attempt < MAX_CAS_RETRIES - 1) continue;
520
- throw err;
521
- }
522
- }
523
- throw new ConflictError(-1);
524
- }
525
- /**
526
- * Migrate this record's LEGACY blobs (no `_cek`, chunks under the shared
527
- * `_blob` DEK) to per-blob content CEKs so they become crypto-shreddable.
528
- * Returns the eTags migrated vs. already-erasable.
529
- *
530
- * **Explicit maintenance pass** (mirrors the record-CEK migration posture):
531
- * re-encrypts the existing compressed chunks IN PLACE under a fresh content
532
- * CEK — preserving the eTag, chunkCount, chunkSize, and compression — then
533
- * flips the `_cek` discriminant. Crash-safe + idempotent via `_cekPending`:
534
- * 1. persist the wrapped content CEK in `_cekPending` (readers ignore it →
535
- * the blob stays readable under the `_blob` DEK; the key survives a crash);
536
- * 2. re-encrypt each chunk under the content CEK (a resume reads an
537
- * already-migrated chunk under the content CEK, else under the `_blob` DEK);
538
- * 3. promote `_cekPending` → `_cek` (atomic flip). Reads now use the CEK.
539
- * A re-run after a crash resumes from whichever phase was reached.
540
- *
541
- * Dedup-safe: migrating a shared blob (refCount > 1) re-keys it for every
542
- * referencer at once; a non-erasable collection still reads it (it unwraps
543
- * `_cek` under the `_blob` DEK it holds).
544
- */
545
- async migrate() {
546
- const migrated = [];
547
- const alreadyErasable = [];
548
- if (!this.encrypted) return { migrated, alreadyErasable };
549
- const blobDEK = await this.getDEK(BLOB_COLLECTION);
550
- const { slots } = await this.loadSlots();
551
- const eTags = new Set(Object.values(slots).map((s) => s.eTag));
552
- for (const eTag of eTags) {
553
- const loaded = await this.loadBlobObject(eTag);
554
- if (!loaded) continue;
555
- const blob = loaded.blob;
556
- if (blob._cek !== void 0) {
557
- alreadyErasable.push(eTag);
558
- continue;
559
- }
560
- let contentCek;
561
- if (blob._cekPending !== void 0) {
562
- contentCek = await unwrapCek(blob._cekPending, blobDEK);
563
- } else {
564
- contentCek = await generateDEK();
565
- const wrapped = await wrapCek(contentCek, blobDEK);
566
- await this.casUpdateBlobObject(eTag, (b) => ({ ...b, _cekPending: wrapped }));
567
- }
568
- for (let i = 0; i < blob.chunkCount; i++) {
569
- let raw;
570
- try {
571
- raw = await this.readChunk(eTag, i, blob.chunkCount, blobDEK);
572
- } catch {
573
- raw = await this.readChunk(eTag, i, blob.chunkCount, contentCek);
574
- }
575
- if (!raw) {
576
- throw new NotFoundError(
577
- `Blob chunk ${i}/${blob.chunkCount} missing for eTag "${eTag}" during migration`
578
- );
579
- }
580
- await this.writeChunk(eTag, i, blob.chunkCount, raw, contentCek);
581
- }
582
- await this.casUpdateBlobObject(eTag, (b) => {
583
- const { _cekPending, ...rest } = b;
584
- return _cekPending === void 0 ? b : { ...rest, _cek: _cekPending };
585
- });
586
- migrated.push(eTag);
587
- }
588
- return { migrated, alreadyErasable };
589
- }
590
- // ─── Chunk I/O (with AAD binding) ─────────────────────────────────
591
- async writeChunk(eTag, index, chunkCount, chunk, dek) {
592
- const id = `${eTag}_${index}`;
593
- const now = (/* @__PURE__ */ new Date()).toISOString();
594
- let envelope;
595
- if (dek) {
596
- const aad = chunkAAD(eTag, index, chunkCount);
597
- const { iv, data } = await encryptBytesWithAAD(chunk, dek, aad);
598
- envelope = { _noydb: NOYDB_FORMAT_VERSION, _v: 1, _ts: now, _iv: iv, _data: data };
599
- } else {
600
- envelope = {
601
- _noydb: NOYDB_FORMAT_VERSION,
602
- _v: 1,
603
- _ts: now,
604
- _iv: "",
605
- _data: bufferToBase64(chunk)
606
- };
607
- }
608
- await this.store.put(this.vault, BLOB_CHUNKS_COLLECTION, id, envelope);
609
- }
610
- async readChunk(eTag, index, chunkCount, dek) {
611
- const envelope = await this.store.get(this.vault, BLOB_CHUNKS_COLLECTION, `${eTag}_${index}`);
612
- if (!envelope) return null;
613
- if (dek) {
614
- const aad = chunkAAD(eTag, index, chunkCount);
615
- return await decryptBytesWithAAD(envelope._iv, envelope._data, dek, aad);
616
- }
617
- return base64ToBuffer(envelope._data);
618
- }
619
- // ─── Version record I/O ───────────────────────────────────────────
620
- versionKey(slotName, label) {
621
- return `${this.recordId}::${slotName}::${label}`;
622
- }
623
- async loadVersionRecord(slotName, label) {
624
- const key = this.versionKey(slotName, label);
625
- const envelope = await this.store.get(this.vault, this.versionsCollection, key);
626
- if (!envelope) return null;
627
- if (!this.encrypted) {
628
- return JSON.parse(envelope._data);
629
- }
630
- const dek = await this.getDEK(this.collection);
631
- const json = await openEnvelopeJson(envelope, dek);
632
- return JSON.parse(json);
633
- }
634
- async writeVersionRecord(slotName, record) {
635
- const key = this.versionKey(slotName, record.label);
636
- const json = JSON.stringify(record);
637
- const now = (/* @__PURE__ */ new Date()).toISOString();
638
- let envelope;
639
- if (this.encrypted) {
640
- const dek = await this.getDEK(this.collection);
641
- const { iv, data } = await encrypt(json, dek);
642
- envelope = { _noydb: NOYDB_FORMAT_VERSION, _v: 1, _ts: now, _iv: iv, _data: data };
643
- } else {
644
- envelope = { _noydb: NOYDB_FORMAT_VERSION, _v: 1, _ts: now, _iv: "", _data: json };
645
- }
646
- await this.store.put(this.vault, this.versionsCollection, key, envelope);
647
- }
648
- async deleteVersionRecord(slotName, label) {
649
- const key = this.versionKey(slotName, label);
650
- await this.store.delete(this.vault, this.versionsCollection, key);
651
- }
652
- // ─── Effective chunk size ─────────────────────────────────────────
653
- effectiveChunkSize(opts) {
654
- if (opts?.chunkSize) return opts.chunkSize;
655
- if (this.maxBlobBytes) return this.maxBlobBytes;
656
- return DEFAULT_CHUNK_SIZE;
657
- }
658
- // ─── Fetch all chunks for a blob ──────────────────────────────────
659
- async fetchAllChunks(blob) {
660
- const chunkKey = await this.resolveChunkKey(blob);
661
- const chunks = [];
662
- for (let i = 0; i < blob.chunkCount; i++) {
663
- const chunk = await this.readChunk(blob.eTag, i, blob.chunkCount, chunkKey);
664
- if (!chunk) {
665
- throw new NotFoundError(
666
- `Blob chunk ${i}/${blob.chunkCount} missing for eTag "${blob.eTag}" on record "${this.recordId}"`
667
- );
668
- }
669
- chunks.push(chunk);
670
- }
671
- const assembled = concatChunks(chunks);
672
- return blob.compression === "gzip" ? await decompressBytes(assembled) : assembled;
673
- }
674
- // ─── Public API: Slot management ──────────────────────────────────
675
- /**
676
- * Upload bytes and attach them to this record under `slotName`.
677
- *
678
- * 1. Computes `eTag = HMAC-SHA-256(blobDEK, plaintext)` for keyed content-addressing.
679
- * 2. Auto-detects MIME type from magic bytes if not provided.
680
- * 3. If a blob with this eTag already exists, skips chunk upload (deduplication)
681
- * and CAS-increments refCount.
682
- * 4. Otherwise: compresses → splits into chunks → encrypts each chunk with
683
- * AAD binding → writes `_blob_chunks` → writes `BlobObject` to `_blob_index`.
684
- * 5. CAS-updates the slot metadata in `_blob_slots_{collection}`.
685
- * If overwriting an existing slot, decrements the old eTag's refCount.
686
- */
687
- async put(slotName, data, opts) {
688
- if (this.objectStore && this.blobFields?.[slotName]?.external) {
689
- const policy = this.blobFields[slotName];
690
- let contentType = opts?.mimeType;
691
- if (!contentType) {
692
- const detected = detectMagic(data.subarray(0, 16));
693
- contentType = detected?.mime ?? "application/octet-stream";
694
- }
695
- const key = `${this.collection}/${this.recordId}/${slotName}`;
696
- const isPublic = policy.public === true;
697
- const backlink = await this.buildBacklink(slotName, policy.backlink ?? "opaque-token");
698
- await this.objectStore.putObject(key, data, {
699
- contentType,
700
- public: isPublic,
701
- ...backlink.userMeta ? { userMeta: backlink.userMeta } : {}
702
- });
703
- const uploaderUserId2 = opts?.uploadedBy ?? this.userId;
704
- let oldETag;
705
- await this.casUpdateSlots((slots) => {
706
- oldETag = slots[slotName]?.eTag || void 0;
707
- const prevMeta = slots[slotName]?.external?.meta;
708
- slots[slotName] = {
709
- eTag: "",
710
- external: {
711
- key,
712
- contentType,
713
- ...isPublic ? { public: true } : {},
714
- ...backlink.token ? { backlink: backlink.token } : {},
715
- ...prevMeta ? { meta: prevMeta } : {}
716
- },
717
- filename: opts?.filename ?? slotName,
718
- size: data.byteLength,
719
- mimeType: contentType,
720
- uploadedAt: (/* @__PURE__ */ new Date()).toISOString(),
721
- ...uploaderUserId2 !== void 0 ? { uploadedBy: uploaderUserId2 } : {}
722
- };
723
- return slots;
724
- });
725
- if (oldETag) {
726
- await this.releaseRef(oldETag, 1, false).catch(() => {
727
- });
728
- }
729
- return;
730
- }
731
- const blobDEK = this.encrypted ? await this.getDEK(BLOB_COLLECTION) : null;
732
- const eTag = blobDEK ? await hmacSha256Hex(blobDEK, data) : await plainSha256Hex(data);
733
- let mimeType = opts?.mimeType;
734
- if (!mimeType) {
735
- const detected = detectMagic(data.subarray(0, 16));
736
- if (detected) mimeType = detected.mime;
737
- }
738
- let shouldCompress;
739
- if (opts?.compress !== void 0) {
740
- shouldCompress = opts.compress;
741
- } else if (mimeType && isPreCompressed(mimeType)) {
742
- shouldCompress = false;
743
- } else {
744
- shouldCompress = true;
745
- }
746
- if (this.debugPlaintext) shouldCompress = false;
747
- const existingBlob = await this.loadBlobObject(eTag);
748
- if (existingBlob) {
749
- await this.casUpdateRefCount(eTag, 1);
750
- } else {
751
- const { bytes: compressed, algorithm } = shouldCompress ? await compressBytes(data) : { bytes: data, algorithm: "none" };
752
- const chunkSize = this.debugPlaintext ? Math.max(compressed.byteLength, 1) : this.effectiveChunkSize(opts);
753
- const chunkCount = Math.max(1, Math.ceil(compressed.byteLength / chunkSize));
754
- let chunkKey = blobDEK;
755
- let wrappedCek;
756
- if (blobDEK && this.erasableBlobs) {
757
- const contentCek = await generateDEK();
758
- wrappedCek = await wrapCek(contentCek, blobDEK);
759
- chunkKey = contentCek;
760
- }
761
- for (let i = 0; i < chunkCount; i++) {
762
- const start = i * chunkSize;
763
- await this.writeChunk(
764
- eTag,
765
- i,
766
- chunkCount,
767
- compressed.subarray(start, start + chunkSize),
768
- chunkKey
769
- );
770
- }
771
- await this.writeBlobObject({
772
- eTag,
773
- size: data.byteLength,
774
- compressedSize: compressed.byteLength,
775
- compression: algorithm,
776
- chunkSize,
777
- chunkCount,
778
- ...mimeType !== void 0 ? { mimeType } : {},
779
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
780
- refCount: 1,
781
- ...wrappedCek !== void 0 ? { _cek: wrappedCek } : {}
782
- });
783
- }
784
- const uploaderUserId = opts?.uploadedBy ?? this.userId;
785
- await this.casUpdateSlots((slots) => {
786
- const oldETag = slots[slotName]?.eTag;
787
- slots[slotName] = {
788
- eTag,
789
- filename: opts?.filename ?? slotName,
790
- size: data.byteLength,
791
- ...mimeType !== void 0 ? { mimeType } : {},
792
- uploadedAt: (/* @__PURE__ */ new Date()).toISOString(),
793
- ...uploaderUserId !== void 0 ? { uploadedBy: uploaderUserId } : {}
794
- };
795
- if (oldETag && oldETag !== eTag) {
796
- this._deferredRefDecrement = oldETag;
797
- }
798
- return slots;
799
- });
800
- if (this._deferredRefDecrement) {
801
- const oldETag = this._deferredRefDecrement;
802
- this._deferredRefDecrement = void 0;
803
- await this.releaseRef(oldETag, 1, false).catch(() => {
804
- });
805
- }
806
- }
807
- _deferredRefDecrement;
808
- /**
809
- * Fetch all bytes for the named slot.
810
- * Returns `null` if the slot does not exist.
811
- * Throws `NotFoundError` if the index entry exists but a chunk is missing.
812
- */
813
- async get(slotName) {
814
- const { slots } = await this.loadSlots();
815
- const slot = slots[slotName];
816
- if (!slot) return null;
817
- if (slot.external) {
818
- if (!this.objectStore) {
819
- throw new NotFoundError(`Blob slot "${slotName}" is external but no objectStore is configured`);
820
- }
821
- return this.objectStore.getObject(slot.external.key);
822
- }
823
- const result = await this.loadBlobObject(slot.eTag);
824
- if (!result) return null;
825
- return this.fetchAllChunks(result.blob);
826
- }
827
- /**
828
- * A URL to fetch an `external` slot's object directly — presigned
829
- * (time-limited) or public, per the projection. Returns `null` if the slot
830
- * does not exist. Throws for a non-external slot (use `get()`/`response()`).
831
- */
832
- async url(slotName, opts) {
833
- const { slots } = await this.loadSlots();
834
- const slot = slots[slotName];
835
- if (!slot) return null;
836
- if (!slot.external) {
837
- throw new NotFoundError(`Blob slot "${slotName}" is not external \u2014 url() is only for external fields`);
838
- }
839
- if (!this.objectStore) {
840
- throw new NotFoundError(`Blob slot "${slotName}" is external but no objectStore is configured`);
841
- }
842
- return this.objectStore.objectUrl(slot.external.key, opts);
843
- }
844
- /**
845
- * Build the backlink stamped onto an external object's metadata — the
846
- * self-describing "secondary store" reference back to this record. See
847
- * {@link BlobFieldPolicy.backlink}. Returns the `userMeta` to attach and, for
848
- * `opaque-token`, the `token` to record on the slot.
849
- */
850
- async buildBacklink(slotName, mode) {
851
- if (mode === "none") return {};
852
- const ref = { vault: this.vault, collection: this.collection, record: this.recordId, field: slotName };
853
- if (mode === "plain") {
854
- return {
855
- userMeta: {
856
- "noydb-vault": ref.vault,
857
- "noydb-collection": ref.collection,
858
- "noydb-record": ref.record,
859
- "noydb-field": ref.field
860
- }
861
- };
862
- }
863
- if (mode === "encrypted" && this.encrypted) {
864
- const dek = await this.getDEK(BLOB_COLLECTION);
865
- const { iv, data } = await encrypt(JSON.stringify(ref), dek);
866
- return { userMeta: { "noydb-backlink-enc": `${iv}.${data}` } };
867
- }
868
- const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));
869
- const token = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
870
- return { userMeta: { "noydb-backlink": token }, token };
871
- }
872
- /**
873
- * Adopt an EXISTING object in the projection into this slot **without
874
- * re-uploading** — used by import/bootstrap to anchor objects already in the
875
- * bucket. Writes the external slot record (the catalog entry).
876
- */
877
- async adoptExternal(slotName, ref) {
878
- const uploaderUserId = this.userId;
879
- await this.casUpdateSlots((slots) => {
880
- slots[slotName] = {
881
- eTag: "",
882
- external: {
883
- key: ref.key,
884
- ...ref.contentType ? { contentType: ref.contentType } : {},
885
- ...ref.public ? { public: true } : {},
886
- ...ref.backlink ? { backlink: ref.backlink } : {},
887
- ...ref.meta ? { meta: ref.meta } : {}
888
- },
889
- filename: slotName,
890
- size: ref.size ?? 0,
891
- ...ref.contentType ? { mimeType: ref.contentType } : {},
892
- uploadedAt: (/* @__PURE__ */ new Date()).toISOString(),
893
- ...uploaderUserId !== void 0 ? { uploadedBy: uploaderUserId } : {}
894
- };
895
- return slots;
896
- });
897
- }
898
- /**
899
- * Merge derived metadata (video `duration`, image `width`/`height`, arbitrary
900
- * metatags) into an external slot's secondary metadata store. Typically called
901
- * from an AWS-side processing callback (MediaConvert / ffprobe / Rekognition)
902
- * once it has probed the object. No-op for a missing or non-external slot.
903
- */
904
- async setExternalMeta(slotName, meta) {
905
- await this.casUpdateSlots((slots) => {
906
- const slot = slots[slotName];
907
- if (!slot?.external) return null;
908
- slots[slotName] = {
909
- ...slot,
910
- external: { ...slot.external, meta: { ...slot.external.meta, ...meta } }
911
- };
912
- return slots;
913
- });
914
- }
915
- /**
916
- * Read an external slot's synced derived metadata (the secondary store).
917
- * Returns `null` for a missing or non-external slot, `{}` if none synced yet.
918
- */
919
- async externalMeta(slotName) {
920
- const { slots } = await this.loadSlots();
921
- const slot = slots[slotName];
922
- if (!slot?.external) return null;
923
- return slot.external.meta ?? {};
924
- }
925
- /**
926
- * List all slot entries for this record.
927
- * Returns metadata only — no chunk data is loaded.
928
- */
929
- async list() {
930
- const { slots } = await this.loadSlots();
931
- return Object.entries(slots).map(([name, slot]) => ({ name, ...slot }));
932
- }
933
- /**
934
- * Delete the named slot from this record.
935
- * Decrements refCount on the blob. Chunks are GC'd by `vault.blobGC()`.
936
- */
937
- async delete(slotName) {
938
- let eTagToRelease;
939
- let externalKeyToDelete;
940
- await this.casUpdateSlots((slots) => {
941
- if (!(slotName in slots)) return null;
942
- const slot = slots[slotName];
943
- if (slot.external) externalKeyToDelete = slot.external.key;
944
- else eTagToRelease = slot.eTag;
945
- delete slots[slotName];
946
- return slots;
947
- });
948
- if (externalKeyToDelete && this.objectStore) {
949
- await this.objectStore.deleteObject(externalKeyToDelete).catch(() => {
950
- });
951
- }
952
- if (eTagToRelease) {
953
- await this.releaseRef(eTagToRelease, 1, false).catch(() => {
954
- });
955
- }
956
- }
957
- /**
958
- * Return a native `Response` whose body streams the decrypted,
959
- * decompressed blob bytes with full HTTP metadata headers.
960
- *
961
- * Note: implementation is buffered — all chunks are loaded into
962
- * memory before being enqueued. True streaming deferred to.
963
- *
964
- * Returns `null` if the slot does not exist.
965
- */
966
- async response(slotName, opts) {
967
- const { slots } = await this.loadSlots();
968
- const slot = slots[slotName];
969
- if (!slot) return null;
970
- const result = await this.loadBlobObject(slot.eTag);
971
- if (!result) return null;
972
- return this.buildResponse(slot, result.blob, opts);
973
- }
974
- /**
975
- * Decrypt the slot and wrap the bytes in a browser ObjectURL ready
976
- * to feed into `<img src>`, `<a href>`, etc. The caller MUST call
977
- * `revoke()` when the URL is no longer needed — otherwise the URL
978
- * (and the underlying decrypted Blob) are pinned for the lifetime
979
- * of the document, which leaks memory in long-lived pages.
980
- *
981
- * Returns `null` when the slot does not exist.
982
- *
983
- * Throws when `URL.createObjectURL` is unavailable in the host
984
- * environment (Node without DOM, restricted workers). Framework
985
- * adapters — `useBlobURL` in `@noy-db/in-vue`, etc. — guard against
986
- * this for SSR contexts and stay at `null` instead of propagating.
987
- */
988
- async objectURL(slotName, opts) {
989
- if (typeof URL === "undefined" || typeof URL.createObjectURL !== "function") {
990
- throw new Error(
991
- "BlobSet.objectURL: URL.createObjectURL is unavailable in this environment. Call this from the browser, or use BlobSet.get() and create the URL yourself."
992
- );
993
- }
994
- const bytes = await this.get(slotName);
995
- if (!bytes) return null;
996
- const { slots } = await this.loadSlots();
997
- const slot = slots[slotName];
998
- const type = opts?.mimeType ?? slot?.mimeType ?? "application/octet-stream";
999
- const buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
1000
- const blob = new Blob([buffer], { type });
1001
- const url = URL.createObjectURL(blob);
1002
- let revoked = false;
1003
- const revoke = () => {
1004
- if (revoked) return;
1005
- revoked = true;
1006
- URL.revokeObjectURL(url);
1007
- };
1008
- return { url, revoke };
1009
- }
1010
- // ─── Public API: Published versions (UC-3 amendment versioning) ───
1011
- /**
1012
- * Publish the current slot content as a named version snapshot.
1013
- *
1014
- * The published version holds an independent refCount reference to
1015
- * the blob. Even if the slot is later overwritten or deleted, the
1016
- * published version keeps the blob data alive.
1017
- *
1018
- * Publishing with an existing label overwrites it — if the eTags differ,
1019
- * refCounts are adjusted accordingly.
1020
- */
1021
- async publish(slotName, label) {
1022
- const { slots } = await this.loadSlots();
1023
- const slot = slots[slotName];
1024
- if (!slot) throw new NotFoundError(`Slot "${slotName}" not found on record "${this.recordId}"`);
1025
- const existing = await this.loadVersionRecord(slotName, label);
1026
- if (existing && existing.eTag === slot.eTag) return;
1027
- const record = {
1028
- label,
1029
- eTag: slot.eTag,
1030
- publishedAt: (/* @__PURE__ */ new Date()).toISOString(),
1031
- ...this.userId !== void 0 ? { publishedBy: this.userId } : {}
1032
- };
1033
- await this.writeVersionRecord(slotName, record);
1034
- await this.casUpdateRefCount(slot.eTag, 1);
1035
- if (existing && existing.eTag !== slot.eTag) {
1036
- await this.releaseRef(existing.eTag, 1, false).catch(() => {
1037
- });
1038
- }
1039
- }
1040
- /**
1041
- * Fetch bytes for a published version.
1042
- * Returns `null` if the version does not exist.
1043
- */
1044
- async getVersion(slotName, label) {
1045
- const record = await this.loadVersionRecord(slotName, label);
1046
- if (!record) return null;
1047
- const result = await this.loadBlobObject(record.eTag);
1048
- if (!result) return null;
1049
- return this.fetchAllChunks(result.blob);
1050
- }
1051
- /**
1052
- * List all published versions for a slot.
1053
- */
1054
- async listVersions(slotName) {
1055
- const prefix = `${this.recordId}::${slotName}::`;
1056
- const allKeys = await this.store.list(this.vault, this.versionsCollection);
1057
- const matchingKeys = allKeys.filter((k) => k.startsWith(prefix));
1058
- const versions = [];
1059
- for (const key of matchingKeys) {
1060
- const envelope = await this.store.get(this.vault, this.versionsCollection, key);
1061
- if (!envelope) continue;
1062
- if (!this.encrypted) {
1063
- versions.push(JSON.parse(envelope._data));
1064
- } else {
1065
- const dek = await this.getDEK(this.collection);
1066
- const json = await openEnvelopeJson(envelope, dek);
1067
- versions.push(JSON.parse(json));
1068
- }
1069
- }
1070
- return versions;
1071
- }
1072
- /**
1073
- * Delete a published version. Decrements refCount on its blob.
1074
- */
1075
- async deleteVersion(slotName, label) {
1076
- const record = await this.loadVersionRecord(slotName, label);
1077
- if (!record) return;
1078
- await this.deleteVersionRecord(slotName, label);
1079
- await this.releaseRef(record.eTag, 1, false).catch(() => {
1080
- });
1081
- }
1082
- /**
1083
- * Return a `Response` for a published version — same as `response()`
1084
- * but reads from the version record's eTag instead of the current slot.
1085
- */
1086
- async responseVersion(slotName, label, opts) {
1087
- const record = await this.loadVersionRecord(slotName, label);
1088
- if (!record) return null;
1089
- const result = await this.loadBlobObject(record.eTag);
1090
- if (!result) return null;
1091
- const slotLike = {
1092
- eTag: record.eTag,
1093
- filename: opts?.filename ?? `${slotName}-${label}`,
1094
- size: result.blob.size,
1095
- ...result.blob.mimeType !== void 0 ? { mimeType: result.blob.mimeType } : {},
1096
- uploadedAt: record.publishedAt,
1097
- ...record.publishedBy !== void 0 ? { uploadedBy: record.publishedBy } : {}
1098
- };
1099
- return this.buildResponse(slotLike, result.blob, opts);
1100
- }
1101
- // ─── Diagnostics ──────────────────────────────────────────────────
1102
- /**
1103
- * Return the `BlobObject` metadata for the named slot.
1104
- * Returns `null` if the slot or blob does not exist.
1105
- */
1106
- async blobInfo(slotName) {
1107
- const { slots } = await this.loadSlots();
1108
- const slot = slots[slotName];
1109
- if (!slot) return null;
1110
- const result = await this.loadBlobObject(slot.eTag);
1111
- return result?.blob ?? null;
1112
- }
1113
- // ─── Presigned URL (E5) ────────────────────────────────────────────
1114
- /**
1115
- * Generate a presigned URL for direct client download of the blob's
1116
- * ciphertext. Only works when the blob store supports `presignUrl`.
1117
- *
1118
- * **Important:** The URL returns encrypted data. The caller must
1119
- * decrypt client-side using `decryptResponse()` or a service worker.
1120
- *
1121
- * Returns `null` if the slot doesn't exist or the store doesn't support presigning.
1122
- */
1123
- async presignedUrl(slotName, expiresInSeconds = 3600) {
1124
- const { slots } = await this.loadSlots();
1125
- const slot = slots[slotName];
1126
- if (!slot) return null;
1127
- const result = await this.loadBlobObject(slot.eTag);
1128
- if (!result) return null;
1129
- if (result.blob.chunkCount !== 1) return null;
1130
- if (!this.store.presignUrl) return null;
1131
- const chunkId = `${slot.eTag}_0`;
1132
- return this.store.presignUrl(this.vault, "_blob_chunks", chunkId, expiresInSeconds);
1133
- }
1134
- /**
1135
- * Decrypt a ciphertext Response (e.g. from a presigned URL fetch)
1136
- * back into a plaintext Response with correct headers.
1137
- *
1138
- * Usage with service worker or client-side fetch:
1139
- * ```ts
1140
- * const url = await blobs.presignedUrl('invoice.pdf')
1141
- * const cipherResponse = await fetch(url)
1142
- * const plainResponse = await blobs.decryptResponse('invoice.pdf', cipherResponse)
1143
- * ```
1144
- */
1145
- async decryptResponse(slotName, cipherResponse) {
1146
- const { slots } = await this.loadSlots();
1147
- const slot = slots[slotName];
1148
- if (!slot) return null;
1149
- const result = await this.loadBlobObject(slot.eTag);
1150
- if (!result) return null;
1151
- const text = await cipherResponse.text();
1152
- const envelope = JSON.parse(text);
1153
- const blobDEK = this.encrypted ? await this.getDEK("_blob") : null;
1154
- if (!blobDEK) {
1155
- return this.buildResponse(slot, result.blob, { inline: true });
1156
- }
1157
- const aad = chunkAAD(slot.eTag, 0, result.blob.chunkCount);
1158
- const { decryptBytesWithAAD: decryptAAD } = await import("./enclave-KGEUW2GL.js");
1159
- const decrypted = await decryptAAD(envelope._iv, envelope._data, blobDEK, aad);
1160
- const plaintext = result.blob.compression === "gzip" ? await decompressBytes(decrypted) : decrypted;
1161
- const body = new ReadableStream({
1162
- start(controller) {
1163
- controller.enqueue(plaintext);
1164
- controller.close();
1165
- }
1166
- });
1167
- const filename = slot.filename;
1168
- return new Response(body, {
1169
- headers: {
1170
- "Content-Type": slot.mimeType ?? "application/octet-stream",
1171
- "Content-Length": String(slot.size),
1172
- "ETag": `"${slot.eTag}"`,
1173
- "Content-Disposition": `inline; filename="${filename}"`,
1174
- "Last-Modified": new Date(slot.uploadedAt).toUTCString()
1175
- }
1176
- });
1177
- }
1178
- // ─── Internal: build Response from slot + blob ────────────────────
1179
- async buildResponse(slot, blob, opts) {
1180
- const fetchAllChunks = this.fetchAllChunks.bind(this);
1181
- const body = new ReadableStream({
1182
- async start(controller) {
1183
- try {
1184
- const output = await fetchAllChunks(blob);
1185
- controller.enqueue(output);
1186
- controller.close();
1187
- } catch (err) {
1188
- controller.error(err);
1189
- }
1190
- }
1191
- });
1192
- const filename = opts?.filename ?? slot.filename;
1193
- const disposition = opts?.inline ? `inline; filename="${filename}"` : `attachment; filename="${filename}"`;
1194
- return new Response(body, {
1195
- headers: {
1196
- "Content-Type": slot.mimeType ?? "application/octet-stream",
1197
- "Content-Length": String(slot.size),
1198
- "ETag": `"${slot.eTag}"`,
1199
- "Content-Disposition": disposition,
1200
- "Last-Modified": new Date(slot.uploadedAt).toUTCString()
1201
- }
1202
- });
1203
- }
1204
- };
1205
- async function plainSha256Hex(data) {
1206
- return sha256Hex(data);
1207
- }
1208
-
1209
- export {
1210
- detectMimeType,
1211
- detectMagic,
1212
- isPreCompressed,
1213
- BLOB_COLLECTION,
1214
- BLOB_INDEX_COLLECTION,
1215
- BLOB_CHUNKS_COLLECTION,
1216
- BLOB_SLOTS_PREFIX,
1217
- BLOB_VERSIONS_PREFIX,
1218
- DEFAULT_CHUNK_SIZE,
1219
- BlobSet
1220
- };
1221
- //# sourceMappingURL=chunk-WPNP3NF5.js.map