@backblaze-labs/b2-sdk 0.2.0 → 0.4.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.
- package/CHANGELOG.md +86 -1
- package/README.md +38 -7
- package/dist/_virtual/_b2-sdk-version-json.cjs +1 -1
- package/dist/_virtual/_b2-sdk-version-json.js +1 -1
- package/dist/auth/file.cjs.map +1 -1
- package/dist/auth/reauth-coalescer.cjs +65 -0
- package/dist/auth/reauth-coalescer.cjs.map +1 -0
- package/dist/auth/reauth-coalescer.d.cts +34 -0
- package/dist/auth/reauth-coalescer.d.cts.map +1 -0
- package/dist/auth/reauth-coalescer.d.ts +34 -0
- package/dist/auth/reauth-coalescer.d.ts.map +1 -0
- package/dist/auth/reauth-coalescer.js +65 -0
- package/dist/auth/reauth-coalescer.js.map +1 -0
- package/dist/backup/client.cjs +206 -0
- package/dist/backup/client.cjs.map +1 -0
- package/dist/backup/client.d.cts +238 -0
- package/dist/backup/client.d.cts.map +1 -0
- package/dist/backup/client.d.ts +238 -0
- package/dist/backup/client.d.ts.map +1 -0
- package/dist/backup/client.js +206 -0
- package/dist/backup/client.js.map +1 -0
- package/dist/backup/index.cjs +15 -0
- package/dist/backup/index.d.cts +22 -0
- package/dist/backup/index.d.cts.map +1 -0
- package/dist/backup/index.d.ts +22 -0
- package/dist/backup/index.d.ts.map +1 -0
- package/dist/backup/index.js +7 -0
- package/dist/backup/raw.cjs +168 -0
- package/dist/backup/raw.cjs.map +1 -0
- package/dist/backup/raw.d.cts +122 -0
- package/dist/backup/raw.d.cts.map +1 -0
- package/dist/backup/raw.d.ts +122 -0
- package/dist/backup/raw.d.ts.map +1 -0
- package/dist/backup/raw.js +168 -0
- package/dist/backup/raw.js.map +1 -0
- package/dist/bucket-validation.cjs +111 -0
- package/dist/bucket-validation.cjs.map +1 -0
- package/dist/bucket-validation.d.cts +27 -0
- package/dist/bucket-validation.d.cts.map +1 -0
- package/dist/bucket-validation.d.ts +27 -0
- package/dist/bucket-validation.d.ts.map +1 -0
- package/dist/bucket-validation.js +109 -0
- package/dist/bucket-validation.js.map +1 -0
- package/dist/bucket.cjs +125 -74
- package/dist/bucket.cjs.map +1 -1
- package/dist/bucket.d.cts +156 -61
- package/dist/bucket.d.cts.map +1 -1
- package/dist/bucket.d.ts +156 -61
- package/dist/bucket.d.ts.map +1 -1
- package/dist/bucket.js +125 -74
- package/dist/bucket.js.map +1 -1
- package/dist/client.cjs +29 -8
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +30 -9
- package/dist/client.d.cts.map +1 -1
- package/dist/client.d.ts +30 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +29 -8
- package/dist/client.js.map +1 -1
- package/dist/copy/large.cjs +5 -3
- package/dist/copy/large.cjs.map +1 -1
- package/dist/copy/large.d.cts.map +1 -1
- package/dist/copy/large.d.ts.map +1 -1
- package/dist/copy/large.js +5 -3
- package/dist/copy/large.js.map +1 -1
- package/dist/download/checksum.cjs +6 -2
- package/dist/download/checksum.cjs.map +1 -1
- package/dist/download/checksum.js +6 -2
- package/dist/download/checksum.js.map +1 -1
- package/dist/download/parallel.cjs +52 -15
- package/dist/download/parallel.cjs.map +1 -1
- package/dist/download/parallel.d.cts +8 -1
- package/dist/download/parallel.d.cts.map +1 -1
- package/dist/download/parallel.d.ts +8 -1
- package/dist/download/parallel.d.ts.map +1 -1
- package/dist/download/parallel.js +52 -15
- package/dist/download/parallel.js.map +1 -1
- package/dist/download/single.cjs +179 -19
- package/dist/download/single.cjs.map +1 -1
- package/dist/download/single.d.cts +10 -4
- package/dist/download/single.d.cts.map +1 -1
- package/dist/download/single.d.ts +10 -4
- package/dist/download/single.d.ts.map +1 -1
- package/dist/download/single.js +179 -19
- package/dist/download/single.js.map +1 -1
- package/dist/errors/index.cjs +196 -3
- package/dist/errors/index.cjs.map +1 -1
- package/dist/errors/index.d.cts +134 -0
- package/dist/errors/index.d.cts.map +1 -1
- package/dist/errors/index.d.ts +134 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +183 -4
- package/dist/errors/index.js.map +1 -1
- package/dist/http/non-idempotent-mutations.cjs +38 -0
- package/dist/http/non-idempotent-mutations.cjs.map +1 -0
- package/dist/http/non-idempotent-mutations.d.cts +25 -0
- package/dist/http/non-idempotent-mutations.d.cts.map +1 -0
- package/dist/http/non-idempotent-mutations.d.ts +25 -0
- package/dist/http/non-idempotent-mutations.d.ts.map +1 -0
- package/dist/http/non-idempotent-mutations.js +35 -0
- package/dist/http/non-idempotent-mutations.js.map +1 -0
- package/dist/http/retry.cjs +1 -1
- package/dist/http/retry.cjs.map +1 -1
- package/dist/http/retry.js +1 -1
- package/dist/http/retry.js.map +1 -1
- package/dist/http/transport.cjs +62 -23
- package/dist/http/transport.cjs.map +1 -1
- package/dist/http/transport.d.cts +30 -3
- package/dist/http/transport.d.cts.map +1 -1
- package/dist/http/transport.d.ts +30 -3
- package/dist/http/transport.d.ts.map +1 -1
- package/dist/http/transport.js +60 -22
- package/dist/http/transport.js.map +1 -1
- package/dist/http/user-agent.cjs +12 -1
- package/dist/http/user-agent.cjs.map +1 -1
- package/dist/http/user-agent.d.cts +8 -0
- package/dist/http/user-agent.d.cts.map +1 -1
- package/dist/http/user-agent.d.ts +8 -0
- package/dist/http/user-agent.d.ts.map +1 -1
- package/dist/http/user-agent.js +13 -3
- package/dist/http/user-agent.js.map +1 -1
- package/dist/index.cjs +50 -2
- package/dist/index.d.cts +15 -12
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +15 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -10
- package/dist/notifications/index.cjs +3 -0
- package/dist/notifications/index.d.cts +2 -0
- package/dist/notifications/index.d.cts.map +1 -1
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +2 -1
- package/dist/object.cjs +13 -2
- package/dist/object.cjs.map +1 -1
- package/dist/object.d.cts +11 -3
- package/dist/object.d.cts.map +1 -1
- package/dist/object.d.ts +11 -3
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +13 -2
- package/dist/object.js.map +1 -1
- package/dist/partner/account-info.d.cts +43 -0
- package/dist/partner/account-info.d.cts.map +1 -0
- package/dist/partner/account-info.d.ts +43 -0
- package/dist/partner/account-info.d.ts.map +1 -0
- package/dist/partner/auth-clone.cjs +64 -0
- package/dist/partner/auth-clone.cjs.map +1 -0
- package/dist/partner/auth-clone.d.cts +27 -0
- package/dist/partner/auth-clone.d.cts.map +1 -0
- package/dist/partner/auth-clone.d.ts +27 -0
- package/dist/partner/auth-clone.d.ts.map +1 -0
- package/dist/partner/auth-clone.js +63 -0
- package/dist/partner/auth-clone.js.map +1 -0
- package/dist/partner/auth-core.cjs +156 -0
- package/dist/partner/auth-core.cjs.map +1 -0
- package/dist/partner/auth-core.d.cts +111 -0
- package/dist/partner/auth-core.d.cts.map +1 -0
- package/dist/partner/auth-core.d.ts +111 -0
- package/dist/partner/auth-core.d.ts.map +1 -0
- package/dist/partner/auth-core.js +156 -0
- package/dist/partner/auth-core.js.map +1 -0
- package/dist/partner/auth-shape.cjs +36 -0
- package/dist/partner/auth-shape.cjs.map +1 -0
- package/dist/partner/auth-shape.d.cts +12 -0
- package/dist/partner/auth-shape.d.cts.map +1 -0
- package/dist/partner/auth-shape.d.ts +12 -0
- package/dist/partner/auth-shape.d.ts.map +1 -0
- package/dist/partner/auth-shape.js +36 -0
- package/dist/partner/auth-shape.js.map +1 -0
- package/dist/partner/client.cjs +270 -0
- package/dist/partner/client.cjs.map +1 -0
- package/dist/partner/client.d.cts +357 -0
- package/dist/partner/client.d.cts.map +1 -0
- package/dist/partner/client.d.ts +357 -0
- package/dist/partner/client.d.ts.map +1 -0
- package/dist/partner/client.js +270 -0
- package/dist/partner/client.js.map +1 -0
- package/dist/partner/endpoint-url.cjs +109 -0
- package/dist/partner/endpoint-url.cjs.map +1 -0
- package/dist/partner/endpoint-url.d.cts +74 -0
- package/dist/partner/endpoint-url.d.cts.map +1 -0
- package/dist/partner/endpoint-url.d.ts +74 -0
- package/dist/partner/endpoint-url.d.ts.map +1 -0
- package/dist/partner/endpoint-url.js +106 -0
- package/dist/partner/endpoint-url.js.map +1 -0
- package/dist/partner/in-memory.cjs +135 -0
- package/dist/partner/in-memory.cjs.map +1 -0
- package/dist/partner/in-memory.d.cts +99 -0
- package/dist/partner/in-memory.d.cts.map +1 -0
- package/dist/partner/in-memory.d.ts +99 -0
- package/dist/partner/in-memory.d.ts.map +1 -0
- package/dist/partner/in-memory.js +135 -0
- package/dist/partner/in-memory.js.map +1 -0
- package/dist/partner/index.cjs +27 -0
- package/dist/partner/index.d.cts +32 -0
- package/dist/partner/index.d.cts.map +1 -0
- package/dist/partner/index.d.ts +32 -0
- package/dist/partner/index.d.ts.map +1 -0
- package/dist/partner/index.js +9 -0
- package/dist/partner/raw.cjs +400 -0
- package/dist/partner/raw.cjs.map +1 -0
- package/dist/partner/raw.d.cts +220 -0
- package/dist/partner/raw.d.cts.map +1 -0
- package/dist/partner/raw.d.ts +220 -0
- package/dist/partner/raw.d.ts.map +1 -0
- package/dist/partner/raw.js +398 -0
- package/dist/partner/raw.js.map +1 -0
- package/dist/partner/redaction-placeholders.cjs +10 -0
- package/dist/partner/redaction-placeholders.cjs.map +1 -0
- package/dist/partner/redaction-placeholders.d.cts +5 -0
- package/dist/partner/redaction-placeholders.d.cts.map +1 -0
- package/dist/partner/redaction-placeholders.d.ts +5 -0
- package/dist/partner/redaction-placeholders.d.ts.map +1 -0
- package/dist/partner/redaction-placeholders.js +9 -0
- package/dist/partner/redaction-placeholders.js.map +1 -0
- package/dist/partner/redaction.cjs +292 -0
- package/dist/partner/redaction.cjs.map +1 -0
- package/dist/partner/redaction.d.cts +158 -0
- package/dist/partner/redaction.d.cts.map +1 -0
- package/dist/partner/redaction.d.ts +158 -0
- package/dist/partner/redaction.d.ts.map +1 -0
- package/dist/partner/redaction.js +281 -0
- package/dist/partner/redaction.js.map +1 -0
- package/dist/raw/encoding.cjs +29 -10
- package/dist/raw/encoding.cjs.map +1 -1
- package/dist/raw/encoding.d.cts +3 -2
- package/dist/raw/encoding.d.cts.map +1 -1
- package/dist/raw/encoding.d.ts +3 -2
- package/dist/raw/encoding.d.ts.map +1 -1
- package/dist/raw/encoding.js +29 -10
- package/dist/raw/encoding.js.map +1 -1
- package/dist/raw/index.cjs +131 -44
- package/dist/raw/index.cjs.map +1 -1
- package/dist/raw/index.d.cts +21 -15
- package/dist/raw/index.d.cts.map +1 -1
- package/dist/raw/index.d.ts +21 -15
- package/dist/raw/index.d.ts.map +1 -1
- package/dist/raw/index.js +114 -45
- package/dist/raw/index.js.map +1 -1
- package/dist/raw/url.cjs +111 -0
- package/dist/raw/url.cjs.map +1 -0
- package/dist/raw/url.d.cts +41 -0
- package/dist/raw/url.d.cts.map +1 -0
- package/dist/raw/url.d.ts +41 -0
- package/dist/raw/url.d.ts.map +1 -0
- package/dist/raw/url.js +110 -0
- package/dist/raw/url.js.map +1 -0
- package/dist/s3/sigv4.cjs +15 -10
- package/dist/s3/sigv4.cjs.map +1 -1
- package/dist/s3/sigv4.js +15 -10
- package/dist/s3/sigv4.js.map +1 -1
- package/dist/simulator/index.cjs +1579 -257
- package/dist/simulator/index.cjs.map +1 -1
- package/dist/simulator/index.d.cts +124 -11
- package/dist/simulator/index.d.cts.map +1 -1
- package/dist/simulator/index.d.ts +124 -11
- package/dist/simulator/index.d.ts.map +1 -1
- package/dist/simulator/index.js +1568 -262
- package/dist/simulator/index.js.map +1 -1
- package/dist/simulator/partner-capabilities.cjs +77 -0
- package/dist/simulator/partner-capabilities.cjs.map +1 -0
- package/dist/simulator/partner-capabilities.d.cts +53 -0
- package/dist/simulator/partner-capabilities.d.cts.map +1 -0
- package/dist/simulator/partner-capabilities.d.ts +53 -0
- package/dist/simulator/partner-capabilities.d.ts.map +1 -0
- package/dist/simulator/partner-capabilities.js +73 -0
- package/dist/simulator/partner-capabilities.js.map +1 -0
- package/dist/simulator/partner.cjs +713 -0
- package/dist/simulator/partner.cjs.map +1 -0
- package/dist/simulator/partner.d.cts +186 -0
- package/dist/simulator/partner.d.cts.map +1 -0
- package/dist/simulator/partner.d.ts +186 -0
- package/dist/simulator/partner.d.ts.map +1 -0
- package/dist/simulator/partner.js +713 -0
- package/dist/simulator/partner.js.map +1 -0
- package/dist/simulator/validation.cjs +732 -25
- package/dist/simulator/validation.cjs.map +1 -1
- package/dist/simulator/validation.d.cts +145 -6
- package/dist/simulator/validation.d.cts.map +1 -1
- package/dist/simulator/validation.d.ts +145 -6
- package/dist/simulator/validation.d.ts.map +1 -1
- package/dist/simulator/validation.js +705 -26
- package/dist/simulator/validation.js.map +1 -1
- package/dist/streams/file-source.cjs +2 -2
- package/dist/streams/file-source.cjs.map +1 -1
- package/dist/streams/file-source.js +2 -2
- package/dist/streams/file-source.js.map +1 -1
- package/dist/streams/hash.cjs +246 -13
- package/dist/streams/hash.cjs.map +1 -1
- package/dist/streams/hash.d.cts +37 -12
- package/dist/streams/hash.d.cts.map +1 -1
- package/dist/streams/hash.d.ts +37 -12
- package/dist/streams/hash.d.ts.map +1 -1
- package/dist/streams/hash.js +246 -15
- package/dist/streams/hash.js.map +1 -1
- package/dist/streams/index.cjs +3 -1
- package/dist/streams/index.d.cts +1 -1
- package/dist/streams/index.d.cts.map +1 -1
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.d.ts.map +1 -1
- package/dist/streams/index.js +3 -3
- package/dist/streams/progress.cjs +63 -4
- package/dist/streams/progress.cjs.map +1 -1
- package/dist/streams/progress.d.cts +28 -2
- package/dist/streams/progress.d.cts.map +1 -1
- package/dist/streams/progress.d.ts +28 -2
- package/dist/streams/progress.d.ts.map +1 -1
- package/dist/streams/progress.js +63 -4
- package/dist/streams/progress.js.map +1 -1
- package/dist/streams/source.cjs +2 -1
- package/dist/streams/source.cjs.map +1 -1
- package/dist/streams/source.js +2 -1
- package/dist/streams/source.js.map +1 -1
- package/dist/sync/b2-sha1-reader.cjs +6 -2
- package/dist/sync/b2-sha1-reader.cjs.map +1 -1
- package/dist/sync/b2-sha1-reader.d.cts.map +1 -1
- package/dist/sync/b2-sha1-reader.d.ts.map +1 -1
- package/dist/sync/b2-sha1-reader.js +6 -2
- package/dist/sync/b2-sha1-reader.js.map +1 -1
- package/dist/sync/download-staging.cjs +156 -43
- package/dist/sync/download-staging.cjs.map +1 -1
- package/dist/sync/download-staging.d.cts +26 -2
- package/dist/sync/download-staging.d.cts.map +1 -1
- package/dist/sync/download-staging.d.ts +26 -2
- package/dist/sync/download-staging.d.ts.map +1 -1
- package/dist/sync/download-staging.js +155 -44
- package/dist/sync/download-staging.js.map +1 -1
- package/dist/sync/filters.cjs.map +1 -1
- package/dist/sync/filters.js.map +1 -1
- package/dist/sync/index.d.cts +1 -1
- package/dist/sync/index.d.cts.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/local-file-io.cjs +15 -6
- package/dist/sync/local-file-io.cjs.map +1 -1
- package/dist/sync/local-file-io.d.cts +3 -0
- package/dist/sync/local-file-io.d.cts.map +1 -1
- package/dist/sync/local-file-io.d.ts +3 -0
- package/dist/sync/local-file-io.d.ts.map +1 -1
- package/dist/sync/local-file-io.js +15 -6
- package/dist/sync/local-file-io.js.map +1 -1
- package/dist/sync/local-sha1.cjs +6 -15
- package/dist/sync/local-sha1.cjs.map +1 -1
- package/dist/sync/local-sha1.d.cts +0 -8
- package/dist/sync/local-sha1.d.cts.map +1 -1
- package/dist/sync/local-sha1.d.ts +0 -8
- package/dist/sync/local-sha1.d.ts.map +1 -1
- package/dist/sync/local-sha1.js +7 -15
- package/dist/sync/local-sha1.js.map +1 -1
- package/dist/sync/pairing.cjs +1 -0
- package/dist/sync/pairing.cjs.map +1 -1
- package/dist/sync/pairing.js +1 -0
- package/dist/sync/pairing.js.map +1 -1
- package/dist/sync/policies/compare.cjs +5 -3
- package/dist/sync/policies/compare.cjs.map +1 -1
- package/dist/sync/policies/compare.d.cts.map +1 -1
- package/dist/sync/policies/compare.d.ts.map +1 -1
- package/dist/sync/policies/compare.js +6 -4
- package/dist/sync/policies/compare.js.map +1 -1
- package/dist/sync/policies/index.cjs +4 -10
- package/dist/sync/policies/index.cjs.map +1 -1
- package/dist/sync/policies/index.js +4 -10
- package/dist/sync/policies/index.js.map +1 -1
- package/dist/sync/scanners/b2.cjs +4 -2
- package/dist/sync/scanners/b2.cjs.map +1 -1
- package/dist/sync/scanners/b2.d.cts.map +1 -1
- package/dist/sync/scanners/b2.d.ts.map +1 -1
- package/dist/sync/scanners/b2.js +4 -2
- package/dist/sync/scanners/b2.js.map +1 -1
- package/dist/sync/scanners/local.cjs +150 -33
- package/dist/sync/scanners/local.cjs.map +1 -1
- package/dist/sync/scanners/local.d.cts +6 -0
- package/dist/sync/scanners/local.d.cts.map +1 -1
- package/dist/sync/scanners/local.d.ts +6 -0
- package/dist/sync/scanners/local.d.ts.map +1 -1
- package/dist/sync/scanners/local.js +150 -33
- package/dist/sync/scanners/local.js.map +1 -1
- package/dist/sync/synchronizer.cjs +79 -31
- package/dist/sync/synchronizer.cjs.map +1 -1
- package/dist/sync/synchronizer.d.cts +1 -0
- package/dist/sync/synchronizer.d.cts.map +1 -1
- package/dist/sync/synchronizer.d.ts +1 -0
- package/dist/sync/synchronizer.d.ts.map +1 -1
- package/dist/sync/synchronizer.js +79 -31
- package/dist/sync/synchronizer.js.map +1 -1
- package/dist/sync/types.d.cts +19 -3
- package/dist/sync/types.d.cts.map +1 -1
- package/dist/sync/types.d.ts +19 -3
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/types/auth.cjs +4 -0
- package/dist/types/auth.cjs.map +1 -1
- package/dist/types/auth.d.cts +4 -0
- package/dist/types/auth.d.cts.map +1 -1
- package/dist/types/auth.d.ts +4 -0
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +4 -0
- package/dist/types/auth.js.map +1 -1
- package/dist/types/backup.d.cts +85 -0
- package/dist/types/backup.d.cts.map +1 -0
- package/dist/types/backup.d.ts +85 -0
- package/dist/types/backup.d.ts.map +1 -0
- package/dist/types/bucket.cjs +81 -11
- package/dist/types/bucket.cjs.map +1 -1
- package/dist/types/bucket.d.cts +194 -41
- package/dist/types/bucket.d.cts.map +1 -1
- package/dist/types/bucket.d.ts +194 -41
- package/dist/types/bucket.d.ts.map +1 -1
- package/dist/types/bucket.js +67 -12
- package/dist/types/bucket.js.map +1 -1
- package/dist/types/download.cjs +62 -0
- package/dist/types/download.cjs.map +1 -0
- package/dist/types/download.d.cts +100 -16
- package/dist/types/download.d.cts.map +1 -1
- package/dist/types/download.d.ts +100 -16
- package/dist/types/download.d.ts.map +1 -1
- package/dist/types/download.js +61 -0
- package/dist/types/download.js.map +1 -0
- package/dist/types/encryption.cjs +76 -229
- package/dist/types/encryption.cjs.map +1 -1
- package/dist/types/encryption.d.cts +48 -6
- package/dist/types/encryption.d.cts.map +1 -1
- package/dist/types/encryption.d.ts +48 -6
- package/dist/types/encryption.d.ts.map +1 -1
- package/dist/types/encryption.js +74 -229
- package/dist/types/encryption.js.map +1 -1
- package/dist/types/errors.cjs +9 -0
- package/dist/types/errors.cjs.map +1 -1
- package/dist/types/errors.d.cts +1 -1
- package/dist/types/errors.d.cts.map +1 -1
- package/dist/types/errors.d.ts +1 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +9 -0
- package/dist/types/errors.js.map +1 -1
- package/dist/types/file.cjs +3 -0
- package/dist/types/file.cjs.map +1 -1
- package/dist/types/file.d.cts +140 -18
- package/dist/types/file.d.cts.map +1 -1
- package/dist/types/file.d.ts +140 -18
- package/dist/types/file.d.ts.map +1 -1
- package/dist/types/file.js +3 -1
- package/dist/types/file.js.map +1 -1
- package/dist/types/ids.cjs +30 -0
- package/dist/types/ids.cjs.map +1 -1
- package/dist/types/ids.d.cts +32 -0
- package/dist/types/ids.d.cts.map +1 -1
- package/dist/types/ids.d.ts +32 -0
- package/dist/types/ids.d.ts.map +1 -1
- package/dist/types/ids.js +28 -1
- package/dist/types/ids.js.map +1 -1
- package/dist/types/index.d.cts +16 -12
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.ts +16 -12
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/key.d.cts +4 -3
- package/dist/types/key.d.cts.map +1 -1
- package/dist/types/key.d.ts +4 -3
- package/dist/types/key.d.ts.map +1 -1
- package/dist/types/lock.cjs.map +1 -1
- package/dist/types/lock.d.cts +14 -0
- package/dist/types/lock.d.cts.map +1 -1
- package/dist/types/lock.d.ts +14 -0
- package/dist/types/lock.d.ts.map +1 -1
- package/dist/types/lock.js.map +1 -1
- package/dist/types/notifications.cjs +31 -1
- package/dist/types/notifications.cjs.map +1 -1
- package/dist/types/notifications.d.cts +31 -4
- package/dist/types/notifications.d.cts.map +1 -1
- package/dist/types/notifications.d.ts +31 -4
- package/dist/types/notifications.d.ts.map +1 -1
- package/dist/types/notifications.js +30 -2
- package/dist/types/notifications.js.map +1 -1
- package/dist/types/partner.cjs +32 -0
- package/dist/types/partner.cjs.map +1 -0
- package/dist/types/partner.d.cts +386 -0
- package/dist/types/partner.d.cts.map +1 -0
- package/dist/types/partner.d.ts +386 -0
- package/dist/types/partner.d.ts.map +1 -0
- package/dist/types/partner.js +29 -0
- package/dist/types/partner.js.map +1 -0
- package/dist/types/upload.d.cts +35 -18
- package/dist/types/upload.d.cts.map +1 -1
- package/dist/types/upload.d.ts +35 -18
- package/dist/types/upload.d.ts.map +1 -1
- package/dist/upload/abort-scope.cjs +0 -45
- package/dist/upload/abort-scope.cjs.map +1 -1
- package/dist/upload/abort-scope.d.cts +0 -22
- package/dist/upload/abort-scope.d.cts.map +1 -1
- package/dist/upload/abort-scope.d.ts +0 -22
- package/dist/upload/abort-scope.d.ts.map +1 -1
- package/dist/upload/abort-scope.js +1 -44
- package/dist/upload/abort-scope.js.map +1 -1
- package/dist/upload/finish.cjs +3 -8
- package/dist/upload/finish.cjs.map +1 -1
- package/dist/upload/finish.d.cts.map +1 -1
- package/dist/upload/finish.d.ts.map +1 -1
- package/dist/upload/finish.js +1 -6
- package/dist/upload/finish.js.map +1 -1
- package/dist/upload/large.cjs +15 -8
- package/dist/upload/large.cjs.map +1 -1
- package/dist/upload/large.d.cts +31 -8
- package/dist/upload/large.d.cts.map +1 -1
- package/dist/upload/large.d.ts +31 -8
- package/dist/upload/large.d.ts.map +1 -1
- package/dist/upload/large.js +15 -8
- package/dist/upload/large.js.map +1 -1
- package/dist/upload/options.cjs.map +1 -1
- package/dist/upload/options.d.cts +24 -0
- package/dist/upload/options.d.cts.map +1 -1
- package/dist/upload/options.d.ts +24 -0
- package/dist/upload/options.d.ts.map +1 -1
- package/dist/upload/options.js.map +1 -1
- package/dist/upload/resume.cjs +6 -4
- package/dist/upload/resume.cjs.map +1 -1
- package/dist/upload/resume.d.cts +9 -5
- package/dist/upload/resume.d.cts.map +1 -1
- package/dist/upload/resume.d.ts +9 -5
- package/dist/upload/resume.d.ts.map +1 -1
- package/dist/upload/resume.js +6 -4
- package/dist/upload/resume.js.map +1 -1
- package/dist/upload/retry.cjs +25 -13
- package/dist/upload/retry.cjs.map +1 -1
- package/dist/upload/retry.d.cts.map +1 -1
- package/dist/upload/retry.d.ts.map +1 -1
- package/dist/upload/retry.js +25 -13
- package/dist/upload/retry.js.map +1 -1
- package/dist/upload/single.cjs +35 -30
- package/dist/upload/single.cjs.map +1 -1
- package/dist/upload/single.d.cts +12 -0
- package/dist/upload/single.d.cts.map +1 -1
- package/dist/upload/single.d.ts +12 -0
- package/dist/upload/single.d.ts.map +1 -1
- package/dist/upload/single.js +35 -30
- package/dist/upload/single.js.map +1 -1
- package/dist/upload/stream.cjs +18 -5
- package/dist/upload/stream.cjs.map +1 -1
- package/dist/upload/stream.d.cts +12 -0
- package/dist/upload/stream.d.cts.map +1 -1
- package/dist/upload/stream.d.ts +12 -0
- package/dist/upload/stream.d.ts.map +1 -1
- package/dist/upload/stream.js +15 -2
- package/dist/upload/stream.js.map +1 -1
- package/dist/util/abort.cjs +114 -0
- package/dist/util/abort.cjs.map +1 -0
- package/dist/util/abort.d.cts +65 -0
- package/dist/util/abort.d.cts.map +1 -0
- package/dist/util/abort.d.ts +65 -0
- package/dist/util/abort.d.ts.map +1 -0
- package/dist/util/abort.js +109 -0
- package/dist/util/abort.js.map +1 -0
- package/dist/util/defaults.cjs +3 -0
- package/dist/util/defaults.cjs.map +1 -1
- package/dist/util/defaults.d.cts +2 -0
- package/dist/util/defaults.d.cts.map +1 -1
- package/dist/util/defaults.d.ts +2 -0
- package/dist/util/defaults.d.ts.map +1 -1
- package/dist/util/defaults.js +3 -1
- package/dist/util/defaults.js.map +1 -1
- package/dist/util/md5.cjs +211 -0
- package/dist/util/md5.cjs.map +1 -0
- package/dist/util/md5.d.cts +43 -0
- package/dist/util/md5.d.cts.map +1 -0
- package/dist/util/md5.d.ts +43 -0
- package/dist/util/md5.d.ts.map +1 -0
- package/dist/util/md5.js +209 -0
- package/dist/util/md5.js.map +1 -0
- package/dist/util/normalize.cjs +5 -5
- package/dist/util/normalize.cjs.map +1 -1
- package/dist/util/normalize.d.cts +7 -7
- package/dist/util/normalize.d.cts.map +1 -1
- package/dist/util/normalize.d.ts +7 -7
- package/dist/util/normalize.d.ts.map +1 -1
- package/dist/util/normalize.js +5 -5
- package/dist/util/normalize.js.map +1 -1
- package/dist/util/paginator.cjs +7 -1
- package/dist/util/paginator.cjs.map +1 -1
- package/dist/util/paginator.d.cts +3 -1
- package/dist/util/paginator.d.cts.map +1 -1
- package/dist/util/paginator.d.ts +3 -1
- package/dist/util/paginator.d.ts.map +1 -1
- package/dist/util/paginator.js +7 -1
- package/dist/util/paginator.js.map +1 -1
- package/dist/version.cjs +56 -4
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +53 -4
- package/dist/version.d.cts.map +1 -1
- package/dist/version.d.ts +53 -4
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +52 -5
- package/dist/version.js.map +1 -1
- package/package.json +47 -18
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import { B2BucketConfigurationError } from "../errors/index.js";
|
|
1
2
|
import { utf8Encoder } from "../util/text-codec.js";
|
|
3
|
+
import { BUCKET_INFO_KEY_MAX_BYTES, BUCKET_INFO_KEY_MIN_BYTES, BUCKET_INFO_KEY_PATTERN, BUCKET_INFO_RESERVED_PREFIX, BUCKET_INFO_VALUES_MAX_BYTES, BucketRetentionMode, BucketType, CORS_MAX_AGE_SECONDS_MAX, CORS_RULES_MAX_COUNT, CORS_RULE_MAX_BYTES, CORS_RULE_NAME_MAX_LENGTH, CORS_RULE_NAME_MIN_LENGTH, CORS_RULE_NAME_PATTERN, CORS_RULE_NAME_RESERVED_PREFIX, CorsOperation } from "../types/bucket.js";
|
|
4
|
+
import { assertValidBucketInfo, assertValidCorsRules } from "../bucket-validation.js";
|
|
5
|
+
import { Capability } from "../types/auth.js";
|
|
6
|
+
import { EventType } from "../types/notifications.js";
|
|
2
7
|
import { BUCKET_NAME_MAX, BUCKET_NAME_MIN, FILE_NAME_MAX_BYTES, getB2FileNameByteLength, hasB2FileNameControlCharacter, hasValidB2BucketNameShape, isB2BucketNameIpv4Address } from "../internal/b2-naming.js";
|
|
3
8
|
//#region src/simulator/validation.ts
|
|
4
9
|
/**
|
|
@@ -17,6 +22,80 @@ import { BUCKET_NAME_MAX, BUCKET_NAME_MIN, FILE_NAME_MAX_BYTES, getB2FileNameByt
|
|
|
17
22
|
* @packageDocumentation
|
|
18
23
|
*/
|
|
19
24
|
/**
|
|
25
|
+
* Deprecated compatibility alias for the former simulator bucketInfo pair-count cap.
|
|
26
|
+
*
|
|
27
|
+
* @deprecated B2 bucketInfo has no documented pair-count cap. Use the byte
|
|
28
|
+
* limit constants instead.
|
|
29
|
+
*/
|
|
30
|
+
var BUCKET_INFO_MAX_KEYS = Number.POSITIVE_INFINITY;
|
|
31
|
+
/**
|
|
32
|
+
* Deprecated compatibility alias for the former simulator per-value bucketInfo cap.
|
|
33
|
+
*
|
|
34
|
+
* @deprecated B2 bucketInfo limits aggregate value bytes, not per-value bytes.
|
|
35
|
+
* Use {@link BUCKET_INFO_VALUES_MAX_BYTES}.
|
|
36
|
+
*/
|
|
37
|
+
var BUCKET_INFO_VALUE_MAX = BUCKET_INFO_VALUES_MAX_BYTES;
|
|
38
|
+
/** Minimum length for application key names. */
|
|
39
|
+
var KEY_NAME_MIN = 1;
|
|
40
|
+
/** Maximum length for application key names. */
|
|
41
|
+
var KEY_NAME_MAX = 100;
|
|
42
|
+
var VALID_CAPABILITIES = new Set(Object.values(Capability));
|
|
43
|
+
/**
|
|
44
|
+
* Validates application-key capabilities against B2's supported capability set.
|
|
45
|
+
*
|
|
46
|
+
* @param capabilities - Caller-supplied capabilities array.
|
|
47
|
+
*
|
|
48
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
49
|
+
*
|
|
50
|
+
* @see https://www.backblaze.com/apidocs/b2-create-key
|
|
51
|
+
*/
|
|
52
|
+
function validateCreateKeyCapabilities(capabilities) {
|
|
53
|
+
if (!Array.isArray(capabilities)) return {
|
|
54
|
+
code: "bad_request",
|
|
55
|
+
message: "capabilities must be an array"
|
|
56
|
+
};
|
|
57
|
+
if (capabilities.length === 0) return {
|
|
58
|
+
code: "bad_request",
|
|
59
|
+
message: "capabilities must not be empty"
|
|
60
|
+
};
|
|
61
|
+
const unknownCapabilities = capabilities.filter((capability) => typeof capability !== "string" || !VALID_CAPABILITIES.has(capability));
|
|
62
|
+
if (unknownCapabilities.length > 0) return {
|
|
63
|
+
code: "bad_request",
|
|
64
|
+
message: `unknown capabilities: ${unknownCapabilities.map(String).join(", ")}`
|
|
65
|
+
};
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns a frozen copy of a previously validated application-key capability list.
|
|
70
|
+
*
|
|
71
|
+
* @param capabilities - Validated caller-supplied capabilities.
|
|
72
|
+
*
|
|
73
|
+
* @returns An immutable capability list safe to store internally.
|
|
74
|
+
*/
|
|
75
|
+
function normalizeCreateKeyCapabilities(capabilities) {
|
|
76
|
+
return Object.freeze([...capabilities]);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validates application-key names against B2's documented length limits.
|
|
80
|
+
*
|
|
81
|
+
* @param keyName - Caller-supplied keyName.
|
|
82
|
+
*
|
|
83
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
84
|
+
*
|
|
85
|
+
* @see https://www.backblaze.com/apidocs/b2-create-key
|
|
86
|
+
*/
|
|
87
|
+
function validateCreateKeyName(keyName) {
|
|
88
|
+
if (typeof keyName !== "string") return {
|
|
89
|
+
code: "bad_request",
|
|
90
|
+
message: "keyName must be a string"
|
|
91
|
+
};
|
|
92
|
+
if (keyName.length < 1 || keyName.length > 100) return {
|
|
93
|
+
code: "bad_request",
|
|
94
|
+
message: `keyName must be 1-100 characters`
|
|
95
|
+
};
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
20
99
|
* Validates a bucket name against B2's documented rules.
|
|
21
100
|
*
|
|
22
101
|
* @param name - Caller-supplied bucket name.
|
|
@@ -119,12 +198,6 @@ function validateFileInfo(info) {
|
|
|
119
198
|
};
|
|
120
199
|
return null;
|
|
121
200
|
}
|
|
122
|
-
/** Per-bucket bucketInfo total max keys. */
|
|
123
|
-
var BUCKET_INFO_MAX_KEYS = 10;
|
|
124
|
-
/** Per-key bucketInfo value byte cap. */
|
|
125
|
-
var BUCKET_INFO_VALUE_MAX = 2048;
|
|
126
|
-
/** Allowed key character set for bucketInfo. */
|
|
127
|
-
var BUCKET_INFO_KEY_REGEX = /^[a-zA-Z0-9_-]+$/;
|
|
128
201
|
/**
|
|
129
202
|
* Validates a `bucketInfo` record against B2's per-bucket metadata rules.
|
|
130
203
|
*
|
|
@@ -132,27 +205,13 @@ var BUCKET_INFO_KEY_REGEX = /^[a-zA-Z0-9_-]+$/;
|
|
|
132
205
|
*
|
|
133
206
|
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
134
207
|
*
|
|
135
|
-
* @see https://www.backblaze.com/
|
|
208
|
+
* @see https://www.backblaze.com/docs/cloud-storage-buckets
|
|
136
209
|
*/
|
|
137
210
|
function validateBucketInfo(info) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
};
|
|
143
|
-
for (const [key, value] of entries) {
|
|
144
|
-
if (!BUCKET_INFO_KEY_REGEX.test(key)) return {
|
|
145
|
-
code: "invalid_bucket_info",
|
|
146
|
-
message: `bucketInfo key "${key}" must match ^[a-zA-Z0-9_-]+$`
|
|
147
|
-
};
|
|
148
|
-
if (typeof value !== "string") return {
|
|
149
|
-
code: "invalid_bucket_info",
|
|
150
|
-
message: `bucketInfo value for "${key}" must be a string`
|
|
151
|
-
};
|
|
152
|
-
if (utf8Encoder.encode(value).byteLength > 2048) return {
|
|
153
|
-
code: "invalid_bucket_info",
|
|
154
|
-
message: `bucketInfo value for "${key}" exceeds ${BUCKET_INFO_VALUE_MAX} bytes`
|
|
155
|
-
};
|
|
211
|
+
try {
|
|
212
|
+
assertValidBucketInfo(info);
|
|
213
|
+
} catch (err) {
|
|
214
|
+
return bucketConfigurationValidationError(err);
|
|
156
215
|
}
|
|
157
216
|
return null;
|
|
158
217
|
}
|
|
@@ -194,7 +253,627 @@ function validateMaxCount(requested, endpoint) {
|
|
|
194
253
|
};
|
|
195
254
|
return null;
|
|
196
255
|
}
|
|
256
|
+
/** Minimum `b2_get_download_authorization.validDurationInSeconds`. */
|
|
257
|
+
var DOWNLOAD_AUTH_DURATION_MIN_SECONDS = 1;
|
|
258
|
+
/** Maximum `b2_get_download_authorization.validDurationInSeconds`. */
|
|
259
|
+
var DOWNLOAD_AUTH_DURATION_MAX_SECONDS = 604800;
|
|
260
|
+
/**
|
|
261
|
+
* Validates a `b2_get_download_authorization` duration against B2's
|
|
262
|
+
* documented inclusive 1-second to 7-day range.
|
|
263
|
+
*
|
|
264
|
+
* @param requested - Caller-supplied duration in seconds.
|
|
265
|
+
*
|
|
266
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
267
|
+
*/
|
|
268
|
+
function validateDownloadAuthorizationDuration(requested) {
|
|
269
|
+
if (typeof requested !== "number" || !Number.isInteger(requested) || requested < 1 || requested > 604800) return {
|
|
270
|
+
code: "bad_request",
|
|
271
|
+
message: `validDurationInSeconds must be an integer from 1 through ${DOWNLOAD_AUTH_DURATION_MAX_SECONDS}`
|
|
272
|
+
};
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Validates a `b2_get_download_authorization` file name prefix.
|
|
277
|
+
*
|
|
278
|
+
* B2 allows an empty prefix, but the field must still be present as a
|
|
279
|
+
* string so later prefix checks cannot crash on malformed request bodies.
|
|
280
|
+
*
|
|
281
|
+
* @param requested - Caller-supplied file name prefix.
|
|
282
|
+
*
|
|
283
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
284
|
+
*/
|
|
285
|
+
function validateDownloadAuthorizationPrefix(requested) {
|
|
286
|
+
if (typeof requested !== "string") return {
|
|
287
|
+
code: "bad_request",
|
|
288
|
+
message: "fileNamePrefix must be a string"
|
|
289
|
+
};
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
function isRecord(value) {
|
|
293
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
294
|
+
}
|
|
295
|
+
function validateKnownFields(value, allowedFields, path) {
|
|
296
|
+
for (const field of Object.keys(value)) if (!allowedFields.has(field)) return {
|
|
297
|
+
code: "bad_request",
|
|
298
|
+
message: `${path}.${field} is not a supported field`
|
|
299
|
+
};
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
function validateStringArray(value, path, options = {}) {
|
|
303
|
+
if (value === void 0 && options.allowNull === true) return null;
|
|
304
|
+
if (value === null && options.allowNull === true) return null;
|
|
305
|
+
if (!Array.isArray(value)) return {
|
|
306
|
+
code: "bad_request",
|
|
307
|
+
message: `${path} must be an array of strings`
|
|
308
|
+
};
|
|
309
|
+
if (options.requireNonEmpty === true && value.length === 0) return {
|
|
310
|
+
code: "bad_request",
|
|
311
|
+
message: `${path} must be a non-empty array`
|
|
312
|
+
};
|
|
313
|
+
for (const [index, item] of value.entries()) if (typeof item !== "string") return {
|
|
314
|
+
code: "bad_request",
|
|
315
|
+
message: `${path}[${index}] must be a string`
|
|
316
|
+
};
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
function validateNonEmptyString(value, path) {
|
|
320
|
+
if (typeof value !== "string" || value.length === 0) return {
|
|
321
|
+
code: "bad_request",
|
|
322
|
+
message: `${path} must be a non-empty string`
|
|
323
|
+
};
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
function validateNonNegativeInteger(value, path) {
|
|
327
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0) return {
|
|
328
|
+
code: "bad_request",
|
|
329
|
+
message: `${path} must be a non-negative integer`
|
|
330
|
+
};
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
function validateIntegerAtMost(value, max, path) {
|
|
334
|
+
if (value > max) return {
|
|
335
|
+
code: "bad_request",
|
|
336
|
+
message: `${path} must not exceed ${max}`
|
|
337
|
+
};
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
function validatePositiveInteger(value, path) {
|
|
341
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1) return {
|
|
342
|
+
code: "bad_request",
|
|
343
|
+
message: `${path} must be a positive integer`
|
|
344
|
+
};
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
function validateNullablePositiveInteger(value, path) {
|
|
348
|
+
if (value === void 0 || value === null) return null;
|
|
349
|
+
return validatePositiveInteger(value, path);
|
|
350
|
+
}
|
|
351
|
+
function validateUniqueName(names, name, path) {
|
|
352
|
+
if (names.has(name)) return {
|
|
353
|
+
code: "bad_request",
|
|
354
|
+
message: `${path} must be unique`
|
|
355
|
+
};
|
|
356
|
+
names.add(name);
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
var REQUEST_BUCKET_TYPES = new Set(Object.values(BucketType));
|
|
360
|
+
/**
|
|
361
|
+
* Validates a create/update request `bucketType`.
|
|
362
|
+
*
|
|
363
|
+
* @param bucketType - Caller-supplied bucket type.
|
|
364
|
+
*
|
|
365
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
366
|
+
*
|
|
367
|
+
* @see https://www.backblaze.com/apidocs/b2-create-bucket
|
|
368
|
+
* @see https://www.backblaze.com/apidocs/b2-update-bucket
|
|
369
|
+
*/
|
|
370
|
+
function validateBucketType(bucketType) {
|
|
371
|
+
if (typeof bucketType !== "string" || !REQUEST_BUCKET_TYPES.has(bucketType)) return {
|
|
372
|
+
code: "bad_request",
|
|
373
|
+
message: "bucketType must be a known request bucket type"
|
|
374
|
+
};
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Validates a `b2_list_buckets.bucketTypes` filter.
|
|
379
|
+
*
|
|
380
|
+
* @param bucketTypes - Caller-supplied bucket type filter.
|
|
381
|
+
*
|
|
382
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
383
|
+
*
|
|
384
|
+
* @see https://www.backblaze.com/apidocs/b2-list-buckets
|
|
385
|
+
*/
|
|
386
|
+
function validateBucketTypes(bucketTypes) {
|
|
387
|
+
if (bucketTypes === void 0) return null;
|
|
388
|
+
if (!Array.isArray(bucketTypes)) return {
|
|
389
|
+
code: "bad_request",
|
|
390
|
+
message: "bucketTypes must be an array"
|
|
391
|
+
};
|
|
392
|
+
if (bucketTypes.length === 0) return {
|
|
393
|
+
code: "bad_request",
|
|
394
|
+
message: "bucketTypes must not be empty"
|
|
395
|
+
};
|
|
396
|
+
if (bucketTypes.length === 1 && bucketTypes[0] === "all") return null;
|
|
397
|
+
if (bucketTypes.includes("all")) return {
|
|
398
|
+
code: "bad_request",
|
|
399
|
+
message: "bucketTypes may contain 'all' only by itself"
|
|
400
|
+
};
|
|
401
|
+
for (const [index, bucketType] of bucketTypes.entries()) if (typeof bucketType !== "string") return {
|
|
402
|
+
code: "bad_request",
|
|
403
|
+
message: `bucketTypes[${index}] must be a string`
|
|
404
|
+
};
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
var CORS_RULE_FIELDS = /* @__PURE__ */ new Set([
|
|
408
|
+
"allowedHeaders",
|
|
409
|
+
"allowedOperations",
|
|
410
|
+
"allowedOrigins",
|
|
411
|
+
"corsRuleName",
|
|
412
|
+
"exposeHeaders",
|
|
413
|
+
"maxAgeSeconds"
|
|
414
|
+
]);
|
|
415
|
+
var KNOWN_CORS_OPERATIONS = new Set(Object.values(CorsOperation));
|
|
416
|
+
/**
|
|
417
|
+
* Validates B2 CORS rule structure for bucket create/update requests.
|
|
418
|
+
*
|
|
419
|
+
* @param rules - Caller-supplied CORS rules.
|
|
420
|
+
*
|
|
421
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
422
|
+
*
|
|
423
|
+
* @see https://www.backblaze.com/docs/cloud-storage-cross-origin-resource-sharing-rules
|
|
424
|
+
*/
|
|
425
|
+
function validateCorsRules(rules) {
|
|
426
|
+
try {
|
|
427
|
+
assertValidCorsRules(rules);
|
|
428
|
+
} catch (err) {
|
|
429
|
+
return bucketConfigurationValidationError(err);
|
|
430
|
+
}
|
|
431
|
+
if (!Array.isArray(rules)) return {
|
|
432
|
+
code: "bad_request",
|
|
433
|
+
message: "corsRules must be an array"
|
|
434
|
+
};
|
|
435
|
+
const names = /* @__PURE__ */ new Set();
|
|
436
|
+
for (const [index, rule] of rules.entries()) {
|
|
437
|
+
const rulePath = `corsRules[${index}]`;
|
|
438
|
+
if (!isRecord(rule)) return {
|
|
439
|
+
code: "bad_request",
|
|
440
|
+
message: `${rulePath} must be an object`
|
|
441
|
+
};
|
|
442
|
+
const fieldError = validateKnownFields(rule, CORS_RULE_FIELDS, rulePath);
|
|
443
|
+
if (fieldError) return fieldError;
|
|
444
|
+
const nameError = validateNonEmptyString(rule["corsRuleName"], `${rulePath}.corsRuleName`);
|
|
445
|
+
if (nameError) return nameError;
|
|
446
|
+
const ruleName = rule["corsRuleName"];
|
|
447
|
+
const uniqueNameError = validateUniqueName(names, ruleName, `${rulePath}.corsRuleName`);
|
|
448
|
+
if (uniqueNameError) return uniqueNameError;
|
|
449
|
+
const originsError = validateStringArray(rule["allowedOrigins"], `${rulePath}.allowedOrigins`, { requireNonEmpty: true });
|
|
450
|
+
if (originsError) return originsError;
|
|
451
|
+
const operationsError = validateStringArray(rule["allowedOperations"], `${rulePath}.allowedOperations`, { requireNonEmpty: true });
|
|
452
|
+
if (operationsError) return operationsError;
|
|
453
|
+
for (const operation of rule["allowedOperations"]) if (!KNOWN_CORS_OPERATIONS.has(operation)) return {
|
|
454
|
+
code: "bad_request",
|
|
455
|
+
message: `${rulePath}.allowedOperations contains an unknown operation`
|
|
456
|
+
};
|
|
457
|
+
const headersError = validateStringArray(rule["allowedHeaders"], `${rulePath}.allowedHeaders`, { allowNull: true });
|
|
458
|
+
if (headersError) return headersError;
|
|
459
|
+
const exposeError = validateStringArray(rule["exposeHeaders"], `${rulePath}.exposeHeaders`, { allowNull: true });
|
|
460
|
+
if (exposeError) return exposeError;
|
|
461
|
+
const ageError = validateNonNegativeInteger(rule["maxAgeSeconds"], `${rulePath}.maxAgeSeconds`);
|
|
462
|
+
if (ageError) return ageError;
|
|
463
|
+
const maxAgeError = validateIntegerAtMost(rule["maxAgeSeconds"], CORS_MAX_AGE_SECONDS_MAX, `${rulePath}.maxAgeSeconds`);
|
|
464
|
+
if (maxAgeError) return maxAgeError;
|
|
465
|
+
}
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
function bucketConfigurationValidationError(err) {
|
|
469
|
+
if (err instanceof B2BucketConfigurationError) return {
|
|
470
|
+
code: err.code,
|
|
471
|
+
message: err.message
|
|
472
|
+
};
|
|
473
|
+
throw err;
|
|
474
|
+
}
|
|
475
|
+
var LIFECYCLE_RULE_FIELDS = /* @__PURE__ */ new Set([
|
|
476
|
+
"daysFromHidingToDeleting",
|
|
477
|
+
"daysFromStartingToCancelingUnfinishedLargeFiles",
|
|
478
|
+
"daysFromUploadingToHiding",
|
|
479
|
+
"fileNamePrefix"
|
|
480
|
+
]);
|
|
481
|
+
/**
|
|
482
|
+
* Validates B2 lifecycle rule structure for bucket create/update requests.
|
|
483
|
+
*
|
|
484
|
+
* @param rules - Caller-supplied lifecycle rules.
|
|
485
|
+
*
|
|
486
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
487
|
+
*
|
|
488
|
+
* @see https://www.backblaze.com/docs/cloud-storage-lifecycle-rules
|
|
489
|
+
*/
|
|
490
|
+
function validateLifecycleRules(rules) {
|
|
491
|
+
if (!Array.isArray(rules)) return {
|
|
492
|
+
code: "bad_request",
|
|
493
|
+
message: "lifecycleRules must be an array"
|
|
494
|
+
};
|
|
495
|
+
for (const [index, rule] of rules.entries()) {
|
|
496
|
+
const rulePath = `lifecycleRules[${index}]`;
|
|
497
|
+
if (!isRecord(rule)) return {
|
|
498
|
+
code: "bad_request",
|
|
499
|
+
message: `${rulePath} must be an object`
|
|
500
|
+
};
|
|
501
|
+
const fieldError = validateKnownFields(rule, LIFECYCLE_RULE_FIELDS, rulePath);
|
|
502
|
+
if (fieldError) return fieldError;
|
|
503
|
+
const deletingError = validateNullablePositiveInteger(rule["daysFromHidingToDeleting"], `${rulePath}.daysFromHidingToDeleting`);
|
|
504
|
+
if (deletingError) return deletingError;
|
|
505
|
+
const hidingError = validateNullablePositiveInteger(rule["daysFromUploadingToHiding"], `${rulePath}.daysFromUploadingToHiding`);
|
|
506
|
+
if (hidingError) return hidingError;
|
|
507
|
+
const cancelError = validateNullablePositiveInteger(rule["daysFromStartingToCancelingUnfinishedLargeFiles"], `${rulePath}.daysFromStartingToCancelingUnfinishedLargeFiles`);
|
|
508
|
+
if (cancelError) return cancelError;
|
|
509
|
+
if (rule["daysFromHidingToDeleting"] == null && rule["daysFromUploadingToHiding"] == null && rule["daysFromStartingToCancelingUnfinishedLargeFiles"] == null) return {
|
|
510
|
+
code: "bad_request",
|
|
511
|
+
message: `${rulePath} must set at least one lifecycle action`
|
|
512
|
+
};
|
|
513
|
+
if (typeof rule["fileNamePrefix"] !== "string") return {
|
|
514
|
+
code: "bad_request",
|
|
515
|
+
message: `${rulePath}.fileNamePrefix must be a string`
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
return null;
|
|
519
|
+
}
|
|
520
|
+
var DEFAULT_RETENTION_FIELDS = /* @__PURE__ */ new Set(["mode", "period"]);
|
|
521
|
+
var RETENTION_PERIOD_FIELDS = /* @__PURE__ */ new Set(["duration", "unit"]);
|
|
522
|
+
var DEFAULT_RETENTION_MODES = new Set(Object.values(BucketRetentionMode));
|
|
523
|
+
var OBJECT_LOCK_RETENTION_MAX_DAYS = 3e3;
|
|
524
|
+
/**
|
|
525
|
+
* Validates default Object Lock retention policy structure for bucket requests.
|
|
526
|
+
*
|
|
527
|
+
* @param policy - Caller-supplied default retention policy.
|
|
528
|
+
*
|
|
529
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
530
|
+
*
|
|
531
|
+
* @see https://www.backblaze.com/docs/cloud-storage-object-lock
|
|
532
|
+
*/
|
|
533
|
+
function validateDefaultRetention(policy) {
|
|
534
|
+
if (!isRecord(policy)) return {
|
|
535
|
+
code: "bad_request",
|
|
536
|
+
message: "defaultRetention must be an object"
|
|
537
|
+
};
|
|
538
|
+
const fieldError = validateKnownFields(policy, DEFAULT_RETENTION_FIELDS, "defaultRetention");
|
|
539
|
+
if (fieldError) return fieldError;
|
|
540
|
+
const mode = policy["mode"];
|
|
541
|
+
if (typeof mode !== "string" || !DEFAULT_RETENTION_MODES.has(mode)) return {
|
|
542
|
+
code: "bad_request",
|
|
543
|
+
message: "defaultRetention.mode must be \"compliance\", \"governance\", or \"none\""
|
|
544
|
+
};
|
|
545
|
+
const period = policy["period"];
|
|
546
|
+
if (mode === BucketRetentionMode.None) {
|
|
547
|
+
if (period !== null) return {
|
|
548
|
+
code: "bad_request",
|
|
549
|
+
message: "defaultRetention.period must be null when mode is \"none\""
|
|
550
|
+
};
|
|
551
|
+
return null;
|
|
552
|
+
}
|
|
553
|
+
if (!isRecord(period)) return {
|
|
554
|
+
code: "bad_request",
|
|
555
|
+
message: "defaultRetention.period must be an object for retention modes"
|
|
556
|
+
};
|
|
557
|
+
const periodFieldError = validateKnownFields(period, RETENTION_PERIOD_FIELDS, "defaultRetention.period");
|
|
558
|
+
if (periodFieldError) return periodFieldError;
|
|
559
|
+
const durationError = validatePositiveInteger(period["duration"], "defaultRetention.period.duration");
|
|
560
|
+
if (durationError) return durationError;
|
|
561
|
+
if (!Number.isSafeInteger(period["duration"])) return {
|
|
562
|
+
code: "bad_request",
|
|
563
|
+
message: "defaultRetention.period.duration must be a safe integer"
|
|
564
|
+
};
|
|
565
|
+
if (period["unit"] !== "days" && period["unit"] !== "years") return {
|
|
566
|
+
code: "bad_request",
|
|
567
|
+
message: "defaultRetention.period.unit must be \"days\" or \"years\""
|
|
568
|
+
};
|
|
569
|
+
const durationDays = period["unit"] === "days" ? period["duration"] : period["duration"] * 365;
|
|
570
|
+
if (!Number.isFinite(durationDays) || durationDays > OBJECT_LOCK_RETENTION_MAX_DAYS) return {
|
|
571
|
+
code: "bad_request",
|
|
572
|
+
message: `defaultRetention.period must not exceed ${OBJECT_LOCK_RETENTION_MAX_DAYS} days`
|
|
573
|
+
};
|
|
574
|
+
return null;
|
|
575
|
+
}
|
|
576
|
+
var REPLICATION_CONFIG_FIELDS = /* @__PURE__ */ new Set(["asReplicationSource", "asReplicationDestination"]);
|
|
577
|
+
var REPLICATION_SOURCE_FIELDS = /* @__PURE__ */ new Set(["replicationRules", "sourceApplicationKeyId"]);
|
|
578
|
+
var REPLICATION_DESTINATION_FIELDS = /* @__PURE__ */ new Set(["sourceToDestinationKeyMapping"]);
|
|
579
|
+
var REPLICATION_RULE_FIELDS = /* @__PURE__ */ new Set([
|
|
580
|
+
"destinationBucketId",
|
|
581
|
+
"fileNamePrefix",
|
|
582
|
+
"includeExistingFiles",
|
|
583
|
+
"isEnabled",
|
|
584
|
+
"priority",
|
|
585
|
+
"replicationRuleName"
|
|
586
|
+
]);
|
|
587
|
+
function validateReplicationRule(rule, rulePath) {
|
|
588
|
+
if (!isRecord(rule)) return {
|
|
589
|
+
code: "bad_request",
|
|
590
|
+
message: `${rulePath} must be an object`
|
|
591
|
+
};
|
|
592
|
+
const fieldError = validateKnownFields(rule, REPLICATION_RULE_FIELDS, rulePath);
|
|
593
|
+
if (fieldError) return fieldError;
|
|
594
|
+
const destinationError = validateNonEmptyString(rule["destinationBucketId"], `${rulePath}.destinationBucketId`);
|
|
595
|
+
if (destinationError) return destinationError;
|
|
596
|
+
if (typeof rule["fileNamePrefix"] !== "string") return {
|
|
597
|
+
code: "bad_request",
|
|
598
|
+
message: `${rulePath}.fileNamePrefix must be a string`
|
|
599
|
+
};
|
|
600
|
+
if (typeof rule["includeExistingFiles"] !== "boolean") return {
|
|
601
|
+
code: "bad_request",
|
|
602
|
+
message: `${rulePath}.includeExistingFiles must be a boolean`
|
|
603
|
+
};
|
|
604
|
+
if (typeof rule["isEnabled"] !== "boolean") return {
|
|
605
|
+
code: "bad_request",
|
|
606
|
+
message: `${rulePath}.isEnabled must be a boolean`
|
|
607
|
+
};
|
|
608
|
+
const priorityError = validatePositiveInteger(rule["priority"], `${rulePath}.priority`);
|
|
609
|
+
if (priorityError) return priorityError;
|
|
610
|
+
const nameError = validateNonEmptyString(rule["replicationRuleName"], `${rulePath}.replicationRuleName`);
|
|
611
|
+
if (nameError) return nameError;
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
function validateReplicationSource(source) {
|
|
615
|
+
if (!isRecord(source)) return {
|
|
616
|
+
code: "bad_request",
|
|
617
|
+
message: "replicationConfiguration.asReplicationSource must be an object"
|
|
618
|
+
};
|
|
619
|
+
const fieldError = validateKnownFields(source, REPLICATION_SOURCE_FIELDS, "replicationConfiguration.asReplicationSource");
|
|
620
|
+
if (fieldError) return fieldError;
|
|
621
|
+
const sourceKeyError = validateNonEmptyString(source["sourceApplicationKeyId"], "replicationConfiguration.asReplicationSource.sourceApplicationKeyId");
|
|
622
|
+
if (sourceKeyError) return sourceKeyError;
|
|
623
|
+
const rules = source["replicationRules"];
|
|
624
|
+
if (!Array.isArray(rules)) return {
|
|
625
|
+
code: "bad_request",
|
|
626
|
+
message: "replicationConfiguration.asReplicationSource.replicationRules must be an array"
|
|
627
|
+
};
|
|
628
|
+
const names = /* @__PURE__ */ new Set();
|
|
629
|
+
for (const [index, rule] of rules.entries()) {
|
|
630
|
+
const rulePath = `replicationConfiguration.asReplicationSource.replicationRules[${index}]`;
|
|
631
|
+
const ruleError = validateReplicationRule(rule, rulePath);
|
|
632
|
+
if (ruleError) return ruleError;
|
|
633
|
+
const ruleName = rule["replicationRuleName"];
|
|
634
|
+
const uniqueNameError = validateUniqueName(names, ruleName, `${rulePath}.replicationRuleName`);
|
|
635
|
+
if (uniqueNameError) return uniqueNameError;
|
|
636
|
+
}
|
|
637
|
+
return null;
|
|
638
|
+
}
|
|
639
|
+
function validateReplicationDestination(destination) {
|
|
640
|
+
if (!isRecord(destination)) return {
|
|
641
|
+
code: "bad_request",
|
|
642
|
+
message: "replicationConfiguration.asReplicationDestination must be an object"
|
|
643
|
+
};
|
|
644
|
+
const fieldError = validateKnownFields(destination, REPLICATION_DESTINATION_FIELDS, "replicationConfiguration.asReplicationDestination");
|
|
645
|
+
if (fieldError) return fieldError;
|
|
646
|
+
const mapping = destination["sourceToDestinationKeyMapping"];
|
|
647
|
+
if (!isRecord(mapping)) return {
|
|
648
|
+
code: "bad_request",
|
|
649
|
+
message: "replicationConfiguration.asReplicationDestination.sourceToDestinationKeyMapping must be an object"
|
|
650
|
+
};
|
|
651
|
+
for (const [sourceKey, destinationKey] of Object.entries(mapping)) {
|
|
652
|
+
if (sourceKey.length === 0) return {
|
|
653
|
+
code: "bad_request",
|
|
654
|
+
message: "replicationConfiguration.asReplicationDestination.sourceToDestinationKeyMapping keys must be non-empty"
|
|
655
|
+
};
|
|
656
|
+
if (typeof destinationKey !== "string" || destinationKey.length === 0) return {
|
|
657
|
+
code: "bad_request",
|
|
658
|
+
message: "replicationConfiguration.asReplicationDestination.sourceToDestinationKeyMapping values must be non-empty strings"
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
return null;
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Validates B2 replication configuration structure for bucket requests.
|
|
665
|
+
*
|
|
666
|
+
* @param config - Caller-supplied replication configuration.
|
|
667
|
+
*
|
|
668
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
669
|
+
*
|
|
670
|
+
* @see https://www.backblaze.com/apidocs/b2-update-bucket
|
|
671
|
+
*/
|
|
672
|
+
function validateReplicationConfiguration(config) {
|
|
673
|
+
if (!isRecord(config)) return {
|
|
674
|
+
code: "bad_request",
|
|
675
|
+
message: "replicationConfiguration must be an object"
|
|
676
|
+
};
|
|
677
|
+
const fieldError = validateKnownFields(config, REPLICATION_CONFIG_FIELDS, "replicationConfiguration");
|
|
678
|
+
if (fieldError) return fieldError;
|
|
679
|
+
if (!("asReplicationSource" in config) && !("asReplicationDestination" in config)) return {
|
|
680
|
+
code: "bad_request",
|
|
681
|
+
message: "replicationConfiguration must include asReplicationSource or asReplicationDestination"
|
|
682
|
+
};
|
|
683
|
+
const source = config["asReplicationSource"];
|
|
684
|
+
if (source !== void 0 && source !== null) {
|
|
685
|
+
const sourceError = validateReplicationSource(source);
|
|
686
|
+
if (sourceError) return sourceError;
|
|
687
|
+
}
|
|
688
|
+
const destination = config["asReplicationDestination"];
|
|
689
|
+
if (destination !== void 0 && destination !== null) {
|
|
690
|
+
const destinationError = validateReplicationDestination(destination);
|
|
691
|
+
if (destinationError) return destinationError;
|
|
692
|
+
}
|
|
693
|
+
return null;
|
|
694
|
+
}
|
|
695
|
+
var NOTIFICATION_RULE_FIELDS = /* @__PURE__ */ new Set([
|
|
696
|
+
"eventTypes",
|
|
697
|
+
"isEnabled",
|
|
698
|
+
"isSuspended",
|
|
699
|
+
"maxEventsPerBatch",
|
|
700
|
+
"name",
|
|
701
|
+
"objectNamePrefix",
|
|
702
|
+
"suspensionReason",
|
|
703
|
+
"targetConfiguration"
|
|
704
|
+
]);
|
|
705
|
+
var NOTIFICATION_TARGET_FIELDS = /* @__PURE__ */ new Set([
|
|
706
|
+
"customHeaders",
|
|
707
|
+
"hmacSha256SigningSecret",
|
|
708
|
+
"targetType",
|
|
709
|
+
"url"
|
|
710
|
+
]);
|
|
711
|
+
var NOTIFICATION_CUSTOM_HEADER_FIELDS = /* @__PURE__ */ new Set(["name", "value"]);
|
|
712
|
+
var NOTIFICATION_CUSTOM_HEADER_MAX_COUNT = 10;
|
|
713
|
+
var NOTIFICATION_CUSTOM_HEADER_MAX_ENCODED_BYTES = 2048;
|
|
714
|
+
var NOTIFICATION_CUSTOM_HEADER_RESERVED_PREFIX = "x-bz-";
|
|
715
|
+
var HTTP_HEADER_NAME_RE = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
716
|
+
var KNOWN_NOTIFICATION_EVENT_TYPES = new Set(Object.values(EventType));
|
|
717
|
+
function encodedHeaderBytes(name, value) {
|
|
718
|
+
try {
|
|
719
|
+
return encodeURIComponent(name).length + encodeURIComponent(value).length + 3;
|
|
720
|
+
} catch {
|
|
721
|
+
return null;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
function isValidHeaderValue(value) {
|
|
725
|
+
for (let i = 0; i < value.length; i++) {
|
|
726
|
+
const code = value.charCodeAt(i);
|
|
727
|
+
if (code === 9) continue;
|
|
728
|
+
if (code < 32 || code === 127) return false;
|
|
729
|
+
}
|
|
730
|
+
return true;
|
|
731
|
+
}
|
|
732
|
+
function validateNotificationCustomHeaders(value, path) {
|
|
733
|
+
if (value === void 0) return null;
|
|
734
|
+
if (!Array.isArray(value)) return {
|
|
735
|
+
code: "bad_request",
|
|
736
|
+
message: `${path} must be an array of objects`
|
|
737
|
+
};
|
|
738
|
+
if (value.length > NOTIFICATION_CUSTOM_HEADER_MAX_COUNT) return {
|
|
739
|
+
code: "bad_request",
|
|
740
|
+
message: `${path} must contain no more than ${NOTIFICATION_CUSTOM_HEADER_MAX_COUNT} entries`
|
|
741
|
+
};
|
|
742
|
+
const names = /* @__PURE__ */ new Set();
|
|
743
|
+
let encodedBytes = 0;
|
|
744
|
+
for (const [index, header] of value.entries()) {
|
|
745
|
+
const headerPath = `${path}[${index}]`;
|
|
746
|
+
if (!isRecord(header)) return {
|
|
747
|
+
code: "bad_request",
|
|
748
|
+
message: `${headerPath} must be an object`
|
|
749
|
+
};
|
|
750
|
+
const fieldError = validateKnownFields(header, NOTIFICATION_CUSTOM_HEADER_FIELDS, headerPath);
|
|
751
|
+
if (fieldError) return fieldError;
|
|
752
|
+
if (typeof header["name"] !== "string" || header["name"].length === 0) return {
|
|
753
|
+
code: "bad_request",
|
|
754
|
+
message: `${headerPath}.name must be a non-empty string`
|
|
755
|
+
};
|
|
756
|
+
if (typeof header["value"] !== "string") return {
|
|
757
|
+
code: "bad_request",
|
|
758
|
+
message: `${headerPath}.value must be a string`
|
|
759
|
+
};
|
|
760
|
+
const name = header["name"];
|
|
761
|
+
const normalizedName = name.toLowerCase();
|
|
762
|
+
if (!HTTP_HEADER_NAME_RE.test(name)) return {
|
|
763
|
+
code: "bad_request",
|
|
764
|
+
message: `${headerPath}.name must be a valid HTTP header name`
|
|
765
|
+
};
|
|
766
|
+
if (normalizedName.startsWith(NOTIFICATION_CUSTOM_HEADER_RESERVED_PREFIX)) return {
|
|
767
|
+
code: "bad_request",
|
|
768
|
+
message: `${headerPath}.name must not begin with X-Bz-`
|
|
769
|
+
};
|
|
770
|
+
if (names.has(normalizedName)) return {
|
|
771
|
+
code: "bad_request",
|
|
772
|
+
message: `${headerPath}.name must be unique`
|
|
773
|
+
};
|
|
774
|
+
names.add(normalizedName);
|
|
775
|
+
const headerValue = header["value"];
|
|
776
|
+
if (!isValidHeaderValue(headerValue)) return {
|
|
777
|
+
code: "bad_request",
|
|
778
|
+
message: `${headerPath}.value must be a valid HTTP header value`
|
|
779
|
+
};
|
|
780
|
+
const size = encodedHeaderBytes(name, headerValue);
|
|
781
|
+
if (size === null) return {
|
|
782
|
+
code: "bad_request",
|
|
783
|
+
message: `${headerPath} must be URL-encodable`
|
|
784
|
+
};
|
|
785
|
+
encodedBytes += size;
|
|
786
|
+
if (encodedBytes > NOTIFICATION_CUSTOM_HEADER_MAX_ENCODED_BYTES) return {
|
|
787
|
+
code: "bad_request",
|
|
788
|
+
message: `${path} URL-encoded name/value bytes must not exceed ${NOTIFICATION_CUSTOM_HEADER_MAX_ENCODED_BYTES}`
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
return null;
|
|
792
|
+
}
|
|
793
|
+
/**
|
|
794
|
+
* Validates event notification rules for `b2_set_bucket_notification_rules`.
|
|
795
|
+
*
|
|
796
|
+
* @param rules - Caller-supplied event notification rules.
|
|
797
|
+
*
|
|
798
|
+
* @returns A `{ code, message }` pair on failure, or `null` when valid.
|
|
799
|
+
*
|
|
800
|
+
* @see https://www.backblaze.com/apidocs/b2-set-bucket-notification-rules
|
|
801
|
+
*/
|
|
802
|
+
function validateNotificationRules(rules) {
|
|
803
|
+
if (!Array.isArray(rules)) return {
|
|
804
|
+
code: "bad_request",
|
|
805
|
+
message: "eventNotificationRules must be an array"
|
|
806
|
+
};
|
|
807
|
+
const names = /* @__PURE__ */ new Set();
|
|
808
|
+
for (const [index, ruleValue] of rules.entries()) {
|
|
809
|
+
const rulePath = `eventNotificationRules[${index}]`;
|
|
810
|
+
if (!isRecord(ruleValue)) return {
|
|
811
|
+
code: "bad_request",
|
|
812
|
+
message: `${rulePath} must be an object`
|
|
813
|
+
};
|
|
814
|
+
const fieldError = validateKnownFields(ruleValue, NOTIFICATION_RULE_FIELDS, rulePath);
|
|
815
|
+
if (fieldError) return fieldError;
|
|
816
|
+
if (typeof ruleValue["isEnabled"] !== "boolean") return {
|
|
817
|
+
code: "bad_request",
|
|
818
|
+
message: `${rulePath}.isEnabled must be a boolean`
|
|
819
|
+
};
|
|
820
|
+
const maxEventsPerBatch = ruleValue["maxEventsPerBatch"];
|
|
821
|
+
if (maxEventsPerBatch !== void 0 && (typeof maxEventsPerBatch !== "number" || !Number.isInteger(maxEventsPerBatch) || maxEventsPerBatch < 1)) return {
|
|
822
|
+
code: "bad_request",
|
|
823
|
+
message: `${rulePath}.maxEventsPerBatch must be a positive integer`
|
|
824
|
+
};
|
|
825
|
+
const name = ruleValue["name"];
|
|
826
|
+
if (typeof name !== "string" || name.length === 0) return {
|
|
827
|
+
code: "bad_request",
|
|
828
|
+
message: `${rulePath}.name must be a non-empty string`
|
|
829
|
+
};
|
|
830
|
+
if (names.has(name)) return {
|
|
831
|
+
code: "bad_request",
|
|
832
|
+
message: `${rulePath}.name must be unique within eventNotificationRules`
|
|
833
|
+
};
|
|
834
|
+
names.add(name);
|
|
835
|
+
const eventTypes = ruleValue["eventTypes"];
|
|
836
|
+
if (!Array.isArray(eventTypes) || eventTypes.length === 0) return {
|
|
837
|
+
code: "bad_request",
|
|
838
|
+
message: `${rulePath}.eventTypes must be a non-empty array`
|
|
839
|
+
};
|
|
840
|
+
for (const eventType of eventTypes) if (typeof eventType !== "string" || !KNOWN_NOTIFICATION_EVENT_TYPES.has(eventType)) return {
|
|
841
|
+
code: "bad_request",
|
|
842
|
+
message: `${rulePath}.eventTypes contains an unknown event type`
|
|
843
|
+
};
|
|
844
|
+
const targetConfiguration = ruleValue["targetConfiguration"];
|
|
845
|
+
if (!isRecord(targetConfiguration)) return {
|
|
846
|
+
code: "bad_request",
|
|
847
|
+
message: `${rulePath}.targetConfiguration must be an object`
|
|
848
|
+
};
|
|
849
|
+
const targetFieldError = validateKnownFields(targetConfiguration, NOTIFICATION_TARGET_FIELDS, `${rulePath}.targetConfiguration`);
|
|
850
|
+
if (targetFieldError) return targetFieldError;
|
|
851
|
+
if (targetConfiguration["targetType"] !== "webhook") return {
|
|
852
|
+
code: "bad_request",
|
|
853
|
+
message: `${rulePath}.targetConfiguration.targetType must be "webhook"`
|
|
854
|
+
};
|
|
855
|
+
const url = targetConfiguration["url"];
|
|
856
|
+
if (typeof url !== "string") return {
|
|
857
|
+
code: "bad_request",
|
|
858
|
+
message: `${rulePath}.targetConfiguration.url must be a valid https URL`
|
|
859
|
+
};
|
|
860
|
+
try {
|
|
861
|
+
if (new URL(url).protocol !== "https:") return {
|
|
862
|
+
code: "bad_request",
|
|
863
|
+
message: `${rulePath}.targetConfiguration.url must be a valid https URL`
|
|
864
|
+
};
|
|
865
|
+
} catch {
|
|
866
|
+
return {
|
|
867
|
+
code: "bad_request",
|
|
868
|
+
message: `${rulePath}.targetConfiguration.url must be a valid https URL`
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
const customHeadersError = validateNotificationCustomHeaders(targetConfiguration["customHeaders"], `${rulePath}.targetConfiguration.customHeaders`);
|
|
872
|
+
if (customHeadersError) return customHeadersError;
|
|
873
|
+
}
|
|
874
|
+
return null;
|
|
875
|
+
}
|
|
197
876
|
//#endregion
|
|
198
|
-
export { BUCKET_INFO_MAX_KEYS, BUCKET_INFO_VALUE_MAX, BUCKET_NAME_MAX, BUCKET_NAME_MIN, FILE_INFO_TOTAL_MAX, FILE_INFO_VALUE_MAX, FILE_NAME_MAX_BYTES, LIST_ENDPOINT_CAPS, validateBucketInfo, validateBucketName, validateFileInfo, validateFileName, validateMaxCount };
|
|
877
|
+
export { BUCKET_INFO_KEY_MAX_BYTES, BUCKET_INFO_KEY_MIN_BYTES, BUCKET_INFO_KEY_PATTERN, BUCKET_INFO_MAX_KEYS, BUCKET_INFO_RESERVED_PREFIX, BUCKET_INFO_VALUES_MAX_BYTES, BUCKET_INFO_VALUE_MAX, BUCKET_NAME_MAX, BUCKET_NAME_MIN, CORS_MAX_AGE_SECONDS_MAX, CORS_RULES_MAX_COUNT, CORS_RULE_MAX_BYTES, CORS_RULE_NAME_MAX_LENGTH, CORS_RULE_NAME_MIN_LENGTH, CORS_RULE_NAME_PATTERN, CORS_RULE_NAME_RESERVED_PREFIX, DOWNLOAD_AUTH_DURATION_MAX_SECONDS, DOWNLOAD_AUTH_DURATION_MIN_SECONDS, FILE_INFO_TOTAL_MAX, FILE_INFO_VALUE_MAX, FILE_NAME_MAX_BYTES, KEY_NAME_MAX, KEY_NAME_MIN, LIST_ENDPOINT_CAPS, normalizeCreateKeyCapabilities, validateBucketInfo, validateBucketName, validateBucketType, validateBucketTypes, validateCorsRules, validateCreateKeyCapabilities, validateCreateKeyName, validateDefaultRetention, validateDownloadAuthorizationDuration, validateDownloadAuthorizationPrefix, validateFileInfo, validateFileName, validateLifecycleRules, validateMaxCount, validateNotificationRules, validateReplicationConfiguration };
|
|
199
878
|
|
|
200
879
|
//# sourceMappingURL=validation.js.map
|