@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
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
const require_ids = require("../types/ids.cjs");
|
|
2
|
+
const require_errors_index = require("../errors/index.cjs");
|
|
3
|
+
const require_realms = require("../auth/realms.cjs");
|
|
4
|
+
const require_url_guard = require("../http/url-guard.cjs");
|
|
5
|
+
const require_transport = require("../http/transport.cjs");
|
|
6
|
+
const require_url = require("../raw/url.cjs");
|
|
7
|
+
const require_auth_shape = require("./auth-shape.cjs");
|
|
8
|
+
const require_redaction = require("./redaction.cjs");
|
|
9
|
+
const require_endpoint_url = require("./endpoint-url.cjs");
|
|
10
|
+
//#region src/partner/raw.ts
|
|
11
|
+
var PARTNER_API_PREFIX = "b2api";
|
|
12
|
+
var PARTNER_AUTHORIZE_API = {
|
|
13
|
+
prefix: PARTNER_API_PREFIX,
|
|
14
|
+
version: "v3"
|
|
15
|
+
};
|
|
16
|
+
var PARTNER_GROUPS_API = {
|
|
17
|
+
prefix: PARTNER_API_PREFIX,
|
|
18
|
+
version: "v4"
|
|
19
|
+
};
|
|
20
|
+
var DEFAULT_PARTNER_REALM_URL = "https://api.backblazeb2.com";
|
|
21
|
+
var PRODUCTION_HOST_SUFFIX = "backblazeb2.com";
|
|
22
|
+
var PRODUCTION_ENDPOINT_HOST_SUFFIX = "backblaze.com";
|
|
23
|
+
var STAGING_HOST_SUFFIX = "backblaze.net";
|
|
24
|
+
var VERIFIED_PARTNER_AUTHORIZE_REALM_ORIGINS = /* @__PURE__ */ new Set(["https://api.backblazeb2.com", "https://api.backblaze.net"]);
|
|
25
|
+
function assertVerifiedPartnerAuthorizeRealm(realmUrl, allowCustomAuthorizeRealm) {
|
|
26
|
+
if (allowCustomAuthorizeRealm) return;
|
|
27
|
+
const realm = new URL(realmUrl);
|
|
28
|
+
if (VERIFIED_PARTNER_AUTHORIZE_REALM_ORIGINS.has(realm.origin)) return;
|
|
29
|
+
throw new require_errors_index.B2RealmConfigurationError(`refusing to send Master Application Key credentials to unverified Partner authorize realm: ${realm.origin}`);
|
|
30
|
+
}
|
|
31
|
+
function endpointAllowedSuffixesForRealm(realmUrl, allowCustomAuthorizeRealm) {
|
|
32
|
+
const realmHost = new URL(realmUrl).hostname.toLowerCase();
|
|
33
|
+
if (require_url_guard.hostMatchesAllowedSuffix(realmHost, PRODUCTION_HOST_SUFFIX)) return [PRODUCTION_ENDPOINT_HOST_SUFFIX, PRODUCTION_HOST_SUFFIX];
|
|
34
|
+
if (require_url_guard.hostMatchesAllowedSuffix(realmHost, STAGING_HOST_SUFFIX)) return [STAGING_HOST_SUFFIX];
|
|
35
|
+
return allowCustomAuthorizeRealm ? [authorizeRealmAllowedSuffix(realmUrl)] : [realmHost];
|
|
36
|
+
}
|
|
37
|
+
function authorizeRealmAllowedSuffix(realmUrl) {
|
|
38
|
+
const host = new URL(realmUrl).hostname.toLowerCase();
|
|
39
|
+
if (require_url_guard.hostMatchesAllowedSuffix(host, PRODUCTION_HOST_SUFFIX)) return PRODUCTION_HOST_SUFFIX;
|
|
40
|
+
if (require_url_guard.hostMatchesAllowedSuffix(host, STAGING_HOST_SUFFIX)) return STAGING_HOST_SUFFIX;
|
|
41
|
+
if (require_url_guard.hostMatchesAllowedSuffix(host, PRODUCTION_ENDPOINT_HOST_SUFFIX)) return PRODUCTION_ENDPOINT_HOST_SUFFIX;
|
|
42
|
+
return host;
|
|
43
|
+
}
|
|
44
|
+
function endpointAllowedSuffix(url) {
|
|
45
|
+
const host = new URL(url).hostname.toLowerCase();
|
|
46
|
+
if (require_url_guard.hostMatchesAllowedSuffix(host, PRODUCTION_HOST_SUFFIX)) return PRODUCTION_HOST_SUFFIX;
|
|
47
|
+
if (require_url_guard.hostMatchesAllowedSuffix(host, STAGING_HOST_SUFFIX)) return STAGING_HOST_SUFFIX;
|
|
48
|
+
if (require_url_guard.hostMatchesAllowedSuffix(host, PRODUCTION_ENDPOINT_HOST_SUFFIX)) return PRODUCTION_ENDPOINT_HOST_SUFFIX;
|
|
49
|
+
return host;
|
|
50
|
+
}
|
|
51
|
+
function normalizeGroupsApi(groupsApi, allowedSuffixes) {
|
|
52
|
+
return {
|
|
53
|
+
...groupsApi,
|
|
54
|
+
groupsApiUrl: require_endpoint_url.validatePartnerEndpointUrl(groupsApi.groupsApiUrl, "groupsApiUrl", allowedSuffixes),
|
|
55
|
+
capabilities: [...groupsApi.capabilities ?? []],
|
|
56
|
+
infoType: "groupsApi"
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function normalizeBackupApi(backupApi, allowedSuffixes) {
|
|
60
|
+
return {
|
|
61
|
+
...backupApi,
|
|
62
|
+
backupApiUrl: require_endpoint_url.validatePartnerEndpointUrl(backupApi.backupApiUrl, "backupApiUrl", allowedSuffixes),
|
|
63
|
+
capabilities: [...backupApi.capabilities ?? []],
|
|
64
|
+
infoType: "backupApi"
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function normalizePartnerAuthorizeResponse(response, realmUrl, allowCustomAuthorizeRealm) {
|
|
68
|
+
const { groupsApi, backupApi } = response.apiInfo;
|
|
69
|
+
if (groupsApi === void 0 && backupApi === void 0) throw new require_errors_index.B2PartnerAuthorizationError("Partner authorize response did not include apiInfo.groupsApi or apiInfo.backupApi");
|
|
70
|
+
const allowedSuffixes = endpointAllowedSuffixesForRealm(realmUrl, allowCustomAuthorizeRealm);
|
|
71
|
+
const normalizedGroupsApi = groupsApi !== void 0 ? normalizeGroupsApi(groupsApi, allowedSuffixes) : void 0;
|
|
72
|
+
const normalizedBackupApi = backupApi !== void 0 ? normalizeBackupApi(backupApi, allowedSuffixes) : void 0;
|
|
73
|
+
const apiInfo = {
|
|
74
|
+
...response.apiInfo.storageApi !== void 0 ? { storageApi: response.apiInfo.storageApi } : {},
|
|
75
|
+
...normalizedGroupsApi !== void 0 ? { groupsApi: normalizedGroupsApi } : {},
|
|
76
|
+
...normalizedBackupApi !== void 0 ? { backupApi: normalizedBackupApi } : {}
|
|
77
|
+
};
|
|
78
|
+
const normalized = {
|
|
79
|
+
accountId: require_ids.accountId(response.accountId),
|
|
80
|
+
authorizationToken: require_ids.partnerToken(response.authorizationToken),
|
|
81
|
+
apiInfo,
|
|
82
|
+
...normalizedGroupsApi !== void 0 ? { groupsApiUrl: normalizedGroupsApi.groupsApiUrl } : {},
|
|
83
|
+
...normalizedBackupApi !== void 0 ? { backupApiUrl: normalizedBackupApi.backupApiUrl } : {},
|
|
84
|
+
...normalizedGroupsApi !== void 0 ? { groupsCapabilities: normalizedGroupsApi.capabilities } : {},
|
|
85
|
+
...normalizedBackupApi !== void 0 ? { backupCapabilities: normalizedBackupApi.capabilities } : {},
|
|
86
|
+
applicationKeyExpirationTimestamp: response.applicationKeyExpirationTimestamp
|
|
87
|
+
};
|
|
88
|
+
require_auth_shape.validatePartnerAuthorizeResponseShape(normalized);
|
|
89
|
+
return require_redaction.redactPartnerAuthorizeResponse(normalized);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Derives the Partner authorize and endpoint host suffixes that may receive
|
|
93
|
+
* Partner tokens after a trusted authorize response has been validated.
|
|
94
|
+
*
|
|
95
|
+
* @param auth - Normalized Partner authorize response.
|
|
96
|
+
* @param realmUrl - Realm URL used for Partner authorization.
|
|
97
|
+
*
|
|
98
|
+
* @returns Sorted list of unique host suffixes to allow.
|
|
99
|
+
*
|
|
100
|
+
* @internal
|
|
101
|
+
*/
|
|
102
|
+
function derivePartnerAllowedSuffixes(auth, realmUrl) {
|
|
103
|
+
const suffixes = /* @__PURE__ */ new Set([authorizeRealmAllowedSuffix(realmUrl)]);
|
|
104
|
+
if (auth.apiInfo.groupsApi !== void 0) suffixes.add(endpointAllowedSuffix(auth.apiInfo.groupsApi.groupsApiUrl));
|
|
105
|
+
if (auth.apiInfo.backupApi !== void 0) suffixes.add(endpointAllowedSuffix(auth.apiInfo.backupApi.backupApiUrl));
|
|
106
|
+
return Array.from(suffixes).sort();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validates cached Partner authorize endpoint URLs with the same realm policy
|
|
110
|
+
* applied to fresh `authorizePartner()` responses and returns guard suffixes.
|
|
111
|
+
*
|
|
112
|
+
* @param auth - Cached Partner authorize response to validate.
|
|
113
|
+
* @param realmUrl - Realm URL used for Partner authorization.
|
|
114
|
+
* @param allowCustomAuthorizeRealm - Whether custom authorize realms are trusted.
|
|
115
|
+
*
|
|
116
|
+
* @returns Sorted list of host suffixes derived from the validated auth state.
|
|
117
|
+
*
|
|
118
|
+
* @throws B2PartnerAuthorizationError if the cached auth endpoints are unsafe.
|
|
119
|
+
*
|
|
120
|
+
* @internal
|
|
121
|
+
*/
|
|
122
|
+
function validatePartnerAuthorizeResponseEndpoints(auth, realmUrl, allowCustomAuthorizeRealm) {
|
|
123
|
+
require_realms.assertSecureRealmUrl(realmUrl);
|
|
124
|
+
assertVerifiedPartnerAuthorizeRealm(realmUrl, allowCustomAuthorizeRealm);
|
|
125
|
+
require_auth_shape.validatePartnerAuthorizeResponseShape(auth);
|
|
126
|
+
const { groupsApi, backupApi } = auth.apiInfo;
|
|
127
|
+
const allowedSuffixes = endpointAllowedSuffixesForRealm(realmUrl, allowCustomAuthorizeRealm);
|
|
128
|
+
if (groupsApi !== void 0) require_endpoint_url.validatePartnerEndpointUrl(groupsApi.groupsApiUrl, "groupsApiUrl", allowedSuffixes);
|
|
129
|
+
if (backupApi !== void 0) require_endpoint_url.validatePartnerEndpointUrl(backupApi.backupApiUrl, "backupApiUrl", allowedSuffixes);
|
|
130
|
+
return derivePartnerAllowedSuffixes(auth, realmUrl);
|
|
131
|
+
}
|
|
132
|
+
function lockTransportUrlGuard(transport, allowedSuffixes) {
|
|
133
|
+
const guard = require_transport.getTransportUrlGuard(transport);
|
|
134
|
+
if (guard === void 0) return;
|
|
135
|
+
const suffixes = /* @__PURE__ */ new Set([...guard.getAllowedSuffixes(), ...allowedSuffixes]);
|
|
136
|
+
guard.setAllowedSuffixes(Array.from(suffixes).sort());
|
|
137
|
+
}
|
|
138
|
+
function partnerEndpointAllowedSuffixes(transport, authorizedSuffixes) {
|
|
139
|
+
return require_endpoint_url.endpointAllowedSuffixes(transport, authorizedSuffixes, {
|
|
140
|
+
missingGuard: "Partner endpoint requests require authorizePartner() or a UrlGuardedTransport with a locked URL guard before sending Partner tokens",
|
|
141
|
+
unlockedGuard: "Partner endpoint requests require a locked URL guard before sending Partner tokens"
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function validatePartnerRequestGroupsApiUrl(transport, authorizedSuffixes, groupsApiUrl) {
|
|
145
|
+
return require_endpoint_url.validatePartnerEndpointUrl(groupsApiUrl, "groupsApiUrl", partnerEndpointAllowedSuffixes(transport, authorizedSuffixes));
|
|
146
|
+
}
|
|
147
|
+
function reserveTrialCreateAccountRequestBody(request) {
|
|
148
|
+
if (Array.isArray(request)) throw new TypeError("reserveTrialCreateAccount request must be a single account object.");
|
|
149
|
+
return {
|
|
150
|
+
email: request.email,
|
|
151
|
+
term: request.term,
|
|
152
|
+
storage: request.storage,
|
|
153
|
+
...request.region != null ? { region: request.region } : {}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function partnerAuthorizeUrl(realmUrl) {
|
|
157
|
+
return require_url.b2Url(realmUrl, {
|
|
158
|
+
...PARTNER_AUTHORIZE_API,
|
|
159
|
+
endpoint: "b2_authorize_account"
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function partnerGroupsEndpointUrl(groupsApiUrl, endpoint) {
|
|
163
|
+
return require_url.b2Url(groupsApiUrl, {
|
|
164
|
+
...PARTNER_GROUPS_API,
|
|
165
|
+
endpoint
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Low-level client for Partner API authorization and endpoint bindings.
|
|
170
|
+
*/
|
|
171
|
+
var PartnerRawClient = class {
|
|
172
|
+
/** @internal */
|
|
173
|
+
transport;
|
|
174
|
+
allowCustomAuthorizeRealm;
|
|
175
|
+
authorizedEndpointSuffixes;
|
|
176
|
+
/**
|
|
177
|
+
* Creates a new PartnerRawClient with the given transport.
|
|
178
|
+
*
|
|
179
|
+
* @param options - The constructor configuration.
|
|
180
|
+
*/
|
|
181
|
+
constructor(options) {
|
|
182
|
+
this.transport = options.transport;
|
|
183
|
+
this.allowCustomAuthorizeRealm = options.allowCustomAuthorizeRealm ?? false;
|
|
184
|
+
this.authorizedEndpointSuffixes = Array.from(options.authorizedPartnerEndpointSuffixes ?? []);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Replaces the validated Partner endpoint host suffixes.
|
|
188
|
+
*
|
|
189
|
+
* @param suffixes - Host suffixes derived from Partner authorization.
|
|
190
|
+
*
|
|
191
|
+
* @internal
|
|
192
|
+
*/
|
|
193
|
+
setAuthorizedEndpointSuffixes(suffixes) {
|
|
194
|
+
this.authorizedEndpointSuffixes = Array.from(suffixes);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Calls `b2_authorize_account` with Master Application Key credentials and
|
|
198
|
+
* normalizes the Partner/Backup suites into a Partner-specific auth shape.
|
|
199
|
+
*
|
|
200
|
+
* The Partner API documentation currently shows the v3 authorize path, so
|
|
201
|
+
* this method intentionally uses `/b2api/v3/b2_authorize_account` while the
|
|
202
|
+
* storage raw client keeps using v4.
|
|
203
|
+
*
|
|
204
|
+
* @param masterKeyId - The Master Application Key ID for authentication.
|
|
205
|
+
* @param masterKey - The Master Application Key secret.
|
|
206
|
+
* @param realmUrl - The B2 realm URL to authenticate against.
|
|
207
|
+
* @param options - Optional abort and per-request retry settings.
|
|
208
|
+
*
|
|
209
|
+
* @returns The normalized Partner authorization response.
|
|
210
|
+
*
|
|
211
|
+
* @throws B2RealmConfigurationError if the realm URL is unsafe for Master Application Key credentials.
|
|
212
|
+
* @throws B2PartnerAuthorizationError if the response omits or returns unsafe Partner endpoint data.
|
|
213
|
+
*/
|
|
214
|
+
async authorizePartner(masterKeyId, masterKey, realmUrl = DEFAULT_PARTNER_REALM_URL, options) {
|
|
215
|
+
require_realms.assertSecureRealmUrl(realmUrl);
|
|
216
|
+
assertVerifiedPartnerAuthorizeRealm(realmUrl, this.allowCustomAuthorizeRealm);
|
|
217
|
+
const auth = normalizePartnerAuthorizeResponse(await (await this.transport.send({
|
|
218
|
+
url: partnerAuthorizeUrl(realmUrl),
|
|
219
|
+
method: "GET",
|
|
220
|
+
headers: { Authorization: `Basic ${btoa(`${masterKeyId}:${masterKey}`)}` },
|
|
221
|
+
...options?.signal !== void 0 ? { signal: options.signal } : {},
|
|
222
|
+
...options?.retry !== void 0 ? { retry: options.retry } : {}
|
|
223
|
+
})).json(), realmUrl, this.allowCustomAuthorizeRealm);
|
|
224
|
+
const suffixes = derivePartnerAllowedSuffixes(auth, realmUrl);
|
|
225
|
+
this.setAuthorizedEndpointSuffixes(suffixes);
|
|
226
|
+
lockTransportUrlGuard(this.transport, suffixes);
|
|
227
|
+
return auth;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Calls {@link https://www.backblaze.com/apidocs/b2-create-group-member | b2_create_group_member}.
|
|
231
|
+
*
|
|
232
|
+
* The Partner API creates a new Backblaze account for an email address that
|
|
233
|
+
* is not already a Backblaze account and adds that account to the managed
|
|
234
|
+
* group. The wire response is a single JSON object.
|
|
235
|
+
*
|
|
236
|
+
* @param groupsApiUrl - The Partner API base URL from `authorizePartner`.
|
|
237
|
+
* @param authToken - The Partner API authorization token.
|
|
238
|
+
* @param request - The group-member creation request body.
|
|
239
|
+
* @param options - Optional abort and per-request retry settings.
|
|
240
|
+
*
|
|
241
|
+
* @returns The created member result, including the member application key.
|
|
242
|
+
*/
|
|
243
|
+
async createGroupMember(groupsApiUrl, authToken, request, options) {
|
|
244
|
+
const response = await this.postNonRetryingMutationJson(groupsApiUrl, authToken, "b2_create_group_member", {
|
|
245
|
+
adminAccountId: request.adminAccountId,
|
|
246
|
+
groupId: request.groupId,
|
|
247
|
+
memberEmail: request.memberEmail,
|
|
248
|
+
...request.region != null ? { region: request.region } : {}
|
|
249
|
+
}, options);
|
|
250
|
+
return require_redaction.redactCreateGroupMemberResponse(response);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Calls {@link https://www.backblaze.com/apidocs/b2-eject-group-member | b2_eject_group_member}.
|
|
254
|
+
*
|
|
255
|
+
* Ejection removes the member account from the group but does not delete the
|
|
256
|
+
* Backblaze account. The wire response is a single JSON object.
|
|
257
|
+
*
|
|
258
|
+
* @param groupsApiUrl - The Partner API base URL from `authorizePartner`.
|
|
259
|
+
* @param authToken - The Partner API authorization token.
|
|
260
|
+
* @param request - The group-member ejection request body.
|
|
261
|
+
* @param options - Optional abort and per-request retry settings.
|
|
262
|
+
*
|
|
263
|
+
* @returns The ejected member object.
|
|
264
|
+
*/
|
|
265
|
+
async ejectGroupMember(groupsApiUrl, authToken, request, options) {
|
|
266
|
+
return this.postNonRetryingMutationJson(groupsApiUrl, authToken, "b2_eject_group_member", {
|
|
267
|
+
adminAccountId: request.adminAccountId,
|
|
268
|
+
groupId: request.groupId,
|
|
269
|
+
memberAccountId: request.memberAccountId,
|
|
270
|
+
...request.email !== void 0 ? { email: request.email } : {}
|
|
271
|
+
}, options);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Calls {@link https://www.backblaze.com/apidocs/b2-reserve-trial-create-account | b2_reserve_trial_create_account}.
|
|
275
|
+
*
|
|
276
|
+
* The Partner API creates one new Backblaze B2 account and starts a B2
|
|
277
|
+
* Reserve trial for it. The wire request and success response are single
|
|
278
|
+
* JSON objects.
|
|
279
|
+
*
|
|
280
|
+
* Each email address must not already be a Backblaze account. `term` is the
|
|
281
|
+
* trial duration in days, documented as 7 through 30 inclusive. `storage` is
|
|
282
|
+
* the requested storage in TB, documented as 1 through 50 inclusive.
|
|
283
|
+
*
|
|
284
|
+
* This operation is non-idempotent and creates billable accounts. Automatic
|
|
285
|
+
* retries and expired-token reauthorization are disabled; long-lived
|
|
286
|
+
* callers must catch auth expiry, reauthorize, and then decide whether to
|
|
287
|
+
* issue a new request. A network or timeout failure after the server has
|
|
288
|
+
* processed the request may still have created an account, and the
|
|
289
|
+
* application key from a lost response is not recoverable from B2. Callers
|
|
290
|
+
* should reconcile account state out of band, such as through Partner
|
|
291
|
+
* account listing, before re-issuing a request for the same email address.
|
|
292
|
+
*
|
|
293
|
+
* @param groupsApiUrl - The Partner API base URL from `authorizePartner`. The authorize response currently exposes the shared Partner endpoint base as `groupsApiUrl`.
|
|
294
|
+
* @param authToken - The Partner API authorization token.
|
|
295
|
+
* @param request - Email, term, storage, and optional region for the account to create.
|
|
296
|
+
* @param options - Optional abort and per-request retry settings.
|
|
297
|
+
*
|
|
298
|
+
* @returns The created reserve-trial account result.
|
|
299
|
+
*
|
|
300
|
+
* @experimental Partner API surface; shape may change as the Partner API docs evolve.
|
|
301
|
+
*/
|
|
302
|
+
async reserveTrialCreateAccount(groupsApiUrl, authToken, request, options) {
|
|
303
|
+
const response = await this.postNonRetryingMutationJson(groupsApiUrl, authToken, "b2_reserve_trial_create_account", reserveTrialCreateAccountRequestBody(request), options);
|
|
304
|
+
return require_redaction.redactReserveTrialCreateAccountResponse(response);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Calls {@link https://www.backblaze.com/apidocs/b2-list-groups | b2_list_groups}.
|
|
308
|
+
*
|
|
309
|
+
* Uses the documented canonical GET form. The wire response is a single JSON
|
|
310
|
+
* object that surfaces `nextGroupId` for cursor-based pagination.
|
|
311
|
+
*
|
|
312
|
+
* @param groupsApiUrl - The Partner API base URL from `authorizePartner`.
|
|
313
|
+
* @param authToken - The Partner API authorization token.
|
|
314
|
+
* @param request - The group listing query parameters.
|
|
315
|
+
* @param options - Optional abort and per-request retry settings.
|
|
316
|
+
*
|
|
317
|
+
* @returns The groups page object.
|
|
318
|
+
*/
|
|
319
|
+
async listGroups(groupsApiUrl, authToken, request, options) {
|
|
320
|
+
return this.getJson(groupsApiUrl, authToken, "b2_list_groups", {
|
|
321
|
+
adminAccountId: request.adminAccountId,
|
|
322
|
+
...request.groupName !== void 0 ? { groupName: request.groupName } : {},
|
|
323
|
+
...request.startGroupId !== void 0 ? { startGroupId: request.startGroupId } : {},
|
|
324
|
+
...request.maxGroupCount !== void 0 ? { maxGroupCount: request.maxGroupCount } : {}
|
|
325
|
+
}, options);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Calls {@link https://www.backblaze.com/apidocs/b2-list-group-members | b2_list_group_members}.
|
|
329
|
+
*
|
|
330
|
+
* Uses the documented canonical GET form. The wire response is a JSON array
|
|
331
|
+
* whose result objects surface `nextEmail` for cursor-based pagination.
|
|
332
|
+
*
|
|
333
|
+
* @param groupsApiUrl - The Partner API base URL from `authorizePartner`.
|
|
334
|
+
* @param authToken - The Partner API authorization token.
|
|
335
|
+
* @param request - The member listing query parameters.
|
|
336
|
+
* @param options - Optional abort and per-request retry settings.
|
|
337
|
+
*
|
|
338
|
+
* @returns The group-member page result array.
|
|
339
|
+
*/
|
|
340
|
+
async listGroupMembers(groupsApiUrl, authToken, request, options) {
|
|
341
|
+
return this.getJson(groupsApiUrl, authToken, "b2_list_group_members", {
|
|
342
|
+
adminAccountId: request.adminAccountId,
|
|
343
|
+
groupId: request.groupId,
|
|
344
|
+
...request.startEmail !== void 0 ? { startEmail: request.startEmail } : {},
|
|
345
|
+
...request.maxMemberCount !== void 0 ? { maxMemberCount: request.maxMemberCount } : {}
|
|
346
|
+
}, options);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Sends a JSON GET request to the specified Partner API endpoint.
|
|
350
|
+
* @param groupsApiUrl - The Partner API base URL.
|
|
351
|
+
* @param authToken - The Partner API authorization token.
|
|
352
|
+
* @param endpoint - The Partner API endpoint name.
|
|
353
|
+
* @param query - The query-string parameters.
|
|
354
|
+
* @param options - Optional abort and per-request retry settings.
|
|
355
|
+
*
|
|
356
|
+
* @returns The parsed JSON response.
|
|
357
|
+
*/
|
|
358
|
+
async getJson(groupsApiUrl, authToken, endpoint, query, options) {
|
|
359
|
+
const safeGroupsApiUrl = validatePartnerRequestGroupsApiUrl(this.transport, this.authorizedEndpointSuffixes, groupsApiUrl);
|
|
360
|
+
return (await this.transport.send({
|
|
361
|
+
url: require_endpoint_url.withQueryString(partnerGroupsEndpointUrl(safeGroupsApiUrl, endpoint), query),
|
|
362
|
+
method: "GET",
|
|
363
|
+
headers: { Authorization: authToken },
|
|
364
|
+
...options?.signal !== void 0 ? { signal: options.signal } : {},
|
|
365
|
+
...options?.retry !== void 0 ? { retry: options.retry } : {}
|
|
366
|
+
})).json();
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Sends a non-retrying JSON mutation POST request to the specified Partner API endpoint.
|
|
370
|
+
* @param groupsApiUrl - The Partner API base URL.
|
|
371
|
+
* @param authToken - The Partner API authorization token.
|
|
372
|
+
* @param endpoint - The Partner API endpoint name.
|
|
373
|
+
* @param body - The JSON request body.
|
|
374
|
+
* @param options - Optional abort and per-request retry settings.
|
|
375
|
+
*
|
|
376
|
+
* @returns The parsed JSON response.
|
|
377
|
+
*/
|
|
378
|
+
async postNonRetryingMutationJson(groupsApiUrl, authToken, endpoint, body, options) {
|
|
379
|
+
const safeGroupsApiUrl = validatePartnerRequestGroupsApiUrl(this.transport, this.authorizedEndpointSuffixes, groupsApiUrl);
|
|
380
|
+
const requestOptions = require_endpoint_url.nonRetryingMutationRequestOptions(options);
|
|
381
|
+
return (await this.transport.send({
|
|
382
|
+
url: partnerGroupsEndpointUrl(safeGroupsApiUrl, endpoint),
|
|
383
|
+
method: "POST",
|
|
384
|
+
headers: {
|
|
385
|
+
Authorization: authToken,
|
|
386
|
+
"Content-Type": "application/json"
|
|
387
|
+
},
|
|
388
|
+
body: JSON.stringify(body),
|
|
389
|
+
...requestOptions.signal !== void 0 ? { signal: requestOptions.signal } : {},
|
|
390
|
+
...requestOptions.idempotent !== void 0 ? { idempotent: requestOptions.idempotent } : {},
|
|
391
|
+
...requestOptions.retry !== void 0 ? { retry: requestOptions.retry } : {}
|
|
392
|
+
})).json();
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
//#endregion
|
|
396
|
+
exports.PartnerRawClient = PartnerRawClient;
|
|
397
|
+
exports.derivePartnerAllowedSuffixes = derivePartnerAllowedSuffixes;
|
|
398
|
+
exports.validatePartnerAuthorizeResponseEndpoints = validatePartnerAuthorizeResponseEndpoints;
|
|
399
|
+
|
|
400
|
+
//# sourceMappingURL=raw.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw.cjs","names":[],"sources":["../../src/partner/raw.ts"],"sourcesContent":["import { assertSecureRealmUrl } from '../auth/realms.ts'\nimport { B2PartnerAuthorizationError, B2RealmConfigurationError } from '../errors/index.ts'\nimport type { PartnerNonIdempotentMutationEndpoint } from '../http/non-idempotent-mutations.ts'\nimport type { RetryOptions } from '../http/retry.ts'\nimport {\n getTransportUrlGuard,\n type HttpTransport,\n type UrlGuardedTransport,\n} from '../http/transport.ts'\nimport { hostMatchesAllowedSuffix } from '../http/url-guard.ts'\nimport { type B2EndpointUrlOptions, b2Url } from '../raw/url.ts'\nimport { accountId, partnerToken } from '../types/ids.ts'\nimport type {\n CreateGroupMemberRequest,\n CreateGroupMemberResponse,\n EjectGroupMemberRequest,\n EjectGroupMemberResponse,\n ListGroupMembersRequest,\n ListGroupMembersResponse,\n ListGroupsRequest,\n ListGroupsResponse,\n PartnerApiInfo,\n PartnerAuthorizeResponse,\n PartnerBackupApiInfo,\n PartnerGroupsApiInfo,\n ReserveTrialCreateAccountRequest,\n ReserveTrialCreateAccountResponse,\n} from '../types/partner.ts'\nimport { validatePartnerAuthorizeResponseShape } from './auth-shape.ts'\nimport {\n endpointAllowedSuffixes,\n nonRetryingMutationRequestOptions,\n type QueryParams,\n validatePartnerEndpointUrl,\n withQueryString,\n} from './endpoint-url.ts'\nimport {\n redactCreateGroupMemberResponse,\n redactPartnerAuthorizeResponse,\n redactReserveTrialCreateAccountResponse,\n} from './redaction.ts'\n\nconst PARTNER_API_PREFIX = 'b2api'\nconst PARTNER_AUTHORIZE_API: B2EndpointUrlOptions = {\n prefix: PARTNER_API_PREFIX,\n version: 'v3',\n}\nconst PARTNER_GROUPS_API: B2EndpointUrlOptions = {\n prefix: PARTNER_API_PREFIX,\n version: 'v4',\n}\nconst DEFAULT_PARTNER_REALM_URL = 'https://api.backblazeb2.com'\nconst PRODUCTION_HOST_SUFFIX = 'backblazeb2.com'\nconst PRODUCTION_ENDPOINT_HOST_SUFFIX = 'backblaze.com'\nconst STAGING_HOST_SUFFIX = 'backblaze.net'\nconst VERIFIED_PARTNER_AUTHORIZE_REALM_ORIGINS = new Set([\n 'https://api.backblazeb2.com',\n 'https://api.backblaze.net',\n])\n\n/** Configuration for constructing a {@link PartnerRawClient}. */\nexport interface PartnerRawClientOptions {\n /**\n * The HTTP transport used to send requests.\n *\n * Partner endpoint calls validate URLs against suffixes recorded by\n * `authorizePartner()`. A rehydrated client that skips authorization must use\n * `authorizedPartnerEndpointSuffixes` or a {@link UrlGuardedTransport} with a\n * locked `urlGuard`. Because Partner authorize responses redact\n * `authorizationToken` under `JSON.stringify`, durable caches should persist\n * `partnerAuthorizeResponseForPersistence(auth)` only to encrypted or\n * otherwise credential-grade storage, or use another secure token-preserving\n * representation.\n */\n readonly transport: HttpTransport\n /**\n * Validated Partner endpoint host suffixes restored from cached\n * authorization. Facades normally manage this after authorization; direct raw\n * clients can pass suffixes derived from trusted Partner authorization when\n * rehydrating an auth cache. Do not derive this cache with\n * `JSON.stringify(authorizePartner())`, which intentionally stores a redacted\n * token placeholder instead of a usable Partner token. Rehydrating that\n * placeholder fails fast.\n */\n readonly authorizedPartnerEndpointSuffixes?: readonly string[]\n /**\n * Allow direct custom authorize realms for tests or private proxies.\n * Leave disabled unless the configured host is trusted with the Master Application Key.\n */\n readonly allowCustomAuthorizeRealm?: boolean\n}\n\n/** Optional controls for raw Partner API requests. */\nexport interface PartnerRawRequestOptions {\n /** Abort signal for cancelling the request. */\n readonly signal?: AbortSignal\n /** Per-request retry override. */\n readonly retry?: Partial<RetryOptions>\n}\n\ninterface WirePartnerAuthorizeResponse {\n readonly accountId: string\n readonly authorizationToken: string\n readonly apiInfo: PartnerApiInfo\n readonly applicationKeyExpirationTimestamp: number | null\n}\n\nfunction assertVerifiedPartnerAuthorizeRealm(realmUrl: string, allowCustomAuthorizeRealm: boolean) {\n if (allowCustomAuthorizeRealm) return\n\n const realm = new URL(realmUrl)\n if (VERIFIED_PARTNER_AUTHORIZE_REALM_ORIGINS.has(realm.origin)) return\n\n throw new B2RealmConfigurationError(\n `refusing to send Master Application Key credentials to unverified Partner authorize realm: ${realm.origin}`,\n )\n}\n\nfunction endpointAllowedSuffixesForRealm(\n realmUrl: string,\n allowCustomAuthorizeRealm: boolean,\n): readonly string[] {\n const realmHost = new URL(realmUrl).hostname.toLowerCase()\n if (hostMatchesAllowedSuffix(realmHost, PRODUCTION_HOST_SUFFIX)) {\n return [PRODUCTION_ENDPOINT_HOST_SUFFIX, PRODUCTION_HOST_SUFFIX]\n }\n if (hostMatchesAllowedSuffix(realmHost, STAGING_HOST_SUFFIX)) return [STAGING_HOST_SUFFIX]\n return allowCustomAuthorizeRealm ? [authorizeRealmAllowedSuffix(realmUrl)] : [realmHost]\n}\n\nfunction authorizeRealmAllowedSuffix(realmUrl: string): string {\n const host = new URL(realmUrl).hostname.toLowerCase()\n if (hostMatchesAllowedSuffix(host, PRODUCTION_HOST_SUFFIX)) return PRODUCTION_HOST_SUFFIX\n if (hostMatchesAllowedSuffix(host, STAGING_HOST_SUFFIX)) return STAGING_HOST_SUFFIX\n if (hostMatchesAllowedSuffix(host, PRODUCTION_ENDPOINT_HOST_SUFFIX)) {\n return PRODUCTION_ENDPOINT_HOST_SUFFIX\n }\n return host\n}\n\nfunction endpointAllowedSuffix(url: string): string {\n const host = new URL(url).hostname.toLowerCase()\n if (hostMatchesAllowedSuffix(host, PRODUCTION_HOST_SUFFIX)) return PRODUCTION_HOST_SUFFIX\n if (hostMatchesAllowedSuffix(host, STAGING_HOST_SUFFIX)) return STAGING_HOST_SUFFIX\n if (hostMatchesAllowedSuffix(host, PRODUCTION_ENDPOINT_HOST_SUFFIX)) {\n return PRODUCTION_ENDPOINT_HOST_SUFFIX\n }\n return host\n}\n\nfunction normalizeGroupsApi(\n groupsApi: PartnerGroupsApiInfo,\n allowedSuffixes: readonly string[],\n): PartnerGroupsApiInfo {\n return {\n ...groupsApi,\n groupsApiUrl: validatePartnerEndpointUrl(\n groupsApi.groupsApiUrl,\n 'groupsApiUrl',\n allowedSuffixes,\n ),\n capabilities: [...(groupsApi.capabilities ?? [])],\n infoType: 'groupsApi',\n }\n}\n\nfunction normalizeBackupApi(\n backupApi: PartnerBackupApiInfo,\n allowedSuffixes: readonly string[],\n): PartnerBackupApiInfo {\n return {\n ...backupApi,\n backupApiUrl: validatePartnerEndpointUrl(\n backupApi.backupApiUrl,\n 'backupApiUrl',\n allowedSuffixes,\n ),\n capabilities: [...(backupApi.capabilities ?? [])],\n infoType: 'backupApi',\n }\n}\n\nfunction normalizePartnerAuthorizeResponse(\n response: WirePartnerAuthorizeResponse,\n realmUrl: string,\n allowCustomAuthorizeRealm: boolean,\n): PartnerAuthorizeResponse {\n const { groupsApi, backupApi } = response.apiInfo\n if (groupsApi === undefined && backupApi === undefined) {\n throw new B2PartnerAuthorizationError(\n 'Partner authorize response did not include apiInfo.groupsApi or apiInfo.backupApi',\n )\n }\n\n const allowedSuffixes = endpointAllowedSuffixesForRealm(realmUrl, allowCustomAuthorizeRealm)\n const normalizedGroupsApi =\n groupsApi !== undefined ? normalizeGroupsApi(groupsApi, allowedSuffixes) : undefined\n const normalizedBackupApi =\n backupApi !== undefined ? normalizeBackupApi(backupApi, allowedSuffixes) : undefined\n const apiInfo: PartnerApiInfo = {\n ...(response.apiInfo.storageApi !== undefined\n ? { storageApi: response.apiInfo.storageApi }\n : {}),\n ...(normalizedGroupsApi !== undefined ? { groupsApi: normalizedGroupsApi } : {}),\n ...(normalizedBackupApi !== undefined ? { backupApi: normalizedBackupApi } : {}),\n }\n const normalized: PartnerAuthorizeResponse = {\n accountId: accountId(response.accountId),\n authorizationToken: partnerToken(response.authorizationToken),\n apiInfo,\n ...(normalizedGroupsApi !== undefined\n ? { groupsApiUrl: normalizedGroupsApi.groupsApiUrl }\n : {}),\n ...(normalizedBackupApi !== undefined\n ? { backupApiUrl: normalizedBackupApi.backupApiUrl }\n : {}),\n ...(normalizedGroupsApi !== undefined\n ? { groupsCapabilities: normalizedGroupsApi.capabilities }\n : {}),\n ...(normalizedBackupApi !== undefined\n ? { backupCapabilities: normalizedBackupApi.capabilities }\n : {}),\n applicationKeyExpirationTimestamp: response.applicationKeyExpirationTimestamp,\n }\n\n validatePartnerAuthorizeResponseShape(normalized)\n return redactPartnerAuthorizeResponse(normalized)\n}\n\n/**\n * Derives the Partner authorize and endpoint host suffixes that may receive\n * Partner tokens after a trusted authorize response has been validated.\n *\n * @param auth - Normalized Partner authorize response.\n * @param realmUrl - Realm URL used for Partner authorization.\n *\n * @returns Sorted list of unique host suffixes to allow.\n *\n * @internal\n */\nexport function derivePartnerAllowedSuffixes(\n auth: PartnerAuthorizeResponse,\n realmUrl: string,\n): readonly string[] {\n const suffixes = new Set<string>([authorizeRealmAllowedSuffix(realmUrl)])\n if (auth.apiInfo.groupsApi !== undefined) {\n suffixes.add(endpointAllowedSuffix(auth.apiInfo.groupsApi.groupsApiUrl))\n }\n if (auth.apiInfo.backupApi !== undefined) {\n suffixes.add(endpointAllowedSuffix(auth.apiInfo.backupApi.backupApiUrl))\n }\n return Array.from(suffixes).sort()\n}\n\n/**\n * Validates cached Partner authorize endpoint URLs with the same realm policy\n * applied to fresh `authorizePartner()` responses and returns guard suffixes.\n *\n * @param auth - Cached Partner authorize response to validate.\n * @param realmUrl - Realm URL used for Partner authorization.\n * @param allowCustomAuthorizeRealm - Whether custom authorize realms are trusted.\n *\n * @returns Sorted list of host suffixes derived from the validated auth state.\n *\n * @throws B2PartnerAuthorizationError if the cached auth endpoints are unsafe.\n *\n * @internal\n */\nexport function validatePartnerAuthorizeResponseEndpoints(\n auth: PartnerAuthorizeResponse,\n realmUrl: string,\n allowCustomAuthorizeRealm: boolean,\n): readonly string[] {\n assertSecureRealmUrl(realmUrl)\n assertVerifiedPartnerAuthorizeRealm(realmUrl, allowCustomAuthorizeRealm)\n validatePartnerAuthorizeResponseShape(auth)\n\n const { groupsApi, backupApi } = auth.apiInfo\n const allowedSuffixes = endpointAllowedSuffixesForRealm(realmUrl, allowCustomAuthorizeRealm)\n if (groupsApi !== undefined) {\n validatePartnerEndpointUrl(groupsApi.groupsApiUrl, 'groupsApiUrl', allowedSuffixes)\n }\n if (backupApi !== undefined) {\n validatePartnerEndpointUrl(backupApi.backupApiUrl, 'backupApiUrl', allowedSuffixes)\n }\n\n return derivePartnerAllowedSuffixes(auth, realmUrl)\n}\n\nfunction lockTransportUrlGuard(transport: HttpTransport, allowedSuffixes: readonly string[]): void {\n const guard = getTransportUrlGuard(transport)\n if (guard === undefined) return\n\n const suffixes = new Set([...guard.getAllowedSuffixes(), ...allowedSuffixes])\n guard.setAllowedSuffixes(Array.from(suffixes).sort())\n}\n\nfunction partnerEndpointAllowedSuffixes(\n transport: HttpTransport,\n authorizedSuffixes: readonly string[],\n): readonly string[] {\n return endpointAllowedSuffixes(transport, authorizedSuffixes, {\n missingGuard:\n 'Partner endpoint requests require authorizePartner() or a UrlGuardedTransport with a locked URL guard before sending Partner tokens',\n unlockedGuard:\n 'Partner endpoint requests require a locked URL guard before sending Partner tokens',\n })\n}\n\nfunction validatePartnerRequestGroupsApiUrl(\n transport: HttpTransport,\n authorizedSuffixes: readonly string[],\n groupsApiUrl: string,\n): string {\n return validatePartnerEndpointUrl(\n groupsApiUrl,\n 'groupsApiUrl',\n partnerEndpointAllowedSuffixes(transport, authorizedSuffixes),\n )\n}\n\nfunction reserveTrialCreateAccountRequestBody(\n request: ReserveTrialCreateAccountRequest,\n): ReserveTrialCreateAccountRequest {\n if (Array.isArray(request)) {\n throw new TypeError('reserveTrialCreateAccount request must be a single account object.')\n }\n\n return {\n email: request.email,\n term: request.term,\n storage: request.storage,\n ...(request.region != null ? { region: request.region } : {}),\n }\n}\n\nfunction partnerAuthorizeUrl(realmUrl: string): string {\n return b2Url(realmUrl, { ...PARTNER_AUTHORIZE_API, endpoint: 'b2_authorize_account' })\n}\n\nfunction partnerGroupsEndpointUrl(groupsApiUrl: string, endpoint: string): string {\n return b2Url(groupsApiUrl, { ...PARTNER_GROUPS_API, endpoint })\n}\n\n/**\n * Low-level client for Partner API authorization and endpoint bindings.\n */\nexport class PartnerRawClient {\n /** @internal */\n private readonly transport: HttpTransport\n private readonly allowCustomAuthorizeRealm: boolean\n private authorizedEndpointSuffixes: readonly string[]\n\n /**\n * Creates a new PartnerRawClient with the given transport.\n *\n * @param options - The constructor configuration.\n */\n constructor(options: PartnerRawClientOptions) {\n this.transport = options.transport\n this.allowCustomAuthorizeRealm = options.allowCustomAuthorizeRealm ?? false\n this.authorizedEndpointSuffixes = Array.from(options.authorizedPartnerEndpointSuffixes ?? [])\n }\n\n /**\n * Replaces the validated Partner endpoint host suffixes.\n *\n * @param suffixes - Host suffixes derived from Partner authorization.\n *\n * @internal\n */\n setAuthorizedEndpointSuffixes(suffixes: readonly string[]): void {\n this.authorizedEndpointSuffixes = Array.from(suffixes)\n }\n\n /**\n * Calls `b2_authorize_account` with Master Application Key credentials and\n * normalizes the Partner/Backup suites into a Partner-specific auth shape.\n *\n * The Partner API documentation currently shows the v3 authorize path, so\n * this method intentionally uses `/b2api/v3/b2_authorize_account` while the\n * storage raw client keeps using v4.\n *\n * @param masterKeyId - The Master Application Key ID for authentication.\n * @param masterKey - The Master Application Key secret.\n * @param realmUrl - The B2 realm URL to authenticate against.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The normalized Partner authorization response.\n *\n * @throws B2RealmConfigurationError if the realm URL is unsafe for Master Application Key credentials.\n * @throws B2PartnerAuthorizationError if the response omits or returns unsafe Partner endpoint data.\n */\n async authorizePartner(\n masterKeyId: string,\n masterKey: string,\n realmUrl = DEFAULT_PARTNER_REALM_URL,\n options?: PartnerRawRequestOptions,\n ): Promise<PartnerAuthorizeResponse> {\n assertSecureRealmUrl(realmUrl)\n assertVerifiedPartnerAuthorizeRealm(realmUrl, this.allowCustomAuthorizeRealm)\n const response = await this.transport.send({\n url: partnerAuthorizeUrl(realmUrl),\n method: 'GET',\n headers: {\n Authorization: `Basic ${btoa(`${masterKeyId}:${masterKey}`)}`,\n },\n ...(options?.signal !== undefined ? { signal: options.signal } : {}),\n ...(options?.retry !== undefined ? { retry: options.retry } : {}),\n })\n const auth = normalizePartnerAuthorizeResponse(\n await response.json<WirePartnerAuthorizeResponse>(),\n realmUrl,\n this.allowCustomAuthorizeRealm,\n )\n const suffixes = derivePartnerAllowedSuffixes(auth, realmUrl)\n this.setAuthorizedEndpointSuffixes(suffixes)\n lockTransportUrlGuard(this.transport, suffixes)\n return auth\n }\n\n /**\n * Calls {@link https://www.backblaze.com/apidocs/b2-create-group-member | b2_create_group_member}.\n *\n * The Partner API creates a new Backblaze account for an email address that\n * is not already a Backblaze account and adds that account to the managed\n * group. The wire response is a single JSON object.\n *\n * @param groupsApiUrl - The Partner API base URL from `authorizePartner`.\n * @param authToken - The Partner API authorization token.\n * @param request - The group-member creation request body.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The created member result, including the member application key.\n */\n async createGroupMember(\n groupsApiUrl: string,\n authToken: string,\n request: CreateGroupMemberRequest,\n options?: PartnerRawRequestOptions,\n ): Promise<CreateGroupMemberResponse> {\n const response = await this.postNonRetryingMutationJson<CreateGroupMemberResponse>(\n groupsApiUrl,\n authToken,\n 'b2_create_group_member',\n {\n adminAccountId: request.adminAccountId,\n groupId: request.groupId,\n memberEmail: request.memberEmail,\n ...(request.region != null ? { region: request.region } : {}),\n },\n options,\n )\n return redactCreateGroupMemberResponse(response)\n }\n\n /**\n * Calls {@link https://www.backblaze.com/apidocs/b2-eject-group-member | b2_eject_group_member}.\n *\n * Ejection removes the member account from the group but does not delete the\n * Backblaze account. The wire response is a single JSON object.\n *\n * @param groupsApiUrl - The Partner API base URL from `authorizePartner`.\n * @param authToken - The Partner API authorization token.\n * @param request - The group-member ejection request body.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The ejected member object.\n */\n async ejectGroupMember(\n groupsApiUrl: string,\n authToken: string,\n request: EjectGroupMemberRequest,\n options?: PartnerRawRequestOptions,\n ): Promise<EjectGroupMemberResponse> {\n return this.postNonRetryingMutationJson<EjectGroupMemberResponse>(\n groupsApiUrl,\n authToken,\n 'b2_eject_group_member',\n {\n adminAccountId: request.adminAccountId,\n groupId: request.groupId,\n memberAccountId: request.memberAccountId,\n ...(request.email !== undefined ? { email: request.email } : {}),\n },\n options,\n )\n }\n\n /**\n * Calls {@link https://www.backblaze.com/apidocs/b2-reserve-trial-create-account | b2_reserve_trial_create_account}.\n *\n * The Partner API creates one new Backblaze B2 account and starts a B2\n * Reserve trial for it. The wire request and success response are single\n * JSON objects.\n *\n * Each email address must not already be a Backblaze account. `term` is the\n * trial duration in days, documented as 7 through 30 inclusive. `storage` is\n * the requested storage in TB, documented as 1 through 50 inclusive.\n *\n * This operation is non-idempotent and creates billable accounts. Automatic\n * retries and expired-token reauthorization are disabled; long-lived\n * callers must catch auth expiry, reauthorize, and then decide whether to\n * issue a new request. A network or timeout failure after the server has\n * processed the request may still have created an account, and the\n * application key from a lost response is not recoverable from B2. Callers\n * should reconcile account state out of band, such as through Partner\n * account listing, before re-issuing a request for the same email address.\n *\n * @param groupsApiUrl - The Partner API base URL from `authorizePartner`. The authorize response currently exposes the shared Partner endpoint base as `groupsApiUrl`.\n * @param authToken - The Partner API authorization token.\n * @param request - Email, term, storage, and optional region for the account to create.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The created reserve-trial account result.\n *\n * @experimental Partner API surface; shape may change as the Partner API docs evolve.\n */\n async reserveTrialCreateAccount(\n groupsApiUrl: string,\n authToken: string,\n request: ReserveTrialCreateAccountRequest,\n options?: PartnerRawRequestOptions,\n ): Promise<ReserveTrialCreateAccountResponse> {\n const response = await this.postNonRetryingMutationJson<ReserveTrialCreateAccountResponse>(\n groupsApiUrl,\n authToken,\n 'b2_reserve_trial_create_account',\n reserveTrialCreateAccountRequestBody(request),\n options,\n )\n return redactReserveTrialCreateAccountResponse(response)\n }\n\n /**\n * Calls {@link https://www.backblaze.com/apidocs/b2-list-groups | b2_list_groups}.\n *\n * Uses the documented canonical GET form. The wire response is a single JSON\n * object that surfaces `nextGroupId` for cursor-based pagination.\n *\n * @param groupsApiUrl - The Partner API base URL from `authorizePartner`.\n * @param authToken - The Partner API authorization token.\n * @param request - The group listing query parameters.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The groups page object.\n */\n async listGroups(\n groupsApiUrl: string,\n authToken: string,\n request: ListGroupsRequest,\n options?: PartnerRawRequestOptions,\n ): Promise<ListGroupsResponse> {\n return this.getJson<ListGroupsResponse>(\n groupsApiUrl,\n authToken,\n 'b2_list_groups',\n {\n adminAccountId: request.adminAccountId,\n ...(request.groupName !== undefined ? { groupName: request.groupName } : {}),\n ...(request.startGroupId !== undefined ? { startGroupId: request.startGroupId } : {}),\n ...(request.maxGroupCount !== undefined ? { maxGroupCount: request.maxGroupCount } : {}),\n },\n options,\n )\n }\n\n /**\n * Calls {@link https://www.backblaze.com/apidocs/b2-list-group-members | b2_list_group_members}.\n *\n * Uses the documented canonical GET form. The wire response is a JSON array\n * whose result objects surface `nextEmail` for cursor-based pagination.\n *\n * @param groupsApiUrl - The Partner API base URL from `authorizePartner`.\n * @param authToken - The Partner API authorization token.\n * @param request - The member listing query parameters.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The group-member page result array.\n */\n async listGroupMembers(\n groupsApiUrl: string,\n authToken: string,\n request: ListGroupMembersRequest,\n options?: PartnerRawRequestOptions,\n ): Promise<ListGroupMembersResponse> {\n return this.getJson<ListGroupMembersResponse>(\n groupsApiUrl,\n authToken,\n 'b2_list_group_members',\n {\n adminAccountId: request.adminAccountId,\n groupId: request.groupId,\n ...(request.startEmail !== undefined ? { startEmail: request.startEmail } : {}),\n ...(request.maxMemberCount !== undefined ? { maxMemberCount: request.maxMemberCount } : {}),\n },\n options,\n )\n }\n\n /**\n * Sends a JSON GET request to the specified Partner API endpoint.\n * @param groupsApiUrl - The Partner API base URL.\n * @param authToken - The Partner API authorization token.\n * @param endpoint - The Partner API endpoint name.\n * @param query - The query-string parameters.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The parsed JSON response.\n */\n private async getJson<T>(\n groupsApiUrl: string,\n authToken: string,\n endpoint: string,\n query: QueryParams,\n options?: PartnerRawRequestOptions,\n ): Promise<T> {\n const safeGroupsApiUrl = validatePartnerRequestGroupsApiUrl(\n this.transport,\n this.authorizedEndpointSuffixes,\n groupsApiUrl,\n )\n const response = await this.transport.send({\n url: withQueryString(partnerGroupsEndpointUrl(safeGroupsApiUrl, endpoint), query),\n method: 'GET',\n headers: {\n Authorization: authToken,\n },\n ...(options?.signal !== undefined ? { signal: options.signal } : {}),\n ...(options?.retry !== undefined ? { retry: options.retry } : {}),\n })\n return response.json<T>()\n }\n\n /**\n * Sends a non-retrying JSON mutation POST request to the specified Partner API endpoint.\n * @param groupsApiUrl - The Partner API base URL.\n * @param authToken - The Partner API authorization token.\n * @param endpoint - The Partner API endpoint name.\n * @param body - The JSON request body.\n * @param options - Optional abort and per-request retry settings.\n *\n * @returns The parsed JSON response.\n */\n private async postNonRetryingMutationJson<T>(\n groupsApiUrl: string,\n authToken: string,\n endpoint: PartnerNonIdempotentMutationEndpoint,\n body: unknown,\n options?: PartnerRawRequestOptions,\n ): Promise<T> {\n const safeGroupsApiUrl = validatePartnerRequestGroupsApiUrl(\n this.transport,\n this.authorizedEndpointSuffixes,\n groupsApiUrl,\n )\n const requestOptions = nonRetryingMutationRequestOptions(options)\n const response = await this.transport.send({\n url: partnerGroupsEndpointUrl(safeGroupsApiUrl, endpoint),\n method: 'POST',\n headers: {\n Authorization: authToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n ...(requestOptions.signal !== undefined ? { signal: requestOptions.signal } : {}),\n ...(requestOptions.idempotent !== undefined ? { idempotent: requestOptions.idempotent } : {}),\n ...(requestOptions.retry !== undefined ? { retry: requestOptions.retry } : {}),\n })\n return response.json<T>()\n }\n}\n"],"mappings":"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"}
|