@noy-db/hub 0.2.0-pre.9 → 0.3.0-pre.10
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.
- package/README.md +129 -3
- package/dist/aggregate/index.d.ts +5 -2
- package/dist/aggregate/index.js +25 -16
- package/dist/aggregate/index.js.map +1 -1
- package/dist/api-TX2EX2FX.js +20 -0
- package/dist/as/index.d.ts +6 -0
- package/dist/as/index.js +30 -0
- package/dist/at/index.d.ts +4 -0
- package/dist/at/index.js +1 -0
- package/dist/attestation/index.d.ts +14 -47
- package/dist/attestation/index.js +60 -10
- package/dist/attestation/index.js.map +1 -1
- package/dist/backup-R7NTDFKY.js +225 -0
- package/dist/backup-R7NTDFKY.js.map +1 -0
- package/dist/blobs/index.d.ts +5 -8
- package/dist/blobs/index.js +25 -12
- package/dist/blobs/index.js.map +1 -1
- package/dist/bundle/index.d.ts +15 -70
- package/dist/bundle/index.js +45 -476
- package/dist/bundle/index.js.map +1 -1
- package/dist/{ulid-CJ8RzRrm.d.ts → bundle-D6GxiUfq.d.ts} +31 -86
- package/dist/by/index.d.ts +1 -0
- package/dist/by/index.js +11 -0
- package/dist/cargo/index.d.ts +7 -0
- package/dist/cargo/index.js +95 -0
- package/dist/chunk-2OV5NVE7.js +95 -0
- package/dist/chunk-2OV5NVE7.js.map +1 -0
- package/dist/chunk-2OZXVKVP.js +367 -0
- package/dist/chunk-2OZXVKVP.js.map +1 -0
- package/dist/{chunk-HNRHLRDC.js → chunk-2REPHKET.js} +6 -5
- package/dist/chunk-2REPHKET.js.map +1 -0
- package/dist/{chunk-PE2FR4J3.js → chunk-3JXPAHOZ.js} +17 -17
- package/dist/chunk-3JXPAHOZ.js.map +1 -0
- package/dist/{chunk-H2X3ISXG.js → chunk-3MATJ6O4.js} +7 -7
- package/dist/chunk-3MATJ6O4.js.map +1 -0
- package/dist/{chunk-PP6W64Y3.js → chunk-3OPY6MK2.js} +132 -3
- package/dist/chunk-3OPY6MK2.js.map +1 -0
- package/dist/{chunk-T7JEBOGN.js → chunk-3QSIU3UT.js} +49 -71
- package/dist/chunk-3QSIU3UT.js.map +1 -0
- package/dist/{chunk-ZYWZWG6G.js → chunk-4OMCIY6F.js} +32 -12
- package/dist/chunk-4OMCIY6F.js.map +1 -0
- package/dist/chunk-4Q6HSHHL.js +90 -0
- package/dist/chunk-4Q6HSHHL.js.map +1 -0
- package/dist/chunk-5I35DOHK.js +94 -0
- package/dist/chunk-5I35DOHK.js.map +1 -0
- package/dist/chunk-5VG4IJR7.js +235 -0
- package/dist/chunk-5VG4IJR7.js.map +1 -0
- package/dist/chunk-5YESYH2C.js +155 -0
- package/dist/chunk-5YESYH2C.js.map +1 -0
- package/dist/chunk-6G5ORS5D.js +202 -0
- package/dist/chunk-6G5ORS5D.js.map +1 -0
- package/dist/{chunk-VTKGMEPP.js → chunk-6P5XCKSD.js} +13 -3
- package/dist/chunk-6P5XCKSD.js.map +1 -0
- package/dist/{chunk-J66GRPNH.js → chunk-6S7T6WC4.js} +2 -2
- package/dist/chunk-6S7T6WC4.js.map +1 -0
- package/dist/{chunk-U26HQ6KJ.js → chunk-7BWJHO2A.js} +4 -4
- package/dist/chunk-7BWJHO2A.js.map +1 -0
- package/dist/chunk-7P2SDJG3.js +279 -0
- package/dist/chunk-7P2SDJG3.js.map +1 -0
- package/dist/chunk-ANB77BVV.js +150 -0
- package/dist/chunk-ANB77BVV.js.map +1 -0
- package/dist/chunk-AURFOK3D.js +35 -0
- package/dist/chunk-AURFOK3D.js.map +1 -0
- package/dist/chunk-BKARNZJN.js +382 -0
- package/dist/chunk-BKARNZJN.js.map +1 -0
- package/dist/{chunk-3BFJOWSU.js → chunk-BQISD5ZV.js} +35 -7
- package/dist/chunk-BQISD5ZV.js.map +1 -0
- package/dist/{chunk-2GLDA55J.js → chunk-BUAQ7YI3.js} +260 -135
- package/dist/chunk-BUAQ7YI3.js.map +1 -0
- package/dist/{chunk-2WUSG3IT.js → chunk-CB7CWSKW.js} +5 -5
- package/dist/chunk-CB7CWSKW.js.map +1 -0
- package/dist/chunk-CHFZDSE4.js +1 -0
- package/dist/{aggregate/index.cjs → chunk-DFVUTGT2.js} +206 -222
- package/dist/chunk-DFVUTGT2.js.map +1 -0
- package/dist/chunk-DJ7KIPLV.js +23 -0
- package/dist/chunk-DJ7KIPLV.js.map +1 -0
- package/dist/chunk-DSKDQP3G.js +14066 -0
- package/dist/chunk-DSKDQP3G.js.map +1 -0
- package/dist/{chunk-5T22KDPN.js → chunk-DV4HUP5G.js} +10 -8
- package/dist/chunk-DV4HUP5G.js.map +1 -0
- package/dist/chunk-EOXAAJTY.js +621 -0
- package/dist/chunk-EOXAAJTY.js.map +1 -0
- package/dist/chunk-ET67AY6B.js +74 -0
- package/dist/chunk-ET67AY6B.js.map +1 -0
- package/dist/chunk-F4CEK5YM.js +123 -0
- package/dist/chunk-F4CEK5YM.js.map +1 -0
- package/dist/chunk-FORYWFN6.js +130 -0
- package/dist/chunk-FORYWFN6.js.map +1 -0
- package/dist/{chunk-JWRVQKRZ.js → chunk-FRP6D2DM.js} +21 -20
- package/dist/chunk-FRP6D2DM.js.map +1 -0
- package/dist/chunk-FUOE7UUV.js +341 -0
- package/dist/chunk-FUOE7UUV.js.map +1 -0
- package/dist/chunk-G4JYND6L.js +42 -0
- package/dist/chunk-G4JYND6L.js.map +1 -0
- package/dist/{chunk-53XBRIRT.js → chunk-G6XV4H65.js} +9 -9
- package/dist/chunk-G6XV4H65.js.map +1 -0
- package/dist/chunk-GHVIKOHT.js +1 -0
- package/dist/{chunk-PX35GA7L.js → chunk-GNMXXTMN.js} +11 -9
- package/dist/chunk-GNMXXTMN.js.map +1 -0
- package/dist/chunk-GYGLAVCX.js +19 -0
- package/dist/chunk-GYGLAVCX.js.map +1 -0
- package/dist/chunk-HPWKV3YB.js +21 -0
- package/dist/chunk-HPWKV3YB.js.map +1 -0
- package/dist/chunk-HY3AUMFI.js +41 -0
- package/dist/chunk-HY3AUMFI.js.map +1 -0
- package/dist/chunk-HYR4WZZ3.js +69 -0
- package/dist/chunk-HYR4WZZ3.js.map +1 -0
- package/dist/chunk-I7FD46FF.js +9 -0
- package/dist/chunk-I7FD46FF.js.map +1 -0
- package/dist/{chunk-TFBP23BX.js → chunk-ICXIFFYZ.js} +66 -7
- package/dist/chunk-ICXIFFYZ.js.map +1 -0
- package/dist/{chunk-TV3YZ35S.js → chunk-IGJCYUT5.js} +17 -8
- package/dist/chunk-IGJCYUT5.js.map +1 -0
- package/dist/{chunk-F3GDRNUT.js → chunk-IVLTXX4W.js} +36 -68
- package/dist/chunk-IVLTXX4W.js.map +1 -0
- package/dist/{chunk-DONMZAD2.js → chunk-J4LPNIGK.js} +62 -169
- package/dist/chunk-J4LPNIGK.js.map +1 -0
- package/dist/chunk-JJZ2LW6T.js +36 -0
- package/dist/chunk-JJZ2LW6T.js.map +1 -0
- package/dist/chunk-JK733I5V.js +23 -0
- package/dist/chunk-JK733I5V.js.map +1 -0
- package/dist/{chunk-3YPCK6JX.js → chunk-KJ2BCBTL.js} +181 -422
- package/dist/chunk-KJ2BCBTL.js.map +1 -0
- package/dist/chunk-KNZB6JMR.js +129 -0
- package/dist/chunk-KNZB6JMR.js.map +1 -0
- package/dist/{chunk-OIF6LZUR.js → chunk-KPZS5QAQ.js} +30 -11
- package/dist/chunk-KPZS5QAQ.js.map +1 -0
- package/dist/chunk-LB7FD65R.js +163 -0
- package/dist/chunk-LB7FD65R.js.map +1 -0
- package/dist/{chunk-DO7C2TOG.js → chunk-LEJIKBBB.js} +3 -3
- package/dist/{chunk-DO7C2TOG.js.map → chunk-LEJIKBBB.js.map} +1 -1
- package/dist/{chunk-O3VZPBZG.js → chunk-LL2NIVUR.js} +56 -13
- package/dist/chunk-LL2NIVUR.js.map +1 -0
- package/dist/chunk-LP7BEXCT.js +32 -0
- package/dist/chunk-LP7BEXCT.js.map +1 -0
- package/dist/chunk-MCHVVJIA.js +968 -0
- package/dist/chunk-MCHVVJIA.js.map +1 -0
- package/dist/chunk-NO272T7Q.js +194 -0
- package/dist/chunk-NO272T7Q.js.map +1 -0
- package/dist/{chunk-22DWZL57.js → chunk-NUEQU36L.js} +70 -267
- package/dist/chunk-NUEQU36L.js.map +1 -0
- package/dist/chunk-O45M6LDB.js +38 -0
- package/dist/chunk-O45M6LDB.js.map +1 -0
- package/dist/chunk-OBKWYKYC.js +117 -0
- package/dist/chunk-OBKWYKYC.js.map +1 -0
- package/dist/{chunk-DJHHA6XH.js → chunk-OHHKHSJP.js} +50 -20
- package/dist/chunk-OHHKHSJP.js.map +1 -0
- package/dist/chunk-OT76OZL6.js +45 -0
- package/dist/chunk-OT76OZL6.js.map +1 -0
- package/dist/chunk-OVYRLHPE.js +150 -0
- package/dist/chunk-OVYRLHPE.js.map +1 -0
- package/dist/{chunk-ML236QKC.js → chunk-OXCSVM3B.js} +5 -5
- package/dist/chunk-OXCSVM3B.js.map +1 -0
- package/dist/chunk-P33LUIML.js +205 -0
- package/dist/chunk-P33LUIML.js.map +1 -0
- package/dist/{chunk-DL3HWOQ5.js → chunk-PLS64NCS.js} +10 -8
- package/dist/chunk-PLS64NCS.js.map +1 -0
- package/dist/{chunk-SYMWGEET.js → chunk-PS2NEWEX.js} +3 -3
- package/dist/chunk-PS2NEWEX.js.map +1 -0
- package/dist/chunk-PY4KJPYU.js +9 -0
- package/dist/chunk-PY4KJPYU.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-QA2KUPCP.js +45 -0
- package/dist/chunk-QA2KUPCP.js.map +1 -0
- package/dist/chunk-QOC3VYL2.js +30 -0
- package/dist/chunk-QOC3VYL2.js.map +1 -0
- package/dist/{chunk-BVRYKATC.js → chunk-QSFOZUYL.js} +62 -34
- package/dist/chunk-QSFOZUYL.js.map +1 -0
- package/dist/chunk-RHK32N73.js +30 -0
- package/dist/chunk-RHK32N73.js.map +1 -0
- package/dist/{chunk-K3DK3NU5.js → chunk-RW3Y22MW.js} +20 -5
- package/dist/chunk-RW3Y22MW.js.map +1 -0
- package/dist/{chunk-B6PB7JLN.js → chunk-S7VFUQM2.js} +541 -6
- package/dist/chunk-S7VFUQM2.js.map +1 -0
- package/dist/chunk-SVLR4POP.js +64 -0
- package/dist/chunk-SVLR4POP.js.map +1 -0
- package/dist/chunk-T7WSLRAU.js +49 -0
- package/dist/chunk-T7WSLRAU.js.map +1 -0
- package/dist/{chunk-WPLVTJ5D.js → chunk-TAKWLZZX.js} +285 -63
- package/dist/chunk-TAKWLZZX.js.map +1 -0
- package/dist/chunk-THNJ3IKU.js +17 -0
- package/dist/chunk-THNJ3IKU.js.map +1 -0
- package/dist/{chunk-XJFLDA7A.js → chunk-TMBXVJKT.js} +9 -6
- package/dist/chunk-TMBXVJKT.js.map +1 -0
- package/dist/chunk-TWKKOM55.js +54 -0
- package/dist/chunk-TWKKOM55.js.map +1 -0
- package/dist/chunk-U3WZCU7E.js +14 -0
- package/dist/chunk-U3WZCU7E.js.map +1 -0
- package/dist/{chunk-Z6FNBOTC.js → chunk-UF362QVH.js} +15 -17
- package/dist/chunk-UF362QVH.js.map +1 -0
- package/dist/chunk-UN4FVIBH.js +135 -0
- package/dist/chunk-UN4FVIBH.js.map +1 -0
- package/dist/chunk-VEAVKDDB.js +29 -0
- package/dist/chunk-VEAVKDDB.js.map +1 -0
- package/dist/chunk-VEPTFUJY.js +29 -0
- package/dist/chunk-VEPTFUJY.js.map +1 -0
- package/dist/chunk-VJV7GKQK.js +662 -0
- package/dist/chunk-VJV7GKQK.js.map +1 -0
- package/dist/{chunk-2QR2PQTT.js → chunk-VQNJ7UZL.js} +5 -3
- package/dist/chunk-VQNJ7UZL.js.map +1 -0
- package/dist/chunk-VQRAIPYF.js +50 -0
- package/dist/chunk-VQRAIPYF.js.map +1 -0
- package/dist/{chunk-DFMLEQZB.js → chunk-VRIYFLBA.js} +5 -10
- package/dist/chunk-VRIYFLBA.js.map +1 -0
- package/dist/chunk-VWM3DAVB.js +265 -0
- package/dist/chunk-VWM3DAVB.js.map +1 -0
- package/dist/{chunk-NONAAENK.js → chunk-VWRRVE6D.js} +11 -4
- package/dist/chunk-VWRRVE6D.js.map +1 -0
- package/dist/chunk-VYYM3MEN.js +98 -0
- package/dist/chunk-VYYM3MEN.js.map +1 -0
- package/dist/chunk-WBJIQSLL.js +167 -0
- package/dist/chunk-WBJIQSLL.js.map +1 -0
- package/dist/chunk-WIGQB62E.js +164 -0
- package/dist/chunk-WIGQB62E.js.map +1 -0
- package/dist/{chunk-EMIGCR7X.js → chunk-WXSYDNBT.js} +2 -2
- package/dist/chunk-WXSYDNBT.js.map +1 -0
- package/dist/chunk-WZSCE6RM.js +466 -0
- package/dist/chunk-WZSCE6RM.js.map +1 -0
- package/dist/chunk-XGDAPN6M.js +255 -0
- package/dist/chunk-XGDAPN6M.js.map +1 -0
- package/dist/{chunk-QODLLGQ7.js → chunk-XH7XP3OL.js} +372 -37
- package/dist/chunk-XH7XP3OL.js.map +1 -0
- package/dist/chunk-XREOISSI.js +40 -0
- package/dist/chunk-XREOISSI.js.map +1 -0
- package/dist/chunk-XUBPSPKD.js +164 -0
- package/dist/chunk-XUBPSPKD.js.map +1 -0
- package/dist/chunk-Y3A5CB5G.js +247 -0
- package/dist/chunk-Y3A5CB5G.js.map +1 -0
- package/dist/{chunk-I5FOWO4J.js → chunk-YCXCR7VG.js} +52 -73
- package/dist/chunk-YCXCR7VG.js.map +1 -0
- package/dist/{chunk-A3JMGXPG.js → chunk-YMUGBZN2.js} +2 -2
- package/dist/chunk-YMUGBZN2.js.map +1 -0
- package/dist/chunk-YMVQD5Q5.js +453 -0
- package/dist/chunk-YMVQD5Q5.js.map +1 -0
- package/dist/chunk-YN5IAHN6.js +32 -0
- package/dist/chunk-YN5IAHN6.js.map +1 -0
- package/dist/{chunk-FZU343FL.js → chunk-ZJADGNYF.js} +2 -2
- package/dist/chunk-ZJADGNYF.js.map +1 -0
- package/dist/chunk-ZYJ55N7N.js +86 -0
- package/dist/chunk-ZYJ55N7N.js.map +1 -0
- package/dist/classified/index.d.ts +16 -0
- package/dist/classified/index.js +40 -0
- package/dist/classified-marker-H6YSHYNK.js +24 -0
- package/dist/classified-marker-H6YSHYNK.js.map +1 -0
- package/dist/collection-facade-LVD22JLM.js +39 -0
- package/dist/computed-EXDMQODG.js +11 -0
- package/dist/consent/index.d.ts +4 -7
- package/dist/consent/index.js +13 -5
- package/dist/consent/index.js.map +1 -1
- package/dist/crdt/index.d.ts +5 -2
- package/dist/crdt/index.js +3 -2
- package/dist/crdt/index.js.map +1 -1
- package/dist/dead-filter-HQIE2YG7.js +28 -0
- package/dist/dead-filter-HQIE2YG7.js.map +1 -0
- package/dist/decrypt-partition-IHtxEnTi.d.ts +21 -0
- package/dist/delegation-BJP73GAP.js +25 -0
- package/dist/derivations/index.d.ts +6 -9
- package/dist/derivations/index.js +18 -6
- package/dist/derive-BME7HDWO.js +21 -0
- package/dist/{dev-unlock-B4kDxep_.d.ts → dev-unlock-Bmm2pgJ0.d.ts} +1 -1
- package/dist/discriminant-BN9REW3o.d.ts +60 -0
- package/dist/enclave-NHORSWSF.js +125 -0
- package/dist/executor-FE6X4LFX.js +9 -0
- package/dist/executor-KSHKRJXP.js +25 -0
- package/dist/executor-ZHTJJICG.js +9 -0
- package/dist/export-accessible-DACHM5VT.js +23 -0
- package/dist/extract-partition-RNENZZ4T.js +36 -0
- package/dist/fanout-sidecar-OFWN3NM7.js +74 -0
- package/dist/fanout-sidecar-OFWN3NM7.js.map +1 -0
- package/dist/fence-watcher-DHQ775JB.js +69 -0
- package/dist/fence-watcher-DHQ775JB.js.map +1 -0
- package/dist/find-BNGBJNKP.js +11 -0
- package/dist/forget/index.d.ts +36 -0
- package/dist/forget/index.js +25 -0
- package/dist/forget/index.js.map +1 -0
- package/dist/guards/index.d.ts +12 -9
- package/dist/guards/index.js +12 -5
- package/dist/{hash-DdpVypUp.d.cts → hash-DAJjMsCE.d.ts} +10 -1
- package/dist/history/index.d.ts +5 -8
- package/dist/history/index.js +25 -12
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.d.ts +25 -8
- package/dist/i18n/index.js +137 -29
- package/dist/i18n/index.js.map +1 -1
- package/dist/in/index.d.ts +4 -0
- package/dist/in/index.js +1 -0
- package/dist/in/index.js.map +1 -0
- package/dist/index-B9QdHytu.d.ts +123 -0
- package/dist/index-DjWbxsjb.d.ts +23579 -0
- package/dist/index-qwuNvO2B.d.ts +144 -0
- package/dist/index.d.ts +1179 -449
- package/dist/index.js +2524 -312
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.d.ts +5 -3
- package/dist/indexing/index.js +6 -5
- package/dist/indexing/index.js.map +1 -1
- package/dist/issue-NDI4CVZU.js +19 -0
- package/dist/issue-NDI4CVZU.js.map +1 -0
- package/dist/json-schema-I22JCYCG.js +44 -0
- package/dist/json-schema-I22JCYCG.js.map +1 -0
- package/dist/lazy/index.d.ts +20 -0
- package/dist/lazy/index.js +12 -0
- package/dist/lazy/index.js.map +1 -0
- package/dist/ledger-6NDS2EO4.js +42 -0
- package/dist/ledger-6NDS2EO4.js.map +1 -0
- package/dist/liberate-HN3RIGIP.js +24 -0
- package/dist/liberate-HN3RIGIP.js.map +1 -0
- package/dist/link-set-SJB2MVJV.js +31 -0
- package/dist/link-set-SJB2MVJV.js.map +1 -0
- package/dist/materialized-views/index.d.ts +23 -20
- package/dist/materialized-views/index.js +26 -12
- package/dist/mime-magic-bBj5OgUC.d.ts +103 -0
- package/dist/noydb-BWF6EPIR.js +66 -0
- package/dist/noydb-BWF6EPIR.js.map +1 -0
- package/dist/on/index.d.ts +4 -0
- package/dist/on/index.js +17 -0
- package/dist/on/index.js.map +1 -0
- package/dist/overlay-views/index.d.ts +26 -11
- package/dist/overlay-views/index.js +7 -6
- package/dist/periods/index.d.ts +4 -7
- package/dist/periods/index.js +27 -9
- package/dist/pod/index.d.ts +62 -0
- package/dist/pod/index.js +67 -0
- package/dist/pod/index.js.map +1 -0
- package/dist/policy-WGNAG5H6.js +41 -0
- package/dist/policy-WGNAG5H6.js.map +1 -0
- package/dist/portability/index.d.ts +19 -0
- package/dist/portability/index.js +43 -0
- package/dist/portability/index.js.map +1 -0
- package/dist/post-register-CWKBQRC7.js +55 -0
- package/dist/post-register-CWKBQRC7.js.map +1 -0
- package/dist/{public-envelope-BW6OXORV.js → public-envelope-EJLVIFX7.js} +6 -5
- package/dist/public-envelope-EJLVIFX7.js.map +1 -0
- package/dist/query/index.d.ts +4 -3
- package/dist/query/index.js +24 -13
- package/dist/read-only-facade-CHCKSEPD.js +8 -0
- package/dist/read-only-facade-CHCKSEPD.js.map +1 -0
- package/dist/register-SBIX7TVV.js +23 -0
- package/dist/register-SBIX7TVV.js.map +1 -0
- package/dist/registry-3EQG6OOE.js +18 -0
- package/dist/registry-3EQG6OOE.js.map +1 -0
- package/dist/registry-CA327ACV.js +9 -0
- package/dist/registry-CA327ACV.js.map +1 -0
- package/dist/registry-E7OXOTSV.js +19 -0
- package/dist/registry-E7OXOTSV.js.map +1 -0
- package/dist/registry-VW6P6A3J.js +8 -0
- package/dist/registry-VW6P6A3J.js.map +1 -0
- package/dist/request-withdrawal-KAH2AAXC.js +31 -0
- package/dist/request-withdrawal-KAH2AAXC.js.map +1 -0
- package/dist/reveal-R3JLHMUF.js +38 -0
- package/dist/reveal-R3JLHMUF.js.map +1 -0
- package/dist/revoke-IXLOJ3IH.js +24 -0
- package/dist/revoke-IXLOJ3IH.js.map +1 -0
- package/dist/satellites/index.d.ts +4 -0
- package/dist/satellites/index.js +8 -0
- package/dist/satellites/index.js.map +1 -0
- package/dist/sealed-record/index.d.ts +68 -0
- package/dist/sealed-record/index.js +71 -0
- package/dist/sealed-record/index.js.map +1 -0
- package/dist/session/index.d.ts +5 -8
- package/dist/session/index.js +13 -5
- package/dist/session/index.js.map +1 -1
- package/dist/shadow/index.d.ts +4 -7
- package/dist/shadow/index.js +4 -3
- package/dist/shadow/index.js.map +1 -1
- package/dist/signer-Y46N2GJ3.js +25 -0
- package/dist/signer-Y46N2GJ3.js.map +1 -0
- package/dist/snapshots/index.d.ts +5 -8
- package/dist/snapshots/index.js +19 -11
- package/dist/snapshots/index.js.map +1 -1
- package/dist/{stale-6ZDBTQT7.js → stale-Z7IW6RIL.js} +3 -2
- package/dist/stale-Z7IW6RIL.js.map +1 -0
- package/dist/storage-ADNP2UWI.js +23 -0
- package/dist/storage-ADNP2UWI.js.map +1 -0
- package/dist/store-coordination-provider-DTDMI6VL.js +142 -0
- package/dist/store-coordination-provider-DTDMI6VL.js.map +1 -0
- package/dist/subject-index-CyOgGMJL.d.ts +380 -0
- package/dist/sync/index.d.ts +3 -6
- package/dist/sync/index.js +13 -6
- package/dist/sync/index.js.map +1 -1
- package/dist/team/index.d.ts +46 -10
- package/dist/team/index.js +35 -18
- package/dist/tiers/index.d.ts +4 -0
- package/dist/tiers/index.js +39 -0
- package/dist/tiers/index.js.map +1 -0
- package/dist/to/index.d.ts +4 -0
- package/dist/to/index.js +16 -0
- package/dist/to/index.js.map +1 -0
- package/dist/transition-guard-DI-krBsZ.d.ts +165 -0
- package/dist/tx/index.d.ts +22 -9
- package/dist/tx/index.js +13 -8
- package/dist/tx/index.js.map +1 -1
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.js +1 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ulid-DRH25k3y.d.ts +66 -0
- package/dist/ulid-PTAIMDG4.js +10 -0
- package/dist/ulid-PTAIMDG4.js.map +1 -0
- package/dist/util/index.d.ts +2 -0
- package/dist/util/index.js +7 -2
- package/dist/util/index.js.map +1 -1
- package/dist/validators-BUcli5Nh.d.ts +101 -0
- package/dist/vault-diff-Z2DUayMe.d.ts +147 -0
- package/dist/verify-JPF2YR5E.js +139 -0
- package/dist/verify-JPF2YR5E.js.map +1 -0
- package/dist/walk-XYA2O3LW.js +241 -0
- package/dist/walk-XYA2O3LW.js.map +1 -0
- package/dist/with/index.d.ts +37 -0
- package/dist/with/index.js +31 -0
- package/dist/with/index.js.map +1 -0
- package/dist/{with-materialized-view-BLkQxoQN.d.ts → with-materialized-view-BUmzlXue.d.ts} +1 -1
- package/dist/{with-overlayed-view-CRsSEwHR.d.ts → with-overlayed-view-m4FaXXTO.d.ts} +2 -3
- package/dist/with-rollup-DEKGI9vb.d.ts +47 -0
- package/dist/withdraw-accessible-WLV4MTEN.js +28 -0
- package/dist/withdraw-accessible-WLV4MTEN.js.map +1 -0
- package/dist/zod-HAJM7LMS.js +14763 -0
- package/dist/zod-HAJM7LMS.js.map +1 -0
- package/package.json +122 -202
- package/dist/aggregate/index.cjs.map +0 -1
- package/dist/aggregate/index.d.cts +0 -38
- package/dist/attestation/index.cjs +0 -305
- package/dist/attestation/index.cjs.map +0 -1
- package/dist/attestation/index.d.cts +0 -52
- package/dist/blobs/index.cjs +0 -1480
- package/dist/blobs/index.cjs.map +0 -1
- package/dist/blobs/index.d.cts +0 -46
- package/dist/bundle/index.cjs +0 -19264
- package/dist/bundle/index.cjs.map +0 -1
- package/dist/bundle/index.d.cts +0 -176
- package/dist/chunk-22DWZL57.js.map +0 -1
- package/dist/chunk-2GLDA55J.js.map +0 -1
- package/dist/chunk-2QR2PQTT.js.map +0 -1
- package/dist/chunk-2WUSG3IT.js.map +0 -1
- package/dist/chunk-3BFJOWSU.js.map +0 -1
- package/dist/chunk-3YPCK6JX.js.map +0 -1
- package/dist/chunk-53XBRIRT.js.map +0 -1
- package/dist/chunk-5T22KDPN.js.map +0 -1
- package/dist/chunk-5XHKQ56N.js +0 -340
- package/dist/chunk-5XHKQ56N.js.map +0 -1
- package/dist/chunk-6CME4UEK.js +0 -10329
- package/dist/chunk-6CME4UEK.js.map +0 -1
- package/dist/chunk-6STK5TQP.js +0 -139
- package/dist/chunk-6STK5TQP.js.map +0 -1
- package/dist/chunk-A3JMGXPG.js.map +0 -1
- package/dist/chunk-B6PB7JLN.js.map +0 -1
- package/dist/chunk-BVRYKATC.js.map +0 -1
- package/dist/chunk-DE6GKS6G.js +0 -79
- package/dist/chunk-DE6GKS6G.js.map +0 -1
- package/dist/chunk-DFMLEQZB.js.map +0 -1
- package/dist/chunk-DJHHA6XH.js.map +0 -1
- package/dist/chunk-DL3HWOQ5.js.map +0 -1
- package/dist/chunk-DONMZAD2.js.map +0 -1
- package/dist/chunk-EMIGCR7X.js.map +0 -1
- package/dist/chunk-F3GDRNUT.js.map +0 -1
- package/dist/chunk-FZU343FL.js.map +0 -1
- package/dist/chunk-H2X3ISXG.js.map +0 -1
- package/dist/chunk-HNRHLRDC.js.map +0 -1
- package/dist/chunk-I5FOWO4J.js.map +0 -1
- package/dist/chunk-J66GRPNH.js.map +0 -1
- package/dist/chunk-JWRVQKRZ.js.map +0 -1
- package/dist/chunk-K3DK3NU5.js.map +0 -1
- package/dist/chunk-ML236QKC.js.map +0 -1
- package/dist/chunk-NONAAENK.js.map +0 -1
- package/dist/chunk-O3VZPBZG.js.map +0 -1
- package/dist/chunk-OIF6LZUR.js.map +0 -1
- package/dist/chunk-OQ6PIGHA.js +0 -19
- package/dist/chunk-OQ6PIGHA.js.map +0 -1
- package/dist/chunk-PE2FR4J3.js.map +0 -1
- package/dist/chunk-PP6W64Y3.js.map +0 -1
- package/dist/chunk-PX35GA7L.js.map +0 -1
- package/dist/chunk-QEILDE6R.js +0 -793
- package/dist/chunk-QEILDE6R.js.map +0 -1
- package/dist/chunk-QODLLGQ7.js.map +0 -1
- package/dist/chunk-RAZ4OVLL.js +0 -51
- package/dist/chunk-RAZ4OVLL.js.map +0 -1
- package/dist/chunk-SYMWGEET.js.map +0 -1
- package/dist/chunk-T7JEBOGN.js.map +0 -1
- package/dist/chunk-TFBP23BX.js.map +0 -1
- package/dist/chunk-TV3YZ35S.js.map +0 -1
- package/dist/chunk-U26HQ6KJ.js.map +0 -1
- package/dist/chunk-UF3BUNQZ.js +0 -1
- package/dist/chunk-UMLVJTYV.js +0 -20
- package/dist/chunk-UMLVJTYV.js.map +0 -1
- package/dist/chunk-VTKGMEPP.js.map +0 -1
- package/dist/chunk-W6EQLGMB.js +0 -100
- package/dist/chunk-W6EQLGMB.js.map +0 -1
- package/dist/chunk-WIRRPTFH.js +0 -17
- package/dist/chunk-WIRRPTFH.js.map +0 -1
- package/dist/chunk-WPLVTJ5D.js.map +0 -1
- package/dist/chunk-XJFLDA7A.js.map +0 -1
- package/dist/chunk-Z6FNBOTC.js.map +0 -1
- package/dist/chunk-ZYWZWG6G.js.map +0 -1
- package/dist/consent/index.cjs +0 -204
- package/dist/consent/index.cjs.map +0 -1
- package/dist/consent/index.d.cts +0 -25
- package/dist/crdt/index.cjs +0 -152
- package/dist/crdt/index.cjs.map +0 -1
- package/dist/crdt/index.d.cts +0 -30
- package/dist/crypto-HTZ4FJOP.js +0 -44
- package/dist/delegation-RI54P6I5.js +0 -17
- package/dist/derivations/index.cjs +0 -351
- package/dist/derivations/index.cjs.map +0 -1
- package/dist/derivations/index.d.cts +0 -72
- package/dist/dev-unlock-BIoEFbwm.d.cts +0 -263
- package/dist/executor-5PNY7LGW.js +0 -8
- package/dist/executor-B4QIYGZX.js +0 -8
- package/dist/executor-BWXXDQ7K.js +0 -11
- package/dist/fanout-sidecar-OKPMMPLG.js +0 -51
- package/dist/fanout-sidecar-OKPMMPLG.js.map +0 -1
- package/dist/guards/index.cjs +0 -322
- package/dist/guards/index.cjs.map +0 -1
- package/dist/guards/index.d.cts +0 -31
- package/dist/hash-HJqD14vS.d.ts +0 -63
- package/dist/history/index.cjs +0 -1222
- package/dist/history/index.cjs.map +0 -1
- package/dist/history/index.d.cts +0 -63
- package/dist/i18n/index.cjs +0 -1100
- package/dist/i18n/index.cjs.map +0 -1
- package/dist/i18n/index.d.cts +0 -39
- package/dist/index-4fBVt8j9.d.cts +0 -2387
- package/dist/index-D8I_pyJD.d.ts +0 -2387
- package/dist/index.cjs +0 -24487
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -776
- package/dist/indexing/index.cjs +0 -742
- package/dist/indexing/index.cjs.map +0 -1
- package/dist/indexing/index.d.cts +0 -36
- package/dist/issue-VGDPP4B5.js +0 -12
- package/dist/lazy-builder-7tIpFyWN.d.ts +0 -304
- package/dist/lazy-builder-wY4pMCEe.d.cts +0 -304
- package/dist/ledger-TMRZYNVJ.js +0 -33
- package/dist/materialized-views/index.cjs +0 -854
- package/dist/materialized-views/index.cjs.map +0 -1
- package/dist/materialized-views/index.d.cts +0 -186
- package/dist/mime-magic-CBBSOkjm.d.cts +0 -50
- package/dist/mime-magic-CBBSOkjm.d.ts +0 -50
- package/dist/noydb-G725ZSZG.js +0 -34
- package/dist/overlay-views/index.cjs +0 -359
- package/dist/overlay-views/index.cjs.map +0 -1
- package/dist/overlay-views/index.d.cts +0 -82
- package/dist/periods/index.cjs +0 -1041
- package/dist/periods/index.cjs.map +0 -1
- package/dist/periods/index.d.cts +0 -22
- package/dist/predicate-BSAGEyu5.d.cts +0 -209
- package/dist/predicate-BSAGEyu5.d.ts +0 -209
- package/dist/query/index.cjs +0 -2375
- package/dist/query/index.cjs.map +0 -1
- package/dist/query/index.d.cts +0 -3
- package/dist/read-only-facade-ITU6L7BL.js +0 -7
- package/dist/registry-3QP3YKQS.js +0 -8
- package/dist/registry-DKEXOJVO.js +0 -7
- package/dist/registry-OJIOSBV6.js +0 -10
- package/dist/registry-USRVT6YF.js +0 -8
- package/dist/revoke-JCC7N56X.js +0 -17
- package/dist/session/index.cjs +0 -495
- package/dist/session/index.cjs.map +0 -1
- package/dist/session/index.d.cts +0 -46
- package/dist/shadow/index.cjs +0 -133
- package/dist/shadow/index.cjs.map +0 -1
- package/dist/shadow/index.d.cts +0 -17
- package/dist/signer-72QAUSVW.js +0 -18
- package/dist/snapshots/index.cjs +0 -937
- package/dist/snapshots/index.cjs.map +0 -1
- package/dist/snapshots/index.d.cts +0 -28
- package/dist/store/index.cjs +0 -1083
- package/dist/store/index.cjs.map +0 -1
- package/dist/store/index.d.cts +0 -492
- package/dist/store/index.d.ts +0 -492
- package/dist/store/index.js +0 -37
- package/dist/strategy-BSxFXGzb.d.cts +0 -110
- package/dist/strategy-BSxFXGzb.d.ts +0 -110
- package/dist/strategy-DSTrsZ8t.d.cts +0 -601
- package/dist/strategy-DSTrsZ8t.d.ts +0 -601
- package/dist/sync/index.cjs +0 -1062
- package/dist/sync/index.cjs.map +0 -1
- package/dist/sync/index.d.cts +0 -43
- package/dist/team/index.cjs +0 -2798
- package/dist/team/index.cjs.map +0 -1
- package/dist/team/index.d.cts +0 -118
- package/dist/tx/index.cjs +0 -544
- package/dist/tx/index.cjs.map +0 -1
- package/dist/tx/index.d.cts +0 -21
- package/dist/types-Df28QFKb.d.ts +0 -12818
- package/dist/types-DyXYr8rE.d.cts +0 -12818
- package/dist/ulid-COREQ2RQ.js +0 -9
- package/dist/ulid-Drr7ykr6.d.cts +0 -603
- package/dist/util/index.cjs +0 -230
- package/dist/util/index.cjs.map +0 -1
- package/dist/util/index.d.cts +0 -77
- package/dist/with-derivation-DFnFByiQ.d.ts +0 -13
- package/dist/with-derivation-DU3Sjazm.d.cts +0 -13
- package/dist/with-guard-ByyxmEe7.d.cts +0 -18
- package/dist/with-guard-qube6BMI.d.ts +0 -18
- package/dist/with-materialized-view-BmEToIR1.d.cts +0 -27
- package/dist/with-overlayed-view-BMsQQbWm.d.cts +0 -13
- /package/dist/{chunk-UF3BUNQZ.js.map → api-TX2EX2FX.js.map} +0 -0
- /package/dist/{store → as}/index.js.map +0 -0
- /package/dist/{crypto-HTZ4FJOP.js.map → at/index.js.map} +0 -0
- /package/dist/{delegation-RI54P6I5.js.map → by/index.js.map} +0 -0
- /package/dist/{executor-5PNY7LGW.js.map → cargo/index.js.map} +0 -0
- /package/dist/{executor-B4QIYGZX.js.map → chunk-CHFZDSE4.js.map} +0 -0
- /package/dist/{executor-BWXXDQ7K.js.map → chunk-GHVIKOHT.js.map} +0 -0
- /package/dist/{issue-VGDPP4B5.js.map → chunk-PZ5AY32C.js.map} +0 -0
- /package/dist/{ledger-TMRZYNVJ.js.map → classified/index.js.map} +0 -0
- /package/dist/{noydb-G725ZSZG.js.map → collection-facade-LVD22JLM.js.map} +0 -0
- /package/dist/{public-envelope-BW6OXORV.js.map → computed-EXDMQODG.js.map} +0 -0
- /package/dist/{read-only-facade-ITU6L7BL.js.map → delegation-BJP73GAP.js.map} +0 -0
- /package/dist/{registry-3QP3YKQS.js.map → derive-BME7HDWO.js.map} +0 -0
- /package/dist/{registry-DKEXOJVO.js.map → enclave-NHORSWSF.js.map} +0 -0
- /package/dist/{registry-OJIOSBV6.js.map → executor-FE6X4LFX.js.map} +0 -0
- /package/dist/{registry-USRVT6YF.js.map → executor-KSHKRJXP.js.map} +0 -0
- /package/dist/{revoke-JCC7N56X.js.map → executor-ZHTJJICG.js.map} +0 -0
- /package/dist/{signer-72QAUSVW.js.map → export-accessible-DACHM5VT.js.map} +0 -0
- /package/dist/{stale-6ZDBTQT7.js.map → extract-partition-RNENZZ4T.js.map} +0 -0
- /package/dist/{ulid-COREQ2RQ.js.map → find-BNGBJNKP.js.map} +0 -0
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
openEnvelopeJson
|
|
3
|
+
} from "./chunk-MCHVVJIA.js";
|
|
4
4
|
import {
|
|
5
5
|
base64ToBuffer,
|
|
6
6
|
bufferToBase64,
|
|
7
|
-
decrypt,
|
|
8
7
|
decryptBytesWithAAD,
|
|
9
8
|
encrypt,
|
|
10
9
|
encryptBytesWithAAD,
|
|
10
|
+
generateDEK,
|
|
11
11
|
hmacSha256Hex,
|
|
12
|
-
sha256Hex
|
|
13
|
-
|
|
12
|
+
sha256Hex,
|
|
13
|
+
unwrapCek,
|
|
14
|
+
wrapCek
|
|
15
|
+
} from "./chunk-3OPY6MK2.js";
|
|
16
|
+
import {
|
|
17
|
+
NOYDB_FORMAT_VERSION
|
|
18
|
+
} from "./chunk-YN5IAHN6.js";
|
|
14
19
|
import {
|
|
15
20
|
ConflictError,
|
|
16
21
|
NotFoundError
|
|
17
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-S7VFUQM2.js";
|
|
18
23
|
|
|
19
|
-
// src/blobs/mime-magic.ts
|
|
24
|
+
// src/with-shape/blobs/mime-magic.ts
|
|
20
25
|
function hex(s) {
|
|
21
26
|
return new Uint8Array(s.split(" ").map((b) => parseInt(b, 16)));
|
|
22
27
|
}
|
|
@@ -228,7 +233,7 @@ var PRE_COMPRESSED_MIMES = new Set(
|
|
|
228
233
|
MAGIC_RULES.filter((r) => r.preCompressed).map((r) => r.mime)
|
|
229
234
|
);
|
|
230
235
|
|
|
231
|
-
// src/blobs/blob-set.ts
|
|
236
|
+
// src/with-shape/blobs/blob-set.ts
|
|
232
237
|
var BLOB_COLLECTION = "_blob";
|
|
233
238
|
var BLOB_INDEX_COLLECTION = "_blob_index";
|
|
234
239
|
var BLOB_CHUNKS_COLLECTION = "_blob_chunks";
|
|
@@ -240,11 +245,8 @@ async function compressBytes(data) {
|
|
|
240
245
|
if (typeof CompressionStream === "undefined") {
|
|
241
246
|
return { bytes: data, algorithm: "none" };
|
|
242
247
|
}
|
|
243
|
-
const
|
|
244
|
-
const
|
|
245
|
-
await writer.write(data);
|
|
246
|
-
await writer.close();
|
|
247
|
-
const buf = await new Response(cs.readable).arrayBuffer();
|
|
248
|
+
const piped = new Response(data).body.pipeThrough(new CompressionStream("gzip"));
|
|
249
|
+
const buf = await new Response(piped).arrayBuffer();
|
|
248
250
|
return { bytes: new Uint8Array(buf), algorithm: "gzip" };
|
|
249
251
|
}
|
|
250
252
|
async function decompressBytes(data) {
|
|
@@ -253,11 +255,8 @@ async function decompressBytes(data) {
|
|
|
253
255
|
"[noy-db] DecompressionStream not available \u2014 cannot decompress blob chunk"
|
|
254
256
|
);
|
|
255
257
|
}
|
|
256
|
-
const
|
|
257
|
-
const
|
|
258
|
-
await writer.write(data);
|
|
259
|
-
await writer.close();
|
|
260
|
-
const buf = await new Response(ds.readable).arrayBuffer();
|
|
258
|
+
const piped = new Response(data).body.pipeThrough(new DecompressionStream("gzip"));
|
|
259
|
+
const buf = await new Response(piped).arrayBuffer();
|
|
261
260
|
return new Uint8Array(buf);
|
|
262
261
|
}
|
|
263
262
|
function concatChunks(chunks) {
|
|
@@ -282,6 +281,10 @@ var BlobSet = class {
|
|
|
282
281
|
encrypted;
|
|
283
282
|
userId;
|
|
284
283
|
maxBlobBytes;
|
|
284
|
+
erasableBlobs;
|
|
285
|
+
debugPlaintext;
|
|
286
|
+
objectStore;
|
|
287
|
+
blobFields;
|
|
285
288
|
constructor(opts) {
|
|
286
289
|
this.store = opts.store;
|
|
287
290
|
this.vault = opts.vault;
|
|
@@ -291,6 +294,24 @@ var BlobSet = class {
|
|
|
291
294
|
this.encrypted = opts.encrypted;
|
|
292
295
|
this.userId = opts.userId;
|
|
293
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;
|
|
294
315
|
}
|
|
295
316
|
/** The internal collection that holds slot metadata for this collection's blobs. */
|
|
296
317
|
get slotsCollection() {
|
|
@@ -311,7 +332,7 @@ var BlobSet = class {
|
|
|
311
332
|
};
|
|
312
333
|
}
|
|
313
334
|
const dek = await this.getDEK(this.collection);
|
|
314
|
-
const json = await
|
|
335
|
+
const json = await openEnvelopeJson(envelope, dek);
|
|
315
336
|
return {
|
|
316
337
|
slots: JSON.parse(json),
|
|
317
338
|
version: envelope._v
|
|
@@ -374,7 +395,7 @@ var BlobSet = class {
|
|
|
374
395
|
return { blob: JSON.parse(envelope._data), version: envelope._v };
|
|
375
396
|
}
|
|
376
397
|
const dek = await this.getDEK(BLOB_COLLECTION);
|
|
377
|
-
const json = await
|
|
398
|
+
const json = await openEnvelopeJson(envelope, dek);
|
|
378
399
|
return { blob: JSON.parse(json), version: envelope._v };
|
|
379
400
|
}
|
|
380
401
|
async writeBlobObject(blob, expectedVersion) {
|
|
@@ -408,12 +429,163 @@ var BlobSet = class {
|
|
|
408
429
|
const updated = { ...blob, refCount: blob.refCount + delta };
|
|
409
430
|
try {
|
|
410
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);
|
|
411
517
|
return;
|
|
412
518
|
} catch (err) {
|
|
413
519
|
if (err instanceof ConflictError && attempt < MAX_CAS_RETRIES - 1) continue;
|
|
414
520
|
throw err;
|
|
415
521
|
}
|
|
416
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 };
|
|
417
589
|
}
|
|
418
590
|
// ─── Chunk I/O (with AAD binding) ─────────────────────────────────
|
|
419
591
|
async writeChunk(eTag, index, chunkCount, chunk, dek) {
|
|
@@ -456,7 +628,7 @@ var BlobSet = class {
|
|
|
456
628
|
return JSON.parse(envelope._data);
|
|
457
629
|
}
|
|
458
630
|
const dek = await this.getDEK(this.collection);
|
|
459
|
-
const json = await
|
|
631
|
+
const json = await openEnvelopeJson(envelope, dek);
|
|
460
632
|
return JSON.parse(json);
|
|
461
633
|
}
|
|
462
634
|
async writeVersionRecord(slotName, record) {
|
|
@@ -485,10 +657,10 @@ var BlobSet = class {
|
|
|
485
657
|
}
|
|
486
658
|
// ─── Fetch all chunks for a blob ──────────────────────────────────
|
|
487
659
|
async fetchAllChunks(blob) {
|
|
488
|
-
const
|
|
660
|
+
const chunkKey = await this.resolveChunkKey(blob);
|
|
489
661
|
const chunks = [];
|
|
490
662
|
for (let i = 0; i < blob.chunkCount; i++) {
|
|
491
|
-
const chunk = await this.readChunk(blob.eTag, i, blob.chunkCount,
|
|
663
|
+
const chunk = await this.readChunk(blob.eTag, i, blob.chunkCount, chunkKey);
|
|
492
664
|
if (!chunk) {
|
|
493
665
|
throw new NotFoundError(
|
|
494
666
|
`Blob chunk ${i}/${blob.chunkCount} missing for eTag "${blob.eTag}" on record "${this.recordId}"`
|
|
@@ -513,6 +685,49 @@ var BlobSet = class {
|
|
|
513
685
|
* If overwriting an existing slot, decrements the old eTag's refCount.
|
|
514
686
|
*/
|
|
515
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
|
+
}
|
|
516
731
|
const blobDEK = this.encrypted ? await this.getDEK(BLOB_COLLECTION) : null;
|
|
517
732
|
const eTag = blobDEK ? await hmacSha256Hex(blobDEK, data) : await plainSha256Hex(data);
|
|
518
733
|
let mimeType = opts?.mimeType;
|
|
@@ -528,13 +743,21 @@ var BlobSet = class {
|
|
|
528
743
|
} else {
|
|
529
744
|
shouldCompress = true;
|
|
530
745
|
}
|
|
746
|
+
if (this.debugPlaintext) shouldCompress = false;
|
|
531
747
|
const existingBlob = await this.loadBlobObject(eTag);
|
|
532
748
|
if (existingBlob) {
|
|
533
749
|
await this.casUpdateRefCount(eTag, 1);
|
|
534
750
|
} else {
|
|
535
751
|
const { bytes: compressed, algorithm } = shouldCompress ? await compressBytes(data) : { bytes: data, algorithm: "none" };
|
|
536
|
-
const chunkSize = this.effectiveChunkSize(opts);
|
|
752
|
+
const chunkSize = this.debugPlaintext ? Math.max(compressed.byteLength, 1) : this.effectiveChunkSize(opts);
|
|
537
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
|
+
}
|
|
538
761
|
for (let i = 0; i < chunkCount; i++) {
|
|
539
762
|
const start = i * chunkSize;
|
|
540
763
|
await this.writeChunk(
|
|
@@ -542,7 +765,7 @@ var BlobSet = class {
|
|
|
542
765
|
i,
|
|
543
766
|
chunkCount,
|
|
544
767
|
compressed.subarray(start, start + chunkSize),
|
|
545
|
-
|
|
768
|
+
chunkKey
|
|
546
769
|
);
|
|
547
770
|
}
|
|
548
771
|
await this.writeBlobObject({
|
|
@@ -554,7 +777,8 @@ var BlobSet = class {
|
|
|
554
777
|
chunkCount,
|
|
555
778
|
...mimeType !== void 0 ? { mimeType } : {},
|
|
556
779
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
557
|
-
refCount: 1
|
|
780
|
+
refCount: 1,
|
|
781
|
+
...wrappedCek !== void 0 ? { _cek: wrappedCek } : {}
|
|
558
782
|
});
|
|
559
783
|
}
|
|
560
784
|
const uploaderUserId = opts?.uploadedBy ?? this.userId;
|
|
@@ -562,7 +786,7 @@ var BlobSet = class {
|
|
|
562
786
|
const oldETag = slots[slotName]?.eTag;
|
|
563
787
|
slots[slotName] = {
|
|
564
788
|
eTag,
|
|
565
|
-
filename: slotName,
|
|
789
|
+
filename: opts?.filename ?? slotName,
|
|
566
790
|
size: data.byteLength,
|
|
567
791
|
...mimeType !== void 0 ? { mimeType } : {},
|
|
568
792
|
uploadedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -576,7 +800,7 @@ var BlobSet = class {
|
|
|
576
800
|
if (this._deferredRefDecrement) {
|
|
577
801
|
const oldETag = this._deferredRefDecrement;
|
|
578
802
|
this._deferredRefDecrement = void 0;
|
|
579
|
-
await this.
|
|
803
|
+
await this.releaseRef(oldETag, 1, false).catch(() => {
|
|
580
804
|
});
|
|
581
805
|
}
|
|
582
806
|
}
|
|
@@ -590,10 +814,114 @@ var BlobSet = class {
|
|
|
590
814
|
const { slots } = await this.loadSlots();
|
|
591
815
|
const slot = slots[slotName];
|
|
592
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
|
+
}
|
|
593
823
|
const result = await this.loadBlobObject(slot.eTag);
|
|
594
824
|
if (!result) return null;
|
|
595
825
|
return this.fetchAllChunks(result.blob);
|
|
596
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
|
+
}
|
|
597
925
|
/**
|
|
598
926
|
* List all slot entries for this record.
|
|
599
927
|
* Returns metadata only — no chunk data is loaded.
|
|
@@ -607,15 +935,22 @@ var BlobSet = class {
|
|
|
607
935
|
* Decrements refCount on the blob. Chunks are GC'd by `vault.blobGC()`.
|
|
608
936
|
*/
|
|
609
937
|
async delete(slotName) {
|
|
610
|
-
let
|
|
938
|
+
let eTagToRelease;
|
|
939
|
+
let externalKeyToDelete;
|
|
611
940
|
await this.casUpdateSlots((slots) => {
|
|
612
941
|
if (!(slotName in slots)) return null;
|
|
613
|
-
|
|
942
|
+
const slot = slots[slotName];
|
|
943
|
+
if (slot.external) externalKeyToDelete = slot.external.key;
|
|
944
|
+
else eTagToRelease = slot.eTag;
|
|
614
945
|
delete slots[slotName];
|
|
615
946
|
return slots;
|
|
616
947
|
});
|
|
617
|
-
if (
|
|
618
|
-
await this.
|
|
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(() => {
|
|
619
954
|
});
|
|
620
955
|
}
|
|
621
956
|
}
|
|
@@ -698,7 +1033,7 @@ var BlobSet = class {
|
|
|
698
1033
|
await this.writeVersionRecord(slotName, record);
|
|
699
1034
|
await this.casUpdateRefCount(slot.eTag, 1);
|
|
700
1035
|
if (existing && existing.eTag !== slot.eTag) {
|
|
701
|
-
await this.
|
|
1036
|
+
await this.releaseRef(existing.eTag, 1, false).catch(() => {
|
|
702
1037
|
});
|
|
703
1038
|
}
|
|
704
1039
|
}
|
|
@@ -728,7 +1063,7 @@ var BlobSet = class {
|
|
|
728
1063
|
versions.push(JSON.parse(envelope._data));
|
|
729
1064
|
} else {
|
|
730
1065
|
const dek = await this.getDEK(this.collection);
|
|
731
|
-
const json = await
|
|
1066
|
+
const json = await openEnvelopeJson(envelope, dek);
|
|
732
1067
|
versions.push(JSON.parse(json));
|
|
733
1068
|
}
|
|
734
1069
|
}
|
|
@@ -741,7 +1076,7 @@ var BlobSet = class {
|
|
|
741
1076
|
const record = await this.loadVersionRecord(slotName, label);
|
|
742
1077
|
if (!record) return;
|
|
743
1078
|
await this.deleteVersionRecord(slotName, label);
|
|
744
|
-
await this.
|
|
1079
|
+
await this.releaseRef(record.eTag, 1, false).catch(() => {
|
|
745
1080
|
});
|
|
746
1081
|
}
|
|
747
1082
|
/**
|
|
@@ -820,7 +1155,7 @@ var BlobSet = class {
|
|
|
820
1155
|
return this.buildResponse(slot, result.blob, { inline: true });
|
|
821
1156
|
}
|
|
822
1157
|
const aad = chunkAAD(slot.eTag, 0, result.blob.chunkCount);
|
|
823
|
-
const { decryptBytesWithAAD: decryptAAD } = await import("./
|
|
1158
|
+
const { decryptBytesWithAAD: decryptAAD } = await import("./enclave-NHORSWSF.js");
|
|
824
1159
|
const decrypted = await decryptAAD(envelope._iv, envelope._data, blobDEK, aad);
|
|
825
1160
|
const plaintext = result.blob.compression === "gzip" ? await decompressBytes(decrypted) : decrypted;
|
|
826
1161
|
const body = new ReadableStream({
|
|
@@ -883,4 +1218,4 @@ export {
|
|
|
883
1218
|
DEFAULT_CHUNK_SIZE,
|
|
884
1219
|
BlobSet
|
|
885
1220
|
};
|
|
886
|
-
//# sourceMappingURL=chunk-
|
|
1221
|
+
//# sourceMappingURL=chunk-XH7XP3OL.js.map
|