@backblaze-labs/b2-sdk 0.3.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 +45 -1
- package/README.md +18 -5
- package/dist/_virtual/_b2-sdk-version-json.cjs +1 -1
- package/dist/_virtual/_b2-sdk-version-json.js +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/raw.cjs +37 -15
- package/dist/backup/raw.cjs.map +1 -1
- package/dist/backup/raw.d.cts +2 -2
- package/dist/backup/raw.d.cts.map +1 -1
- package/dist/backup/raw.d.ts +2 -2
- package/dist/backup/raw.d.ts.map +1 -1
- package/dist/backup/raw.js +37 -15
- package/dist/backup/raw.js.map +1 -1
- 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 +123 -73
- 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 +123 -73
- 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/download/single.cjs +38 -13
- 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 +38 -13
- package/dist/download/single.js.map +1 -1
- package/dist/errors/index.cjs +27 -4
- package/dist/errors/index.cjs.map +1 -1
- package/dist/errors/index.d.cts +15 -0
- package/dist/errors/index.d.cts.map +1 -1
- package/dist/errors/index.d.ts +15 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +27 -5
- 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/transport.cjs +9 -8
- package/dist/http/transport.cjs.map +1 -1
- package/dist/http/transport.d.cts +5 -0
- package/dist/http/transport.d.cts.map +1 -1
- package/dist/http/transport.d.ts +5 -0
- package/dist/http/transport.d.ts.map +1 -1
- package/dist/http/transport.js +9 -8
- 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 +25 -0
- package/dist/index.d.cts +10 -9
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +10 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- 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 +12 -1
- package/dist/object.cjs.map +1 -1
- package/dist/object.d.cts +7 -1
- package/dist/object.d.cts.map +1 -1
- package/dist/object.d.ts +7 -1
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +12 -1
- package/dist/object.js.map +1 -1
- package/dist/partner/auth-core.cjs +4 -23
- package/dist/partner/auth-core.cjs.map +1 -1
- package/dist/partner/auth-core.d.cts +1 -1
- package/dist/partner/auth-core.d.cts.map +1 -1
- package/dist/partner/auth-core.d.ts +1 -1
- package/dist/partner/auth-core.d.ts.map +1 -1
- package/dist/partner/auth-core.js +5 -24
- package/dist/partner/auth-core.js.map +1 -1
- package/dist/partner/client.cjs +25 -10
- package/dist/partner/client.cjs.map +1 -1
- package/dist/partner/client.d.cts +32 -10
- package/dist/partner/client.d.cts.map +1 -1
- package/dist/partner/client.d.ts +32 -10
- package/dist/partner/client.d.ts.map +1 -1
- package/dist/partner/client.js +25 -10
- package/dist/partner/client.js.map +1 -1
- package/dist/partner/endpoint-url.cjs +1 -0
- package/dist/partner/endpoint-url.cjs.map +1 -1
- package/dist/partner/endpoint-url.d.cts +2 -0
- package/dist/partner/endpoint-url.d.cts.map +1 -1
- package/dist/partner/endpoint-url.d.ts +2 -0
- package/dist/partner/endpoint-url.d.ts.map +1 -1
- package/dist/partner/endpoint-url.js +1 -0
- package/dist/partner/endpoint-url.js.map +1 -1
- package/dist/partner/in-memory.cjs.map +1 -1
- package/dist/partner/in-memory.js.map +1 -1
- package/dist/partner/index.cjs +9 -0
- package/dist/partner/index.d.cts +11 -2
- package/dist/partner/index.d.cts.map +1 -1
- package/dist/partner/index.d.ts +11 -2
- package/dist/partner/index.d.ts.map +1 -1
- package/dist/partner/index.js +3 -1
- package/dist/partner/raw.cjs +52 -44
- package/dist/partner/raw.cjs.map +1 -1
- package/dist/partner/raw.d.cts +16 -19
- package/dist/partner/raw.d.cts.map +1 -1
- package/dist/partner/raw.d.ts +16 -19
- package/dist/partner/raw.d.ts.map +1 -1
- package/dist/partner/raw.js +52 -44
- package/dist/partner/raw.js.map +1 -1
- package/dist/partner/redaction.cjs +133 -108
- package/dist/partner/redaction.cjs.map +1 -1
- package/dist/partner/redaction.d.cts +47 -13
- package/dist/partner/redaction.d.cts.map +1 -1
- package/dist/partner/redaction.d.ts +47 -13
- package/dist/partner/redaction.d.ts.map +1 -1
- package/dist/partner/redaction.js +133 -109
- package/dist/partner/redaction.js.map +1 -1
- 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 +64 -39
- package/dist/raw/index.cjs.map +1 -1
- package/dist/raw/index.d.cts +21 -19
- package/dist/raw/index.d.cts.map +1 -1
- package/dist/raw/index.d.ts +21 -19
- package/dist/raw/index.d.ts.map +1 -1
- package/dist/raw/index.js +47 -40
- package/dist/raw/index.js.map +1 -1
- package/dist/raw/url.cjs.map +1 -1
- package/dist/raw/url.d.cts +3 -3
- package/dist/raw/url.d.ts +3 -3
- package/dist/raw/url.js.map +1 -1
- package/dist/simulator/index.cjs +456 -125
- package/dist/simulator/index.cjs.map +1 -1
- package/dist/simulator/index.d.cts +16 -1
- package/dist/simulator/index.d.cts.map +1 -1
- package/dist/simulator/index.d.ts +16 -1
- package/dist/simulator/index.d.ts.map +1 -1
- package/dist/simulator/index.js +449 -130
- 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 +55 -61
- package/dist/simulator/partner.cjs.map +1 -1
- package/dist/simulator/partner.d.cts +5 -2
- package/dist/simulator/partner.d.cts.map +1 -1
- package/dist/simulator/partner.d.ts +5 -2
- package/dist/simulator/partner.d.ts.map +1 -1
- package/dist/simulator/partner.js +56 -61
- package/dist/simulator/partner.js.map +1 -1
- package/dist/simulator/validation.cjs +160 -30
- package/dist/simulator/validation.cjs.map +1 -1
- package/dist/simulator/validation.d.cts +28 -6
- package/dist/simulator/validation.d.cts.map +1 -1
- package/dist/simulator/validation.d.ts +28 -6
- package/dist/simulator/validation.d.ts.map +1 -1
- package/dist/simulator/validation.js +148 -31
- package/dist/simulator/validation.js.map +1 -1
- package/dist/streams/file-source.cjs +1 -1
- package/dist/streams/file-source.cjs.map +1 -1
- package/dist/streams/file-source.js +1 -1
- 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 +2 -0
- 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 +2 -2
- 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/sync/download-staging.cjs +147 -35
- package/dist/sync/download-staging.cjs.map +1 -1
- package/dist/sync/download-staging.d.cts +25 -2
- package/dist/sync/download-staging.d.cts.map +1 -1
- package/dist/sync/download-staging.d.ts +25 -2
- package/dist/sync/download-staging.d.ts.map +1 -1
- package/dist/sync/download-staging.js +146 -36
- package/dist/sync/download-staging.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 +5 -1
- package/dist/sync/local-file-io.cjs.map +1 -1
- package/dist/sync/local-file-io.d.cts +2 -0
- package/dist/sync/local-file-io.d.cts.map +1 -1
- package/dist/sync/local-file-io.d.ts +2 -0
- package/dist/sync/local-file-io.d.ts.map +1 -1
- package/dist/sync/local-file-io.js +5 -1
- package/dist/sync/local-file-io.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/scanners/b2.cjs +2 -0
- 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 +2 -0
- 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 +76 -29
- 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 +76 -29
- 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/backup.d.cts +6 -1
- package/dist/types/backup.d.cts.map +1 -1
- package/dist/types/backup.d.ts +6 -1
- package/dist/types/backup.d.ts.map +1 -1
- package/dist/types/bucket.cjs +81 -11
- package/dist/types/bucket.cjs.map +1 -1
- package/dist/types/bucket.d.cts +190 -39
- package/dist/types/bucket.d.cts.map +1 -1
- package/dist/types/bucket.d.ts +190 -39
- 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.map +1 -1
- package/dist/types/download.d.cts +3 -17
- package/dist/types/download.d.cts.map +1 -1
- package/dist/types/download.d.ts +3 -17
- package/dist/types/download.d.ts.map +1 -1
- package/dist/types/download.js.map +1 -1
- package/dist/types/encryption.cjs +18 -0
- package/dist/types/encryption.cjs.map +1 -1
- package/dist/types/encryption.d.cts +21 -11
- package/dist/types/encryption.d.cts.map +1 -1
- package/dist/types/encryption.d.ts +21 -11
- package/dist/types/encryption.d.ts.map +1 -1
- package/dist/types/encryption.js +18 -0
- package/dist/types/encryption.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 +125 -16
- package/dist/types/file.d.cts.map +1 -1
- package/dist/types/file.d.ts +125 -16
- 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/index.d.cts +7 -7
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.ts +7 -7
- 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/notifications.cjs +30 -0
- package/dist/types/notifications.cjs.map +1 -1
- package/dist/types/notifications.d.cts +26 -1
- package/dist/types/notifications.d.cts.map +1 -1
- package/dist/types/notifications.d.ts +26 -1
- package/dist/types/notifications.d.ts.map +1 -1
- package/dist/types/notifications.js +29 -1
- package/dist/types/notifications.js.map +1 -1
- package/dist/types/partner.cjs.map +1 -1
- package/dist/types/partner.d.cts +28 -36
- package/dist/types/partner.d.cts.map +1 -1
- package/dist/types/partner.d.ts +28 -36
- package/dist/types/partner.d.ts.map +1 -1
- package/dist/types/partner.js.map +1 -1
- package/dist/types/upload.d.cts +4 -0
- package/dist/types/upload.d.cts.map +1 -1
- package/dist/types/upload.d.ts +4 -0
- package/dist/types/upload.d.ts.map +1 -1
- package/dist/upload/large.cjs +10 -7
- package/dist/upload/large.cjs.map +1 -1
- package/dist/upload/large.d.cts +15 -6
- package/dist/upload/large.d.cts.map +1 -1
- package/dist/upload/large.d.ts +15 -6
- package/dist/upload/large.d.ts.map +1 -1
- package/dist/upload/large.js +10 -7
- package/dist/upload/large.js.map +1 -1
- package/dist/upload/options.cjs.map +1 -1
- package/dist/upload/options.d.cts +12 -0
- package/dist/upload/options.d.cts.map +1 -1
- package/dist/upload/options.d.ts +12 -0
- package/dist/upload/options.d.ts.map +1 -1
- package/dist/upload/options.js.map +1 -1
- package/dist/upload/resume.cjs +4 -3
- package/dist/upload/resume.cjs.map +1 -1
- package/dist/upload/resume.d.cts +6 -4
- package/dist/upload/resume.d.cts.map +1 -1
- package/dist/upload/resume.d.ts +6 -4
- package/dist/upload/resume.d.ts.map +1 -1
- package/dist/upload/resume.js +4 -3
- package/dist/upload/resume.js.map +1 -1
- package/dist/upload/retry.cjs +17 -10
- 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 +17 -10
- package/dist/upload/retry.js.map +1 -1
- package/dist/upload/single.cjs +35 -31
- package/dist/upload/single.cjs.map +1 -1
- package/dist/upload/single.d.cts +6 -0
- package/dist/upload/single.d.cts.map +1 -1
- package/dist/upload/single.d.ts +6 -0
- package/dist/upload/single.d.ts.map +1 -1
- package/dist/upload/single.js +35 -31
- package/dist/upload/single.js.map +1 -1
- package/dist/upload/stream.cjs +12 -1
- package/dist/upload/stream.cjs.map +1 -1
- package/dist/upload/stream.d.cts +6 -0
- package/dist/upload/stream.d.cts.map +1 -1
- package/dist/upload/stream.d.ts +6 -0
- package/dist/upload/stream.d.ts.map +1 -1
- package/dist/upload/stream.js +12 -1
- package/dist/upload/stream.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 +11 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.cjs","names":[],"sources":["../../src/upload/options.ts"],"sourcesContent":["import type { ProgressListener } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type { CleanupFailureOptions } from './cancel.ts'\nimport type { ResumePartReusedListener } from './large.ts'\nimport type { ResumeCandidateRejectedListener } from './resume.ts'\nimport type { UploadRetryOptions } from './retry.ts'\n\n/** Shared options for high-level file uploads. */\nexport interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {\n /**\n * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},\n * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `\"b2/x-auto\"` (auto-detected by B2). */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy (requires file lock on the bucket). */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status for the file. */\n readonly legalHold?: LegalHoldValue\n /** Last-modified timestamp in milliseconds since epoch. */\n readonly lastModifiedMillis?: number\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `lastModifiedMillis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Part size override for multipart uploads, in bytes. */\n readonly partSize?: number\n /** Number of concurrent part uploads for large files. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal for cancelling the upload. */\n readonly signal?: AbortSignal\n /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */\n readonly resumeMaxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */\n readonly resumeMaxPartCandidates?: number\n /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit unfinished large-file ID to verify and resume. Only supported on\n * the large-file path; small-file uploads throw.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\n/** Backwards-compatible name for high-level upload options. */\nexport type UploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link Bucket.upload}. */\nexport interface BucketUploadOptions extends HighLevelUploadOptions {\n /** Destination file name (path) in the bucket. */\n readonly fileName: string\n}\n\n/** Options accepted by {@link B2Object.upload}. */\nexport type B2ObjectUploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link B2Object.createWriteStream}. */\nexport interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** MIME type. Defaults to `\"b2/x-auto\"`. */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `src_last_modified_millis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Target part size in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal that cancels the upload and the unfinished large file. */\n readonly signal?: AbortSignal\n}\n\ntype ResumeOnlyUploadOptions = Pick<\n HighLevelUploadOptions,\n | 'resume'\n | 'resumeFileId'\n | 'onResumeCandidateRejected'\n | 'onResumePartReused'\n | 'resumeDiscoveryTimeoutMs'\n | 'resumeMaxListPages'\n | 'resumeMaxPartCandidates'\n | 'resumeMaxPartPages'\n>\n\n/** High-level upload options after resume-only settings have been removed. */\nexport type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<\n T,\n keyof ResumeOnlyUploadOptions\n>\n\n/**\n * Explicit resume targets are multipart-only and must fail closed on small uploads.\n *\n * @param options - High-level upload options.\n * @param caller - Public method name used in the thrown error.\n *\n * @throws Error when an explicit resume target is supplied for a small upload.\n */\nexport function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void {\n if (options.resumeFileId !== undefined) {\n throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`)\n }\n}\n\n/**\n * Removes resume-only options before forwarding to the small-file upload path.\n *\n * @param options - High-level upload options.\n *\n * @returns Options accepted by the single-request upload implementation.\n */\nexport function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(\n options: T,\n): SmallUploadOptions<T> {\n const {\n resume: _resume,\n resumeFileId: _resumeFileId,\n onResumeCandidateRejected: _onResumeCandidateRejected,\n onResumePartReused: _onResumePartReused,\n resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs,\n resumeMaxListPages: _resumeMaxListPages,\n resumeMaxPartCandidates: _resumeMaxPartCandidates,\n resumeMaxPartPages: _resumeMaxPartPages,\n ...smallOptions\n } = options\n return smallOptions\n}\n"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"options.cjs","names":[],"sources":["../../src/upload/options.ts"],"sourcesContent":["import type { ProgressListener } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type { CleanupFailureOptions } from './cancel.ts'\nimport type { ResumePartReusedListener } from './large.ts'\nimport type { ResumeCandidateRejectedListener } from './resume.ts'\nimport type { UploadRetryOptions } from './retry.ts'\n\n/** Shared options for high-level file uploads. */\nexport interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {\n /**\n * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},\n * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `\"b2/x-auto\"` (auto-detected by B2). */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy (requires file lock on the bucket). */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status for the file. */\n readonly legalHold?: LegalHoldValue\n /** Last-modified timestamp in milliseconds since epoch. */\n readonly lastModifiedMillis?: number\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `lastModifiedMillis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Part size override for multipart uploads, in bytes. */\n readonly partSize?: number\n /** Number of concurrent part uploads for large files. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /**\n * Minimum milliseconds between byte-only progress callbacks. Defaults to\n * the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.\n * Part-completion progress callbacks are always emitted immediately.\n */\n readonly progressIntervalMillis?: number\n /** Abort signal for cancelling the upload. */\n readonly signal?: AbortSignal\n /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */\n readonly resumeMaxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */\n readonly resumeMaxPartCandidates?: number\n /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit unfinished large-file ID to verify and resume. Only supported on\n * the large-file path; small-file uploads throw.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\n/** Backwards-compatible name for high-level upload options. */\nexport type UploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link Bucket.upload}. */\nexport interface BucketUploadOptions extends HighLevelUploadOptions {\n /** Destination file name (path) in the bucket. */\n readonly fileName: string\n}\n\n/** Options accepted by {@link B2Object.upload}. */\nexport type B2ObjectUploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link B2Object.createWriteStream}. */\nexport interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** MIME type. Defaults to `\"b2/x-auto\"`. */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `src_last_modified_millis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Target part size in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /**\n * Minimum milliseconds between byte-only progress callbacks. Defaults to\n * the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.\n * Part-completion progress callbacks are always emitted immediately.\n */\n readonly progressIntervalMillis?: number\n /** Abort signal that cancels the upload and the unfinished large file. */\n readonly signal?: AbortSignal\n}\n\ntype ResumeOnlyUploadOptions = Pick<\n HighLevelUploadOptions,\n | 'resume'\n | 'resumeFileId'\n | 'onResumeCandidateRejected'\n | 'onResumePartReused'\n | 'resumeDiscoveryTimeoutMs'\n | 'resumeMaxListPages'\n | 'resumeMaxPartCandidates'\n | 'resumeMaxPartPages'\n>\n\n/** High-level upload options after resume-only settings have been removed. */\nexport type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<\n T,\n keyof ResumeOnlyUploadOptions\n>\n\n/**\n * Explicit resume targets are multipart-only and must fail closed on small uploads.\n *\n * @param options - High-level upload options.\n * @param caller - Public method name used in the thrown error.\n *\n * @throws Error when an explicit resume target is supplied for a small upload.\n */\nexport function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void {\n if (options.resumeFileId !== undefined) {\n throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`)\n }\n}\n\n/**\n * Removes resume-only options before forwarding to the small-file upload path.\n *\n * @param options - High-level upload options.\n *\n * @returns Options accepted by the single-request upload implementation.\n */\nexport function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(\n options: T,\n): SmallUploadOptions<T> {\n const {\n resume: _resume,\n resumeFileId: _resumeFileId,\n onResumeCandidateRejected: _onResumeCandidateRejected,\n onResumePartReused: _onResumePartReused,\n resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs,\n resumeMaxListPages: _resumeMaxListPages,\n resumeMaxPartCandidates: _resumeMaxPartCandidates,\n resumeMaxPartPages: _resumeMaxPartPages,\n ...smallOptions\n } = options\n return smallOptions\n}\n"],"mappings":";;;;;;;;;AA0IA,SAAgB,wBAAwB,SAAiC,QAAsB;CAC7F,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,MAAM,IAAI,MAAM,GAAG,OAAO,wDAAwD;AAEtF;;;;;;;;AASA,SAAgB,uBACd,SACuB;CACvB,MAAM,EACJ,QAAQ,SACR,cAAc,eACd,2BAA2B,4BAC3B,oBAAoB,qBACpB,0BAA0B,2BAC1B,oBAAoB,qBACpB,yBAAyB,0BACzB,oBAAoB,qBACpB,GAAG,iBACD;CACJ,OAAO;AACT"}
|
|
@@ -38,6 +38,12 @@ export interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailu
|
|
|
38
38
|
readonly concurrency?: number;
|
|
39
39
|
/** Callback invoked with upload progress events. */
|
|
40
40
|
readonly onProgress?: ProgressListener;
|
|
41
|
+
/**
|
|
42
|
+
* Minimum milliseconds between byte-only progress callbacks. Defaults to
|
|
43
|
+
* the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.
|
|
44
|
+
* Part-completion progress callbacks are always emitted immediately.
|
|
45
|
+
*/
|
|
46
|
+
readonly progressIntervalMillis?: number;
|
|
41
47
|
/** Abort signal for cancelling the upload. */
|
|
42
48
|
readonly signal?: AbortSignal;
|
|
43
49
|
/** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */
|
|
@@ -89,6 +95,12 @@ export interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupF
|
|
|
89
95
|
readonly concurrency?: number;
|
|
90
96
|
/** Callback invoked with upload progress events. */
|
|
91
97
|
readonly onProgress?: ProgressListener;
|
|
98
|
+
/**
|
|
99
|
+
* Minimum milliseconds between byte-only progress callbacks. Defaults to
|
|
100
|
+
* the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.
|
|
101
|
+
* Part-completion progress callbacks are always emitted immediately.
|
|
102
|
+
*/
|
|
103
|
+
readonly progressIntervalMillis?: number;
|
|
92
104
|
/** Abort signal that cancels the upload and the unfinished large file. */
|
|
93
105
|
readonly signal?: AbortSignal;
|
|
94
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/upload/options.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/upload/options.js"],"names":[],"mappings":"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"}
|
package/dist/upload/options.d.ts
CHANGED
|
@@ -38,6 +38,12 @@ export interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailu
|
|
|
38
38
|
readonly concurrency?: number;
|
|
39
39
|
/** Callback invoked with upload progress events. */
|
|
40
40
|
readonly onProgress?: ProgressListener;
|
|
41
|
+
/**
|
|
42
|
+
* Minimum milliseconds between byte-only progress callbacks. Defaults to
|
|
43
|
+
* the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.
|
|
44
|
+
* Part-completion progress callbacks are always emitted immediately.
|
|
45
|
+
*/
|
|
46
|
+
readonly progressIntervalMillis?: number;
|
|
41
47
|
/** Abort signal for cancelling the upload. */
|
|
42
48
|
readonly signal?: AbortSignal;
|
|
43
49
|
/** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */
|
|
@@ -89,6 +95,12 @@ export interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupF
|
|
|
89
95
|
readonly concurrency?: number;
|
|
90
96
|
/** Callback invoked with upload progress events. */
|
|
91
97
|
readonly onProgress?: ProgressListener;
|
|
98
|
+
/**
|
|
99
|
+
* Minimum milliseconds between byte-only progress callbacks. Defaults to
|
|
100
|
+
* the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.
|
|
101
|
+
* Part-completion progress callbacks are always emitted immediately.
|
|
102
|
+
*/
|
|
103
|
+
readonly progressIntervalMillis?: number;
|
|
92
104
|
/** Abort signal that cancels the upload and the unfinished large file. */
|
|
93
105
|
readonly signal?: AbortSignal;
|
|
94
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/upload/options.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/upload/options.js"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","names":[],"sources":["../../src/upload/options.ts"],"sourcesContent":["import type { ProgressListener } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type { CleanupFailureOptions } from './cancel.ts'\nimport type { ResumePartReusedListener } from './large.ts'\nimport type { ResumeCandidateRejectedListener } from './resume.ts'\nimport type { UploadRetryOptions } from './retry.ts'\n\n/** Shared options for high-level file uploads. */\nexport interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {\n /**\n * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},\n * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `\"b2/x-auto\"` (auto-detected by B2). */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy (requires file lock on the bucket). */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status for the file. */\n readonly legalHold?: LegalHoldValue\n /** Last-modified timestamp in milliseconds since epoch. */\n readonly lastModifiedMillis?: number\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `lastModifiedMillis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Part size override for multipart uploads, in bytes. */\n readonly partSize?: number\n /** Number of concurrent part uploads for large files. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal for cancelling the upload. */\n readonly signal?: AbortSignal\n /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */\n readonly resumeMaxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */\n readonly resumeMaxPartCandidates?: number\n /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit unfinished large-file ID to verify and resume. Only supported on\n * the large-file path; small-file uploads throw.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\n/** Backwards-compatible name for high-level upload options. */\nexport type UploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link Bucket.upload}. */\nexport interface BucketUploadOptions extends HighLevelUploadOptions {\n /** Destination file name (path) in the bucket. */\n readonly fileName: string\n}\n\n/** Options accepted by {@link B2Object.upload}. */\nexport type B2ObjectUploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link B2Object.createWriteStream}. */\nexport interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** MIME type. Defaults to `\"b2/x-auto\"`. */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `src_last_modified_millis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Target part size in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal that cancels the upload and the unfinished large file. */\n readonly signal?: AbortSignal\n}\n\ntype ResumeOnlyUploadOptions = Pick<\n HighLevelUploadOptions,\n | 'resume'\n | 'resumeFileId'\n | 'onResumeCandidateRejected'\n | 'onResumePartReused'\n | 'resumeDiscoveryTimeoutMs'\n | 'resumeMaxListPages'\n | 'resumeMaxPartCandidates'\n | 'resumeMaxPartPages'\n>\n\n/** High-level upload options after resume-only settings have been removed. */\nexport type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<\n T,\n keyof ResumeOnlyUploadOptions\n>\n\n/**\n * Explicit resume targets are multipart-only and must fail closed on small uploads.\n *\n * @param options - High-level upload options.\n * @param caller - Public method name used in the thrown error.\n *\n * @throws Error when an explicit resume target is supplied for a small upload.\n */\nexport function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void {\n if (options.resumeFileId !== undefined) {\n throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`)\n }\n}\n\n/**\n * Removes resume-only options before forwarding to the small-file upload path.\n *\n * @param options - High-level upload options.\n *\n * @returns Options accepted by the single-request upload implementation.\n */\nexport function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(\n options: T,\n): SmallUploadOptions<T> {\n const {\n resume: _resume,\n resumeFileId: _resumeFileId,\n onResumeCandidateRejected: _onResumeCandidateRejected,\n onResumePartReused: _onResumePartReused,\n resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs,\n resumeMaxListPages: _resumeMaxListPages,\n resumeMaxPartCandidates: _resumeMaxPartCandidates,\n resumeMaxPartPages: _resumeMaxPartPages,\n ...smallOptions\n } = options\n return smallOptions\n}\n"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"options.js","names":[],"sources":["../../src/upload/options.ts"],"sourcesContent":["import type { ProgressListener } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type { CleanupFailureOptions } from './cancel.ts'\nimport type { ResumePartReusedListener } from './large.ts'\nimport type { ResumeCandidateRejectedListener } from './resume.ts'\nimport type { UploadRetryOptions } from './retry.ts'\n\n/** Shared options for high-level file uploads. */\nexport interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {\n /**\n * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},\n * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `\"b2/x-auto\"` (auto-detected by B2). */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy (requires file lock on the bucket). */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status for the file. */\n readonly legalHold?: LegalHoldValue\n /** Last-modified timestamp in milliseconds since epoch. */\n readonly lastModifiedMillis?: number\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `lastModifiedMillis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Part size override for multipart uploads, in bytes. */\n readonly partSize?: number\n /** Number of concurrent part uploads for large files. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /**\n * Minimum milliseconds between byte-only progress callbacks. Defaults to\n * the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.\n * Part-completion progress callbacks are always emitted immediately.\n */\n readonly progressIntervalMillis?: number\n /** Abort signal for cancelling the upload. */\n readonly signal?: AbortSignal\n /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */\n readonly resumeMaxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */\n readonly resumeMaxPartCandidates?: number\n /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit unfinished large-file ID to verify and resume. Only supported on\n * the large-file path; small-file uploads throw.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\n/** Backwards-compatible name for high-level upload options. */\nexport type UploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link Bucket.upload}. */\nexport interface BucketUploadOptions extends HighLevelUploadOptions {\n /** Destination file name (path) in the bucket. */\n readonly fileName: string\n}\n\n/** Options accepted by {@link B2Object.upload}. */\nexport type B2ObjectUploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link B2Object.createWriteStream}. */\nexport interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** MIME type. Defaults to `\"b2/x-auto\"`. */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /**\n * B2 upload timestamp override in milliseconds since epoch.\n * Sets the file version `uploadTimestamp`; distinct from `src_last_modified_millis` metadata.\n * Requires B2 account enablement for Custom Upload Timestamp.\n */\n readonly customUploadTimestamp?: number\n /** Target part size in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /**\n * Minimum milliseconds between byte-only progress callbacks. Defaults to\n * the SDK's 100 ms progress interval; set to 0 for per-chunk callbacks.\n * Part-completion progress callbacks are always emitted immediately.\n */\n readonly progressIntervalMillis?: number\n /** Abort signal that cancels the upload and the unfinished large file. */\n readonly signal?: AbortSignal\n}\n\ntype ResumeOnlyUploadOptions = Pick<\n HighLevelUploadOptions,\n | 'resume'\n | 'resumeFileId'\n | 'onResumeCandidateRejected'\n | 'onResumePartReused'\n | 'resumeDiscoveryTimeoutMs'\n | 'resumeMaxListPages'\n | 'resumeMaxPartCandidates'\n | 'resumeMaxPartPages'\n>\n\n/** High-level upload options after resume-only settings have been removed. */\nexport type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<\n T,\n keyof ResumeOnlyUploadOptions\n>\n\n/**\n * Explicit resume targets are multipart-only and must fail closed on small uploads.\n *\n * @param options - High-level upload options.\n * @param caller - Public method name used in the thrown error.\n *\n * @throws Error when an explicit resume target is supplied for a small upload.\n */\nexport function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void {\n if (options.resumeFileId !== undefined) {\n throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`)\n }\n}\n\n/**\n * Removes resume-only options before forwarding to the small-file upload path.\n *\n * @param options - High-level upload options.\n *\n * @returns Options accepted by the single-request upload implementation.\n */\nexport function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(\n options: T,\n): SmallUploadOptions<T> {\n const {\n resume: _resume,\n resumeFileId: _resumeFileId,\n onResumeCandidateRejected: _onResumeCandidateRejected,\n onResumePartReused: _onResumePartReused,\n resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs,\n resumeMaxListPages: _resumeMaxListPages,\n resumeMaxPartCandidates: _resumeMaxPartCandidates,\n resumeMaxPartPages: _resumeMaxPartPages,\n ...smallOptions\n } = options\n return smallOptions\n}\n"],"mappings":";;;;;;;;;AA0IA,SAAgB,wBAAwB,SAAiC,QAAsB;CAC7F,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,MAAM,IAAI,MAAM,GAAG,OAAO,wDAAwD;AAEtF;;;;;;;;AASA,SAAgB,uBACd,SACuB;CACvB,MAAM,EACJ,QAAQ,SACR,cAAc,eACd,2BAA2B,4BAC3B,oBAAoB,qBACpB,0BAA0B,2BAC1B,oBAAoB,qBACpB,yBAAyB,0BACzB,oBAAoB,qBACpB,GAAG,iBACD;CACJ,OAAO;AACT"}
|
package/dist/upload/resume.cjs
CHANGED
|
@@ -153,7 +153,7 @@ function candidateMetadataRejectReason(candidate, fileName, criteria) {
|
|
|
153
153
|
if (candidateInfo.sourceSize !== void 0 && candidateInfo.sourceSize !== String(criteria.sourceSize)) return "source-size-mismatch";
|
|
154
154
|
if (candidateInfo.partSize !== void 0 && candidateInfo.partSize !== String(criteria.partSize)) return "part-size-mismatch";
|
|
155
155
|
if (criteria.customUploadTimestamp !== void 0 && candidate.uploadTimestamp !== criteria.customUploadTimestamp) return "upload-timestamp-mismatch";
|
|
156
|
-
const encryptionRejectReason = serverSideEncryptionRejectReason(candidate.serverSideEncryption, criteria.serverSideEncryption);
|
|
156
|
+
const encryptionRejectReason = serverSideEncryptionRejectReason(candidate.serverSideEncryption, criteria.serverSideEncryption, criteria.defaultServerSideEncryptionUnreadable === true);
|
|
157
157
|
if (encryptionRejectReason !== null) return encryptionRejectReason;
|
|
158
158
|
if (!fileRetentionMatches(candidate.fileRetention, criteria.fileRetention, criteria.defaultFileRetention, criteria.defaultFileRetentionUnreadable === true, candidate.uploadTimestamp)) return "retention-mismatch";
|
|
159
159
|
if (!legalHoldMatches(candidate.legalHold, criteria.legalHold)) return "legal-hold-mismatch";
|
|
@@ -209,7 +209,7 @@ function splitResumeFileInfo(fileInfo) {
|
|
|
209
209
|
function fileRetentionMatches(candidate, expected, defaultExpected, defaultUnreadable, uploadTimestamp) {
|
|
210
210
|
if (expected === void 0 && defaultUnreadable) return false;
|
|
211
211
|
if (expected === void 0 && defaultExpected !== void 0) {
|
|
212
|
-
if (defaultExpected.mode === require_bucket.BucketRetentionMode.None) {
|
|
212
|
+
if (defaultExpected.mode === null || defaultExpected.mode === require_bucket.BucketRetentionMode.None) {
|
|
213
213
|
if (candidate === void 0) return true;
|
|
214
214
|
if (!candidate.isClientAuthorizedToRead) return false;
|
|
215
215
|
return fileRetentionValueEquals(candidate.value, null);
|
|
@@ -297,8 +297,9 @@ function resumeDiscoveryTimeoutReason(timeoutMs) {
|
|
|
297
297
|
error.name = "TimeoutError";
|
|
298
298
|
return error;
|
|
299
299
|
}
|
|
300
|
-
function serverSideEncryptionRejectReason(candidate, expected) {
|
|
300
|
+
function serverSideEncryptionRejectReason(candidate, expected, defaultUnreadable) {
|
|
301
301
|
if (expected?.mode === require_encryption.EncryptionMode.SseC) return "sse-c-unsupported";
|
|
302
|
+
if (expected === void 0 && defaultUnreadable) return "encryption-mismatch";
|
|
302
303
|
const actual = normalizeEncryption(candidate);
|
|
303
304
|
if (expected === void 0) {
|
|
304
305
|
if (candidate === void 0) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.cjs","names":[],"sources":["../../src/upload/resume.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport { ResumeFileIdMismatchError } from '../errors/index.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport { BucketRetentionMode, type BucketRetentionPolicy } from '../types/bucket.ts'\nimport {\n EncryptionMode,\n type EncryptionSetting,\n type PublicEncryptionSetting,\n} from '../types/encryption.ts'\nimport type { BucketId, LargeFileId } from '../types/ids.ts'\nimport { largeFileId as largeFileIdOf } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type {\n ReadableFileRetention,\n ReadableLegalHold,\n UnfinishedLargeFile,\n} from '../types/upload.ts'\n\nexport { ResumeFileIdMismatchError }\n\n/** Compatibility-only file-info key read from legacy unfinished uploads; new uploads do not write it. */\nexport const RESUME_SOURCE_SIZE_INFO_KEY = 'b2_sdk_resume_source_size'\n\n/** Compatibility-only file-info key read from legacy unfinished uploads; new uploads do not write it. */\nexport const RESUME_PART_SIZE_INFO_KEY = 'b2_sdk_resume_part_size'\n\nconst DEFAULT_MAX_RESUME_LIST_PAGES = 10\nconst DEFAULT_MAX_RESUME_PART_CANDIDATES = 25\nconst DEFAULT_MAX_RESUME_PART_PAGES = 10\n\n/** One planned part from the local upload source. */\nexport interface ResumePartPlan {\n /** 1-based B2 part number. */\n readonly partNumber: number\n /** Expected byte length for this part. */\n readonly length: number\n}\n\n/** Reason an unfinished same-name large file was not reused for resume. */\nexport type ResumeCandidateRejectedReason =\n | 'search-truncated'\n | 'candidate-limit'\n | 'file-name-mismatch'\n | 'content-type-mismatch'\n | 'file-info-mismatch'\n | 'source-size-mismatch'\n | 'part-size-mismatch'\n | 'upload-timestamp-mismatch'\n | 'encryption-mismatch'\n | 'sse-c-unsupported'\n | 'retention-mismatch'\n | 'legal-hold-mismatch'\n | 'part-length-mismatch'\n\n/** Diagnostic event emitted when resume discovery declines a candidate. */\nexport interface ResumeCandidateRejectedEvent {\n /** ID of the unfinished large file, when the event is candidate-specific. */\n readonly fileId?: LargeFileId\n /** Requested destination file name. */\n readonly requestedFileName: string\n /** Actual candidate file name, when the event is candidate-specific. */\n readonly candidateFileName?: string\n /** Machine-readable rejection reason. */\n readonly reason: ResumeCandidateRejectedReason\n}\n\n/** Diagnostic callback for declined resume candidates. */\nexport type ResumeCandidateRejectedListener = (event: ResumeCandidateRejectedEvent) => void\n\n/** Compatibility requirements an unfinished large file must satisfy before reuse. */\nexport interface ResumeCandidateCriteria {\n /** Effective MIME type for the upload, including SDK defaults. */\n readonly contentType: string\n /** Caller-owned file info. Legacy SDK resume keys on candidates are ignored separately. */\n readonly fileInfo: Record<string, string>\n /** Source size in bytes, checked against legacy SDK metadata when a candidate carries it. */\n readonly sourceSize: number\n /** Effective multipart part size, checked against legacy SDK metadata when present. */\n readonly partSize: number\n /** Planned local parts used to verify already-uploaded server part lengths. */\n readonly parts: readonly ResumePartPlan[]\n /** Requested B2 upload timestamp override, if configured by the caller. */\n readonly customUploadTimestamp?: number\n /** Explicit server-side encryption option, if configured by the caller. */\n readonly serverSideEncryption?: EncryptionSetting\n /** Explicit Object Lock retention option, if configured by the caller. */\n readonly fileRetention?: FileRetentionValue\n /** Effective readable bucket default retention when the caller omits fileRetention. */\n readonly defaultFileRetention?: BucketRetentionPolicy\n /** Whether bucket default retention exists but cannot be read by the caller. */\n readonly defaultFileRetentionUnreadable?: boolean\n /** Explicit legal hold option, if configured by the caller. */\n readonly legalHold?: LegalHoldValue\n /** Explicit unfinished large-file ID to verify before reuse. */\n readonly resumeFileId?: LargeFileId\n /** Abort signal used for B2 list requests and checked between pages. */\n readonly signal?: AbortSignal\n /** Optional diagnostic callback for candidates that are found but not reused. */\n readonly onCandidateRejected?: ResumeCandidateRejectedListener\n /** Maximum `b2_list_unfinished_large_files` pages to inspect. */\n readonly maxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed. */\n readonly maxPartCandidates?: number\n /** Maximum `b2_list_parts` pages to inspect for each metadata-compatible candidate. */\n readonly maxPartPages?: number\n /** Caller-supplied aggregate resume discovery timeout. */\n readonly discoveryTimeoutMs?: number\n}\n\n/** Uploaded part metadata used by the resume planner. */\nexport interface ResumePartInfo {\n /** SHA-1 stored by B2 for this uploaded part. */\n readonly contentSha1: string\n /** Byte length stored by B2 for this uploaded part. */\n readonly contentLength: number\n}\n\nconst LIST_PARTS_PAGE_SIZE = 100\n\n/** Information about an unfinished large file eligible for resume. */\nexport interface ResumeCandidate {\n /** ID of the unfinished large file. */\n readonly fileId: LargeFileId\n /** SHA-1 of each part already uploaded, indexed by 1-based part number. */\n readonly uploadedPartSha1s: ReadonlyMap<number, string>\n}\n\n/**\n * Finds an unfinished large file matching the given bucket and file name.\n * Returns `null` when no compatible candidate exists.\n *\n * With criteria, the newest compatible candidate is selected; incompatible\n * same-name uploads are ignored and optionally reported via\n * `onCandidateRejected`.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state.\n * @param bucketId - Target bucket of the upload.\n * @param fileName - Destination file name of the upload.\n * @param criteria - Upload identity and option checks.\n *\n * @returns A {@link ResumeCandidate} describing the candidate and its uploaded parts, or `null`.\n */\nexport async function findResumeCandidate(\n raw: RawClient,\n accountInfo: AccountInfo,\n bucketId: BucketId,\n fileName: string,\n criteria: ResumeCandidateCriteria,\n): Promise<ResumeCandidate | null> {\n const discoverySignal = createResumeDiscoverySignal(criteria)\n try {\n return await findResumeCandidateWithSignal(\n raw,\n accountInfo,\n bucketId,\n fileName,\n criteria,\n discoverySignal.signal,\n )\n } finally {\n discoverySignal.dispose()\n }\n}\n\nasync function findResumeCandidateWithSignal(\n raw: RawClient,\n accountInfo: AccountInfo,\n bucketId: BucketId,\n fileName: string,\n criteria: ResumeCandidateCriteria,\n signal: AbortSignal | undefined,\n): Promise<ResumeCandidate | null> {\n const matches: Array<{ file: UnfinishedLargeFile; sequence: number }> = []\n const maxListPages = criteria.maxListPages ?? DEFAULT_MAX_RESUME_LIST_PAGES\n const maxPartCandidates = criteria.maxPartCandidates ?? DEFAULT_MAX_RESUME_PART_CANDIDATES\n let sequence = 0\n let pageCount = 0\n const explicitResumeFileId = criteria.resumeFileId\n let startFileId: LargeFileId | undefined = explicitResumeFileId\n let truncated = false\n\n while (pageCount < maxListPages) {\n signal?.throwIfAborted()\n const unfinished = await abortableRequest(\n raw.listUnfinishedLargeFiles(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n bucketId,\n maxFileCount: explicitResumeFileId !== undefined ? 1 : 100,\n namePrefix: fileName,\n ...(startFileId !== undefined ? { startFileId } : {}),\n },\n signal !== undefined ? { signal } : undefined,\n ),\n signal,\n )\n pageCount++\n\n for (const file of unfinished.files) {\n const isMatch =\n explicitResumeFileId !== undefined\n ? file.fileId === explicitResumeFileId\n : file.fileName === fileName\n if (isMatch) {\n matches.push({ file, sequence })\n }\n sequence++\n }\n\n if (explicitResumeFileId !== undefined) break\n if (unfinished.nextFileId === null) break\n startFileId = unfinished.nextFileId\n truncated = pageCount >= maxListPages\n }\n\n if (truncated) {\n emitCandidateRejected(criteria, {\n requestedFileName: fileName,\n reason: 'search-truncated',\n })\n }\n\n matches.sort(compareNewestFirst)\n\n let partCandidatesInspected = 0\n for (const match of matches) {\n signal?.throwIfAborted()\n const rejection = candidateMetadataRejectReason(match.file, fileName, criteria)\n if (rejection !== null) {\n notifyCandidateRejected(criteria, match.file, fileName, rejection)\n continue\n }\n\n if (partCandidatesInspected >= maxPartCandidates) {\n notifyCandidateRejected(criteria, match.file, fileName, 'candidate-limit')\n break\n }\n\n partCandidatesInspected++\n const fileId = largeFileIdOf(match.file.fileId)\n const uploadedPartsResult = await collectResumePartInfo(raw, accountInfo, fileId, {\n maxPages: criteria.maxPartPages ?? DEFAULT_MAX_RESUME_PART_PAGES,\n maxParts: criteria.parts.length,\n ...(signal !== undefined ? { signal } : {}),\n })\n const uploadedParts = uploadedPartsResult.parts\n if (uploadedPartsResult.truncated || !uploadedPartsMatchPlan(uploadedParts, criteria.parts)) {\n notifyCandidateRejected(criteria, match.file, fileName, 'part-length-mismatch')\n continue\n }\n\n return { fileId, uploadedPartSha1s: partInfoToSha1s(uploadedParts) }\n }\n\n return null\n}\n\ninterface CollectResumePartInfoOptions {\n readonly signal?: AbortSignal\n readonly maxPages?: number\n readonly maxParts?: number\n}\n\nasync function collectResumePartInfo(\n raw: RawClient,\n accountInfo: AccountInfo,\n fileId: LargeFileId,\n options: CollectResumePartInfoOptions,\n): Promise<{ readonly parts: Map<number, ResumePartInfo>; readonly truncated: boolean }> {\n const parts = new Map<number, ResumePartInfo>()\n const maxPages = options.maxPages ?? Number.POSITIVE_INFINITY\n const maxParts = options.maxParts ?? Number.POSITIVE_INFINITY\n let startPartNumber: number | undefined\n let pageCount = 0\n\n while (pageCount < maxPages) {\n options.signal?.throwIfAborted()\n // Fetch one part beyond the local plan so a candidate with extra uploaded\n // parts is detected and rejected instead of silently reused.\n const remainingParts =\n maxParts === Number.POSITIVE_INFINITY\n ? undefined\n : Math.max(1, Math.min(LIST_PARTS_PAGE_SIZE, maxParts - parts.size + 1))\n const page = await abortableRequest(\n raw.listParts(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n fileId,\n ...(startPartNumber !== undefined ? { startPartNumber } : {}),\n ...(remainingParts !== undefined ? { maxPartCount: remainingParts } : {}),\n },\n options.signal !== undefined ? { signal: options.signal } : undefined,\n ),\n options.signal,\n )\n pageCount++\n for (const part of page.parts) {\n parts.set(part.partNumber, {\n contentSha1: part.contentSha1,\n contentLength: part.contentLength,\n })\n if (parts.size > maxParts) return { parts, truncated: true }\n }\n if (page.nextPartNumber === null) return { parts, truncated: false }\n assertAdvancingPartCursor(fileId, startPartNumber, page.nextPartNumber)\n startPartNumber = page.nextPartNumber\n }\n\n return { parts, truncated: true }\n}\n\nfunction compareNewestFirst(\n a: { file: UnfinishedLargeFile; sequence: number },\n b: { file: UnfinishedLargeFile; sequence: number },\n): number {\n const aTime = a.file.uploadTimestamp ?? Number.NEGATIVE_INFINITY\n const bTime = b.file.uploadTimestamp ?? Number.NEGATIVE_INFINITY\n if (aTime !== bTime) return bTime - aTime\n return b.sequence - a.sequence\n}\n\nfunction candidateMetadataRejectReason(\n candidate: UnfinishedLargeFile,\n fileName: string,\n criteria: ResumeCandidateCriteria,\n): ResumeCandidateRejectedReason | null {\n if (candidate.fileName !== fileName) return 'file-name-mismatch'\n if (\n criteria.contentType === 'b2/x-auto' &&\n criteria.resumeFileId === undefined &&\n candidate.contentType !== 'b2/x-auto'\n ) {\n return 'content-type-mismatch'\n }\n if (criteria.contentType !== 'b2/x-auto' && candidate.contentType !== criteria.contentType) {\n return 'content-type-mismatch'\n }\n\n const candidateInfo = splitResumeFileInfo(candidate.fileInfo ?? {})\n if (!recordEquals(candidateInfo.fileInfo, criteria.fileInfo)) return 'file-info-mismatch'\n if (\n candidateInfo.sourceSize !== undefined &&\n candidateInfo.sourceSize !== String(criteria.sourceSize)\n ) {\n return 'source-size-mismatch'\n }\n if (\n candidateInfo.partSize !== undefined &&\n candidateInfo.partSize !== String(criteria.partSize)\n ) {\n return 'part-size-mismatch'\n }\n if (\n criteria.customUploadTimestamp !== undefined &&\n candidate.uploadTimestamp !== criteria.customUploadTimestamp\n ) {\n return 'upload-timestamp-mismatch'\n }\n\n const encryptionRejectReason = serverSideEncryptionRejectReason(\n candidate.serverSideEncryption,\n criteria.serverSideEncryption,\n )\n if (encryptionRejectReason !== null) return encryptionRejectReason\n if (\n !fileRetentionMatches(\n candidate.fileRetention,\n criteria.fileRetention,\n criteria.defaultFileRetention,\n criteria.defaultFileRetentionUnreadable === true,\n candidate.uploadTimestamp,\n )\n ) {\n return 'retention-mismatch'\n }\n if (!legalHoldMatches(candidate.legalHold, criteria.legalHold)) {\n return 'legal-hold-mismatch'\n }\n\n return null\n}\n\nfunction notifyCandidateRejected(\n criteria: ResumeCandidateCriteria,\n candidate: UnfinishedLargeFile,\n requestedFileName: string,\n reason: ResumeCandidateRejectedReason,\n): void {\n emitCandidateRejected(criteria, {\n fileId: largeFileIdOf(candidate.fileId),\n requestedFileName,\n candidateFileName: candidate.fileName,\n reason,\n })\n}\n\nfunction emitCandidateRejected(\n criteria: ResumeCandidateCriteria,\n event: ResumeCandidateRejectedEvent,\n): void {\n try {\n criteria.onCandidateRejected?.(event)\n } catch {\n // Diagnostic listeners should not make an otherwise valid upload fail.\n }\n}\n\nfunction uploadedPartsMatchPlan(\n uploadedParts: ReadonlyMap<number, ResumePartInfo>,\n plans: readonly ResumePartPlan[],\n): boolean {\n for (const [partNumber, part] of uploadedParts) {\n const planned = plans[partNumber - 1]\n if (planned === undefined) return false\n if (planned.partNumber !== partNumber) return false\n if (planned.length !== part.contentLength) return false\n }\n return true\n}\n\nfunction partInfoToSha1s(parts: ReadonlyMap<number, ResumePartInfo>): Map<number, string> {\n const sha1s = new Map<number, string>()\n for (const [partNumber, part] of parts) {\n sha1s.set(partNumber, part.contentSha1)\n }\n return sha1s\n}\n\nfunction recordEquals(a: Record<string, string>, b: Record<string, string>): boolean {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (a[key] !== b[key]) return false\n }\n return true\n}\n\ninterface SplitResumeFileInfo {\n readonly fileInfo: Record<string, string>\n readonly sourceSize?: string\n readonly partSize?: string\n}\n\nfunction splitResumeFileInfo(fileInfo: Record<string, string>): SplitResumeFileInfo {\n const userFileInfo: Record<string, string> = Object.create(null) as Record<string, string>\n let sourceSize: string | undefined\n let partSize: string | undefined\n for (const [key, value] of Object.entries(fileInfo)) {\n if (key === RESUME_SOURCE_SIZE_INFO_KEY) {\n sourceSize = value\n } else if (key === RESUME_PART_SIZE_INFO_KEY) {\n partSize = value\n } else {\n userFileInfo[key] = value\n }\n }\n return {\n fileInfo: userFileInfo,\n ...(sourceSize !== undefined ? { sourceSize } : {}),\n ...(partSize !== undefined ? { partSize } : {}),\n }\n}\n\nfunction fileRetentionMatches(\n candidate: ReadableFileRetention | undefined,\n expected: FileRetentionValue | undefined,\n defaultExpected: BucketRetentionPolicy | undefined,\n defaultUnreadable: boolean,\n uploadTimestamp: number | undefined,\n): boolean {\n if (expected === undefined && defaultUnreadable) return false\n if (expected === undefined && defaultExpected !== undefined) {\n if (defaultExpected.mode === BucketRetentionMode.None) {\n if (candidate === undefined) return true\n if (!candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueEquals(candidate.value, null)\n }\n if (candidate === undefined || !candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueMatchesBucketDefault(candidate.value, defaultExpected, uploadTimestamp)\n }\n if (expected === undefined) {\n if (candidate === undefined) return true\n if (!candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueEquals(candidate.value, null)\n }\n if (candidate === undefined || !candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueEquals(candidate.value, expected)\n}\n\nfunction fileRetentionValueMatchesBucketDefault(\n candidate: FileRetentionValue | null,\n expected: BucketRetentionPolicy,\n uploadTimestamp: number | undefined,\n): boolean {\n if (expected.period === null) return false\n if (candidate?.mode !== expected.mode || candidate.retainUntilTimestamp === null) return false\n if (uploadTimestamp === undefined) return false\n return candidate.retainUntilTimestamp === uploadTimestamp + retentionPeriodMillis(expected.period)\n}\n\nfunction retentionPeriodMillis(period: BucketRetentionPolicy['period']): number {\n if (period === null) return 0\n const days = period.unit === 'days' ? period.duration : period.duration * 365\n return days * 24 * 60 * 60 * 1000\n}\n\nfunction fileRetentionValueEquals(\n a: FileRetentionValue | null,\n b: FileRetentionValue | null,\n): boolean {\n return (\n (a?.mode ?? null) === (b?.mode ?? null) &&\n (a?.retainUntilTimestamp ?? null) === (b?.retainUntilTimestamp ?? null)\n )\n}\n\nfunction legalHoldMatches(\n candidate: ReadableLegalHold | undefined,\n expected: LegalHoldValue | undefined,\n): boolean {\n if (expected === undefined) {\n if (candidate === undefined) return true\n if (!candidate.isClientAuthorizedToRead) return false\n return candidate.value === null || candidate.value === 'off'\n }\n if (candidate === undefined || !candidate.isClientAuthorizedToRead) return false\n return candidate.value === expected\n}\n\ninterface ResumeDiscoverySignal {\n readonly signal?: AbortSignal\n dispose(): void\n}\n\nfunction createResumeDiscoverySignal(criteria: ResumeCandidateCriteria): ResumeDiscoverySignal {\n if (criteria.signal !== undefined) {\n return {\n signal: criteria.signal,\n dispose() {},\n }\n }\n\n if (criteria.discoveryTimeoutMs === undefined) {\n return {\n dispose() {},\n }\n }\n\n const timeoutMs = criteria.discoveryTimeoutMs\n if (timeoutMs === Number.POSITIVE_INFINITY) {\n return {\n dispose() {},\n }\n }\n\n const controller = new AbortController()\n const timeout = setTimeout(\n () => {\n controller.abort(resumeDiscoveryTimeoutReason(timeoutMs))\n },\n Math.max(0, timeoutMs),\n )\n\n return {\n signal: controller.signal,\n dispose() {\n clearTimeout(timeout)\n },\n }\n}\n\nasync function abortableRequest<T>(\n request: Promise<T>,\n signal: AbortSignal | undefined,\n): Promise<T> {\n if (signal === undefined) return request\n if (signal.aborted) throw resumeAbortReason(signal)\n\n let removeAbortListener: (() => void) | undefined\n const aborted = new Promise<never>((_resolve, reject) => {\n const onAbort = () => reject(resumeAbortReason(signal))\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortListener = () => signal.removeEventListener('abort', onAbort)\n })\n\n try {\n return await Promise.race([request, aborted])\n } finally {\n removeAbortListener?.()\n void request.catch(() => {})\n }\n}\n\nfunction resumeAbortReason(signal: AbortSignal): unknown {\n return signal.reason ?? resumeAbortFallbackReason()\n}\n\nfunction resumeAbortFallbackReason(): Error {\n if (typeof DOMException === 'function') {\n return new DOMException('Resume discovery aborted', 'AbortError')\n }\n const error = new Error('Resume discovery aborted')\n error.name = 'AbortError'\n return error\n}\n\nfunction resumeDiscoveryTimeoutReason(timeoutMs: number): Error {\n if (typeof DOMException === 'function') {\n return new DOMException(`Resume discovery timed out after ${timeoutMs} ms`, 'TimeoutError')\n }\n const error = new Error(`Resume discovery timed out after ${timeoutMs} ms`)\n error.name = 'TimeoutError'\n return error\n}\n\ntype ListedEncryption = PublicEncryptionSetting | undefined\n\nfunction serverSideEncryptionRejectReason(\n candidate: ListedEncryption,\n expected: EncryptionSetting | undefined,\n): 'encryption-mismatch' | 'sse-c-unsupported' | null {\n if (expected?.mode === EncryptionMode.SseC) return 'sse-c-unsupported'\n\n const actual = normalizeEncryption(candidate)\n if (expected === undefined) {\n if (candidate === undefined) return null\n if (actual === undefined) return 'encryption-mismatch'\n if (actual.mode === EncryptionMode.None) return null\n if (actual.mode === EncryptionMode.SseB2) return null\n return actual.mode === EncryptionMode.SseC ? 'sse-c-unsupported' : 'encryption-mismatch'\n }\n\n const normalizedExpected = normalizeEncryption(expected)\n if (normalizedExpected?.mode === EncryptionMode.None && candidate === undefined) return null\n if (actual === undefined || normalizedExpected === undefined) return 'encryption-mismatch'\n if (actual.mode !== normalizedExpected.mode) return 'encryption-mismatch'\n if (actual.mode === EncryptionMode.None) return null\n return actual.algorithm === normalizedExpected.algorithm ? null : 'encryption-mismatch'\n}\n\ninterface NormalizedEncryption {\n readonly mode: EncryptionMode\n readonly algorithm?: string\n}\n\nfunction normalizeEncryption(\n encryption: EncryptionSetting | ListedEncryption,\n): NormalizedEncryption | undefined {\n if (encryption === undefined) return undefined\n // Real B2 responses may spell no encryption as `{ mode: null, algorithm: null }`.\n if (encryption.mode === null || encryption.mode === EncryptionMode.None) {\n return { mode: EncryptionMode.None }\n }\n if (encryption.mode !== EncryptionMode.SseB2 && encryption.mode !== EncryptionMode.SseC) {\n return undefined\n }\n return {\n mode: encryption.mode,\n algorithm: encryption.algorithm,\n }\n}\n\nfunction assertAdvancingPartCursor(\n fileId: LargeFileId,\n previous: number | undefined,\n next: number,\n): void {\n if (!Number.isInteger(next) || next < 1 || (previous !== undefined && next <= previous)) {\n throw new Error(\n `uploadLargeFile: listParts returned a non-advancing nextPartNumber for ${fileId}; aborting resume.`,\n )\n }\n}\n"],"mappings":";;;;;;AAqBA,IAAa,8BAA8B;;AAG3C,IAAa,4BAA4B;AAEzC,IAAM,gCAAgC;AACtC,IAAM,qCAAqC;AAC3C,IAAM,gCAAgC;AAyFtC,IAAM,uBAAuB;;;;;;;;;;;;;;;;;AA0B7B,eAAsB,oBACpB,KACA,aACA,UACA,UACA,UACiC;CACjC,MAAM,kBAAkB,4BAA4B,QAAQ;CAC5D,IAAI;EACF,OAAO,MAAM,8BACX,KACA,aACA,UACA,UACA,UACA,gBAAgB,MAClB;CACF,UAAU;EACR,gBAAgB,QAAQ;CAC1B;AACF;AAEA,eAAe,8BACb,KACA,aACA,UACA,UACA,UACA,QACiC;CACjC,MAAM,UAAkE,CAAC;CACzE,MAAM,eAAe,SAAS,gBAAgB;CAC9C,MAAM,oBAAoB,SAAS,qBAAqB;CACxD,IAAI,WAAW;CACf,IAAI,YAAY;CAChB,MAAM,uBAAuB,SAAS;CACtC,IAAI,cAAuC;CAC3C,IAAI,YAAY;CAEhB,OAAO,YAAY,cAAc;EAC/B,QAAQ,eAAe;EACvB,MAAM,aAAa,MAAM,iBACvB,IAAI,yBACF,YAAY,UAAU,GACtB,YAAY,aAAa,GACzB;GACE;GACA,cAAc,yBAAyB,KAAA,IAAY,IAAI;GACvD,YAAY;GACZ,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;EACrD,GACA,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,KAAA,CACtC,GACA,MACF;EACA;EAEA,KAAK,MAAM,QAAQ,WAAW,OAAO;GAKnC,IAHE,yBAAyB,KAAA,IACrB,KAAK,WAAW,uBAChB,KAAK,aAAa,UAEtB,QAAQ,KAAK;IAAE;IAAM;GAAS,CAAC;GAEjC;EACF;EAEA,IAAI,yBAAyB,KAAA,GAAW;EACxC,IAAI,WAAW,eAAe,MAAM;EACpC,cAAc,WAAW;EACzB,YAAY,aAAa;CAC3B;CAEA,IAAI,WACF,sBAAsB,UAAU;EAC9B,mBAAmB;EACnB,QAAQ;CACV,CAAC;CAGH,QAAQ,KAAK,kBAAkB;CAE/B,IAAI,0BAA0B;CAC9B,KAAK,MAAM,SAAS,SAAS;EAC3B,QAAQ,eAAe;EACvB,MAAM,YAAY,8BAA8B,MAAM,MAAM,UAAU,QAAQ;EAC9E,IAAI,cAAc,MAAM;GACtB,wBAAwB,UAAU,MAAM,MAAM,UAAU,SAAS;GACjE;EACF;EAEA,IAAI,2BAA2B,mBAAmB;GAChD,wBAAwB,UAAU,MAAM,MAAM,UAAU,iBAAiB;GACzE;EACF;EAEA;EACA,MAAM,SAAS,YAAA,YAAc,MAAM,KAAK,MAAM;EAC9C,MAAM,sBAAsB,MAAM,sBAAsB,KAAK,aAAa,QAAQ;GAChF,UAAU,SAAS,gBAAgB;GACnC,UAAU,SAAS,MAAM;GACzB,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;EAC3C,CAAC;EACD,MAAM,gBAAgB,oBAAoB;EAC1C,IAAI,oBAAoB,aAAa,CAAC,uBAAuB,eAAe,SAAS,KAAK,GAAG;GAC3F,wBAAwB,UAAU,MAAM,MAAM,UAAU,sBAAsB;GAC9E;EACF;EAEA,OAAO;GAAE;GAAQ,mBAAmB,gBAAgB,aAAa;EAAE;CACrE;CAEA,OAAO;AACT;AAQA,eAAe,sBACb,KACA,aACA,QACA,SACuF;CACvF,MAAM,wBAAQ,IAAI,IAA4B;CAC9C,MAAM,WAAW,QAAQ,YAAY,OAAO;CAC5C,MAAM,WAAW,QAAQ,YAAY,OAAO;CAC5C,IAAI;CACJ,IAAI,YAAY;CAEhB,OAAO,YAAY,UAAU;EAC3B,QAAQ,QAAQ,eAAe;EAG/B,MAAM,iBACJ,aAAa,OAAO,oBAChB,KAAA,IACA,KAAK,IAAI,GAAG,KAAK,IAAI,sBAAsB,WAAW,MAAM,OAAO,CAAC,CAAC;EAC3E,MAAM,OAAO,MAAM,iBACjB,IAAI,UACF,YAAY,UAAU,GACtB,YAAY,aAAa,GACzB;GACE;GACA,GAAI,oBAAoB,KAAA,IAAY,EAAE,gBAAgB,IAAI,CAAC;GAC3D,GAAI,mBAAmB,KAAA,IAAY,EAAE,cAAc,eAAe,IAAI,CAAC;EACzE,GACA,QAAQ,WAAW,KAAA,IAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,KAAA,CAC9D,GACA,QAAQ,MACV;EACA;EACA,KAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,IAAI,KAAK,YAAY;IACzB,aAAa,KAAK;IAClB,eAAe,KAAK;GACtB,CAAC;GACD,IAAI,MAAM,OAAO,UAAU,OAAO;IAAE;IAAO,WAAW;GAAK;EAC7D;EACA,IAAI,KAAK,mBAAmB,MAAM,OAAO;GAAE;GAAO,WAAW;EAAM;EACnE,0BAA0B,QAAQ,iBAAiB,KAAK,cAAc;EACtE,kBAAkB,KAAK;CACzB;CAEA,OAAO;EAAE;EAAO,WAAW;CAAK;AAClC;AAEA,SAAS,mBACP,GACA,GACQ;CACR,MAAM,QAAQ,EAAE,KAAK,mBAAmB,OAAO;CAC/C,MAAM,QAAQ,EAAE,KAAK,mBAAmB,OAAO;CAC/C,IAAI,UAAU,OAAO,OAAO,QAAQ;CACpC,OAAO,EAAE,WAAW,EAAE;AACxB;AAEA,SAAS,8BACP,WACA,UACA,UACsC;CACtC,IAAI,UAAU,aAAa,UAAU,OAAO;CAC5C,IACE,SAAS,gBAAgB,eACzB,SAAS,iBAAiB,KAAA,KAC1B,UAAU,gBAAgB,aAE1B,OAAO;CAET,IAAI,SAAS,gBAAgB,eAAe,UAAU,gBAAgB,SAAS,aAC7E,OAAO;CAGT,MAAM,gBAAgB,oBAAoB,UAAU,YAAY,CAAC,CAAC;CAClE,IAAI,CAAC,aAAa,cAAc,UAAU,SAAS,QAAQ,GAAG,OAAO;CACrE,IACE,cAAc,eAAe,KAAA,KAC7B,cAAc,eAAe,OAAO,SAAS,UAAU,GAEvD,OAAO;CAET,IACE,cAAc,aAAa,KAAA,KAC3B,cAAc,aAAa,OAAO,SAAS,QAAQ,GAEnD,OAAO;CAET,IACE,SAAS,0BAA0B,KAAA,KACnC,UAAU,oBAAoB,SAAS,uBAEvC,OAAO;CAGT,MAAM,yBAAyB,iCAC7B,UAAU,sBACV,SAAS,oBACX;CACA,IAAI,2BAA2B,MAAM,OAAO;CAC5C,IACE,CAAC,qBACC,UAAU,eACV,SAAS,eACT,SAAS,sBACT,SAAS,mCAAmC,MAC5C,UAAU,eACZ,GAEA,OAAO;CAET,IAAI,CAAC,iBAAiB,UAAU,WAAW,SAAS,SAAS,GAC3D,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,wBACP,UACA,WACA,mBACA,QACM;CACN,sBAAsB,UAAU;EAC9B,QAAQ,YAAA,YAAc,UAAU,MAAM;EACtC;EACA,mBAAmB,UAAU;EAC7B;CACF,CAAC;AACH;AAEA,SAAS,sBACP,UACA,OACM;CACN,IAAI;EACF,SAAS,sBAAsB,KAAK;CACtC,QAAQ,CAER;AACF;AAEA,SAAS,uBACP,eACA,OACS;CACT,KAAK,MAAM,CAAC,YAAY,SAAS,eAAe;EAC9C,MAAM,UAAU,MAAM,aAAa;EACnC,IAAI,YAAY,KAAA,GAAW,OAAO;EAClC,IAAI,QAAQ,eAAe,YAAY,OAAO;EAC9C,IAAI,QAAQ,WAAW,KAAK,eAAe,OAAO;CACpD;CACA,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAiE;CACxF,MAAM,wBAAQ,IAAI,IAAoB;CACtC,KAAK,MAAM,CAAC,YAAY,SAAS,OAC/B,MAAM,IAAI,YAAY,KAAK,WAAW;CAExC,OAAO;AACT;AAEA,SAAS,aAAa,GAA2B,GAAoC;CACnF,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,IAAI,MAAM,WAAW,MAAM,QAAQ,OAAO;CAC1C,KAAK,MAAM,OAAO,OAChB,IAAI,EAAE,SAAS,EAAE,MAAM,OAAO;CAEhC,OAAO;AACT;AAQA,SAAS,oBAAoB,UAAuD;CAClF,MAAM,eAAuC,OAAO,OAAO,IAAI;CAC/D,IAAI;CACJ,IAAI;CACJ,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAChD,IAAI,QAAA,6BACF,aAAa;MACR,IAAI,QAAA,2BACT,WAAW;MAEX,aAAa,OAAO;CAGxB,OAAO;EACL,UAAU;EACV,GAAI,eAAe,KAAA,IAAY,EAAE,WAAW,IAAI,CAAC;EACjD,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;CAC/C;AACF;AAEA,SAAS,qBACP,WACA,UACA,iBACA,mBACA,iBACS;CACT,IAAI,aAAa,KAAA,KAAa,mBAAmB,OAAO;CACxD,IAAI,aAAa,KAAA,KAAa,oBAAoB,KAAA,GAAW;EAC3D,IAAI,gBAAgB,SAAS,eAAA,oBAAoB,MAAM;GACrD,IAAI,cAAc,KAAA,GAAW,OAAO;GACpC,IAAI,CAAC,UAAU,0BAA0B,OAAO;GAChD,OAAO,yBAAyB,UAAU,OAAO,IAAI;EACvD;EACA,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,0BAA0B,OAAO;EAC3E,OAAO,uCAAuC,UAAU,OAAO,iBAAiB,eAAe;CACjG;CACA,IAAI,aAAa,KAAA,GAAW;EAC1B,IAAI,cAAc,KAAA,GAAW,OAAO;EACpC,IAAI,CAAC,UAAU,0BAA0B,OAAO;EAChD,OAAO,yBAAyB,UAAU,OAAO,IAAI;CACvD;CACA,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,0BAA0B,OAAO;CAC3E,OAAO,yBAAyB,UAAU,OAAO,QAAQ;AAC3D;AAEA,SAAS,uCACP,WACA,UACA,iBACS;CACT,IAAI,SAAS,WAAW,MAAM,OAAO;CACrC,IAAI,WAAW,SAAS,SAAS,QAAQ,UAAU,yBAAyB,MAAM,OAAO;CACzF,IAAI,oBAAoB,KAAA,GAAW,OAAO;CAC1C,OAAO,UAAU,yBAAyB,kBAAkB,sBAAsB,SAAS,MAAM;AACnG;AAEA,SAAS,sBAAsB,QAAiD;CAC9E,IAAI,WAAW,MAAM,OAAO;CAE5B,QADa,OAAO,SAAS,SAAS,OAAO,WAAW,OAAO,WAAW,OAC5D,KAAK,KAAK,KAAK;AAC/B;AAEA,SAAS,yBACP,GACA,GACS;CACT,QACG,GAAG,QAAQ,WAAW,GAAG,QAAQ,UACjC,GAAG,wBAAwB,WAAW,GAAG,wBAAwB;AAEtE;AAEA,SAAS,iBACP,WACA,UACS;CACT,IAAI,aAAa,KAAA,GAAW;EAC1B,IAAI,cAAc,KAAA,GAAW,OAAO;EACpC,IAAI,CAAC,UAAU,0BAA0B,OAAO;EAChD,OAAO,UAAU,UAAU,QAAQ,UAAU,UAAU;CACzD;CACA,IAAI,cAAc,KAAA,KAAa,CAAC,UAAU,0BAA0B,OAAO;CAC3E,OAAO,UAAU,UAAU;AAC7B;AAOA,SAAS,4BAA4B,UAA0D;CAC7F,IAAI,SAAS,WAAW,KAAA,GACtB,OAAO;EACL,QAAQ,SAAS;EACjB,UAAU,CAAC;CACb;CAGF,IAAI,SAAS,uBAAuB,KAAA,GAClC,OAAO,EACL,UAAU,CAAC,EACb;CAGF,MAAM,YAAY,SAAS;CAC3B,IAAI,cAAc,OAAO,mBACvB,OAAO,EACL,UAAU,CAAC,EACb;CAGF,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,UAAU,iBACR;EACJ,WAAW,MAAM,6BAA6B,SAAS,CAAC;CAC1D,GACA,KAAK,IAAI,GAAG,SAAS,CACvB;CAEA,OAAO;EACL,QAAQ,WAAW;EACnB,UAAU;GACR,aAAa,OAAO;EACtB;CACF;AACF;AAEA,eAAe,iBACb,SACA,QACY;CACZ,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI,OAAO,SAAS,MAAM,kBAAkB,MAAM;CAElD,IAAI;CACJ,MAAM,UAAU,IAAI,SAAgB,UAAU,WAAW;EACvD,MAAM,gBAAgB,OAAO,kBAAkB,MAAM,CAAC;EACtD,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACxD,4BAA4B,OAAO,oBAAoB,SAAS,OAAO;CACzE,CAAC;CAED,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,OAAO,CAAC;CAC9C,UAAU;EACR,sBAAsB;EACtB,QAAa,YAAY,CAAC,CAAC;CAC7B;AACF;AAEA,SAAS,kBAAkB,QAA8B;CACvD,OAAO,OAAO,UAAU,0BAA0B;AACpD;AAEA,SAAS,4BAAmC;CAC1C,IAAI,OAAO,iBAAiB,YAC1B,OAAO,IAAI,aAAa,4BAA4B,YAAY;CAElE,MAAM,wBAAQ,IAAI,MAAM,0BAA0B;CAClD,MAAM,OAAO;CACb,OAAO;AACT;AAEA,SAAS,6BAA6B,WAA0B;CAC9D,IAAI,OAAO,iBAAiB,YAC1B,OAAO,IAAI,aAAa,oCAAoC,UAAU,MAAM,cAAc;CAE5F,MAAM,wBAAQ,IAAI,MAAM,oCAAoC,UAAU,IAAI;CAC1E,MAAM,OAAO;CACb,OAAO;AACT;AAIA,SAAS,iCACP,WACA,UACoD;CACpD,IAAI,UAAU,SAAS,mBAAA,eAAe,MAAM,OAAO;CAEnD,MAAM,SAAS,oBAAoB,SAAS;CAC5C,IAAI,aAAa,KAAA,GAAW;EAC1B,IAAI,cAAc,KAAA,GAAW,OAAO;EACpC,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,IAAI,OAAO,SAAS,mBAAA,eAAe,MAAM,OAAO;EAChD,IAAI,OAAO,SAAS,mBAAA,eAAe,OAAO,OAAO;EACjD,OAAO,OAAO,SAAS,mBAAA,eAAe,OAAO,sBAAsB;CACrE;CAEA,MAAM,qBAAqB,oBAAoB,QAAQ;CACvD,IAAI,oBAAoB,SAAS,mBAAA,eAAe,QAAQ,cAAc,KAAA,GAAW,OAAO;CACxF,IAAI,WAAW,KAAA,KAAa,uBAAuB,KAAA,GAAW,OAAO;CACrE,IAAI,OAAO,SAAS,mBAAmB,MAAM,OAAO;CACpD,IAAI,OAAO,SAAS,mBAAA,eAAe,MAAM,OAAO;CAChD,OAAO,OAAO,cAAc,mBAAmB,YAAY,OAAO;AACpE;AAOA,SAAS,oBACP,YACkC;CAClC,IAAI,eAAe,KAAA,GAAW,OAAO,KAAA;CAErC,IAAI,WAAW,SAAS,QAAQ,WAAW,SAAS,mBAAA,eAAe,MACjE,OAAO,EAAE,MAAM,mBAAA,eAAe,KAAK;CAErC,IAAI,WAAW,SAAS,mBAAA,eAAe,SAAS,WAAW,SAAS,mBAAA,eAAe,MACjF;CAEF,OAAO;EACL,MAAM,WAAW;EACjB,WAAW,WAAW;CACxB;AACF;AAEA,SAAS,0BACP,QACA,UACA,MACM;CACN,IAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAM,aAAa,KAAA,KAAa,QAAQ,UAC5E,MAAM,IAAI,MACR,0EAA0E,OAAO,mBACnF;AAEJ"}
|
|
1
|
+
{"version":3,"file":"resume.cjs","names":[],"sources":["../../src/upload/resume.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport { ResumeFileIdMismatchError } from '../errors/index.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport {\n type BucketDefaultRetention,\n type BucketDefaultServerSideEncryption,\n BucketRetentionMode,\n type BucketRetentionPolicy,\n} from '../types/bucket.ts'\nimport {\n EncryptionMode,\n type EncryptionSetting,\n type PublicEncryptionSetting,\n} from '../types/encryption.ts'\nimport type { BucketId, LargeFileId } from '../types/ids.ts'\nimport { largeFileId as largeFileIdOf } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type {\n ReadableFileRetention,\n ReadableLegalHold,\n UnfinishedLargeFile,\n} from '../types/upload.ts'\n\nexport { ResumeFileIdMismatchError }\n\n/** Compatibility-only file-info key read from legacy unfinished uploads; new uploads do not write it. */\nexport const RESUME_SOURCE_SIZE_INFO_KEY = 'b2_sdk_resume_source_size'\n\n/** Compatibility-only file-info key read from legacy unfinished uploads; new uploads do not write it. */\nexport const RESUME_PART_SIZE_INFO_KEY = 'b2_sdk_resume_part_size'\n\nconst DEFAULT_MAX_RESUME_LIST_PAGES = 10\nconst DEFAULT_MAX_RESUME_PART_CANDIDATES = 25\nconst DEFAULT_MAX_RESUME_PART_PAGES = 10\n\n/** One planned part from the local upload source. */\nexport interface ResumePartPlan {\n /** 1-based B2 part number. */\n readonly partNumber: number\n /** Expected byte length for this part. */\n readonly length: number\n}\n\n/** Reason an unfinished same-name large file was not reused for resume. */\nexport type ResumeCandidateRejectedReason =\n | 'search-truncated'\n | 'candidate-limit'\n | 'file-name-mismatch'\n | 'content-type-mismatch'\n | 'file-info-mismatch'\n | 'source-size-mismatch'\n | 'part-size-mismatch'\n | 'upload-timestamp-mismatch'\n | 'encryption-mismatch'\n | 'sse-c-unsupported'\n | 'retention-mismatch'\n | 'legal-hold-mismatch'\n | 'part-length-mismatch'\n\n/** Diagnostic event emitted when resume discovery declines a candidate. */\nexport interface ResumeCandidateRejectedEvent {\n /** ID of the unfinished large file, when the event is candidate-specific. */\n readonly fileId?: LargeFileId\n /** Requested destination file name. */\n readonly requestedFileName: string\n /** Actual candidate file name, when the event is candidate-specific. */\n readonly candidateFileName?: string\n /** Machine-readable rejection reason. */\n readonly reason: ResumeCandidateRejectedReason\n}\n\n/** Diagnostic callback for declined resume candidates. */\nexport type ResumeCandidateRejectedListener = (event: ResumeCandidateRejectedEvent) => void\n\n/** Compatibility requirements an unfinished large file must satisfy before reuse. */\nexport interface ResumeCandidateCriteria {\n /** Effective MIME type for the upload, including SDK defaults. */\n readonly contentType: string\n /** Caller-owned file info. Legacy SDK resume keys on candidates are ignored separately. */\n readonly fileInfo: Record<string, string>\n /** Source size in bytes, checked against legacy SDK metadata when a candidate carries it. */\n readonly sourceSize: number\n /** Effective multipart part size, checked against legacy SDK metadata when present. */\n readonly partSize: number\n /** Planned local parts used to verify already-uploaded server part lengths. */\n readonly parts: readonly ResumePartPlan[]\n /** Requested B2 upload timestamp override, if configured by the caller. */\n readonly customUploadTimestamp?: number\n /** Explicit or effective readable bucket default server-side encryption. */\n readonly serverSideEncryption?: EncryptionSetting | BucketDefaultServerSideEncryption\n /** Whether bucket default encryption exists but cannot be read by the caller. */\n readonly defaultServerSideEncryptionUnreadable?: boolean\n /** Explicit Object Lock retention option, if configured by the caller. */\n readonly fileRetention?: FileRetentionValue\n /** Effective readable bucket default retention when the caller omits fileRetention. */\n readonly defaultFileRetention?: BucketDefaultRetention\n /** Whether bucket default retention exists but cannot be read by the caller. */\n readonly defaultFileRetentionUnreadable?: boolean\n /** Explicit legal hold option, if configured by the caller. */\n readonly legalHold?: LegalHoldValue\n /** Explicit unfinished large-file ID to verify before reuse. */\n readonly resumeFileId?: LargeFileId\n /** Abort signal used for B2 list requests and checked between pages. */\n readonly signal?: AbortSignal\n /** Optional diagnostic callback for candidates that are found but not reused. */\n readonly onCandidateRejected?: ResumeCandidateRejectedListener\n /** Maximum `b2_list_unfinished_large_files` pages to inspect. */\n readonly maxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed. */\n readonly maxPartCandidates?: number\n /** Maximum `b2_list_parts` pages to inspect for each metadata-compatible candidate. */\n readonly maxPartPages?: number\n /** Caller-supplied aggregate resume discovery timeout. */\n readonly discoveryTimeoutMs?: number\n}\n\n/** Uploaded part metadata used by the resume planner. */\nexport interface ResumePartInfo {\n /** SHA-1 stored by B2 for this uploaded part. */\n readonly contentSha1: string\n /** Byte length stored by B2 for this uploaded part. */\n readonly contentLength: number\n}\n\nconst LIST_PARTS_PAGE_SIZE = 100\n\n/** Information about an unfinished large file eligible for resume. */\nexport interface ResumeCandidate {\n /** ID of the unfinished large file. */\n readonly fileId: LargeFileId\n /** SHA-1 of each part already uploaded, indexed by 1-based part number. */\n readonly uploadedPartSha1s: ReadonlyMap<number, string>\n}\n\n/**\n * Finds an unfinished large file matching the given bucket and file name.\n * Returns `null` when no compatible candidate exists.\n *\n * With criteria, the newest compatible candidate is selected; incompatible\n * same-name uploads are ignored and optionally reported via\n * `onCandidateRejected`.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state.\n * @param bucketId - Target bucket of the upload.\n * @param fileName - Destination file name of the upload.\n * @param criteria - Upload identity and option checks.\n *\n * @returns A {@link ResumeCandidate} describing the candidate and its uploaded parts, or `null`.\n */\nexport async function findResumeCandidate(\n raw: RawClient,\n accountInfo: AccountInfo,\n bucketId: BucketId,\n fileName: string,\n criteria: ResumeCandidateCriteria,\n): Promise<ResumeCandidate | null> {\n const discoverySignal = createResumeDiscoverySignal(criteria)\n try {\n return await findResumeCandidateWithSignal(\n raw,\n accountInfo,\n bucketId,\n fileName,\n criteria,\n discoverySignal.signal,\n )\n } finally {\n discoverySignal.dispose()\n }\n}\n\nasync function findResumeCandidateWithSignal(\n raw: RawClient,\n accountInfo: AccountInfo,\n bucketId: BucketId,\n fileName: string,\n criteria: ResumeCandidateCriteria,\n signal: AbortSignal | undefined,\n): Promise<ResumeCandidate | null> {\n const matches: Array<{ file: UnfinishedLargeFile; sequence: number }> = []\n const maxListPages = criteria.maxListPages ?? DEFAULT_MAX_RESUME_LIST_PAGES\n const maxPartCandidates = criteria.maxPartCandidates ?? DEFAULT_MAX_RESUME_PART_CANDIDATES\n let sequence = 0\n let pageCount = 0\n const explicitResumeFileId = criteria.resumeFileId\n let startFileId: LargeFileId | undefined = explicitResumeFileId\n let truncated = false\n\n while (pageCount < maxListPages) {\n signal?.throwIfAborted()\n const unfinished = await abortableRequest(\n raw.listUnfinishedLargeFiles(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n bucketId,\n maxFileCount: explicitResumeFileId !== undefined ? 1 : 100,\n namePrefix: fileName,\n ...(startFileId !== undefined ? { startFileId } : {}),\n },\n signal !== undefined ? { signal } : undefined,\n ),\n signal,\n )\n pageCount++\n\n for (const file of unfinished.files) {\n const isMatch =\n explicitResumeFileId !== undefined\n ? file.fileId === explicitResumeFileId\n : file.fileName === fileName\n if (isMatch) {\n matches.push({ file, sequence })\n }\n sequence++\n }\n\n if (explicitResumeFileId !== undefined) break\n if (unfinished.nextFileId === null) break\n startFileId = unfinished.nextFileId\n truncated = pageCount >= maxListPages\n }\n\n if (truncated) {\n emitCandidateRejected(criteria, {\n requestedFileName: fileName,\n reason: 'search-truncated',\n })\n }\n\n matches.sort(compareNewestFirst)\n\n let partCandidatesInspected = 0\n for (const match of matches) {\n signal?.throwIfAborted()\n const rejection = candidateMetadataRejectReason(match.file, fileName, criteria)\n if (rejection !== null) {\n notifyCandidateRejected(criteria, match.file, fileName, rejection)\n continue\n }\n\n if (partCandidatesInspected >= maxPartCandidates) {\n notifyCandidateRejected(criteria, match.file, fileName, 'candidate-limit')\n break\n }\n\n partCandidatesInspected++\n const fileId = largeFileIdOf(match.file.fileId)\n const uploadedPartsResult = await collectResumePartInfo(raw, accountInfo, fileId, {\n maxPages: criteria.maxPartPages ?? DEFAULT_MAX_RESUME_PART_PAGES,\n maxParts: criteria.parts.length,\n ...(signal !== undefined ? { signal } : {}),\n })\n const uploadedParts = uploadedPartsResult.parts\n if (uploadedPartsResult.truncated || !uploadedPartsMatchPlan(uploadedParts, criteria.parts)) {\n notifyCandidateRejected(criteria, match.file, fileName, 'part-length-mismatch')\n continue\n }\n\n return { fileId, uploadedPartSha1s: partInfoToSha1s(uploadedParts) }\n }\n\n return null\n}\n\ninterface CollectResumePartInfoOptions {\n readonly signal?: AbortSignal\n readonly maxPages?: number\n readonly maxParts?: number\n}\n\nasync function collectResumePartInfo(\n raw: RawClient,\n accountInfo: AccountInfo,\n fileId: LargeFileId,\n options: CollectResumePartInfoOptions,\n): Promise<{ readonly parts: Map<number, ResumePartInfo>; readonly truncated: boolean }> {\n const parts = new Map<number, ResumePartInfo>()\n const maxPages = options.maxPages ?? Number.POSITIVE_INFINITY\n const maxParts = options.maxParts ?? Number.POSITIVE_INFINITY\n let startPartNumber: number | undefined\n let pageCount = 0\n\n while (pageCount < maxPages) {\n options.signal?.throwIfAborted()\n // Fetch one part beyond the local plan so a candidate with extra uploaded\n // parts is detected and rejected instead of silently reused.\n const remainingParts =\n maxParts === Number.POSITIVE_INFINITY\n ? undefined\n : Math.max(1, Math.min(LIST_PARTS_PAGE_SIZE, maxParts - parts.size + 1))\n const page = await abortableRequest(\n raw.listParts(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n fileId,\n ...(startPartNumber !== undefined ? { startPartNumber } : {}),\n ...(remainingParts !== undefined ? { maxPartCount: remainingParts } : {}),\n },\n options.signal !== undefined ? { signal: options.signal } : undefined,\n ),\n options.signal,\n )\n pageCount++\n for (const part of page.parts) {\n parts.set(part.partNumber, {\n contentSha1: part.contentSha1,\n contentLength: part.contentLength,\n })\n if (parts.size > maxParts) return { parts, truncated: true }\n }\n if (page.nextPartNumber === null) return { parts, truncated: false }\n assertAdvancingPartCursor(fileId, startPartNumber, page.nextPartNumber)\n startPartNumber = page.nextPartNumber\n }\n\n return { parts, truncated: true }\n}\n\nfunction compareNewestFirst(\n a: { file: UnfinishedLargeFile; sequence: number },\n b: { file: UnfinishedLargeFile; sequence: number },\n): number {\n const aTime = a.file.uploadTimestamp ?? Number.NEGATIVE_INFINITY\n const bTime = b.file.uploadTimestamp ?? Number.NEGATIVE_INFINITY\n if (aTime !== bTime) return bTime - aTime\n return b.sequence - a.sequence\n}\n\nfunction candidateMetadataRejectReason(\n candidate: UnfinishedLargeFile,\n fileName: string,\n criteria: ResumeCandidateCriteria,\n): ResumeCandidateRejectedReason | null {\n if (candidate.fileName !== fileName) return 'file-name-mismatch'\n if (\n criteria.contentType === 'b2/x-auto' &&\n criteria.resumeFileId === undefined &&\n candidate.contentType !== 'b2/x-auto'\n ) {\n return 'content-type-mismatch'\n }\n if (criteria.contentType !== 'b2/x-auto' && candidate.contentType !== criteria.contentType) {\n return 'content-type-mismatch'\n }\n\n const candidateInfo = splitResumeFileInfo(candidate.fileInfo ?? {})\n if (!recordEquals(candidateInfo.fileInfo, criteria.fileInfo)) return 'file-info-mismatch'\n if (\n candidateInfo.sourceSize !== undefined &&\n candidateInfo.sourceSize !== String(criteria.sourceSize)\n ) {\n return 'source-size-mismatch'\n }\n if (\n candidateInfo.partSize !== undefined &&\n candidateInfo.partSize !== String(criteria.partSize)\n ) {\n return 'part-size-mismatch'\n }\n if (\n criteria.customUploadTimestamp !== undefined &&\n candidate.uploadTimestamp !== criteria.customUploadTimestamp\n ) {\n return 'upload-timestamp-mismatch'\n }\n\n const encryptionRejectReason = serverSideEncryptionRejectReason(\n candidate.serverSideEncryption,\n criteria.serverSideEncryption,\n criteria.defaultServerSideEncryptionUnreadable === true,\n )\n if (encryptionRejectReason !== null) return encryptionRejectReason\n if (\n !fileRetentionMatches(\n candidate.fileRetention,\n criteria.fileRetention,\n criteria.defaultFileRetention,\n criteria.defaultFileRetentionUnreadable === true,\n candidate.uploadTimestamp,\n )\n ) {\n return 'retention-mismatch'\n }\n if (!legalHoldMatches(candidate.legalHold, criteria.legalHold)) {\n return 'legal-hold-mismatch'\n }\n\n return null\n}\n\nfunction notifyCandidateRejected(\n criteria: ResumeCandidateCriteria,\n candidate: UnfinishedLargeFile,\n requestedFileName: string,\n reason: ResumeCandidateRejectedReason,\n): void {\n emitCandidateRejected(criteria, {\n fileId: largeFileIdOf(candidate.fileId),\n requestedFileName,\n candidateFileName: candidate.fileName,\n reason,\n })\n}\n\nfunction emitCandidateRejected(\n criteria: ResumeCandidateCriteria,\n event: ResumeCandidateRejectedEvent,\n): void {\n try {\n criteria.onCandidateRejected?.(event)\n } catch {\n // Diagnostic listeners should not make an otherwise valid upload fail.\n }\n}\n\nfunction uploadedPartsMatchPlan(\n uploadedParts: ReadonlyMap<number, ResumePartInfo>,\n plans: readonly ResumePartPlan[],\n): boolean {\n for (const [partNumber, part] of uploadedParts) {\n const planned = plans[partNumber - 1]\n if (planned === undefined) return false\n if (planned.partNumber !== partNumber) return false\n if (planned.length !== part.contentLength) return false\n }\n return true\n}\n\nfunction partInfoToSha1s(parts: ReadonlyMap<number, ResumePartInfo>): Map<number, string> {\n const sha1s = new Map<number, string>()\n for (const [partNumber, part] of parts) {\n sha1s.set(partNumber, part.contentSha1)\n }\n return sha1s\n}\n\nfunction recordEquals(a: Record<string, string>, b: Record<string, string>): boolean {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (a[key] !== b[key]) return false\n }\n return true\n}\n\ninterface SplitResumeFileInfo {\n readonly fileInfo: Record<string, string>\n readonly sourceSize?: string\n readonly partSize?: string\n}\n\nfunction splitResumeFileInfo(fileInfo: Record<string, string>): SplitResumeFileInfo {\n const userFileInfo: Record<string, string> = Object.create(null) as Record<string, string>\n let sourceSize: string | undefined\n let partSize: string | undefined\n for (const [key, value] of Object.entries(fileInfo)) {\n if (key === RESUME_SOURCE_SIZE_INFO_KEY) {\n sourceSize = value\n } else if (key === RESUME_PART_SIZE_INFO_KEY) {\n partSize = value\n } else {\n userFileInfo[key] = value\n }\n }\n return {\n fileInfo: userFileInfo,\n ...(sourceSize !== undefined ? { sourceSize } : {}),\n ...(partSize !== undefined ? { partSize } : {}),\n }\n}\n\nfunction fileRetentionMatches(\n candidate: ReadableFileRetention | undefined,\n expected: FileRetentionValue | undefined,\n defaultExpected: BucketDefaultRetention | undefined,\n defaultUnreadable: boolean,\n uploadTimestamp: number | undefined,\n): boolean {\n if (expected === undefined && defaultUnreadable) return false\n if (expected === undefined && defaultExpected !== undefined) {\n if (defaultExpected.mode === null || defaultExpected.mode === BucketRetentionMode.None) {\n if (candidate === undefined) return true\n if (!candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueEquals(candidate.value, null)\n }\n if (candidate === undefined || !candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueMatchesBucketDefault(candidate.value, defaultExpected, uploadTimestamp)\n }\n if (expected === undefined) {\n if (candidate === undefined) return true\n if (!candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueEquals(candidate.value, null)\n }\n if (candidate === undefined || !candidate.isClientAuthorizedToRead) return false\n return fileRetentionValueEquals(candidate.value, expected)\n}\n\nfunction fileRetentionValueMatchesBucketDefault(\n candidate: FileRetentionValue | null,\n expected: BucketRetentionPolicy,\n uploadTimestamp: number | undefined,\n): boolean {\n if (expected.period === null) return false\n if (candidate?.mode !== expected.mode || candidate.retainUntilTimestamp === null) return false\n if (uploadTimestamp === undefined) return false\n return candidate.retainUntilTimestamp === uploadTimestamp + retentionPeriodMillis(expected.period)\n}\n\nfunction retentionPeriodMillis(period: BucketRetentionPolicy['period']): number {\n if (period === null) return 0\n const days = period.unit === 'days' ? period.duration : period.duration * 365\n return days * 24 * 60 * 60 * 1000\n}\n\nfunction fileRetentionValueEquals(\n a: FileRetentionValue | null,\n b: FileRetentionValue | null,\n): boolean {\n return (\n (a?.mode ?? null) === (b?.mode ?? null) &&\n (a?.retainUntilTimestamp ?? null) === (b?.retainUntilTimestamp ?? null)\n )\n}\n\nfunction legalHoldMatches(\n candidate: ReadableLegalHold | undefined,\n expected: LegalHoldValue | undefined,\n): boolean {\n if (expected === undefined) {\n if (candidate === undefined) return true\n if (!candidate.isClientAuthorizedToRead) return false\n return candidate.value === null || candidate.value === 'off'\n }\n if (candidate === undefined || !candidate.isClientAuthorizedToRead) return false\n return candidate.value === expected\n}\n\ninterface ResumeDiscoverySignal {\n readonly signal?: AbortSignal\n dispose(): void\n}\n\nfunction createResumeDiscoverySignal(criteria: ResumeCandidateCriteria): ResumeDiscoverySignal {\n if (criteria.signal !== undefined) {\n return {\n signal: criteria.signal,\n dispose() {},\n }\n }\n\n if (criteria.discoveryTimeoutMs === undefined) {\n return {\n dispose() {},\n }\n }\n\n const timeoutMs = criteria.discoveryTimeoutMs\n if (timeoutMs === Number.POSITIVE_INFINITY) {\n return {\n dispose() {},\n }\n }\n\n const controller = new AbortController()\n const timeout = setTimeout(\n () => {\n controller.abort(resumeDiscoveryTimeoutReason(timeoutMs))\n },\n Math.max(0, timeoutMs),\n )\n\n return {\n signal: controller.signal,\n dispose() {\n clearTimeout(timeout)\n },\n }\n}\n\nasync function abortableRequest<T>(\n request: Promise<T>,\n signal: AbortSignal | undefined,\n): Promise<T> {\n if (signal === undefined) return request\n if (signal.aborted) throw resumeAbortReason(signal)\n\n let removeAbortListener: (() => void) | undefined\n const aborted = new Promise<never>((_resolve, reject) => {\n const onAbort = () => reject(resumeAbortReason(signal))\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortListener = () => signal.removeEventListener('abort', onAbort)\n })\n\n try {\n return await Promise.race([request, aborted])\n } finally {\n removeAbortListener?.()\n void request.catch(() => {})\n }\n}\n\nfunction resumeAbortReason(signal: AbortSignal): unknown {\n return signal.reason ?? resumeAbortFallbackReason()\n}\n\nfunction resumeAbortFallbackReason(): Error {\n if (typeof DOMException === 'function') {\n return new DOMException('Resume discovery aborted', 'AbortError')\n }\n const error = new Error('Resume discovery aborted')\n error.name = 'AbortError'\n return error\n}\n\nfunction resumeDiscoveryTimeoutReason(timeoutMs: number): Error {\n if (typeof DOMException === 'function') {\n return new DOMException(`Resume discovery timed out after ${timeoutMs} ms`, 'TimeoutError')\n }\n const error = new Error(`Resume discovery timed out after ${timeoutMs} ms`)\n error.name = 'TimeoutError'\n return error\n}\n\ntype ListedEncryption = PublicEncryptionSetting | undefined\n\nfunction serverSideEncryptionRejectReason(\n candidate: ListedEncryption,\n expected: EncryptionSetting | BucketDefaultServerSideEncryption | undefined,\n defaultUnreadable: boolean,\n): 'encryption-mismatch' | 'sse-c-unsupported' | null {\n if (expected?.mode === EncryptionMode.SseC) return 'sse-c-unsupported'\n if (expected === undefined && defaultUnreadable) return 'encryption-mismatch'\n\n const actual = normalizeEncryption(candidate)\n if (expected === undefined) {\n if (candidate === undefined) return null\n if (actual === undefined) return 'encryption-mismatch'\n if (actual.mode === EncryptionMode.None) return null\n if (actual.mode === EncryptionMode.SseB2) return null\n return actual.mode === EncryptionMode.SseC ? 'sse-c-unsupported' : 'encryption-mismatch'\n }\n\n const normalizedExpected = normalizeEncryption(expected)\n if (normalizedExpected?.mode === EncryptionMode.None && candidate === undefined) return null\n if (actual === undefined || normalizedExpected === undefined) return 'encryption-mismatch'\n if (actual.mode !== normalizedExpected.mode) return 'encryption-mismatch'\n if (actual.mode === EncryptionMode.None) return null\n return actual.algorithm === normalizedExpected.algorithm ? null : 'encryption-mismatch'\n}\n\ninterface NormalizedEncryption {\n readonly mode: EncryptionMode\n readonly algorithm?: string\n}\n\nfunction normalizeEncryption(\n encryption: EncryptionSetting | ListedEncryption,\n): NormalizedEncryption | undefined {\n if (encryption === undefined) return undefined\n // Real B2 responses may spell no encryption as `{ mode: null, algorithm: null }`.\n if (encryption.mode === null || encryption.mode === EncryptionMode.None) {\n return { mode: EncryptionMode.None }\n }\n if (encryption.mode !== EncryptionMode.SseB2 && encryption.mode !== EncryptionMode.SseC) {\n return undefined\n }\n return {\n mode: encryption.mode,\n algorithm: encryption.algorithm,\n }\n}\n\nfunction assertAdvancingPartCursor(\n fileId: LargeFileId,\n previous: number | undefined,\n next: number,\n): void {\n if (!Number.isInteger(next) || next < 1 || (previous !== undefined && next <= previous)) {\n throw new Error(\n `uploadLargeFile: listParts returned a non-advancing nextPartNumber for ${fileId}; aborting resume.`,\n )\n }\n}\n"],"mappings":"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"}
|
package/dist/upload/resume.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AccountInfo } from '../auth/account-info.js';
|
|
2
2
|
import { ResumeFileIdMismatchError } from '../errors/index.js';
|
|
3
3
|
import { RawClient } from '../raw/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { BucketDefaultRetention, BucketDefaultServerSideEncryption } from '../types/bucket.js';
|
|
5
5
|
import { EncryptionSetting } from '../types/encryption.js';
|
|
6
6
|
import { BucketId, LargeFileId } from '../types/ids.js';
|
|
7
7
|
import { FileRetentionValue, LegalHoldValue } from '../types/lock.js';
|
|
@@ -46,12 +46,14 @@ export interface ResumeCandidateCriteria {
|
|
|
46
46
|
readonly parts: readonly ResumePartPlan[];
|
|
47
47
|
/** Requested B2 upload timestamp override, if configured by the caller. */
|
|
48
48
|
readonly customUploadTimestamp?: number;
|
|
49
|
-
/** Explicit
|
|
50
|
-
readonly serverSideEncryption?: EncryptionSetting;
|
|
49
|
+
/** Explicit or effective readable bucket default server-side encryption. */
|
|
50
|
+
readonly serverSideEncryption?: EncryptionSetting | BucketDefaultServerSideEncryption;
|
|
51
|
+
/** Whether bucket default encryption exists but cannot be read by the caller. */
|
|
52
|
+
readonly defaultServerSideEncryptionUnreadable?: boolean;
|
|
51
53
|
/** Explicit Object Lock retention option, if configured by the caller. */
|
|
52
54
|
readonly fileRetention?: FileRetentionValue;
|
|
53
55
|
/** Effective readable bucket default retention when the caller omits fileRetention. */
|
|
54
|
-
readonly defaultFileRetention?:
|
|
56
|
+
readonly defaultFileRetention?: BucketDefaultRetention;
|
|
55
57
|
/** Whether bucket default retention exists but cannot be read by the caller. */
|
|
56
58
|
readonly defaultFileRetentionUnreadable?: boolean;
|
|
57
59
|
/** Explicit legal hold option, if configured by the caller. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/upload/resume.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/upload/resume.js"],"names":[],"mappings":"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"}
|
package/dist/upload/resume.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AccountInfo } from '../auth/account-info.js';
|
|
2
2
|
import { ResumeFileIdMismatchError } from '../errors/index.js';
|
|
3
3
|
import { RawClient } from '../raw/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { BucketDefaultRetention, BucketDefaultServerSideEncryption } from '../types/bucket.js';
|
|
5
5
|
import { EncryptionSetting } from '../types/encryption.js';
|
|
6
6
|
import { BucketId, LargeFileId } from '../types/ids.js';
|
|
7
7
|
import { FileRetentionValue, LegalHoldValue } from '../types/lock.js';
|
|
@@ -46,12 +46,14 @@ export interface ResumeCandidateCriteria {
|
|
|
46
46
|
readonly parts: readonly ResumePartPlan[];
|
|
47
47
|
/** Requested B2 upload timestamp override, if configured by the caller. */
|
|
48
48
|
readonly customUploadTimestamp?: number;
|
|
49
|
-
/** Explicit
|
|
50
|
-
readonly serverSideEncryption?: EncryptionSetting;
|
|
49
|
+
/** Explicit or effective readable bucket default server-side encryption. */
|
|
50
|
+
readonly serverSideEncryption?: EncryptionSetting | BucketDefaultServerSideEncryption;
|
|
51
|
+
/** Whether bucket default encryption exists but cannot be read by the caller. */
|
|
52
|
+
readonly defaultServerSideEncryptionUnreadable?: boolean;
|
|
51
53
|
/** Explicit Object Lock retention option, if configured by the caller. */
|
|
52
54
|
readonly fileRetention?: FileRetentionValue;
|
|
53
55
|
/** Effective readable bucket default retention when the caller omits fileRetention. */
|
|
54
|
-
readonly defaultFileRetention?:
|
|
56
|
+
readonly defaultFileRetention?: BucketDefaultRetention;
|
|
55
57
|
/** Whether bucket default retention exists but cannot be read by the caller. */
|
|
56
58
|
readonly defaultFileRetentionUnreadable?: boolean;
|
|
57
59
|
/** Explicit legal hold option, if configured by the caller. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/upload/resume.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/upload/resume.js"],"names":[],"mappings":"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"}
|
package/dist/upload/resume.js
CHANGED
|
@@ -153,7 +153,7 @@ function candidateMetadataRejectReason(candidate, fileName, criteria) {
|
|
|
153
153
|
if (candidateInfo.sourceSize !== void 0 && candidateInfo.sourceSize !== String(criteria.sourceSize)) return "source-size-mismatch";
|
|
154
154
|
if (candidateInfo.partSize !== void 0 && candidateInfo.partSize !== String(criteria.partSize)) return "part-size-mismatch";
|
|
155
155
|
if (criteria.customUploadTimestamp !== void 0 && candidate.uploadTimestamp !== criteria.customUploadTimestamp) return "upload-timestamp-mismatch";
|
|
156
|
-
const encryptionRejectReason = serverSideEncryptionRejectReason(candidate.serverSideEncryption, criteria.serverSideEncryption);
|
|
156
|
+
const encryptionRejectReason = serverSideEncryptionRejectReason(candidate.serverSideEncryption, criteria.serverSideEncryption, criteria.defaultServerSideEncryptionUnreadable === true);
|
|
157
157
|
if (encryptionRejectReason !== null) return encryptionRejectReason;
|
|
158
158
|
if (!fileRetentionMatches(candidate.fileRetention, criteria.fileRetention, criteria.defaultFileRetention, criteria.defaultFileRetentionUnreadable === true, candidate.uploadTimestamp)) return "retention-mismatch";
|
|
159
159
|
if (!legalHoldMatches(candidate.legalHold, criteria.legalHold)) return "legal-hold-mismatch";
|
|
@@ -209,7 +209,7 @@ function splitResumeFileInfo(fileInfo) {
|
|
|
209
209
|
function fileRetentionMatches(candidate, expected, defaultExpected, defaultUnreadable, uploadTimestamp) {
|
|
210
210
|
if (expected === void 0 && defaultUnreadable) return false;
|
|
211
211
|
if (expected === void 0 && defaultExpected !== void 0) {
|
|
212
|
-
if (defaultExpected.mode === BucketRetentionMode.None) {
|
|
212
|
+
if (defaultExpected.mode === null || defaultExpected.mode === BucketRetentionMode.None) {
|
|
213
213
|
if (candidate === void 0) return true;
|
|
214
214
|
if (!candidate.isClientAuthorizedToRead) return false;
|
|
215
215
|
return fileRetentionValueEquals(candidate.value, null);
|
|
@@ -297,8 +297,9 @@ function resumeDiscoveryTimeoutReason(timeoutMs) {
|
|
|
297
297
|
error.name = "TimeoutError";
|
|
298
298
|
return error;
|
|
299
299
|
}
|
|
300
|
-
function serverSideEncryptionRejectReason(candidate, expected) {
|
|
300
|
+
function serverSideEncryptionRejectReason(candidate, expected, defaultUnreadable) {
|
|
301
301
|
if (expected?.mode === EncryptionMode.SseC) return "sse-c-unsupported";
|
|
302
|
+
if (expected === void 0 && defaultUnreadable) return "encryption-mismatch";
|
|
302
303
|
const actual = normalizeEncryption(candidate);
|
|
303
304
|
if (expected === void 0) {
|
|
304
305
|
if (candidate === void 0) return null;
|