@backblaze-labs/b2-sdk 0.1.0 → 0.2.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 +110 -5
- package/README.md +144 -33
- package/dist/_virtual/_b2-sdk-version-json.cjs +4 -0
- package/dist/_virtual/_b2-sdk-version-json.js +4 -0
- package/dist/auth/account-info.d.cts +32 -0
- package/dist/auth/account-info.d.cts.map +1 -1
- package/dist/auth/account-info.d.ts +32 -0
- package/dist/auth/account-info.d.ts.map +1 -1
- package/dist/auth/file.cjs +408 -207
- package/dist/auth/file.cjs.map +1 -1
- package/dist/auth/file.d.cts +77 -3
- package/dist/auth/file.d.cts.map +1 -1
- package/dist/auth/file.d.ts +77 -3
- package/dist/auth/file.d.ts.map +1 -1
- package/dist/auth/file.js +407 -207
- package/dist/auth/file.js.map +1 -1
- package/dist/auth/in-memory.cjs +212 -183
- package/dist/auth/in-memory.cjs.map +1 -1
- package/dist/auth/in-memory.d.cts +8 -0
- package/dist/auth/in-memory.d.cts.map +1 -1
- package/dist/auth/in-memory.d.ts +8 -0
- package/dist/auth/in-memory.d.ts.map +1 -1
- package/dist/auth/in-memory.js +211 -182
- package/dist/auth/in-memory.js.map +1 -1
- package/dist/auth/index.cjs +7 -9
- package/dist/auth/index.d.cts +3 -2
- package/dist/auth/index.d.cts.map +1 -1
- package/dist/auth/index.d.ts +3 -2
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +2 -8
- package/dist/auth/realms.cjs +80 -7
- package/dist/auth/realms.cjs.map +1 -1
- package/dist/auth/realms.d.cts +27 -4
- package/dist/auth/realms.d.cts.map +1 -1
- package/dist/auth/realms.d.ts +27 -4
- package/dist/auth/realms.d.ts.map +1 -1
- package/dist/auth/realms.js +80 -9
- package/dist/auth/realms.js.map +1 -1
- package/dist/auth/upload-url-pool.cjs +55 -51
- package/dist/auth/upload-url-pool.cjs.map +1 -1
- package/dist/auth/upload-url-pool.js +55 -51
- package/dist/auth/upload-url-pool.js.map +1 -1
- package/dist/bucket.cjs +785 -787
- package/dist/bucket.cjs.map +1 -1
- package/dist/bucket.d.cts +35 -47
- package/dist/bucket.d.cts.map +1 -1
- package/dist/bucket.d.ts +35 -47
- package/dist/bucket.d.ts.map +1 -1
- package/dist/bucket.js +780 -782
- package/dist/bucket.js.map +1 -1
- package/dist/client.cjs +246 -228
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +25 -17
- package/dist/client.d.cts.map +1 -1
- package/dist/client.d.ts +25 -17
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +243 -225
- package/dist/client.js.map +1 -1
- package/dist/copy/large.cjs +114 -71
- package/dist/copy/large.cjs.map +1 -1
- package/dist/copy/large.d.cts +6 -0
- package/dist/copy/large.d.cts.map +1 -1
- package/dist/copy/large.d.ts +6 -0
- package/dist/copy/large.d.ts.map +1 -1
- package/dist/copy/large.js +112 -69
- package/dist/copy/large.js.map +1 -1
- package/dist/download/checksum.cjs +89 -0
- package/dist/download/checksum.cjs.map +1 -0
- package/dist/download/checksum.d.cts +40 -0
- package/dist/download/checksum.d.cts.map +1 -0
- package/dist/download/checksum.d.ts +40 -0
- package/dist/download/checksum.d.ts.map +1 -0
- package/dist/download/checksum.js +87 -0
- package/dist/download/checksum.js.map +1 -0
- package/dist/download/parallel.cjs +214 -118
- package/dist/download/parallel.cjs.map +1 -1
- package/dist/download/parallel.d.cts +5 -1
- package/dist/download/parallel.d.cts.map +1 -1
- package/dist/download/parallel.d.ts +5 -1
- package/dist/download/parallel.d.ts.map +1 -1
- package/dist/download/parallel.js +212 -116
- package/dist/download/parallel.js.map +1 -1
- package/dist/download/single.cjs +188 -97
- package/dist/download/single.cjs.map +1 -1
- package/dist/download/single.d.cts +6 -1
- package/dist/download/single.d.cts.map +1 -1
- package/dist/download/single.d.ts +6 -1
- package/dist/download/single.d.ts.map +1 -1
- package/dist/download/single.js +186 -98
- package/dist/download/single.js.map +1 -1
- package/dist/errors/index.cjs +699 -243
- package/dist/errors/index.cjs.map +1 -1
- package/dist/errors/index.d.cts +285 -82
- package/dist/errors/index.d.cts.map +1 -1
- package/dist/errors/index.d.ts +285 -82
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +678 -261
- package/dist/errors/index.js.map +1 -1
- package/dist/http/retry.cjs +45 -28
- package/dist/http/retry.cjs.map +1 -1
- package/dist/http/retry.d.cts +15 -2
- package/dist/http/retry.d.cts.map +1 -1
- package/dist/http/retry.d.ts +15 -2
- package/dist/http/retry.d.ts.map +1 -1
- package/dist/http/retry.js +46 -31
- package/dist/http/retry.js.map +1 -1
- package/dist/http/transport.cjs +438 -140
- package/dist/http/transport.cjs.map +1 -1
- package/dist/http/transport.d.cts +21 -2
- package/dist/http/transport.d.cts.map +1 -1
- package/dist/http/transport.d.ts +21 -2
- package/dist/http/transport.d.ts.map +1 -1
- package/dist/http/transport.js +437 -140
- package/dist/http/transport.js.map +1 -1
- package/dist/http/url-guard.cjs +154 -89
- package/dist/http/url-guard.cjs.map +1 -1
- package/dist/http/url-guard.d.cts +25 -3
- package/dist/http/url-guard.d.cts.map +1 -1
- package/dist/http/url-guard.d.ts +25 -3
- package/dist/http/url-guard.d.ts.map +1 -1
- package/dist/http/url-guard.js +152 -90
- package/dist/http/url-guard.js.map +1 -1
- package/dist/http/user-agent.cjs +84 -44
- package/dist/http/user-agent.cjs.map +1 -1
- package/dist/http/user-agent.js +84 -46
- package/dist/http/user-agent.js.map +1 -1
- package/dist/index.cjs +101 -77
- package/dist/index.d.cts +27 -21
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +27 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -71
- package/dist/internal/b2-naming.cjs +66 -0
- package/dist/internal/b2-naming.cjs.map +1 -0
- package/dist/internal/b2-naming.d.cts +43 -0
- package/dist/internal/b2-naming.d.cts.map +1 -0
- package/dist/internal/b2-naming.d.ts +43 -0
- package/dist/internal/b2-naming.d.ts.map +1 -0
- package/dist/internal/b2-naming.js +60 -0
- package/dist/internal/b2-naming.js.map +1 -0
- package/dist/internal/upload-retry-options.cjs +21 -0
- package/dist/internal/upload-retry-options.cjs.map +1 -0
- package/dist/internal/upload-retry-options.d.cts +12 -0
- package/dist/internal/upload-retry-options.d.cts.map +1 -0
- package/dist/internal/upload-retry-options.d.ts +12 -0
- package/dist/internal/upload-retry-options.d.ts.map +1 -0
- package/dist/internal/upload-retry-options.js +21 -0
- package/dist/internal/upload-retry-options.js.map +1 -0
- package/dist/internal/url-redaction.cjs +31 -0
- package/dist/internal/url-redaction.cjs.map +1 -0
- package/dist/internal/url-redaction.d.cts +17 -0
- package/dist/internal/url-redaction.d.cts.map +1 -0
- package/dist/internal/url-redaction.d.ts +17 -0
- package/dist/internal/url-redaction.d.ts.map +1 -0
- package/dist/internal/url-redaction.js +31 -0
- package/dist/internal/url-redaction.js.map +1 -0
- package/dist/notifications/index.cjs +4 -6
- package/dist/notifications/index.d.cts +1 -1
- package/dist/notifications/index.d.cts.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +1 -6
- package/dist/notifications/webhook.cjs +195 -85
- package/dist/notifications/webhook.cjs.map +1 -1
- package/dist/notifications/webhook.d.cts.map +1 -1
- package/dist/notifications/webhook.d.ts.map +1 -1
- package/dist/notifications/webhook.js +195 -87
- package/dist/notifications/webhook.js.map +1 -1
- package/dist/object.cjs +253 -210
- package/dist/object.cjs.map +1 -1
- package/dist/object.d.cts +9 -55
- package/dist/object.d.cts.map +1 -1
- package/dist/object.d.ts +9 -55
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +249 -206
- package/dist/object.js.map +1 -1
- package/dist/raw/encoding.cjs +74 -35
- package/dist/raw/encoding.cjs.map +1 -1
- package/dist/raw/encoding.js +74 -38
- package/dist/raw/encoding.js.map +1 -1
- package/dist/raw/index.cjs +678 -587
- package/dist/raw/index.cjs.map +1 -1
- package/dist/raw/index.d.cts +121 -18
- package/dist/raw/index.d.cts.map +1 -1
- package/dist/raw/index.d.ts +121 -18
- package/dist/raw/index.d.ts.map +1 -1
- package/dist/raw/index.js +674 -589
- package/dist/raw/index.js.map +1 -1
- package/dist/s3/index.cjs +355 -18
- package/dist/s3/index.cjs.map +1 -1
- package/dist/s3/index.d.cts +233 -5
- package/dist/s3/index.d.cts.map +1 -1
- package/dist/s3/index.d.ts +233 -5
- package/dist/s3/index.d.ts.map +1 -1
- package/dist/s3/index.js +351 -22
- package/dist/s3/index.js.map +1 -1
- package/dist/s3/sigv4.cjs +149 -0
- package/dist/s3/sigv4.cjs.map +1 -0
- package/dist/s3/sigv4.d.cts +43 -0
- package/dist/s3/sigv4.d.cts.map +1 -0
- package/dist/s3/sigv4.d.ts +43 -0
- package/dist/s3/sigv4.d.ts.map +1 -0
- package/dist/s3/sigv4.js +148 -0
- package/dist/s3/sigv4.js.map +1 -0
- package/dist/s3/validation.cjs +69 -0
- package/dist/s3/validation.cjs.map +1 -0
- package/dist/s3/validation.d.cts +43 -0
- package/dist/s3/validation.d.cts.map +1 -0
- package/dist/s3/validation.d.ts +43 -0
- package/dist/s3/validation.d.ts.map +1 -0
- package/dist/s3/validation.js +66 -0
- package/dist/s3/validation.js.map +1 -0
- package/dist/simulator/capabilities.cjs +63 -48
- package/dist/simulator/capabilities.cjs.map +1 -1
- package/dist/simulator/capabilities.js +63 -49
- package/dist/simulator/capabilities.js.map +1 -1
- package/dist/simulator/index.cjs +2124 -1548
- package/dist/simulator/index.cjs.map +1 -1
- package/dist/simulator/index.d.cts +79 -11
- package/dist/simulator/index.d.cts.map +1 -1
- package/dist/simulator/index.d.ts +79 -11
- package/dist/simulator/index.d.ts.map +1 -1
- package/dist/simulator/index.js +2112 -1546
- package/dist/simulator/index.js.map +1 -1
- package/dist/simulator/validation.cjs +191 -153
- package/dist/simulator/validation.cjs.map +1 -1
- package/dist/simulator/validation.d.cts +3 -21
- package/dist/simulator/validation.d.cts.map +1 -1
- package/dist/simulator/validation.d.ts +3 -21
- package/dist/simulator/validation.d.ts.map +1 -1
- package/dist/simulator/validation.js +188 -162
- package/dist/simulator/validation.js.map +1 -1
- package/dist/streams/collect.cjs +74 -24
- package/dist/streams/collect.cjs.map +1 -1
- package/dist/streams/collect.d.cts +14 -1
- package/dist/streams/collect.d.cts.map +1 -1
- package/dist/streams/collect.d.ts +14 -1
- package/dist/streams/collect.d.ts.map +1 -1
- package/dist/streams/collect.js +74 -25
- package/dist/streams/collect.js.map +1 -1
- package/dist/streams/file-source.cjs +287 -0
- package/dist/streams/file-source.cjs.map +1 -0
- package/dist/streams/file-source.d.cts +96 -0
- package/dist/streams/file-source.d.cts.map +1 -0
- package/dist/streams/file-source.d.ts +96 -0
- package/dist/streams/file-source.d.ts.map +1 -0
- package/dist/streams/file-source.js +286 -0
- package/dist/streams/file-source.js.map +1 -0
- package/dist/streams/hash.cjs +207 -115
- package/dist/streams/hash.cjs.map +1 -1
- package/dist/streams/hash.d.cts +5 -4
- package/dist/streams/hash.d.cts.map +1 -1
- package/dist/streams/hash.d.ts +5 -4
- package/dist/streams/hash.d.ts.map +1 -1
- package/dist/streams/hash.js +208 -95
- package/dist/streams/hash.js.map +1 -1
- package/dist/streams/index.cjs +12 -12
- package/dist/streams/index.d.cts +3 -3
- package/dist/streams/index.d.cts.map +1 -1
- package/dist/streams/index.d.ts +3 -3
- package/dist/streams/index.d.ts.map +1 -1
- package/dist/streams/index.js +2 -10
- package/dist/streams/progress.cjs +60 -46
- package/dist/streams/progress.cjs.map +1 -1
- package/dist/streams/progress.js +60 -46
- package/dist/streams/progress.js.map +1 -1
- package/dist/streams/source.cjs +316 -146
- package/dist/streams/source.cjs.map +1 -1
- package/dist/streams/source.d.cts +56 -18
- package/dist/streams/source.d.cts.map +1 -1
- package/dist/streams/source.d.ts +56 -18
- package/dist/streams/source.d.ts.map +1 -1
- package/dist/streams/source.js +312 -149
- package/dist/streams/source.js.map +1 -1
- package/dist/sync/actions/index.cjs +236 -184
- package/dist/sync/actions/index.cjs.map +1 -1
- package/dist/sync/actions/index.d.cts +29 -21
- package/dist/sync/actions/index.d.cts.map +1 -1
- package/dist/sync/actions/index.d.ts +29 -21
- package/dist/sync/actions/index.d.ts.map +1 -1
- package/dist/sync/actions/index.js +236 -190
- package/dist/sync/actions/index.js.map +1 -1
- package/dist/sync/b2-sha1-reader.cjs +148 -0
- package/dist/sync/b2-sha1-reader.cjs.map +1 -0
- package/dist/sync/b2-sha1-reader.d.cts +58 -0
- package/dist/sync/b2-sha1-reader.d.cts.map +1 -0
- package/dist/sync/b2-sha1-reader.d.ts +58 -0
- package/dist/sync/b2-sha1-reader.d.ts.map +1 -0
- package/dist/sync/b2-sha1-reader.js +145 -0
- package/dist/sync/b2-sha1-reader.js.map +1 -0
- package/dist/sync/download-staging.cjs +265 -0
- package/dist/sync/download-staging.cjs.map +1 -0
- package/dist/sync/download-staging.d.cts +54 -0
- package/dist/sync/download-staging.d.cts.map +1 -0
- package/dist/sync/download-staging.d.ts +54 -0
- package/dist/sync/download-staging.d.ts.map +1 -0
- package/dist/sync/download-staging.js +259 -0
- package/dist/sync/download-staging.js.map +1 -0
- package/dist/sync/filesystem-errors.cjs +32 -0
- package/dist/sync/filesystem-errors.cjs.map +1 -0
- package/dist/sync/filesystem-errors.d.cts +8 -0
- package/dist/sync/filesystem-errors.d.cts.map +1 -0
- package/dist/sync/filesystem-errors.d.ts +8 -0
- package/dist/sync/filesystem-errors.d.ts.map +1 -0
- package/dist/sync/filesystem-errors.js +32 -0
- package/dist/sync/filesystem-errors.js.map +1 -0
- package/dist/sync/filters.cjs +217 -0
- package/dist/sync/filters.cjs.map +1 -0
- package/dist/sync/filters.d.cts +51 -0
- package/dist/sync/filters.d.cts.map +1 -0
- package/dist/sync/filters.d.ts +51 -0
- package/dist/sync/filters.d.ts.map +1 -0
- package/dist/sync/filters.js +213 -0
- package/dist/sync/filters.js.map +1 -0
- package/dist/sync/index.cjs +39 -22
- package/dist/sync/index.d.cts +14 -9
- package/dist/sync/index.d.cts.map +1 -1
- package/dist/sync/index.d.ts +14 -9
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +9 -20
- package/dist/sync/local-file-identity.cjs +61 -0
- package/dist/sync/local-file-identity.cjs.map +1 -0
- package/dist/sync/local-file-identity.d.cts +37 -0
- package/dist/sync/local-file-identity.d.cts.map +1 -0
- package/dist/sync/local-file-identity.d.ts +37 -0
- package/dist/sync/local-file-identity.d.ts.map +1 -0
- package/dist/sync/local-file-identity.js +60 -0
- package/dist/sync/local-file-identity.js.map +1 -0
- package/dist/sync/local-file-io.cjs +364 -0
- package/dist/sync/local-file-io.cjs.map +1 -0
- package/dist/sync/local-file-io.d.cts +75 -0
- package/dist/sync/local-file-io.d.cts.map +1 -0
- package/dist/sync/local-file-io.d.ts +75 -0
- package/dist/sync/local-file-io.d.ts.map +1 -0
- package/dist/sync/local-file-io.js +360 -0
- package/dist/sync/local-file-io.js.map +1 -0
- package/dist/sync/local-filesystem-root.cjs +27 -0
- package/dist/sync/local-filesystem-root.cjs.map +1 -0
- package/dist/sync/local-filesystem-root.d.cts +18 -0
- package/dist/sync/local-filesystem-root.d.cts.map +1 -0
- package/dist/sync/local-filesystem-root.d.ts +18 -0
- package/dist/sync/local-filesystem-root.d.ts.map +1 -0
- package/dist/sync/local-filesystem-root.js +26 -0
- package/dist/sync/local-filesystem-root.js.map +1 -0
- package/dist/sync/local-sha1.cjs +119 -0
- package/dist/sync/local-sha1.cjs.map +1 -0
- package/dist/sync/local-sha1.d.cts +39 -0
- package/dist/sync/local-sha1.d.cts.map +1 -0
- package/dist/sync/local-sha1.d.ts +39 -0
- package/dist/sync/local-sha1.d.ts.map +1 -0
- package/dist/sync/local-sha1.js +117 -0
- package/dist/sync/local-sha1.js.map +1 -0
- package/dist/sync/pairing.cjs +118 -29
- package/dist/sync/pairing.cjs.map +1 -1
- package/dist/sync/pairing.d.cts +7 -2
- package/dist/sync/pairing.d.cts.map +1 -1
- package/dist/sync/pairing.d.ts +7 -2
- package/dist/sync/pairing.d.ts.map +1 -1
- package/dist/sync/pairing.js +120 -31
- package/dist/sync/pairing.js.map +1 -1
- package/dist/sync/path-order.cjs +30 -0
- package/dist/sync/path-order.cjs.map +1 -0
- package/dist/sync/path-order.d.cts +28 -0
- package/dist/sync/path-order.d.cts.map +1 -0
- package/dist/sync/path-order.d.ts +28 -0
- package/dist/sync/path-order.d.ts.map +1 -0
- package/dist/sync/path-order.js +29 -0
- package/dist/sync/path-order.js.map +1 -0
- package/dist/sync/path-safety.cjs +111 -0
- package/dist/sync/path-safety.cjs.map +1 -0
- package/dist/sync/path-safety.d.cts +78 -0
- package/dist/sync/path-safety.d.cts.map +1 -0
- package/dist/sync/path-safety.d.ts +78 -0
- package/dist/sync/path-safety.d.ts.map +1 -0
- package/dist/sync/path-safety.js +105 -0
- package/dist/sync/path-safety.js.map +1 -0
- package/dist/sync/paths.d.cts +19 -0
- package/dist/sync/paths.d.cts.map +1 -0
- package/dist/sync/paths.d.ts +19 -0
- package/dist/sync/paths.d.ts.map +1 -0
- package/dist/sync/policies/compare.cjs +389 -11
- package/dist/sync/policies/compare.cjs.map +1 -1
- package/dist/sync/policies/compare.d.cts +100 -2
- package/dist/sync/policies/compare.d.cts.map +1 -1
- package/dist/sync/policies/compare.d.ts +100 -2
- package/dist/sync/policies/compare.d.ts.map +1 -1
- package/dist/sync/policies/compare.js +387 -13
- package/dist/sync/policies/compare.js.map +1 -1
- package/dist/sync/policies/index.cjs +76 -65
- package/dist/sync/policies/index.cjs.map +1 -1
- package/dist/sync/policies/index.d.cts +35 -6
- package/dist/sync/policies/index.d.cts.map +1 -1
- package/dist/sync/policies/index.d.ts +35 -6
- package/dist/sync/policies/index.d.ts.map +1 -1
- package/dist/sync/policies/index.js +76 -65
- package/dist/sync/policies/index.js.map +1 -1
- package/dist/sync/prefix.cjs +96 -0
- package/dist/sync/prefix.cjs.map +1 -0
- package/dist/sync/prefix.d.cts +55 -0
- package/dist/sync/prefix.d.cts.map +1 -0
- package/dist/sync/prefix.d.ts +55 -0
- package/dist/sync/prefix.d.ts.map +1 -0
- package/dist/sync/prefix.js +92 -0
- package/dist/sync/prefix.js.map +1 -0
- package/dist/sync/regexp-safety.cjs +192 -0
- package/dist/sync/regexp-safety.cjs.map +1 -0
- package/dist/sync/regexp-safety.d.cts +29 -0
- package/dist/sync/regexp-safety.d.cts.map +1 -0
- package/dist/sync/regexp-safety.d.ts +29 -0
- package/dist/sync/regexp-safety.d.ts.map +1 -0
- package/dist/sync/regexp-safety.js +190 -0
- package/dist/sync/regexp-safety.js.map +1 -0
- package/dist/sync/scan-events.cjs +33 -0
- package/dist/sync/scan-events.cjs.map +1 -0
- package/dist/sync/scan-events.d.cts +17 -0
- package/dist/sync/scan-events.d.cts.map +1 -0
- package/dist/sync/scan-events.d.ts +17 -0
- package/dist/sync/scan-events.d.ts.map +1 -0
- package/dist/sync/scan-events.js +32 -0
- package/dist/sync/scan-events.js.map +1 -0
- package/dist/sync/scan-limit.cjs +33 -0
- package/dist/sync/scan-limit.cjs.map +1 -0
- package/dist/sync/scan-limit.d.cts +21 -0
- package/dist/sync/scan-limit.d.cts.map +1 -0
- package/dist/sync/scan-limit.d.ts +21 -0
- package/dist/sync/scan-limit.d.ts.map +1 -0
- package/dist/sync/scan-limit.js +31 -0
- package/dist/sync/scan-limit.js.map +1 -0
- package/dist/sync/scanners/b2.cjs +239 -55
- package/dist/sync/scanners/b2.cjs.map +1 -1
- package/dist/sync/scanners/b2.d.cts +26 -7
- package/dist/sync/scanners/b2.d.cts.map +1 -1
- package/dist/sync/scanners/b2.d.ts +26 -7
- package/dist/sync/scanners/b2.d.ts.map +1 -1
- package/dist/sync/scanners/b2.js +239 -55
- package/dist/sync/scanners/b2.js.map +1 -1
- package/dist/sync/scanners/local.cjs +215 -56
- package/dist/sync/scanners/local.cjs.map +1 -1
- package/dist/sync/scanners/local.d.cts +22 -7
- package/dist/sync/scanners/local.d.cts.map +1 -1
- package/dist/sync/scanners/local.d.ts +22 -7
- package/dist/sync/scanners/local.d.ts.map +1 -1
- package/dist/sync/scanners/local.js +216 -57
- package/dist/sync/scanners/local.js.map +1 -1
- package/dist/sync/sha1-metadata.cjs +94 -0
- package/dist/sync/sha1-metadata.cjs.map +1 -0
- package/dist/sync/sha1-metadata.d.cts +82 -0
- package/dist/sync/sha1-metadata.d.cts.map +1 -0
- package/dist/sync/sha1-metadata.d.ts +82 -0
- package/dist/sync/sha1-metadata.d.ts.map +1 -0
- package/dist/sync/sha1-metadata.js +89 -0
- package/dist/sync/sha1-metadata.js.map +1 -0
- package/dist/sync/sha1-options.cjs +23 -0
- package/dist/sync/sha1-options.cjs.map +1 -0
- package/dist/sync/sha1-options.d.cts +14 -0
- package/dist/sync/sha1-options.d.cts.map +1 -0
- package/dist/sync/sha1-options.d.ts +14 -0
- package/dist/sync/sha1-options.d.ts.map +1 -0
- package/dist/sync/sha1-options.js +21 -0
- package/dist/sync/sha1-options.js.map +1 -0
- package/dist/sync/synchronizer.cjs +782 -197
- package/dist/sync/synchronizer.cjs.map +1 -1
- package/dist/sync/synchronizer.d.cts +47 -1
- package/dist/sync/synchronizer.d.cts.map +1 -1
- package/dist/sync/synchronizer.d.ts +47 -1
- package/dist/sync/synchronizer.d.ts.map +1 -1
- package/dist/sync/synchronizer.js +779 -173
- package/dist/sync/synchronizer.js.map +1 -1
- package/dist/sync/types.d.cts +208 -16
- package/dist/sync/types.d.cts.map +1 -1
- package/dist/sync/types.d.ts +208 -16
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/types/auth.cjs +76 -56
- package/dist/types/auth.cjs.map +1 -1
- package/dist/types/auth.d.cts +67 -9
- package/dist/types/auth.d.cts.map +1 -1
- package/dist/types/auth.d.ts +67 -9
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +77 -57
- package/dist/types/auth.js.map +1 -1
- package/dist/types/bucket.cjs +74 -38
- package/dist/types/bucket.cjs.map +1 -1
- package/dist/types/bucket.js +75 -41
- package/dist/types/bucket.js.map +1 -1
- package/dist/types/encryption.cjs +364 -327
- package/dist/types/encryption.cjs.map +1 -1
- package/dist/types/encryption.d.cts +16 -0
- package/dist/types/encryption.d.cts.map +1 -1
- package/dist/types/encryption.d.ts +16 -0
- package/dist/types/encryption.d.ts.map +1 -1
- package/dist/types/encryption.js +364 -310
- package/dist/types/encryption.js.map +1 -1
- package/dist/types/errors.cjs +47 -0
- package/dist/types/errors.cjs.map +1 -0
- package/dist/types/errors.d.cts +13 -4
- package/dist/types/errors.d.cts.map +1 -1
- package/dist/types/errors.d.ts +13 -4
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +47 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/file.cjs +36 -19
- package/dist/types/file.cjs.map +1 -1
- package/dist/types/file.d.cts +2 -2
- package/dist/types/file.d.cts.map +1 -1
- package/dist/types/file.d.ts +2 -2
- package/dist/types/file.d.ts.map +1 -1
- package/dist/types/file.js +37 -21
- package/dist/types/file.js.map +1 -1
- package/dist/types/ids.cjs +53 -9
- package/dist/types/ids.cjs.map +1 -1
- package/dist/types/ids.js +54 -15
- package/dist/types/ids.js.map +1 -1
- package/dist/types/index.d.cts +12 -11
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.ts +12 -11
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/key.d.cts +44 -8
- package/dist/types/key.d.cts.map +1 -1
- package/dist/types/key.d.ts +44 -8
- package/dist/types/key.d.ts.map +1 -1
- package/dist/types/lock.cjs +33 -13
- package/dist/types/lock.cjs.map +1 -1
- package/dist/types/lock.js +34 -15
- package/dist/types/lock.js.map +1 -1
- package/dist/types/notifications.cjs +44 -22
- package/dist/types/notifications.cjs.map +1 -1
- package/dist/types/notifications.js +45 -23
- package/dist/types/notifications.js.map +1 -1
- package/dist/types/upload.d.cts +39 -5
- package/dist/types/upload.d.cts.map +1 -1
- package/dist/types/upload.d.ts +39 -5
- package/dist/types/upload.d.ts.map +1 -1
- package/dist/upload/abort-scope.cjs +91 -0
- package/dist/upload/abort-scope.cjs.map +1 -0
- package/dist/upload/abort-scope.d.cts +48 -0
- package/dist/upload/abort-scope.d.cts.map +1 -0
- package/dist/upload/abort-scope.d.ts +48 -0
- package/dist/upload/abort-scope.d.ts.map +1 -0
- package/dist/upload/abort-scope.js +88 -0
- package/dist/upload/abort-scope.js.map +1 -0
- package/dist/upload/cancel.cjs +183 -8
- package/dist/upload/cancel.cjs.map +1 -1
- package/dist/upload/cancel.d.cts +110 -2
- package/dist/upload/cancel.d.cts.map +1 -1
- package/dist/upload/cancel.d.ts +110 -2
- package/dist/upload/cancel.d.ts.map +1 -1
- package/dist/upload/cancel.js +178 -9
- package/dist/upload/cancel.js.map +1 -1
- package/dist/upload/concurrency.cjs +79 -52
- package/dist/upload/concurrency.cjs.map +1 -1
- package/dist/upload/concurrency.js +79 -53
- package/dist/upload/concurrency.js.map +1 -1
- package/dist/upload/finish.cjs +59 -0
- package/dist/upload/finish.cjs.map +1 -0
- package/dist/upload/finish.d.cts +26 -0
- package/dist/upload/finish.d.cts.map +1 -0
- package/dist/upload/finish.d.ts +26 -0
- package/dist/upload/finish.d.ts.map +1 -0
- package/dist/upload/finish.js +59 -0
- package/dist/upload/finish.js.map +1 -0
- package/dist/upload/large.cjs +301 -218
- package/dist/upload/large.cjs.map +1 -1
- package/dist/upload/large.d.cts +76 -9
- package/dist/upload/large.d.cts.map +1 -1
- package/dist/upload/large.d.ts +76 -9
- package/dist/upload/large.d.ts.map +1 -1
- package/dist/upload/large.js +301 -218
- package/dist/upload/large.js.map +1 -1
- package/dist/upload/options.cjs +28 -0
- package/dist/upload/options.cjs.map +1 -0
- package/dist/upload/options.d.cts +104 -0
- package/dist/upload/options.d.cts.map +1 -0
- package/dist/upload/options.d.ts +104 -0
- package/dist/upload/options.d.ts.map +1 -0
- package/dist/upload/options.js +27 -0
- package/dist/upload/options.js.map +1 -0
- package/dist/upload/resume.cjs +333 -33
- package/dist/upload/resume.cjs.map +1 -1
- package/dist/upload/resume.d.cts +82 -12
- package/dist/upload/resume.d.cts.map +1 -1
- package/dist/upload/resume.d.ts +82 -12
- package/dist/upload/resume.d.ts.map +1 -1
- package/dist/upload/resume.js +330 -33
- package/dist/upload/resume.js.map +1 -1
- package/dist/upload/retry.cjs +186 -0
- package/dist/upload/retry.cjs.map +1 -0
- package/dist/upload/retry.d.cts +127 -0
- package/dist/upload/retry.d.cts.map +1 -0
- package/dist/upload/retry.d.ts +127 -0
- package/dist/upload/retry.d.ts.map +1 -0
- package/dist/upload/retry.js +182 -0
- package/dist/upload/retry.js.map +1 -0
- package/dist/upload/single.cjs +68 -44
- package/dist/upload/single.cjs.map +1 -1
- package/dist/upload/single.d.cts +2 -1
- package/dist/upload/single.d.cts.map +1 -1
- package/dist/upload/single.d.ts +2 -1
- package/dist/upload/single.d.ts.map +1 -1
- package/dist/upload/single.js +68 -44
- package/dist/upload/single.js.map +1 -1
- package/dist/upload/stream.cjs +317 -193
- package/dist/upload/stream.cjs.map +1 -1
- package/dist/upload/stream.d.cts +3 -1
- package/dist/upload/stream.d.cts.map +1 -1
- package/dist/upload/stream.d.ts +3 -1
- package/dist/upload/stream.d.ts.map +1 -1
- package/dist/upload/stream.js +316 -192
- package/dist/upload/stream.js.map +1 -1
- package/dist/util/best-effort.cjs +42 -8
- package/dist/util/best-effort.cjs.map +1 -1
- package/dist/util/best-effort.d.cts +2 -1
- package/dist/util/best-effort.d.cts.map +1 -1
- package/dist/util/best-effort.d.ts +2 -1
- package/dist/util/best-effort.d.ts.map +1 -1
- package/dist/util/best-effort.js +43 -9
- package/dist/util/best-effort.js.map +1 -1
- package/dist/util/bytes.cjs +23 -0
- package/dist/util/bytes.cjs.map +1 -0
- package/dist/util/bytes.d.cts +15 -0
- package/dist/util/bytes.d.cts.map +1 -0
- package/dist/util/bytes.d.ts +15 -0
- package/dist/util/bytes.d.ts.map +1 -0
- package/dist/util/bytes.js +23 -0
- package/dist/util/bytes.js.map +1 -0
- package/dist/util/crypto.cjs +68 -0
- package/dist/util/crypto.cjs.map +1 -0
- package/dist/util/crypto.d.cts +26 -0
- package/dist/util/crypto.d.cts.map +1 -0
- package/dist/util/crypto.d.ts +26 -0
- package/dist/util/crypto.d.ts.map +1 -0
- package/dist/util/crypto.js +66 -0
- package/dist/util/crypto.js.map +1 -0
- package/dist/util/defaults.cjs +25 -9
- package/dist/util/defaults.cjs.map +1 -1
- package/dist/util/defaults.js +26 -11
- package/dist/util/defaults.js.map +1 -1
- package/dist/util/error-reason.cjs +41 -0
- package/dist/util/error-reason.cjs.map +1 -0
- package/dist/util/error-reason.d.cts +9 -0
- package/dist/util/error-reason.d.cts.map +1 -0
- package/dist/util/error-reason.d.ts +9 -0
- package/dist/util/error-reason.d.ts.map +1 -0
- package/dist/util/error-reason.js +41 -0
- package/dist/util/error-reason.js.map +1 -0
- package/dist/util/http.cjs +23 -0
- package/dist/util/http.cjs.map +1 -0
- package/dist/util/http.d.cts +13 -0
- package/dist/util/http.d.cts.map +1 -0
- package/dist/util/http.d.ts +13 -0
- package/dist/util/http.d.ts.map +1 -0
- package/dist/util/http.js +23 -0
- package/dist/util/http.js.map +1 -0
- package/dist/util/normalize.cjs +66 -7
- package/dist/util/normalize.cjs.map +1 -1
- package/dist/util/normalize.js +67 -10
- package/dist/util/normalize.js.map +1 -1
- package/dist/util/paginator.cjs +63 -14
- package/dist/util/paginator.cjs.map +1 -1
- package/dist/util/paginator.js +64 -16
- package/dist/util/paginator.js.map +1 -1
- package/dist/util/plan-ranges.cjs +47 -22
- package/dist/util/plan-ranges.cjs.map +1 -1
- package/dist/util/plan-ranges.js +48 -24
- package/dist/util/plan-ranges.js.map +1 -1
- package/dist/util/sha1.cjs +27 -0
- package/dist/util/sha1.cjs.map +1 -0
- package/dist/util/sha1.d.cts +17 -0
- package/dist/util/sha1.d.cts.map +1 -0
- package/dist/util/sha1.d.ts +17 -0
- package/dist/util/sha1.d.ts.map +1 -0
- package/dist/util/sha1.js +26 -0
- package/dist/util/sha1.js.map +1 -0
- package/dist/util/text-codec.cjs +29 -5
- package/dist/util/text-codec.cjs.map +1 -1
- package/dist/util/text-codec.js +30 -7
- package/dist/util/text-codec.js.map +1 -1
- package/dist/util/to-error.cjs +18 -4
- package/dist/util/to-error.cjs.map +1 -1
- package/dist/util/to-error.js +19 -5
- package/dist/util/to-error.js.map +1 -1
- package/dist/version.cjs +17 -5
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +3 -3
- package/dist/version.d.ts +3 -3
- package/dist/version.js +19 -6
- package/dist/version.js.map +1 -1
- package/package.json +19 -16
- package/dist/auth/index.cjs.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/notifications/index.cjs.map +0 -1
- package/dist/notifications/index.js.map +0 -1
- package/dist/package.json.cjs +0 -9
- package/dist/package.json.cjs.map +0 -1
- package/dist/package.json.js +0 -9
- package/dist/package.json.js.map +0 -1
- package/dist/streams/index.cjs.map +0 -1
- package/dist/streams/index.js.map +0 -1
- package/dist/sync/index.cjs.map +0 -1
- package/dist/sync/index.js.map +0 -1
|
@@ -1,13 +1,111 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LocalSha1Reader } from '../local-sha1.js';
|
|
2
|
+
import { SyncPair } from '../pairing.js';
|
|
3
|
+
import { B2SyncPath, CompareMode, SyncEvent, SyncPath } from '../types.js';
|
|
4
|
+
export { selectB2ComparableSha1 } from '../sha1-metadata.js';
|
|
5
|
+
/** Result from a B2 SHA-1 verification read. */
|
|
6
|
+
export interface B2Sha1ReadResult {
|
|
7
|
+
/** SHA-1 digest of the selected B2 bytes, or null when unavailable. */
|
|
8
|
+
readonly contentSha1: string | null;
|
|
9
|
+
/** Number of B2 bytes downloaded and hashed while verifying. */
|
|
10
|
+
readonly bytesRead: number;
|
|
11
|
+
}
|
|
12
|
+
/** Reads a B2 file and returns the SHA-1 digest of its actual bytes, or null when unavailable. */
|
|
13
|
+
export type B2Sha1Reader = (path: B2SyncPath, signal?: AbortSignal) => Promise<string | null | B2Sha1ReadResult>;
|
|
14
|
+
/** Options for preparing a file pair before comparison. */
|
|
15
|
+
export interface PreparePairForCompareOptions {
|
|
16
|
+
/** Signal used to abort local file hashing. */
|
|
17
|
+
readonly signal?: AbortSignal;
|
|
18
|
+
/** Optional idle/no-progress timeout for local SHA-1 reads. */
|
|
19
|
+
readonly sha1ReadTimeoutMillis?: number;
|
|
20
|
+
/** Optional local hashing override for tests or custom runtimes. */
|
|
21
|
+
readonly readLocalSha1?: LocalSha1Reader;
|
|
22
|
+
/** Optional B2 hashing override used to verify metadata matches before skipping. */
|
|
23
|
+
readonly readB2Sha1?: B2Sha1Reader;
|
|
24
|
+
}
|
|
25
|
+
/** Options for preparing multiple file pairs before comparison. */
|
|
26
|
+
export interface PreparePairsForCompareOptions extends PreparePairForCompareOptions {
|
|
27
|
+
/** Maximum number of file pairs to prepare concurrently. */
|
|
28
|
+
readonly concurrency?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Result of preparing a file pair before policy comparison. */
|
|
31
|
+
export interface ComparePreparationResult {
|
|
32
|
+
/** The pair with compare-mode metadata populated where possible. */
|
|
33
|
+
readonly pair: SyncPair;
|
|
34
|
+
/** Events surfaced while preparing the pair, such as per-file hash errors or skips. */
|
|
35
|
+
readonly events: readonly SyncEvent[];
|
|
36
|
+
/** Errors surfaced while preparing the pair. These contribute to the final summary. */
|
|
37
|
+
readonly errors: readonly Error[];
|
|
38
|
+
/** Local file bytes read for hashing while preparing this pair. */
|
|
39
|
+
readonly bytesHashed: number;
|
|
40
|
+
/** B2 bytes read for untrusted metadata verification while preparing this pair. */
|
|
41
|
+
readonly bytesVerified: number;
|
|
42
|
+
/** Whether action generation should be skipped for this pair. */
|
|
43
|
+
readonly skipActionGeneration: boolean;
|
|
44
|
+
/** Whether preparation stopped because the abort signal fired. */
|
|
45
|
+
readonly aborted: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** A prepared pair result with the original pair retained for event context. */
|
|
48
|
+
export interface PreparedComparePair {
|
|
49
|
+
/** Original pair from {@link zipFolders}. */
|
|
50
|
+
readonly originalPair: SyncPair;
|
|
51
|
+
/** Preparation result for the original pair. */
|
|
52
|
+
readonly prepared: ComparePreparationResult;
|
|
53
|
+
}
|
|
2
54
|
/**
|
|
3
55
|
* Determines whether two files should be considered different based on the compare mode.
|
|
56
|
+
* For `sha1`, callers that use the low-level policy helpers should first prepare the pair so
|
|
57
|
+
* local hashes and comparable B2 hashes are populated.
|
|
4
58
|
*
|
|
5
59
|
* @param source - The source file metadata.
|
|
6
60
|
* @param dest - The destination file metadata.
|
|
7
|
-
* @param compareMode - The comparison strategy: 'modtime', 'size', or 'none'.
|
|
61
|
+
* @param compareMode - The comparison strategy: 'modtime', 'size', 'sha1', or 'none'.
|
|
8
62
|
* @param threshold - Tolerance for the comparison (bytes for size, milliseconds for modtime).
|
|
9
63
|
*
|
|
10
64
|
* @returns `true` if the files are considered different.
|
|
65
|
+
*
|
|
66
|
+
* @throws When `compareMode` is not one of the supported compare modes.
|
|
11
67
|
*/
|
|
12
68
|
export declare function filesAreDifferent(source: SyncPath, dest: SyncPath, compareMode: CompareMode, threshold?: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Throws when a runtime compare mode value is unsupported.
|
|
71
|
+
*
|
|
72
|
+
* @param compareMode - User-supplied compare mode.
|
|
73
|
+
*
|
|
74
|
+
* @throws When `compareMode` is not one of the supported values.
|
|
75
|
+
*/
|
|
76
|
+
export declare function assertSupportedCompareMode(compareMode: unknown): asserts compareMode is CompareMode;
|
|
77
|
+
/**
|
|
78
|
+
* Prepares a pair for the selected compare mode.
|
|
79
|
+
*
|
|
80
|
+
* For `sha1`, this fills missing B2 hashes from comparable metadata and, when an explicit local
|
|
81
|
+
* reader is supplied, hashes the local side only when size cannot already prove a difference.
|
|
82
|
+
* Reader failures are converted into per-file sync events instead of aborting the whole run.
|
|
83
|
+
*
|
|
84
|
+
* @param pair - Source/destination pair from {@link zipFolders}.
|
|
85
|
+
* @param compareMode - The comparison strategy.
|
|
86
|
+
* @param options - Optional hashing dependencies and cancellation signal.
|
|
87
|
+
*
|
|
88
|
+
* @returns The prepared pair plus any preparation events.
|
|
89
|
+
*/
|
|
90
|
+
export declare function preparePairForCompare(pair: SyncPair, compareMode: CompareMode, options?: PreparePairForCompareOptions): Promise<ComparePreparationResult>;
|
|
91
|
+
/**
|
|
92
|
+
* Prepares a list of pairs for the selected compare mode with bounded concurrency.
|
|
93
|
+
*
|
|
94
|
+
* @param pairs - Source/destination pairs from {@link zipFolders}.
|
|
95
|
+
* @param compareMode - The comparison strategy.
|
|
96
|
+
* @param options - Optional hashing dependencies, cancellation signal, and concurrency.
|
|
97
|
+
*
|
|
98
|
+
* @returns Prepared results in the same order as the input pairs.
|
|
99
|
+
*/
|
|
100
|
+
export declare function preparePairsForCompare(pairs: readonly SyncPair[], compareMode: CompareMode, options?: PreparePairsForCompareOptions): Promise<PreparedComparePair[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Creates a successful no-op compare preparation result for a pair.
|
|
103
|
+
*
|
|
104
|
+
* @param pair - Source/destination pair from {@link zipFolders}.
|
|
105
|
+
* @param bytesHashed - Local file bytes read while preparing the pair.
|
|
106
|
+
* @param bytesVerified - B2 bytes read while verifying untrusted SHA-1 metadata.
|
|
107
|
+
*
|
|
108
|
+
* @returns A ready preparation result that allows action generation.
|
|
109
|
+
*/
|
|
110
|
+
export declare function readyComparePair(pair: SyncPair, bytesHashed?: number, bytesVerified?: number): ComparePreparationResult;
|
|
13
111
|
//# sourceMappingURL=compare.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,111 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LocalSha1Reader } from '../local-sha1.js';
|
|
2
|
+
import { SyncPair } from '../pairing.js';
|
|
3
|
+
import { B2SyncPath, CompareMode, SyncEvent, SyncPath } from '../types.js';
|
|
4
|
+
export { selectB2ComparableSha1 } from '../sha1-metadata.js';
|
|
5
|
+
/** Result from a B2 SHA-1 verification read. */
|
|
6
|
+
export interface B2Sha1ReadResult {
|
|
7
|
+
/** SHA-1 digest of the selected B2 bytes, or null when unavailable. */
|
|
8
|
+
readonly contentSha1: string | null;
|
|
9
|
+
/** Number of B2 bytes downloaded and hashed while verifying. */
|
|
10
|
+
readonly bytesRead: number;
|
|
11
|
+
}
|
|
12
|
+
/** Reads a B2 file and returns the SHA-1 digest of its actual bytes, or null when unavailable. */
|
|
13
|
+
export type B2Sha1Reader = (path: B2SyncPath, signal?: AbortSignal) => Promise<string | null | B2Sha1ReadResult>;
|
|
14
|
+
/** Options for preparing a file pair before comparison. */
|
|
15
|
+
export interface PreparePairForCompareOptions {
|
|
16
|
+
/** Signal used to abort local file hashing. */
|
|
17
|
+
readonly signal?: AbortSignal;
|
|
18
|
+
/** Optional idle/no-progress timeout for local SHA-1 reads. */
|
|
19
|
+
readonly sha1ReadTimeoutMillis?: number;
|
|
20
|
+
/** Optional local hashing override for tests or custom runtimes. */
|
|
21
|
+
readonly readLocalSha1?: LocalSha1Reader;
|
|
22
|
+
/** Optional B2 hashing override used to verify metadata matches before skipping. */
|
|
23
|
+
readonly readB2Sha1?: B2Sha1Reader;
|
|
24
|
+
}
|
|
25
|
+
/** Options for preparing multiple file pairs before comparison. */
|
|
26
|
+
export interface PreparePairsForCompareOptions extends PreparePairForCompareOptions {
|
|
27
|
+
/** Maximum number of file pairs to prepare concurrently. */
|
|
28
|
+
readonly concurrency?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Result of preparing a file pair before policy comparison. */
|
|
31
|
+
export interface ComparePreparationResult {
|
|
32
|
+
/** The pair with compare-mode metadata populated where possible. */
|
|
33
|
+
readonly pair: SyncPair;
|
|
34
|
+
/** Events surfaced while preparing the pair, such as per-file hash errors or skips. */
|
|
35
|
+
readonly events: readonly SyncEvent[];
|
|
36
|
+
/** Errors surfaced while preparing the pair. These contribute to the final summary. */
|
|
37
|
+
readonly errors: readonly Error[];
|
|
38
|
+
/** Local file bytes read for hashing while preparing this pair. */
|
|
39
|
+
readonly bytesHashed: number;
|
|
40
|
+
/** B2 bytes read for untrusted metadata verification while preparing this pair. */
|
|
41
|
+
readonly bytesVerified: number;
|
|
42
|
+
/** Whether action generation should be skipped for this pair. */
|
|
43
|
+
readonly skipActionGeneration: boolean;
|
|
44
|
+
/** Whether preparation stopped because the abort signal fired. */
|
|
45
|
+
readonly aborted: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** A prepared pair result with the original pair retained for event context. */
|
|
48
|
+
export interface PreparedComparePair {
|
|
49
|
+
/** Original pair from {@link zipFolders}. */
|
|
50
|
+
readonly originalPair: SyncPair;
|
|
51
|
+
/** Preparation result for the original pair. */
|
|
52
|
+
readonly prepared: ComparePreparationResult;
|
|
53
|
+
}
|
|
2
54
|
/**
|
|
3
55
|
* Determines whether two files should be considered different based on the compare mode.
|
|
56
|
+
* For `sha1`, callers that use the low-level policy helpers should first prepare the pair so
|
|
57
|
+
* local hashes and comparable B2 hashes are populated.
|
|
4
58
|
*
|
|
5
59
|
* @param source - The source file metadata.
|
|
6
60
|
* @param dest - The destination file metadata.
|
|
7
|
-
* @param compareMode - The comparison strategy: 'modtime', 'size', or 'none'.
|
|
61
|
+
* @param compareMode - The comparison strategy: 'modtime', 'size', 'sha1', or 'none'.
|
|
8
62
|
* @param threshold - Tolerance for the comparison (bytes for size, milliseconds for modtime).
|
|
9
63
|
*
|
|
10
64
|
* @returns `true` if the files are considered different.
|
|
65
|
+
*
|
|
66
|
+
* @throws When `compareMode` is not one of the supported compare modes.
|
|
11
67
|
*/
|
|
12
68
|
export declare function filesAreDifferent(source: SyncPath, dest: SyncPath, compareMode: CompareMode, threshold?: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Throws when a runtime compare mode value is unsupported.
|
|
71
|
+
*
|
|
72
|
+
* @param compareMode - User-supplied compare mode.
|
|
73
|
+
*
|
|
74
|
+
* @throws When `compareMode` is not one of the supported values.
|
|
75
|
+
*/
|
|
76
|
+
export declare function assertSupportedCompareMode(compareMode: unknown): asserts compareMode is CompareMode;
|
|
77
|
+
/**
|
|
78
|
+
* Prepares a pair for the selected compare mode.
|
|
79
|
+
*
|
|
80
|
+
* For `sha1`, this fills missing B2 hashes from comparable metadata and, when an explicit local
|
|
81
|
+
* reader is supplied, hashes the local side only when size cannot already prove a difference.
|
|
82
|
+
* Reader failures are converted into per-file sync events instead of aborting the whole run.
|
|
83
|
+
*
|
|
84
|
+
* @param pair - Source/destination pair from {@link zipFolders}.
|
|
85
|
+
* @param compareMode - The comparison strategy.
|
|
86
|
+
* @param options - Optional hashing dependencies and cancellation signal.
|
|
87
|
+
*
|
|
88
|
+
* @returns The prepared pair plus any preparation events.
|
|
89
|
+
*/
|
|
90
|
+
export declare function preparePairForCompare(pair: SyncPair, compareMode: CompareMode, options?: PreparePairForCompareOptions): Promise<ComparePreparationResult>;
|
|
91
|
+
/**
|
|
92
|
+
* Prepares a list of pairs for the selected compare mode with bounded concurrency.
|
|
93
|
+
*
|
|
94
|
+
* @param pairs - Source/destination pairs from {@link zipFolders}.
|
|
95
|
+
* @param compareMode - The comparison strategy.
|
|
96
|
+
* @param options - Optional hashing dependencies, cancellation signal, and concurrency.
|
|
97
|
+
*
|
|
98
|
+
* @returns Prepared results in the same order as the input pairs.
|
|
99
|
+
*/
|
|
100
|
+
export declare function preparePairsForCompare(pairs: readonly SyncPair[], compareMode: CompareMode, options?: PreparePairsForCompareOptions): Promise<PreparedComparePair[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Creates a successful no-op compare preparation result for a pair.
|
|
103
|
+
*
|
|
104
|
+
* @param pair - Source/destination pair from {@link zipFolders}.
|
|
105
|
+
* @param bytesHashed - Local file bytes read while preparing the pair.
|
|
106
|
+
* @param bytesVerified - B2 bytes read while verifying untrusted SHA-1 metadata.
|
|
107
|
+
*
|
|
108
|
+
* @returns A ready preparation result that allows action generation.
|
|
109
|
+
*/
|
|
110
|
+
export declare function readyComparePair(pair: SyncPair, bytesHashed?: number, bytesVerified?: number): ComparePreparationResult;
|
|
13
111
|
//# sourceMappingURL=compare.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/sync/policies/compare.js"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,388 @@
|
|
|
1
|
+
import { mapConcurrent } from "../../upload/concurrency.js";
|
|
2
|
+
import { normalizeVerifiableSha1 } from "../../util/sha1.js";
|
|
3
|
+
import { toError } from "../../util/to-error.js";
|
|
4
|
+
import { formatHashError, isAbortError } from "../local-sha1.js";
|
|
5
|
+
import { selectB2ComparableSha1, syncSha1StateOf } from "../sha1-metadata.js";
|
|
6
|
+
//#region src/sync/policies/compare.ts
|
|
7
|
+
/**
|
|
8
|
+
* Determines whether two files should be considered different based on the compare mode.
|
|
9
|
+
* For `sha1`, callers that use the low-level policy helpers should first prepare the pair so
|
|
10
|
+
* local hashes and comparable B2 hashes are populated.
|
|
11
|
+
*
|
|
12
|
+
* @param source - The source file metadata.
|
|
13
|
+
* @param dest - The destination file metadata.
|
|
14
|
+
* @param compareMode - The comparison strategy: 'modtime', 'size', 'sha1', or 'none'.
|
|
15
|
+
* @param threshold - Tolerance for the comparison (bytes for size, milliseconds for modtime).
|
|
16
|
+
*
|
|
17
|
+
* @returns `true` if the files are considered different.
|
|
18
|
+
*
|
|
19
|
+
* @throws When `compareMode` is not one of the supported compare modes.
|
|
20
|
+
*/
|
|
1
21
|
function filesAreDifferent(source, dest, compareMode, threshold = 0) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
switch (compareMode) {
|
|
23
|
+
case "none": return false;
|
|
24
|
+
case "size": return Math.abs(source.size - dest.size) > threshold;
|
|
25
|
+
case "sha1": return sha1ValuesAreDifferent(source, dest);
|
|
26
|
+
case "modtime": return Math.abs(source.modTimeMillis - dest.modTimeMillis) > threshold;
|
|
27
|
+
default: throw new Error(`Unsupported compare mode: ${String(compareMode)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Throws when a runtime compare mode value is unsupported.
|
|
32
|
+
*
|
|
33
|
+
* @param compareMode - User-supplied compare mode.
|
|
34
|
+
*
|
|
35
|
+
* @throws When `compareMode` is not one of the supported values.
|
|
36
|
+
*/
|
|
37
|
+
function assertSupportedCompareMode(compareMode) {
|
|
38
|
+
switch (compareMode) {
|
|
39
|
+
case "none":
|
|
40
|
+
case "size":
|
|
41
|
+
case "sha1":
|
|
42
|
+
case "modtime": return;
|
|
43
|
+
default: throw new Error(`Unsupported compare mode: ${String(compareMode)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function sha1ValuesAreDifferent(source, dest) {
|
|
47
|
+
if (source.size !== dest.size) return true;
|
|
48
|
+
const sourceSha1 = comparableSha1(source);
|
|
49
|
+
const destSha1 = comparableSha1(dest);
|
|
50
|
+
if (sourceSha1.kind === "untrusted" || destSha1.kind === "untrusted") return true;
|
|
51
|
+
if (sourceSha1.kind === "unavailable" || destSha1.kind === "unavailable") return true;
|
|
52
|
+
return sourceSha1.value !== destSha1.value;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Prepares a pair for the selected compare mode.
|
|
56
|
+
*
|
|
57
|
+
* For `sha1`, this fills missing B2 hashes from comparable metadata and, when an explicit local
|
|
58
|
+
* reader is supplied, hashes the local side only when size cannot already prove a difference.
|
|
59
|
+
* Reader failures are converted into per-file sync events instead of aborting the whole run.
|
|
60
|
+
*
|
|
61
|
+
* @param pair - Source/destination pair from {@link zipFolders}.
|
|
62
|
+
* @param compareMode - The comparison strategy.
|
|
63
|
+
* @param options - Optional hashing dependencies and cancellation signal.
|
|
64
|
+
*
|
|
65
|
+
* @returns The prepared pair plus any preparation events.
|
|
66
|
+
*/
|
|
67
|
+
async function preparePairForCompare(pair, compareMode, options = {}) {
|
|
68
|
+
assertSupportedCompareMode(compareMode);
|
|
69
|
+
if (compareMode !== "sha1") return readyComparePair(pair);
|
|
70
|
+
const [source, dest] = pair;
|
|
71
|
+
if (source === null || dest === null) return readyComparePair(pair);
|
|
72
|
+
if (source.size !== dest.size) return readyComparePair(pair);
|
|
73
|
+
const metadataPair = [withB2ContentSha1(source), withB2ContentSha1(dest)];
|
|
74
|
+
if (hasUnavailableB2Sha1(metadataPair)) return skipped(metadataPair, unavailableSha1Event(metadataPair));
|
|
75
|
+
if (options.readB2Sha1 === void 0 && hasUntrustedSha1(metadataPair) && !hasVerifiableUntrustedSha1(metadataPair)) return readyComparePair(metadataPair);
|
|
76
|
+
const [metadataSource, metadataDest] = metadataPair;
|
|
77
|
+
if (metadataSource === null || metadataDest === null) return readyComparePair(metadataPair);
|
|
78
|
+
const sourceResult = await prepareLocalPathSha1(metadataSource, options);
|
|
79
|
+
if (sourceResult.aborted) return aborted(metadataPair);
|
|
80
|
+
if (sourceResult.event) return skipped(metadataPair, sourceResult.event, sourceResult.error, sourceResult.bytesHashed);
|
|
81
|
+
const destResult = await prepareLocalPathSha1(metadataDest, options);
|
|
82
|
+
if (destResult.aborted) return aborted([sourceResult.path, destResult.path]);
|
|
83
|
+
if (destResult.event) return skipped([sourceResult.path, destResult.path], destResult.event, destResult.error, sourceResult.bytesHashed);
|
|
84
|
+
const preparedPair = [sourceResult.path, destResult.path];
|
|
85
|
+
const sourceState = comparableSha1(sourceResult.path);
|
|
86
|
+
const destState = comparableSha1(destResult.path);
|
|
87
|
+
const bytesHashed = sourceResult.bytesHashed + destResult.bytesHashed;
|
|
88
|
+
if (sourceState.kind === "unavailable" || destState.kind === "unavailable") return skipped(preparedPair, unavailableSha1Event(preparedPair), void 0, bytesHashed);
|
|
89
|
+
const shouldVerifyB2Bytes = untrustedSha1CouldSuppressTransfer(sourceState, destState);
|
|
90
|
+
const readB2Sha1 = options.readB2Sha1;
|
|
91
|
+
if (shouldVerifyB2Bytes && hasB2Path(preparedPair) && readB2Sha1 !== void 0) return verifyB2Sha1Bytes(preparedPair, {
|
|
92
|
+
...options,
|
|
93
|
+
readB2Sha1
|
|
94
|
+
}, bytesHashed);
|
|
95
|
+
return readyComparePair(preparedPair, bytesHashed);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Prepares a list of pairs for the selected compare mode with bounded concurrency.
|
|
99
|
+
*
|
|
100
|
+
* @param pairs - Source/destination pairs from {@link zipFolders}.
|
|
101
|
+
* @param compareMode - The comparison strategy.
|
|
102
|
+
* @param options - Optional hashing dependencies, cancellation signal, and concurrency.
|
|
103
|
+
*
|
|
104
|
+
* @returns Prepared results in the same order as the input pairs.
|
|
105
|
+
*/
|
|
106
|
+
async function preparePairsForCompare(pairs, compareMode, options = {}) {
|
|
107
|
+
assertSupportedCompareMode(compareMode);
|
|
108
|
+
if (compareMode !== "sha1") return pairs.map((pair) => ({
|
|
109
|
+
originalPair: pair,
|
|
110
|
+
prepared: readyComparePair(pair)
|
|
111
|
+
}));
|
|
112
|
+
return mapConcurrent(pairs, normalizeConcurrency(options.concurrency), async (pair) => {
|
|
113
|
+
if (options.signal?.aborted) return {
|
|
114
|
+
originalPair: pair,
|
|
115
|
+
prepared: aborted(pair)
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
originalPair: pair,
|
|
119
|
+
prepared: await preparePairForCompare(pair, compareMode, options)
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async function prepareLocalPathSha1(path, options) {
|
|
124
|
+
if (!isLocalSyncPath(path)) return {
|
|
125
|
+
path,
|
|
126
|
+
bytesHashed: 0,
|
|
127
|
+
bytesVerified: 0,
|
|
128
|
+
aborted: false
|
|
129
|
+
};
|
|
130
|
+
if (options.signal?.aborted) return {
|
|
131
|
+
path,
|
|
132
|
+
bytesHashed: 0,
|
|
133
|
+
bytesVerified: 0,
|
|
134
|
+
aborted: true
|
|
135
|
+
};
|
|
136
|
+
try {
|
|
137
|
+
const state = syncSha1StateOf(path);
|
|
138
|
+
if (state.kind === "verified") return {
|
|
139
|
+
path: {
|
|
140
|
+
...path,
|
|
141
|
+
contentSha1: state.value
|
|
142
|
+
},
|
|
143
|
+
bytesHashed: 0,
|
|
144
|
+
bytesVerified: 0,
|
|
145
|
+
aborted: false
|
|
146
|
+
};
|
|
147
|
+
if (state.kind === "unavailable") return {
|
|
148
|
+
path: {
|
|
149
|
+
...path,
|
|
150
|
+
contentSha1: null
|
|
151
|
+
},
|
|
152
|
+
bytesHashed: 0,
|
|
153
|
+
bytesVerified: 0,
|
|
154
|
+
aborted: false
|
|
155
|
+
};
|
|
156
|
+
const readLocalSha1 = options.readLocalSha1;
|
|
157
|
+
if (readLocalSha1 === void 0) return {
|
|
158
|
+
path: {
|
|
159
|
+
...path,
|
|
160
|
+
contentSha1: path.contentSha1 ?? null
|
|
161
|
+
},
|
|
162
|
+
bytesHashed: 0,
|
|
163
|
+
bytesVerified: 0,
|
|
164
|
+
aborted: false
|
|
165
|
+
};
|
|
166
|
+
const contentSha1 = await readLocalSha1(path, options.signal, { ...options.sha1ReadTimeoutMillis !== void 0 ? { timeoutMillis: options.sha1ReadTimeoutMillis } : {} });
|
|
167
|
+
return {
|
|
168
|
+
path: {
|
|
169
|
+
...path,
|
|
170
|
+
contentSha1
|
|
171
|
+
},
|
|
172
|
+
bytesHashed: normalizeVerifiableSha1(contentSha1) === null ? 0 : path.size,
|
|
173
|
+
bytesVerified: 0,
|
|
174
|
+
aborted: false
|
|
175
|
+
};
|
|
176
|
+
} catch (err) {
|
|
177
|
+
if (options.signal?.aborted || isAbortError(err)) return {
|
|
178
|
+
path,
|
|
179
|
+
bytesHashed: 0,
|
|
180
|
+
bytesVerified: 0,
|
|
181
|
+
aborted: true
|
|
182
|
+
};
|
|
183
|
+
const error = toError(err);
|
|
184
|
+
return {
|
|
185
|
+
path,
|
|
186
|
+
bytesHashed: 0,
|
|
187
|
+
event: {
|
|
188
|
+
type: "error",
|
|
189
|
+
path: path.relativePath,
|
|
190
|
+
size: 0,
|
|
191
|
+
message: `failed to hash local file for sha1 comparison: ${formatHashError(error)}`
|
|
192
|
+
},
|
|
193
|
+
error,
|
|
194
|
+
bytesVerified: 0,
|
|
195
|
+
aborted: false
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function verifyB2Sha1Bytes(pair, options, bytesHashed) {
|
|
200
|
+
const [source, dest] = pair;
|
|
201
|
+
/* v8 ignore next -- callers only verify B2 bytes for paired compare results */
|
|
202
|
+
if (source === null || dest === null) return readyComparePair(pair, bytesHashed);
|
|
203
|
+
const sourceResult = await prepareUntrustedB2PathSha1(source, options);
|
|
204
|
+
const sourceBytesVerified = sourceResult.bytesVerified;
|
|
205
|
+
if (sourceResult.aborted) return aborted(pair);
|
|
206
|
+
if (sourceResult.event) return skipped([sourceResult.path, dest], sourceResult.event, sourceResult.error, bytesHashed, sourceBytesVerified);
|
|
207
|
+
const destResult = await prepareUntrustedB2PathSha1(dest, options);
|
|
208
|
+
const bytesVerified = sourceBytesVerified + destResult.bytesVerified;
|
|
209
|
+
/* v8 ignore next -- destination abort mirrors the covered source abort path */
|
|
210
|
+
if (destResult.aborted) return aborted([sourceResult.path, destResult.path]);
|
|
211
|
+
if (destResult.event) return skipped([sourceResult.path, destResult.path], destResult.event, destResult.error, bytesHashed, bytesVerified);
|
|
212
|
+
return readyComparePair([sourceResult.path, destResult.path], bytesHashed, bytesVerified);
|
|
213
|
+
}
|
|
214
|
+
async function prepareUntrustedB2PathSha1(path, options) {
|
|
215
|
+
if (!isB2SyncPath(path) || comparableSha1(path).kind !== "untrusted") return {
|
|
216
|
+
path,
|
|
217
|
+
bytesHashed: 0,
|
|
218
|
+
bytesVerified: 0,
|
|
219
|
+
aborted: false
|
|
220
|
+
};
|
|
221
|
+
return prepareB2PathSha1(path, options);
|
|
222
|
+
}
|
|
223
|
+
async function prepareB2PathSha1(path, options) {
|
|
224
|
+
/* v8 ignore next -- pre-aborted B2 reads are covered at pair level */
|
|
225
|
+
if (options.signal?.aborted) return {
|
|
226
|
+
path,
|
|
227
|
+
bytesHashed: 0,
|
|
228
|
+
bytesVerified: 0,
|
|
229
|
+
aborted: true
|
|
230
|
+
};
|
|
231
|
+
try {
|
|
232
|
+
const result = await options.readB2Sha1(path, options.signal);
|
|
233
|
+
const contentSha1 = typeof result === "object" && result !== null ? result.contentSha1 : result;
|
|
234
|
+
const bytesVerified = typeof result === "object" && result !== null ? Math.max(0, result.bytesRead) : 0;
|
|
235
|
+
const preparedPath = {
|
|
236
|
+
...path,
|
|
237
|
+
contentSha1,
|
|
238
|
+
contentSha1State: syncSha1StateOf({ contentSha1 })
|
|
239
|
+
};
|
|
240
|
+
if (contentSha1 === null) return {
|
|
241
|
+
path: preparedPath,
|
|
242
|
+
bytesHashed: 0,
|
|
243
|
+
bytesVerified,
|
|
244
|
+
event: unavailableSha1PathEvent(path),
|
|
245
|
+
aborted: false
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
path: preparedPath,
|
|
249
|
+
bytesHashed: 0,
|
|
250
|
+
bytesVerified,
|
|
251
|
+
aborted: false
|
|
252
|
+
};
|
|
253
|
+
} catch (err) {
|
|
254
|
+
if (options.signal?.aborted || isAbortError(err)) return {
|
|
255
|
+
path,
|
|
256
|
+
bytesHashed: 0,
|
|
257
|
+
bytesVerified: 0,
|
|
258
|
+
aborted: true
|
|
259
|
+
};
|
|
260
|
+
const error = toError(err);
|
|
261
|
+
return {
|
|
262
|
+
path,
|
|
263
|
+
bytesHashed: 0,
|
|
264
|
+
bytesVerified: 0,
|
|
265
|
+
event: {
|
|
266
|
+
type: "skip",
|
|
267
|
+
path: path.relativePath,
|
|
268
|
+
size: 0,
|
|
269
|
+
message: `sha1 comparison skipped because B2 verification failed: ${formatHashError(error)}`
|
|
270
|
+
},
|
|
271
|
+
aborted: false
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function comparableSha1(path) {
|
|
276
|
+
const state = syncSha1StateOf(path);
|
|
277
|
+
if (state.kind === "verified") return {
|
|
278
|
+
kind: "verified",
|
|
279
|
+
value: state.value
|
|
280
|
+
};
|
|
281
|
+
if (state.kind === "untrusted") return {
|
|
282
|
+
kind: "untrusted",
|
|
283
|
+
value: state.value
|
|
284
|
+
};
|
|
285
|
+
return { kind: "unavailable" };
|
|
286
|
+
}
|
|
287
|
+
function untrustedSha1CouldSuppressTransfer(source, dest) {
|
|
288
|
+
if (source.kind === "untrusted" && dest.kind === "verified") return source.value === dest.value;
|
|
289
|
+
if (dest.kind === "untrusted" && source.kind === "verified") return dest.value === source.value;
|
|
290
|
+
if (source.kind === "untrusted" && dest.kind === "untrusted") return source.value !== null && source.value === dest.value;
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
function withB2ContentSha1(path) {
|
|
294
|
+
if (!isB2SyncPath(path) || path.contentSha1 !== void 0 || path.contentSha1State !== void 0) return path;
|
|
295
|
+
const contentSha1 = selectB2ComparableSha1(path.selectedVersion);
|
|
296
|
+
return {
|
|
297
|
+
...path,
|
|
298
|
+
contentSha1,
|
|
299
|
+
contentSha1State: syncSha1StateOf({ contentSha1 })
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function hasUnavailableB2Sha1(pair) {
|
|
303
|
+
const [source, dest] = pair;
|
|
304
|
+
return source !== null && isB2SyncPath(source) && comparableSha1(source).kind === "unavailable" || dest !== null && isB2SyncPath(dest) && comparableSha1(dest).kind === "unavailable";
|
|
305
|
+
}
|
|
306
|
+
function hasUntrustedSha1(pair) {
|
|
307
|
+
const [source, dest] = pair;
|
|
308
|
+
return source !== null && comparableSha1(source).kind === "untrusted" || dest !== null && comparableSha1(dest).kind === "untrusted";
|
|
309
|
+
}
|
|
310
|
+
function hasVerifiableUntrustedSha1(pair) {
|
|
311
|
+
const [source, dest] = pair;
|
|
312
|
+
return source !== null && verifiableUntrustedSha1(source) || dest !== null && verifiableUntrustedSha1(dest);
|
|
313
|
+
}
|
|
314
|
+
function verifiableUntrustedSha1(path) {
|
|
315
|
+
const state = comparableSha1(path);
|
|
316
|
+
return state.kind === "untrusted" && state.value !== null;
|
|
317
|
+
}
|
|
318
|
+
function hasB2Path(pair) {
|
|
319
|
+
const [source, dest] = pair;
|
|
320
|
+
return source !== null && isB2SyncPath(source) || dest !== null && isB2SyncPath(dest);
|
|
321
|
+
}
|
|
322
|
+
function isB2SyncPath(path) {
|
|
323
|
+
return "selectedVersion" in path;
|
|
324
|
+
}
|
|
325
|
+
function isLocalSyncPath(path) {
|
|
326
|
+
return "absolutePath" in path;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Creates a successful no-op compare preparation result for a pair.
|
|
330
|
+
*
|
|
331
|
+
* @param pair - Source/destination pair from {@link zipFolders}.
|
|
332
|
+
* @param bytesHashed - Local file bytes read while preparing the pair.
|
|
333
|
+
* @param bytesVerified - B2 bytes read while verifying untrusted SHA-1 metadata.
|
|
334
|
+
*
|
|
335
|
+
* @returns A ready preparation result that allows action generation.
|
|
336
|
+
*/
|
|
337
|
+
function readyComparePair(pair, bytesHashed = 0, bytesVerified = 0) {
|
|
338
|
+
return {
|
|
339
|
+
pair,
|
|
340
|
+
events: [],
|
|
341
|
+
errors: [],
|
|
342
|
+
bytesHashed,
|
|
343
|
+
bytesVerified,
|
|
344
|
+
skipActionGeneration: false,
|
|
345
|
+
aborted: false
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function skipped(pair, event, error, bytesHashed = 0, bytesVerified = 0) {
|
|
349
|
+
return {
|
|
350
|
+
pair,
|
|
351
|
+
events: [event],
|
|
352
|
+
errors: error !== void 0 ? [error] : [],
|
|
353
|
+
bytesHashed,
|
|
354
|
+
bytesVerified,
|
|
355
|
+
skipActionGeneration: true,
|
|
356
|
+
aborted: false
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
function aborted(pair) {
|
|
360
|
+
return {
|
|
361
|
+
pair,
|
|
362
|
+
events: [],
|
|
363
|
+
errors: [],
|
|
364
|
+
bytesHashed: 0,
|
|
365
|
+
bytesVerified: 0,
|
|
366
|
+
skipActionGeneration: true,
|
|
367
|
+
aborted: true
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function unavailableSha1Event(pair) {
|
|
371
|
+
return unavailableSha1PathEvent({ relativePath: (pair[0] ?? pair[1])?.relativePath ?? "" });
|
|
372
|
+
}
|
|
373
|
+
function unavailableSha1PathEvent(path) {
|
|
374
|
+
return {
|
|
375
|
+
type: "skip",
|
|
376
|
+
path: path.relativePath,
|
|
377
|
+
size: 0,
|
|
378
|
+
message: "sha1 comparison skipped because a verifiable SHA-1 is unavailable"
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
function normalizeConcurrency(value) {
|
|
382
|
+
if (value === void 0 || !Number.isFinite(value) || value < 1) return 1;
|
|
383
|
+
return Math.max(1, Math.floor(value));
|
|
384
|
+
}
|
|
385
|
+
//#endregion
|
|
386
|
+
export { assertSupportedCompareMode, filesAreDifferent, preparePairForCompare, preparePairsForCompare, readyComparePair };
|
|
387
|
+
|
|
388
|
+
//# sourceMappingURL=compare.js.map
|