@noy-db/hub 0.2.0-pre.16 → 0.2.0-pre.17
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/dist/aggregate/index.cjs.map +1 -1
- package/dist/aggregate/index.d.cts +3 -2
- package/dist/aggregate/index.d.ts +3 -2
- package/dist/aggregate/index.js +4 -4
- package/dist/attestation/index.cjs.map +1 -1
- package/dist/attestation/index.d.cts +5 -3
- package/dist/attestation/index.d.ts +5 -3
- package/dist/attestation/index.js +6 -6
- package/dist/blobs/index.cjs +226 -11
- package/dist/blobs/index.cjs.map +1 -1
- package/dist/blobs/index.d.cts +6 -4
- package/dist/blobs/index.d.ts +6 -4
- package/dist/blobs/index.js +6 -5
- package/dist/blobs/index.js.map +1 -1
- package/dist/bundle/index.cjs +1087 -95
- package/dist/bundle/index.cjs.map +1 -1
- package/dist/bundle/index.d.cts +7 -5
- package/dist/bundle/index.d.ts +7 -5
- package/dist/bundle/index.js +21 -10
- package/dist/bundle/index.js.map +1 -1
- package/dist/{chunk-G4SCICH5.js → chunk-2FU2FTXD.js} +2 -2
- package/dist/{chunk-JD3OZAI4.js → chunk-3G3W65EQ.js} +2 -2
- package/dist/{chunk-XWH4MXIU.js → chunk-5AXTH4QZ.js} +2 -2
- package/dist/{chunk-4TBBMHVC.js → chunk-5LIROIDM.js} +2 -2
- package/dist/{chunk-L2BNJ6HM.js → chunk-7H2GEJ3O.js} +3 -3
- package/dist/{chunk-GNI5STXQ.js → chunk-AEIKD3PP.js} +52 -38
- package/dist/chunk-AEIKD3PP.js.map +1 -0
- package/dist/{chunk-QSUK7YWK.js → chunk-BH3X5L6A.js} +4 -4
- package/dist/{chunk-BQ65SS5A.js → chunk-BJSLBUJ7.js} +2 -2
- package/dist/{chunk-FFXM3ZIF.js → chunk-BL5GYANC.js} +3 -3
- package/dist/{chunk-6H2ZUNR7.js → chunk-BSZOCSDZ.js} +4 -4
- package/dist/{chunk-ZNQYHJXX.js → chunk-C3HYQPV4.js} +2 -2
- package/dist/{chunk-E2CDVKMH.js → chunk-CD2AVTEM.js} +5 -5
- package/dist/{chunk-667MB6AH.js → chunk-D77ZQSQQ.js} +769 -131
- package/dist/chunk-D77ZQSQQ.js.map +1 -0
- package/dist/{chunk-BR3AMFGS.js → chunk-DWEBTE2W.js} +5 -5
- package/dist/{chunk-Z4DO7YSI.js → chunk-DYYYUW5D.js} +2 -2
- package/dist/{chunk-SCJPI4Z5.js → chunk-E77UKJYL.js} +5 -5
- package/dist/{chunk-OMAMZKKD.js → chunk-F4G63NTZ.js} +2 -2
- package/dist/{chunk-TKIY625R.js → chunk-FEJDVE3Z.js} +2 -2
- package/dist/{chunk-7Z7KSVA5.js → chunk-GP3SDSH2.js} +2 -2
- package/dist/{chunk-IQLVUT37.js → chunk-H2MRGONI.js} +2 -2
- package/dist/{chunk-DUREQF5W.js → chunk-HGVSHKZW.js} +8 -5
- package/dist/chunk-HGVSHKZW.js.map +1 -0
- package/dist/chunk-I5IUYN7B.js +125 -0
- package/dist/chunk-I5IUYN7B.js.map +1 -0
- package/dist/{chunk-CJORTUJ2.js → chunk-J7RWBXFY.js} +2 -2
- package/dist/{chunk-AAVWKNZW.js → chunk-JDWE6JMX.js} +2 -2
- package/dist/{chunk-XL35NSEN.js → chunk-KCEHMDZF.js} +3 -3
- package/dist/{chunk-TS26M2SB.js → chunk-M476FOQ7.js} +2 -2
- package/dist/{chunk-F4OJZIWQ.js → chunk-NBBMMJ2H.js} +4 -4
- package/dist/{chunk-CZI2A4MQ.js → chunk-NYSYPFXJ.js} +3 -3
- package/dist/{chunk-OQSRJG6A.js → chunk-PDULVIBY.js} +2 -2
- package/dist/{chunk-Z6FNBOTC.js → chunk-PDVP3C2I.js} +1 -1
- package/dist/{chunk-Z6FNBOTC.js.map → chunk-PDVP3C2I.js.map} +1 -1
- package/dist/{chunk-DLZ2ONOD.js → chunk-QHM6XEAH.js} +6 -6
- package/dist/{chunk-HBXJ37ZY.js → chunk-QO6RGLLD.js} +4 -4
- package/dist/{chunk-7BQ4QWYX.js → chunk-ROPJVUG3.js} +23 -6
- package/dist/chunk-ROPJVUG3.js.map +1 -0
- package/dist/{chunk-42FEUPZQ.js → chunk-ROVO6NPJ.js} +2 -2
- package/dist/{chunk-6RR3MNMG.js → chunk-SHX5QBCI.js} +3 -3
- package/dist/{chunk-F3BPIPLS.js → chunk-SISBMAPO.js} +1 -1
- package/dist/chunk-SISBMAPO.js.map +1 -0
- package/dist/{chunk-3YWP3WBP.js → chunk-SNMJ7SB3.js} +5 -5
- package/dist/{chunk-IXBIFDEW.js → chunk-TIDXB5DF.js} +4 -4
- package/dist/chunk-U5QCMH3W.js +151 -0
- package/dist/chunk-U5QCMH3W.js.map +1 -0
- package/dist/{chunk-YULZKK4F.js → chunk-UNTGHX5A.js} +37 -2
- package/dist/chunk-UNTGHX5A.js.map +1 -0
- package/dist/{chunk-FWPKCXTN.js → chunk-WIAOUFFB.js} +2 -2
- package/dist/{chunk-KABJXG2F.js → chunk-WV7WV6JO.js} +195 -17
- package/dist/chunk-WV7WV6JO.js.map +1 -0
- package/dist/{chunk-X73VS74Y.js → chunk-XJV6OB4D.js} +2 -2
- package/dist/{chunk-VLMPU56Q.js → chunk-XMHUK5PN.js} +2 -2
- package/dist/{chunk-BI6ETQPF.js → chunk-XMVHEWF6.js} +4 -4
- package/dist/{chunk-HOR4R722.js → chunk-XPIHJ34I.js} +30 -4
- package/dist/chunk-XPIHJ34I.js.map +1 -0
- package/dist/{chunk-OB2ZJQ2D.js → chunk-YYVZYTWW.js} +3 -3
- package/dist/{chunk-535SSHBS.js → chunk-ZEGSDPB7.js} +81 -2
- package/dist/chunk-ZEGSDPB7.js.map +1 -0
- package/dist/{chunk-QVIEAYTP.js → chunk-ZNGPEV5J.js} +3 -3
- package/dist/consent/index.cjs.map +1 -1
- package/dist/consent/index.d.cts +6 -4
- package/dist/consent/index.d.ts +6 -4
- package/dist/consent/index.js +3 -3
- package/dist/{crypto-QXQOHMHF.js → crypto-7BN2HDWG.js} +7 -3
- package/dist/{delegation-NIQ43IPU.js → delegation-MGH5SODX.js} +5 -5
- package/dist/derivations/index.cjs.map +1 -1
- package/dist/derivations/index.d.cts +7 -5
- package/dist/derivations/index.d.ts +7 -5
- package/dist/derivations/index.js +4 -4
- package/dist/{dev-unlock-DR3upLd1.d.ts → dev-unlock-CI1ijTML.d.ts} +1 -1
- package/dist/{dev-unlock-8XzcD2Z4.d.cts → dev-unlock-iXbYFAWl.d.cts} +1 -1
- package/dist/{strategy-BtW8fAjz.d.ts → errors-Dz64FA65.d.cts} +98 -727
- package/dist/{strategy-BtW8fAjz.d.cts → errors-Dz64FA65.d.ts} +98 -727
- package/dist/executor-3W63Y44O.js +11 -0
- package/dist/executor-CFFWPWBJ.js +8 -0
- package/dist/executor-VDQQOR4F.js +8 -0
- package/dist/{fanout-sidecar-67CMI3UT.js → fanout-sidecar-FIJJ46YG.js} +2 -2
- package/dist/forget/index.cjs +43 -0
- package/dist/forget/index.cjs.map +1 -0
- package/dist/forget/index.d.cts +1 -0
- package/dist/forget/index.d.ts +1 -0
- package/dist/forget/index.js +14 -0
- package/dist/guards/index.cjs.map +1 -1
- package/dist/guards/index.d.cts +7 -5
- package/dist/guards/index.d.ts +7 -5
- package/dist/guards/index.js +6 -6
- package/dist/{hash-CDjye9KV.d.ts → hash-blk7Bkes.d.ts} +1 -1
- package/dist/{hash-DuQ88_5W.d.cts → hash-tEcM5fnv.d.cts} +1 -1
- package/dist/history/index.cjs +27 -4
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.d.cts +7 -5
- package/dist/history/index.d.ts +7 -5
- package/dist/history/index.js +9 -7
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.cjs +53 -0
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.d.cts +6 -4
- package/dist/i18n/index.d.ts +6 -4
- package/dist/i18n/index.js +16 -8
- package/dist/i18n/index.js.map +1 -1
- package/dist/{immutable-guard-Dov3WvwF.d.ts → immutable-guard-B5M95nbq.d.ts} +1 -1
- package/dist/{immutable-guard-CRPvu24K.d.cts → immutable-guard-qN3zF8o1.d.cts} +1 -1
- package/dist/index-C-SSRIxP.d.cts +348 -0
- package/dist/index-C-SSRIxP.d.ts +348 -0
- package/dist/{index-nP99bXLg.d.ts → index-DpU6KWof.d.ts} +9 -1
- package/dist/{index-C8Bk3-VF.d.cts → index-u-kWzSrL.d.cts} +9 -1
- package/dist/index.cjs +7271 -6079
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -12
- package/dist/index.d.ts +15 -12
- package/dist/index.js +130 -106
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.cjs.map +1 -1
- package/dist/indexing/index.js +4 -4
- package/dist/issue-TTMGHQ2J.js +12 -0
- package/dist/{ledger-A3LL253R.js → ledger-LFVLHE5H.js} +6 -6
- package/dist/materialized-views/index.cjs.map +1 -1
- package/dist/materialized-views/index.d.cts +7 -5
- package/dist/materialized-views/index.d.ts +7 -5
- package/dist/materialized-views/index.js +12 -12
- package/dist/noydb-36S6GQNC.js +37 -0
- package/dist/overlay-views/index.cjs.map +1 -1
- package/dist/overlay-views/index.d.cts +7 -5
- package/dist/overlay-views/index.d.ts +7 -5
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.cjs.map +1 -1
- package/dist/periods/index.d.cts +6 -4
- package/dist/periods/index.d.ts +6 -4
- package/dist/periods/index.js +6 -6
- package/dist/{public-envelope-YP2UWMLG.js → public-envelope-RXZNP3V6.js} +4 -4
- package/dist/query/index.cjs +4 -1
- package/dist/query/index.cjs.map +1 -1
- package/dist/query/index.d.cts +3 -2
- package/dist/query/index.d.ts +3 -2
- package/dist/query/index.js +6 -6
- package/dist/registry-3YFLZ7WD.js +8 -0
- package/dist/{registry-UTA4CLQS.js → registry-SECUWSGY.js} +3 -3
- package/dist/registry-TGZISEWC.js +8 -0
- package/dist/{revoke-HNMQZSCL.js → revoke-B54H2S2W.js} +6 -6
- package/dist/sealed-record/index.cjs +139 -0
- package/dist/sealed-record/index.cjs.map +1 -0
- package/dist/sealed-record/index.d.cts +123 -0
- package/dist/sealed-record/index.d.ts +123 -0
- package/dist/sealed-record/index.js +42 -0
- package/dist/sealed-record/index.js.map +1 -0
- package/dist/session/index.cjs.map +1 -1
- package/dist/session/index.d.cts +7 -5
- package/dist/session/index.d.ts +7 -5
- package/dist/session/index.js +3 -3
- package/dist/shadow/index.cjs.map +1 -1
- package/dist/shadow/index.d.cts +6 -4
- package/dist/shadow/index.d.ts +6 -4
- package/dist/shadow/index.js +2 -2
- package/dist/{signer-DCMNKXSF.js → signer-YSXZT574.js} +5 -5
- package/dist/snapshots/index.cjs.map +1 -1
- package/dist/snapshots/index.d.cts +6 -4
- package/dist/snapshots/index.d.ts +6 -4
- package/dist/snapshots/index.js +4 -4
- package/dist/{stale-W5PQTRYH.js → stale-TOA36SRK.js} +2 -2
- package/dist/stale-TOA36SRK.js.map +1 -0
- package/dist/{state-vault-TMXZRTY5.js → state-vault-W2OEABNO.js} +3 -3
- package/dist/store/index.cjs.map +1 -1
- package/dist/store/index.d.cts +6 -4
- package/dist/store/index.d.ts +6 -4
- package/dist/store/index.js +2 -2
- package/dist/strategy-4M9jo172.d.ts +739 -0
- package/dist/strategy-CLC1j79g.d.cts +739 -0
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +5 -3
- package/dist/sync/index.d.ts +5 -3
- package/dist/sync/index.js +4 -4
- package/dist/team/index.cjs.map +1 -1
- package/dist/team/index.d.cts +6 -4
- package/dist/team/index.d.ts +6 -4
- package/dist/team/index.js +8 -8
- package/dist/tx/index.cjs.map +1 -1
- package/dist/tx/index.d.cts +6 -4
- package/dist/tx/index.d.ts +6 -4
- package/dist/tx/index.js +3 -3
- package/dist/{types-DrmBTscX.d.ts → types-CljIHm_J.d.ts} +789 -500
- package/dist/{types-Bze6vkwm.d.cts → types-CrSpRDuG.d.cts} +789 -500
- package/dist/{ulid-DbBVrNSt.d.ts → ulid-CWfL2Vfv.d.ts} +1 -1
- package/dist/{ulid-DfZlAh0u.d.cts → ulid-CrI7PPbA.d.cts} +1 -1
- package/dist/util/index.cjs.map +1 -1
- package/dist/util/index.js +1 -1
- package/dist/{vault-group-DX2HFQMX.js → vault-group-DHAHFX2A.js} +4 -4
- package/dist/{with-derivation-_lySGdlm.d.ts → with-derivation-BZ2y4bzF.d.ts} +1 -1
- package/dist/{with-derivation-CCqAchD5.d.cts → with-derivation-Bozs8DmD.d.cts} +1 -1
- package/dist/{with-materialized-view-QT1Tp7NO.d.ts → with-materialized-view-B892zYZV.d.ts} +1 -1
- package/dist/{with-materialized-view--4PsvMDu.d.cts → with-materialized-view-NzF71cG_.d.cts} +1 -1
- package/dist/{with-overlayed-view-BEXfpzSb.d.ts → with-overlayed-view-CR6m7CHe.d.ts} +1 -1
- package/dist/{with-overlayed-view-DlH5qmeB.d.cts → with-overlayed-view-UI8qSGL4.d.cts} +1 -1
- package/package.json +23 -3
- package/dist/chunk-535SSHBS.js.map +0 -1
- package/dist/chunk-667MB6AH.js.map +0 -1
- package/dist/chunk-7BQ4QWYX.js.map +0 -1
- package/dist/chunk-DUREQF5W.js.map +0 -1
- package/dist/chunk-F3BPIPLS.js.map +0 -1
- package/dist/chunk-GNI5STXQ.js.map +0 -1
- package/dist/chunk-HOR4R722.js.map +0 -1
- package/dist/chunk-KABJXG2F.js.map +0 -1
- package/dist/chunk-YULZKK4F.js.map +0 -1
- package/dist/executor-6ZDSDZ6V.js +0 -8
- package/dist/executor-AZLS3KBK.js +0 -11
- package/dist/executor-IDZDAFNH.js +0 -8
- package/dist/issue-RZP3VI6O.js +0 -12
- package/dist/noydb-WCMY2ZOW.js +0 -35
- package/dist/registry-EB6SISTA.js +0 -8
- package/dist/registry-IUZQVVBB.js +0 -8
- /package/dist/{chunk-G4SCICH5.js.map → chunk-2FU2FTXD.js.map} +0 -0
- /package/dist/{chunk-JD3OZAI4.js.map → chunk-3G3W65EQ.js.map} +0 -0
- /package/dist/{chunk-XWH4MXIU.js.map → chunk-5AXTH4QZ.js.map} +0 -0
- /package/dist/{chunk-4TBBMHVC.js.map → chunk-5LIROIDM.js.map} +0 -0
- /package/dist/{chunk-L2BNJ6HM.js.map → chunk-7H2GEJ3O.js.map} +0 -0
- /package/dist/{chunk-QSUK7YWK.js.map → chunk-BH3X5L6A.js.map} +0 -0
- /package/dist/{chunk-BQ65SS5A.js.map → chunk-BJSLBUJ7.js.map} +0 -0
- /package/dist/{chunk-FFXM3ZIF.js.map → chunk-BL5GYANC.js.map} +0 -0
- /package/dist/{chunk-6H2ZUNR7.js.map → chunk-BSZOCSDZ.js.map} +0 -0
- /package/dist/{chunk-ZNQYHJXX.js.map → chunk-C3HYQPV4.js.map} +0 -0
- /package/dist/{chunk-E2CDVKMH.js.map → chunk-CD2AVTEM.js.map} +0 -0
- /package/dist/{chunk-BR3AMFGS.js.map → chunk-DWEBTE2W.js.map} +0 -0
- /package/dist/{chunk-Z4DO7YSI.js.map → chunk-DYYYUW5D.js.map} +0 -0
- /package/dist/{chunk-SCJPI4Z5.js.map → chunk-E77UKJYL.js.map} +0 -0
- /package/dist/{chunk-OMAMZKKD.js.map → chunk-F4G63NTZ.js.map} +0 -0
- /package/dist/{chunk-TKIY625R.js.map → chunk-FEJDVE3Z.js.map} +0 -0
- /package/dist/{chunk-7Z7KSVA5.js.map → chunk-GP3SDSH2.js.map} +0 -0
- /package/dist/{chunk-IQLVUT37.js.map → chunk-H2MRGONI.js.map} +0 -0
- /package/dist/{chunk-CJORTUJ2.js.map → chunk-J7RWBXFY.js.map} +0 -0
- /package/dist/{chunk-AAVWKNZW.js.map → chunk-JDWE6JMX.js.map} +0 -0
- /package/dist/{chunk-XL35NSEN.js.map → chunk-KCEHMDZF.js.map} +0 -0
- /package/dist/{chunk-TS26M2SB.js.map → chunk-M476FOQ7.js.map} +0 -0
- /package/dist/{chunk-F4OJZIWQ.js.map → chunk-NBBMMJ2H.js.map} +0 -0
- /package/dist/{chunk-CZI2A4MQ.js.map → chunk-NYSYPFXJ.js.map} +0 -0
- /package/dist/{chunk-OQSRJG6A.js.map → chunk-PDULVIBY.js.map} +0 -0
- /package/dist/{chunk-DLZ2ONOD.js.map → chunk-QHM6XEAH.js.map} +0 -0
- /package/dist/{chunk-HBXJ37ZY.js.map → chunk-QO6RGLLD.js.map} +0 -0
- /package/dist/{chunk-42FEUPZQ.js.map → chunk-ROVO6NPJ.js.map} +0 -0
- /package/dist/{chunk-6RR3MNMG.js.map → chunk-SHX5QBCI.js.map} +0 -0
- /package/dist/{chunk-3YWP3WBP.js.map → chunk-SNMJ7SB3.js.map} +0 -0
- /package/dist/{chunk-IXBIFDEW.js.map → chunk-TIDXB5DF.js.map} +0 -0
- /package/dist/{chunk-FWPKCXTN.js.map → chunk-WIAOUFFB.js.map} +0 -0
- /package/dist/{chunk-X73VS74Y.js.map → chunk-XJV6OB4D.js.map} +0 -0
- /package/dist/{chunk-VLMPU56Q.js.map → chunk-XMHUK5PN.js.map} +0 -0
- /package/dist/{chunk-BI6ETQPF.js.map → chunk-XMVHEWF6.js.map} +0 -0
- /package/dist/{chunk-OB2ZJQ2D.js.map → chunk-YYVZYTWW.js.map} +0 -0
- /package/dist/{chunk-QVIEAYTP.js.map → chunk-ZNGPEV5J.js.map} +0 -0
- /package/dist/{crypto-QXQOHMHF.js.map → crypto-7BN2HDWG.js.map} +0 -0
- /package/dist/{delegation-NIQ43IPU.js.map → delegation-MGH5SODX.js.map} +0 -0
- /package/dist/{executor-6ZDSDZ6V.js.map → executor-3W63Y44O.js.map} +0 -0
- /package/dist/{executor-AZLS3KBK.js.map → executor-CFFWPWBJ.js.map} +0 -0
- /package/dist/{executor-IDZDAFNH.js.map → executor-VDQQOR4F.js.map} +0 -0
- /package/dist/{fanout-sidecar-67CMI3UT.js.map → fanout-sidecar-FIJJ46YG.js.map} +0 -0
- /package/dist/{issue-RZP3VI6O.js.map → forget/index.js.map} +0 -0
- /package/dist/{ledger-A3LL253R.js.map → issue-TTMGHQ2J.js.map} +0 -0
- /package/dist/{noydb-WCMY2ZOW.js.map → ledger-LFVLHE5H.js.map} +0 -0
- /package/dist/{public-envelope-YP2UWMLG.js.map → noydb-36S6GQNC.js.map} +0 -0
- /package/dist/{registry-EB6SISTA.js.map → public-envelope-RXZNP3V6.js.map} +0 -0
- /package/dist/{registry-IUZQVVBB.js.map → registry-3YFLZ7WD.js.map} +0 -0
- /package/dist/{registry-UTA4CLQS.js.map → registry-SECUWSGY.js.map} +0 -0
- /package/dist/{revoke-HNMQZSCL.js.map → registry-TGZISEWC.js.map} +0 -0
- /package/dist/{signer-DCMNKXSF.js.map → revoke-B54H2S2W.js.map} +0 -0
- /package/dist/{stale-W5PQTRYH.js.map → signer-YSXZT574.js.map} +0 -0
- /package/dist/{state-vault-TMXZRTY5.js.map → state-vault-W2OEABNO.js.map} +0 -0
- /package/dist/{vault-group-DX2HFQMX.js.map → vault-group-DHAHFX2A.js.map} +0 -0
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b2 as NoydbStore } from '../types-CrSpRDuG.cjs';
|
|
2
2
|
import { AttestationFieldSchema, QrPayload, RevocationList } from '@noy-db/attestation';
|
|
3
3
|
export { AttestationFieldSchema, QrPayload, RevocationList, VerifyInput, VerifyResult, decodeQr, isRevoked, signRevocationList, verifyAttestation, verifyRevocationList } from '@noy-db/attestation';
|
|
4
|
-
export {
|
|
4
|
+
export { r as AttestationError } from '../errors-Dz64FA65.cjs';
|
|
5
5
|
import '../lazy-builder-eYZzLEL1.cjs';
|
|
6
6
|
import '../predicate-BmhBSPCH.cjs';
|
|
7
|
+
import '../strategy-CLC1j79g.cjs';
|
|
7
8
|
import '../strategy-BSxFXGzb.cjs';
|
|
8
|
-
import '../index-
|
|
9
|
+
import '../index-C-SSRIxP.cjs';
|
|
10
|
+
import '../index-u-kWzSrL.cjs';
|
|
9
11
|
|
|
10
12
|
/** Everything issueAttestationCore needs from the Vault, injected for testability. */
|
|
11
13
|
interface IssueContext {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b2 as NoydbStore } from '../types-CljIHm_J.js';
|
|
2
2
|
import { AttestationFieldSchema, QrPayload, RevocationList } from '@noy-db/attestation';
|
|
3
3
|
export { AttestationFieldSchema, QrPayload, RevocationList, VerifyInput, VerifyResult, decodeQr, isRevoked, signRevocationList, verifyAttestation, verifyRevocationList } from '@noy-db/attestation';
|
|
4
|
-
export {
|
|
4
|
+
export { r as AttestationError } from '../errors-Dz64FA65.js';
|
|
5
5
|
import '../lazy-builder-ChSqcF5t.js';
|
|
6
6
|
import '../predicate-BmhBSPCH.js';
|
|
7
|
+
import '../strategy-4M9jo172.js';
|
|
7
8
|
import '../strategy-BSxFXGzb.js';
|
|
8
|
-
import '../index-
|
|
9
|
+
import '../index-C-SSRIxP.js';
|
|
10
|
+
import '../index-DpU6KWof.js';
|
|
9
11
|
|
|
10
12
|
/** Everything issueAttestationCore needs from the Vault, injected for testability. */
|
|
11
13
|
interface IssueContext {
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
issueAttestationCore
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-SNMJ7SB3.js";
|
|
4
4
|
import {
|
|
5
5
|
getRevokedDocIdsCore,
|
|
6
6
|
publishRevocationListCore,
|
|
7
7
|
revokeDocCore,
|
|
8
8
|
unrevokeDocCore
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-CD2AVTEM.js";
|
|
10
10
|
import {
|
|
11
11
|
ATTESTATIONS_COLLECTION
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-TIDXB5DF.js";
|
|
13
13
|
import "../chunk-FZU343FL.js";
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
14
|
+
import "../chunk-SISBMAPO.js";
|
|
15
|
+
import "../chunk-UNTGHX5A.js";
|
|
16
16
|
import {
|
|
17
17
|
AttestationError
|
|
18
|
-
} from "../chunk-
|
|
18
|
+
} from "../chunk-ZEGSDPB7.js";
|
|
19
19
|
|
|
20
20
|
// src/attestation/index.ts
|
|
21
21
|
import { verifyAttestation, decodeQr, verifyRevocationList, isRevoked, signRevocationList } from "@noy-db/attestation";
|
package/dist/blobs/index.cjs
CHANGED
|
@@ -90,7 +90,9 @@ __export(crypto_exports, {
|
|
|
90
90
|
generateSalt: () => generateSalt,
|
|
91
91
|
hmacSha256Hex: () => hmacSha256Hex,
|
|
92
92
|
sha256Hex: () => sha256Hex,
|
|
93
|
+
unwrapCek: () => unwrapCek,
|
|
93
94
|
unwrapKey: () => unwrapKey,
|
|
95
|
+
wrapCek: () => wrapCek,
|
|
94
96
|
wrapKey: () => wrapKey
|
|
95
97
|
});
|
|
96
98
|
async function deriveKey(passphrase, salt) {
|
|
@@ -141,6 +143,39 @@ async function unwrapKey(wrappedBase64, kek) {
|
|
|
141
143
|
throw new InvalidKeyError();
|
|
142
144
|
}
|
|
143
145
|
}
|
|
146
|
+
async function asKwKey(dek) {
|
|
147
|
+
const rawDek = await subtle.exportKey("raw", dek);
|
|
148
|
+
const hkdfKey = await subtle.importKey("raw", rawDek, "HKDF", false, ["deriveBits"]);
|
|
149
|
+
const salt = new TextEncoder().encode("noydb-cek-wrap");
|
|
150
|
+
const info = new TextEncoder().encode("v1");
|
|
151
|
+
const bits = await subtle.deriveBits(
|
|
152
|
+
{ name: "HKDF", hash: "SHA-256", salt, info },
|
|
153
|
+
hkdfKey,
|
|
154
|
+
KEY_BITS
|
|
155
|
+
);
|
|
156
|
+
return subtle.importKey("raw", bits, "AES-KW", false, ["wrapKey", "unwrapKey"]);
|
|
157
|
+
}
|
|
158
|
+
async function wrapCek(cek, dek) {
|
|
159
|
+
const kw = await asKwKey(dek);
|
|
160
|
+
const wrapped = await subtle.wrapKey("raw", cek, kw, "AES-KW");
|
|
161
|
+
return bufferToBase64(wrapped);
|
|
162
|
+
}
|
|
163
|
+
async function unwrapCek(wrappedBase64, dek) {
|
|
164
|
+
const kw = await asKwKey(dek);
|
|
165
|
+
try {
|
|
166
|
+
return await subtle.unwrapKey(
|
|
167
|
+
"raw",
|
|
168
|
+
base64ToBuffer(wrappedBase64),
|
|
169
|
+
kw,
|
|
170
|
+
"AES-KW",
|
|
171
|
+
{ name: "AES-GCM", length: KEY_BITS },
|
|
172
|
+
true,
|
|
173
|
+
["encrypt", "decrypt"]
|
|
174
|
+
);
|
|
175
|
+
} catch {
|
|
176
|
+
throw new InvalidKeyError();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
144
179
|
async function encrypt(plaintext, dek) {
|
|
145
180
|
const iv = generateIV();
|
|
146
181
|
const encoded = new TextEncoder().encode(plaintext);
|
|
@@ -373,6 +408,11 @@ var NOYDB_FORMAT_VERSION = 1;
|
|
|
373
408
|
|
|
374
409
|
// src/blobs/blob-set.ts
|
|
375
410
|
init_crypto();
|
|
411
|
+
|
|
412
|
+
// src/record-keys/index.ts
|
|
413
|
+
init_crypto();
|
|
414
|
+
|
|
415
|
+
// src/blobs/blob-set.ts
|
|
376
416
|
init_errors();
|
|
377
417
|
|
|
378
418
|
// src/blobs/mime-magic.ts
|
|
@@ -642,6 +682,7 @@ var BlobSet = class {
|
|
|
642
682
|
encrypted;
|
|
643
683
|
userId;
|
|
644
684
|
maxBlobBytes;
|
|
685
|
+
erasableBlobs;
|
|
645
686
|
constructor(opts) {
|
|
646
687
|
this.store = opts.store;
|
|
647
688
|
this.vault = opts.vault;
|
|
@@ -651,6 +692,21 @@ var BlobSet = class {
|
|
|
651
692
|
this.encrypted = opts.encrypted;
|
|
652
693
|
this.userId = opts.userId;
|
|
653
694
|
this.maxBlobBytes = opts.maxBlobBytes;
|
|
695
|
+
this.erasableBlobs = opts.erasableBlobs === true;
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Resolve the key the blob's CHUNKS are encrypted under.
|
|
699
|
+
*
|
|
700
|
+
* - `_cek` present (erasable blob) → unwrap the per-blob content CEK under
|
|
701
|
+
* the `_blob` DEK. Deleting the BlobObject (at `refCount → 0`) makes this
|
|
702
|
+
* key unrecoverable → the chunks are crypto-shredded.
|
|
703
|
+
* - `_cek` absent (legacy) → the `_blob` DEK encrypts chunks directly.
|
|
704
|
+
* - unencrypted vault → `null` (chunks stored as plaintext base64).
|
|
705
|
+
*/
|
|
706
|
+
async resolveChunkKey(blob) {
|
|
707
|
+
if (!this.encrypted) return null;
|
|
708
|
+
const blobDEK = await this.getDEK(BLOB_COLLECTION);
|
|
709
|
+
return blob._cek !== void 0 ? await unwrapCek(blob._cek, blobDEK) : blobDEK;
|
|
654
710
|
}
|
|
655
711
|
/** The internal collection that holds slot metadata for this collection's blobs. */
|
|
656
712
|
get slotsCollection() {
|
|
@@ -768,12 +824,163 @@ var BlobSet = class {
|
|
|
768
824
|
const updated = { ...blob, refCount: blob.refCount + delta };
|
|
769
825
|
try {
|
|
770
826
|
await this.writeBlobObject(updated, version);
|
|
827
|
+
return updated.refCount;
|
|
828
|
+
} catch (err) {
|
|
829
|
+
if (err instanceof ConflictError && attempt < MAX_CAS_RETRIES - 1) continue;
|
|
830
|
+
throw err;
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
throw new ConflictError(-1);
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* Release `n` references to a blob and reclaim it at refCount 0 (#365 slice 4).
|
|
837
|
+
*
|
|
838
|
+
* The single reclaim choke point for every reference-drop path — slot
|
|
839
|
+
* delete/overwrite, published-version delete, and `forget()` shred — so the
|
|
840
|
+
* refCount-0 policy is uniform:
|
|
841
|
+
* - **erasable blob** (`_cek` present) → delete the `BlobObject` (the SOLE
|
|
842
|
+
* copy of the wrapped content CEK → chunks permanently undecryptable) and
|
|
843
|
+
* reclaim the chunks. The crypto-shred is EAGER on every path: GDPR erasure
|
|
844
|
+
* must not wait on orphan retention.
|
|
845
|
+
* - **legacy blob** (no `_cek`) → reclaimed only when `reclaimLegacy` (the
|
|
846
|
+
* `forget()` erasure path); otherwise left for deferred GC so the existing
|
|
847
|
+
* `BlobLifecyclePolicy.orphanRetentionDays` semantics are preserved.
|
|
848
|
+
*
|
|
849
|
+
* @returns `'shredded'` (erasable, refCount 0, chunks dead) · `'retainedShared'`
|
|
850
|
+
* (erasable, still referenced) · `'residue'` (legacy — not a crypto-shred).
|
|
851
|
+
*/
|
|
852
|
+
async releaseRef(eTag, n, reclaimLegacy) {
|
|
853
|
+
const loaded = await this.loadBlobObject(eTag);
|
|
854
|
+
if (!loaded) return "shredded";
|
|
855
|
+
const erasable = loaded.blob._cek !== void 0;
|
|
856
|
+
const remaining = await this.casUpdateRefCount(eTag, -n);
|
|
857
|
+
if (remaining > 0) return erasable ? "retainedShared" : "residue";
|
|
858
|
+
if (erasable || reclaimLegacy) {
|
|
859
|
+
await this.store.delete(this.vault, BLOB_INDEX_COLLECTION, eTag);
|
|
860
|
+
for (let i = 0; i < loaded.blob.chunkCount; i++) {
|
|
861
|
+
await this.store.delete(this.vault, BLOB_CHUNKS_COLLECTION, `${eTag}_${i}`);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
return erasable ? "shredded" : "residue";
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Crypto-shred this record's blob attachments (#365 slice 2) — called by
|
|
868
|
+
* `vault.forget()`.
|
|
869
|
+
*
|
|
870
|
+
* For each distinct eTag the record references (a record may attach the same
|
|
871
|
+
* content under several slot names → several refCount holds): decrement the
|
|
872
|
+
* blob's refCount by that many. When it reaches 0:
|
|
873
|
+
* - **erasable blob** (`_cek` present) → delete the `BlobObject` (the SOLE
|
|
874
|
+
* recoverable copy of the wrapped content CEK → chunks permanently
|
|
875
|
+
* undecryptable) and reclaim the chunk bytes. This is the crypto-shred.
|
|
876
|
+
* - **legacy blob** (no `_cek`) → chunks are under the shared `_blob` DEK and
|
|
877
|
+
* stay decryptable until byte-deleted; we delete the orphaned chunks +
|
|
878
|
+
* index but report it as residue, not a cryptographic erasure.
|
|
879
|
+
* When refCount stays > 0 the content legitimately persists for its other
|
|
880
|
+
* owner — reported as `retainedShared` (or `residue` if legacy).
|
|
881
|
+
*
|
|
882
|
+
* Finally drops the record's slot map, severing the subject's link.
|
|
883
|
+
*/
|
|
884
|
+
async shredAllForRecord() {
|
|
885
|
+
const { slots } = await this.loadSlots();
|
|
886
|
+
const slotNames = Object.keys(slots);
|
|
887
|
+
const shredded = [];
|
|
888
|
+
const retainedShared = [];
|
|
889
|
+
const residue = [];
|
|
890
|
+
if (slotNames.length === 0) return { shredded, retainedShared, residue };
|
|
891
|
+
const holds = /* @__PURE__ */ new Map();
|
|
892
|
+
for (const name of slotNames) {
|
|
893
|
+
const eTag = slots[name].eTag;
|
|
894
|
+
holds.set(eTag, (holds.get(eTag) ?? 0) + 1);
|
|
895
|
+
}
|
|
896
|
+
for (const [eTag, n] of holds) {
|
|
897
|
+
const outcome = await this.releaseRef(eTag, n, true);
|
|
898
|
+
if (outcome === "shredded") shredded.push(eTag);
|
|
899
|
+
else if (outcome === "retainedShared") retainedShared.push(eTag);
|
|
900
|
+
else residue.push(eTag);
|
|
901
|
+
}
|
|
902
|
+
await this.store.delete(this.vault, this.slotsCollection, this.recordId);
|
|
903
|
+
return { shredded, retainedShared, residue };
|
|
904
|
+
}
|
|
905
|
+
/** CAS retry loop for an arbitrary BlobObject mutation. */
|
|
906
|
+
async casUpdateBlobObject(eTag, mutate) {
|
|
907
|
+
for (let attempt = 0; attempt < MAX_CAS_RETRIES; attempt++) {
|
|
908
|
+
const result = await this.loadBlobObject(eTag);
|
|
909
|
+
if (!result) throw new NotFoundError(`BlobObject ${eTag} not found`);
|
|
910
|
+
try {
|
|
911
|
+
await this.writeBlobObject(mutate(result.blob), result.version);
|
|
771
912
|
return;
|
|
772
913
|
} catch (err) {
|
|
773
914
|
if (err instanceof ConflictError && attempt < MAX_CAS_RETRIES - 1) continue;
|
|
774
915
|
throw err;
|
|
775
916
|
}
|
|
776
917
|
}
|
|
918
|
+
throw new ConflictError(-1);
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Migrate this record's LEGACY blobs (no `_cek`, chunks under the shared
|
|
922
|
+
* `_blob` DEK) to per-blob content CEKs so they become crypto-shreddable
|
|
923
|
+
* (#365 slice 3). Returns the eTags migrated vs. already-erasable.
|
|
924
|
+
*
|
|
925
|
+
* **Explicit maintenance pass** (mirrors the record-CEK migration posture):
|
|
926
|
+
* re-encrypts the existing compressed chunks IN PLACE under a fresh content
|
|
927
|
+
* CEK — preserving the eTag, chunkCount, chunkSize, and compression — then
|
|
928
|
+
* flips the `_cek` discriminant. Crash-safe + idempotent via `_cekPending`:
|
|
929
|
+
* 1. persist the wrapped content CEK in `_cekPending` (readers ignore it →
|
|
930
|
+
* the blob stays readable under the `_blob` DEK; the key survives a crash);
|
|
931
|
+
* 2. re-encrypt each chunk under the content CEK (a resume reads an
|
|
932
|
+
* already-migrated chunk under the content CEK, else under the `_blob` DEK);
|
|
933
|
+
* 3. promote `_cekPending` → `_cek` (atomic flip). Reads now use the CEK.
|
|
934
|
+
* A re-run after a crash resumes from whichever phase was reached.
|
|
935
|
+
*
|
|
936
|
+
* Dedup-safe: migrating a shared blob (refCount > 1) re-keys it for every
|
|
937
|
+
* referencer at once; a non-erasable collection still reads it (it unwraps
|
|
938
|
+
* `_cek` under the `_blob` DEK it holds).
|
|
939
|
+
*/
|
|
940
|
+
async migrate() {
|
|
941
|
+
const migrated = [];
|
|
942
|
+
const alreadyErasable = [];
|
|
943
|
+
if (!this.encrypted) return { migrated, alreadyErasable };
|
|
944
|
+
const blobDEK = await this.getDEK(BLOB_COLLECTION);
|
|
945
|
+
const { slots } = await this.loadSlots();
|
|
946
|
+
const eTags = new Set(Object.values(slots).map((s) => s.eTag));
|
|
947
|
+
for (const eTag of eTags) {
|
|
948
|
+
const loaded = await this.loadBlobObject(eTag);
|
|
949
|
+
if (!loaded) continue;
|
|
950
|
+
const blob = loaded.blob;
|
|
951
|
+
if (blob._cek !== void 0) {
|
|
952
|
+
alreadyErasable.push(eTag);
|
|
953
|
+
continue;
|
|
954
|
+
}
|
|
955
|
+
let contentCek;
|
|
956
|
+
if (blob._cekPending !== void 0) {
|
|
957
|
+
contentCek = await unwrapCek(blob._cekPending, blobDEK);
|
|
958
|
+
} else {
|
|
959
|
+
contentCek = await generateDEK();
|
|
960
|
+
const wrapped = await wrapCek(contentCek, blobDEK);
|
|
961
|
+
await this.casUpdateBlobObject(eTag, (b) => ({ ...b, _cekPending: wrapped }));
|
|
962
|
+
}
|
|
963
|
+
for (let i = 0; i < blob.chunkCount; i++) {
|
|
964
|
+
let raw;
|
|
965
|
+
try {
|
|
966
|
+
raw = await this.readChunk(eTag, i, blob.chunkCount, blobDEK);
|
|
967
|
+
} catch {
|
|
968
|
+
raw = await this.readChunk(eTag, i, blob.chunkCount, contentCek);
|
|
969
|
+
}
|
|
970
|
+
if (!raw) {
|
|
971
|
+
throw new NotFoundError(
|
|
972
|
+
`Blob chunk ${i}/${blob.chunkCount} missing for eTag "${eTag}" during migration`
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
await this.writeChunk(eTag, i, blob.chunkCount, raw, contentCek);
|
|
976
|
+
}
|
|
977
|
+
await this.casUpdateBlobObject(eTag, (b) => {
|
|
978
|
+
const { _cekPending, ...rest } = b;
|
|
979
|
+
return _cekPending === void 0 ? b : { ...rest, _cek: _cekPending };
|
|
980
|
+
});
|
|
981
|
+
migrated.push(eTag);
|
|
982
|
+
}
|
|
983
|
+
return { migrated, alreadyErasable };
|
|
777
984
|
}
|
|
778
985
|
// ─── Chunk I/O (with AAD binding) ─────────────────────────────────
|
|
779
986
|
async writeChunk(eTag, index, chunkCount, chunk, dek) {
|
|
@@ -845,10 +1052,10 @@ var BlobSet = class {
|
|
|
845
1052
|
}
|
|
846
1053
|
// ─── Fetch all chunks for a blob ──────────────────────────────────
|
|
847
1054
|
async fetchAllChunks(blob) {
|
|
848
|
-
const
|
|
1055
|
+
const chunkKey = await this.resolveChunkKey(blob);
|
|
849
1056
|
const chunks = [];
|
|
850
1057
|
for (let i = 0; i < blob.chunkCount; i++) {
|
|
851
|
-
const chunk = await this.readChunk(blob.eTag, i, blob.chunkCount,
|
|
1058
|
+
const chunk = await this.readChunk(blob.eTag, i, blob.chunkCount, chunkKey);
|
|
852
1059
|
if (!chunk) {
|
|
853
1060
|
throw new NotFoundError(
|
|
854
1061
|
`Blob chunk ${i}/${blob.chunkCount} missing for eTag "${blob.eTag}" on record "${this.recordId}"`
|
|
@@ -895,6 +1102,13 @@ var BlobSet = class {
|
|
|
895
1102
|
const { bytes: compressed, algorithm } = shouldCompress ? await compressBytes(data) : { bytes: data, algorithm: "none" };
|
|
896
1103
|
const chunkSize = this.effectiveChunkSize(opts);
|
|
897
1104
|
const chunkCount = Math.max(1, Math.ceil(compressed.byteLength / chunkSize));
|
|
1105
|
+
let chunkKey = blobDEK;
|
|
1106
|
+
let wrappedCek;
|
|
1107
|
+
if (blobDEK && this.erasableBlobs) {
|
|
1108
|
+
const contentCek = await generateDEK();
|
|
1109
|
+
wrappedCek = await wrapCek(contentCek, blobDEK);
|
|
1110
|
+
chunkKey = contentCek;
|
|
1111
|
+
}
|
|
898
1112
|
for (let i = 0; i < chunkCount; i++) {
|
|
899
1113
|
const start = i * chunkSize;
|
|
900
1114
|
await this.writeChunk(
|
|
@@ -902,7 +1116,7 @@ var BlobSet = class {
|
|
|
902
1116
|
i,
|
|
903
1117
|
chunkCount,
|
|
904
1118
|
compressed.subarray(start, start + chunkSize),
|
|
905
|
-
|
|
1119
|
+
chunkKey
|
|
906
1120
|
);
|
|
907
1121
|
}
|
|
908
1122
|
await this.writeBlobObject({
|
|
@@ -914,7 +1128,8 @@ var BlobSet = class {
|
|
|
914
1128
|
chunkCount,
|
|
915
1129
|
...mimeType !== void 0 ? { mimeType } : {},
|
|
916
1130
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
917
|
-
refCount: 1
|
|
1131
|
+
refCount: 1,
|
|
1132
|
+
...wrappedCek !== void 0 ? { _cek: wrappedCek } : {}
|
|
918
1133
|
});
|
|
919
1134
|
}
|
|
920
1135
|
const uploaderUserId = opts?.uploadedBy ?? this.userId;
|
|
@@ -936,7 +1151,7 @@ var BlobSet = class {
|
|
|
936
1151
|
if (this._deferredRefDecrement) {
|
|
937
1152
|
const oldETag = this._deferredRefDecrement;
|
|
938
1153
|
this._deferredRefDecrement = void 0;
|
|
939
|
-
await this.
|
|
1154
|
+
await this.releaseRef(oldETag, 1, false).catch(() => {
|
|
940
1155
|
});
|
|
941
1156
|
}
|
|
942
1157
|
}
|
|
@@ -967,15 +1182,15 @@ var BlobSet = class {
|
|
|
967
1182
|
* Decrements refCount on the blob. Chunks are GC'd by `vault.blobGC()`.
|
|
968
1183
|
*/
|
|
969
1184
|
async delete(slotName) {
|
|
970
|
-
let
|
|
1185
|
+
let eTagToRelease;
|
|
971
1186
|
await this.casUpdateSlots((slots) => {
|
|
972
1187
|
if (!(slotName in slots)) return null;
|
|
973
|
-
|
|
1188
|
+
eTagToRelease = slots[slotName].eTag;
|
|
974
1189
|
delete slots[slotName];
|
|
975
1190
|
return slots;
|
|
976
1191
|
});
|
|
977
|
-
if (
|
|
978
|
-
await this.
|
|
1192
|
+
if (eTagToRelease) {
|
|
1193
|
+
await this.releaseRef(eTagToRelease, 1, false).catch(() => {
|
|
979
1194
|
});
|
|
980
1195
|
}
|
|
981
1196
|
}
|
|
@@ -1058,7 +1273,7 @@ var BlobSet = class {
|
|
|
1058
1273
|
await this.writeVersionRecord(slotName, record);
|
|
1059
1274
|
await this.casUpdateRefCount(slot.eTag, 1);
|
|
1060
1275
|
if (existing && existing.eTag !== slot.eTag) {
|
|
1061
|
-
await this.
|
|
1276
|
+
await this.releaseRef(existing.eTag, 1, false).catch(() => {
|
|
1062
1277
|
});
|
|
1063
1278
|
}
|
|
1064
1279
|
}
|
|
@@ -1101,7 +1316,7 @@ var BlobSet = class {
|
|
|
1101
1316
|
const record = await this.loadVersionRecord(slotName, label);
|
|
1102
1317
|
if (!record) return;
|
|
1103
1318
|
await this.deleteVersionRecord(slotName, label);
|
|
1104
|
-
await this.
|
|
1319
|
+
await this.releaseRef(record.eTag, 1, false).catch(() => {
|
|
1105
1320
|
});
|
|
1106
1321
|
}
|
|
1107
1322
|
/**
|