@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sources":["../../src/streams/source.ts"],"sourcesContent":["import { collectStream } from './collect.ts'\n\n/**\n * Uniform adapter for upload content. Wraps File, Blob, Buffer, or ReadableStream\n * behind a common interface so upload logic does not depend on the input type.\n */\nexport interface ContentSource {\n /** Total size of the content in bytes. */\n readonly size: number\n /** Pre-computed SHA-1 hex digest, if available. */\n readonly sha1?: string\n /**\n * Whether {@link slice} is safe to call on this source.\n *\n * `true` for in-memory / random-access sources (`BufferSource`,\n * `BlobSource`) — the multipart upload engine can dispatch part reads\n * in parallel by slicing the source into disjoint ranges. `false`\n * for forward-only sources (`StreamSource`) — the engine must read\n * sequentially, one `partSize` chunk at a time. Callers that branch\n * on this flag are expected to fall back to the sequential path\n * rather than call `slice()` and catch the throw.\n */\n readonly canSlice: boolean\n /** Return a sub-range of this source as a new ContentSource. */\n slice(start: number, end: number): ContentSource\n /** Open the content as a ReadableStream. */\n stream(): ReadableStream<Uint8Array>\n /** Read the entire content into an ArrayBuffer. */\n toArrayBuffer(): Promise<ArrayBuffer>\n}\n\n/** ContentSource backed by a Blob or File. */\nexport class BlobSource implements ContentSource {\n /** {@inheritDoc} */\n readonly size: number\n /** Random-access: `Blob.slice()` is cheap and returns a new Blob view. */\n readonly canSlice = true\n\n /**\n * Create a BlobSource wrapping the given Blob.\n * @param blob - The Blob or File to use as the underlying content.\n */\n constructor(private readonly blob: Blob) {\n this.size = blob.size\n }\n\n /**\n * Return a new BlobSource covering the specified byte range.\n * @param start - The zero-based byte offset to begin the slice.\n * @param end - The exclusive byte offset where the slice ends.\n *\n * @returns A new ContentSource representing the requested sub-range.\n */\n slice(start: number, end: number): ContentSource {\n return new BlobSource(this.blob.slice(start, end))\n }\n\n /**\n * Open the Blob content as a ReadableStream.\n * @returns A ReadableStream of the Blob bytes.\n */\n stream(): ReadableStream<Uint8Array> {\n return this.blob.stream() as ReadableStream<Uint8Array>\n }\n\n /**\n * Read the entire Blob content into an ArrayBuffer.\n * @returns A promise that resolves with the full content as an ArrayBuffer.\n */\n toArrayBuffer(): Promise<ArrayBuffer> {\n return this.blob.arrayBuffer()\n }\n}\n\n/** ContentSource backed by a Uint8Array buffer. */\nexport class BufferSource implements ContentSource {\n /** {@inheritDoc} */\n readonly size: number\n /** Random-access: the entire payload lives in memory. */\n readonly canSlice = true\n\n /**\n * Create a BufferSource wrapping the given Uint8Array.\n * @param buffer - The byte buffer to use as the underlying content.\n */\n constructor(private readonly buffer: Uint8Array) {\n this.size = buffer.byteLength\n }\n\n /**\n * Return a new BufferSource covering the specified byte range.\n * @param start - The zero-based byte offset to begin the slice.\n * @param end - The exclusive byte offset where the slice ends.\n *\n * @returns A new ContentSource representing the requested sub-range.\n */\n slice(start: number, end: number): ContentSource {\n return new BufferSource(this.buffer.slice(start, end))\n }\n\n /**\n * Open the buffer content as a ReadableStream.\n * @returns A ReadableStream that emits the buffer bytes in a single chunk.\n */\n stream(): ReadableStream<Uint8Array> {\n const buffer = this.buffer\n return new ReadableStream({\n start(controller) {\n controller.enqueue(buffer)\n controller.close()\n },\n })\n }\n\n /**\n * Read the entire buffer content into an ArrayBuffer.\n * @returns A promise that resolves with the full content as an ArrayBuffer.\n */\n toArrayBuffer(): Promise<ArrayBuffer> {\n return Promise.resolve(\n this.buffer.buffer.slice(\n this.buffer.byteOffset,\n this.buffer.byteOffset + this.buffer.byteLength,\n ) as ArrayBuffer,\n )\n }\n}\n\n/** ContentSource backed by a ReadableStream. Can only be consumed once and does not support slicing. */\nexport class StreamSource implements ContentSource {\n /** {@inheritDoc} */\n readonly size: number\n /**\n * Forward-only: ReadableStreams cannot be repositioned, so multipart\n * uploads must take the sequential path. See the interface comment on\n * `canSlice` for what the engine does with this flag.\n */\n readonly canSlice = false\n /** Whether the stream has already been read. */\n private consumed = false\n\n /**\n * Create a StreamSource wrapping the given ReadableStream with a known byte size.\n * @param readable - The ReadableStream to wrap as a content source.\n * @param size - The total number of bytes the stream will produce.\n */\n constructor(\n private readonly readable: ReadableStream<Uint8Array>,\n size: number,\n ) {\n this.size = size\n }\n\n /**\n * Always throws because streams cannot be sliced. Buffer the stream first.\n *\n * @throws If slicing is attempted on a stream-backed source.\n */\n slice(): ContentSource {\n throw new Error('StreamSource does not support slicing. Buffer the stream first.')\n }\n\n /**\n * Open the underlying ReadableStream. Can only be called once.\n * @returns The underlying ReadableStream of bytes.\n *\n * @throws If the stream has already been consumed.\n */\n stream(): ReadableStream<Uint8Array> {\n if (this.consumed) throw new Error('StreamSource can only be consumed once.')\n this.consumed = true\n return this.readable\n }\n\n /**\n * Read the entire stream into an ArrayBuffer.\n * @returns A promise that resolves with the full content as an ArrayBuffer.\n */\n async toArrayBuffer(): Promise<ArrayBuffer> {\n const bytes = await collectStream(this.stream())\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer\n }\n}\n\n/**\n * Convert a Uint8Array, Blob, or ReadableStream into a {@link ContentSource}.\n * When passing a ReadableStream, the `size` parameter is required.\n * @param input - The content to wrap, as a Uint8Array, Blob, or ReadableStream.\n * @param size - The total byte length, required when input is a ReadableStream.\n *\n * @returns A ContentSource adapter for the given input.\n *\n * @throws If input is a ReadableStream and size is not provided.\n */\nexport function toContentSource(\n input: Uint8Array | Blob | ReadableStream<Uint8Array>,\n size?: number,\n): ContentSource {\n if (input instanceof Uint8Array) {\n return new BufferSource(input)\n }\n if (input instanceof Blob) {\n return new BlobSource(input)\n }\n if (size === undefined) {\n throw new Error('size is required when using a ReadableStream as input.')\n }\n return new StreamSource(input, size)\n}\n"],"names":[],"mappings":";AAgCO,MAAM,WAAoC;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/C,YAA6B,MAAY;AAAZ,SAAA,OAAA;AAC3B,SAAK,OAAO,KAAK;AAAA,EACnB;AAAA;AAAA,EAVS;AAAA;AAAA,EAEA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBpB,MAAM,OAAe,KAA4B;AAC/C,WAAO,IAAI,WAAW,KAAK,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAqC;AACnC,WAAO,KAAK,KAAK,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAsC;AACpC,WAAO,KAAK,KAAK,YAAA;AAAA,EACnB;AACF;AAGO,MAAM,aAAsC;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjD,YAA6B,QAAoB;AAApB,SAAA,SAAA;AAC3B,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA;AAAA,EAVS;AAAA;AAAA,EAEA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBpB,MAAM,OAAe,KAA4B;AAC/C,WAAO,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,GAAG,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAqC;AACnC,UAAM,SAAS,KAAK;AACpB,WAAO,IAAI,eAAe;AAAA,MACxB,MAAM,YAAY;AAChB,mBAAW,QAAQ,MAAM;AACzB,mBAAW,MAAA;AAAA,MACb;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAsC;AACpC,WAAO,QAAQ;AAAA,MACb,KAAK,OAAO,OAAO;AAAA,QACjB,KAAK,OAAO;AAAA,QACZ,KAAK,OAAO,aAAa,KAAK,OAAO;AAAA,MAAA;AAAA,IACvC;AAAA,EAEJ;AACF;AAGO,MAAM,aAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBjD,YACmB,UACjB,MACA;AAFiB,SAAA,WAAA;AAGjB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EApBS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AAAA;AAAA,EAEZ,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBnB,QAAuB;AACrB,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAqC;AACnC,QAAI,KAAK,SAAU,OAAM,IAAI,MAAM,yCAAyC;AAC5E,SAAK,WAAW;AAChB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAsC;AAC1C,UAAM,QAAQ,MAAM,cAAc,KAAK,QAAQ;AAC/C,WAAO,MAAM,OAAO,MAAM,MAAM,YAAY,MAAM,aAAa,MAAM,UAAU;AAAA,EACjF;AACF;AAYO,SAAS,gBACd,OACA,MACe;AACf,MAAI,iBAAiB,YAAY;AAC/B,WAAO,IAAI,aAAa,KAAK;AAAA,EAC/B;AACA,MAAI,iBAAiB,MAAM;AACzB,WAAO,IAAI,WAAW,KAAK;AAAA,EAC7B;AACA,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO,IAAI,aAAa,OAAO,IAAI;AACrC;"}
|
|
1
|
+
{"version":3,"file":"source.js","names":[],"sources":["../../src/streams/source.ts"],"sourcesContent":["import { arrayBufferFor } from '../util/bytes.ts'\nimport { collectStream } from './collect.ts'\n\nexport { FileSource, type FileSourcePath } from './file-source.ts'\n\nconst READABLE_STREAM_SIZE_REQUIRED_ERROR = 'size is required when using a ReadableStream as input.'\nconst FORWARD_ONLY_SIZE_REQUIRED_ERROR =\n 'size is required when using a forward-only content source as input.'\nconst STREAM_SOURCE_ENDED_EARLY_ERROR = 'StreamSource ended before the advertised byte count.'\nconst STREAM_SOURCE_TOO_MANY_BYTES_ERROR =\n 'StreamSource emitted more bytes than the advertised byte count.'\nconst STREAM_SOURCE_TOO_MANY_EMPTY_CHUNKS_ERROR =\n 'StreamSource emitted too many empty chunks without data.'\n/** Maximum consecutive empty chunks tolerated from a forward-only stream. */\nexport const MAX_EMPTY_STREAM_CHUNKS = 1024\n\nfunction asyncIterableToReadableStream(\n iterable: AsyncIterable<Uint8Array>,\n): ReadableStream<Uint8Array> {\n const iterator = iterable[Symbol.asyncIterator]()\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await iterator.next()\n if (done === true) {\n controller.close()\n return\n }\n if (!(value instanceof Uint8Array)) {\n throw new TypeError('Async iterable content sources must yield Uint8Array chunks.')\n }\n controller.enqueue(value)\n } catch (err) {\n /* v8 ignore next -- Iterator-return failure must not mask the pull error. */\n await returnAsyncIteratorBestEffort(iterator)\n throw err\n }\n },\n async cancel(reason) {\n await returnAsyncIteratorBestEffort(iterator, reason)\n },\n })\n}\n\nasync function returnAsyncIteratorBestEffort(\n iterator: AsyncIterator<Uint8Array>,\n reason?: unknown,\n): Promise<void> {\n try {\n await iterator.return?.(reason)\n } catch {\n // Iterator cleanup is secondary and must not mask the pull error.\n }\n}\n\nfunction isAsyncIterable(input: unknown): input is AsyncIterable<Uint8Array> {\n return (\n typeof input === 'object' &&\n input !== null &&\n Symbol.asyncIterator in input &&\n typeof input[Symbol.asyncIterator] === 'function'\n )\n}\n\nfunction isReadableStream(input: unknown): input is ReadableStream<Uint8Array> {\n return (\n typeof input === 'object' &&\n input !== null &&\n typeof (input as { getReader?: unknown }).getReader === 'function'\n )\n}\n\n/**\n * Uniform adapter for upload content. Wraps File, Blob, Buffer, local files,\n * async iterables, or ReadableStream behind a common interface so upload logic\n * does not depend on the input type.\n */\nexport interface ContentSource {\n /** Total size of the content in bytes. */\n readonly size: number\n /** Pre-computed SHA-1 hex digest, if available. */\n readonly sha1?: string\n /**\n * Whether {@link slice} is safe to call on this source.\n *\n * `true` for in-memory / random-access sources (`BufferSource`,\n * `BlobSource`, `FileSource`) — the multipart upload engine can dispatch\n * part reads in parallel by slicing the source into disjoint ranges.\n * `false` for forward-only streams and async iterables — the engine must\n * read sequentially, one `partSize` chunk at a time. Callers that branch on\n * this flag are expected to fall back to the sequential path rather than call\n * `slice()` and catch the throw.\n */\n readonly canSlice: boolean\n /** Return a sub-range of this source as a new ContentSource. */\n slice(start: number, end: number): ContentSource\n /** Open the content as a ReadableStream. */\n stream(): ReadableStream<Uint8Array>\n /** Read the entire content into an ArrayBuffer. */\n toArrayBuffer(options?: { readonly signal?: AbortSignal }): Promise<ArrayBuffer>\n}\n\n/** ContentSource backed by a Blob or File. */\nexport class BlobSource implements ContentSource {\n /** {@inheritDoc} */\n readonly size: number\n /** Random-access: `Blob.slice()` is cheap and returns a new Blob view. */\n readonly canSlice = true\n\n /**\n * Create a BlobSource wrapping the given Blob.\n * @param blob - The Blob or File to use as the underlying content.\n */\n constructor(private readonly blob: Blob) {\n this.size = blob.size\n }\n\n /**\n * Return a new BlobSource covering the specified byte range.\n * @param start - The zero-based byte offset to begin the slice.\n * @param end - The exclusive byte offset where the slice ends.\n *\n * @returns A new ContentSource representing the requested sub-range.\n */\n slice(start: number, end: number): ContentSource {\n return new BlobSource(this.blob.slice(start, end))\n }\n\n /**\n * Open the Blob content as a ReadableStream.\n * @returns A ReadableStream of the Blob bytes.\n */\n stream(): ReadableStream<Uint8Array> {\n return this.blob.stream() as ReadableStream<Uint8Array>\n }\n\n /**\n * Read the entire Blob content into an ArrayBuffer.\n * @param options - Optional abort signal used while reading.\n *\n * @returns A promise that resolves with the full content as an ArrayBuffer.\n */\n async toArrayBuffer(options: { readonly signal?: AbortSignal } = {}): Promise<ArrayBuffer> {\n options.signal?.throwIfAborted()\n if (options.signal === undefined) return this.blob.arrayBuffer()\n const bytes = await collectStream(this.stream(), options)\n return arrayBufferFor(bytes)\n }\n}\n\n/** ContentSource backed by a Uint8Array buffer. */\nexport class BufferSource implements ContentSource {\n /** {@inheritDoc} */\n readonly size: number\n /** Random-access: the entire payload lives in memory. */\n readonly canSlice = true\n\n /**\n * Create a BufferSource wrapping the given Uint8Array.\n * @param buffer - The byte buffer to use as the underlying content.\n */\n constructor(private readonly buffer: Uint8Array) {\n this.size = buffer.byteLength\n }\n\n /**\n * Return a new BufferSource covering the specified byte range.\n * @param start - The zero-based byte offset to begin the slice.\n * @param end - The exclusive byte offset where the slice ends.\n *\n * @returns A new ContentSource representing the requested sub-range.\n */\n slice(start: number, end: number): ContentSource {\n return new BufferSource(this.buffer.slice(start, end))\n }\n\n /**\n * Open the buffer content as a ReadableStream.\n * @returns A ReadableStream that emits the buffer bytes in a single chunk.\n */\n stream(): ReadableStream<Uint8Array> {\n const buffer = this.buffer\n return new ReadableStream({\n start(controller) {\n controller.enqueue(buffer)\n controller.close()\n },\n })\n }\n\n /**\n * Read the entire buffer content into an ArrayBuffer.\n * @param options - Optional abort signal checked before returning bytes.\n *\n * @returns A promise that resolves with the full content as an ArrayBuffer.\n */\n async toArrayBuffer(options: { readonly signal?: AbortSignal } = {}): Promise<ArrayBuffer> {\n options.signal?.throwIfAborted()\n return arrayBufferFor(this.buffer)\n }\n}\n\n/** ContentSource backed by a ReadableStream. Can only be consumed once and does not support slicing. */\nexport class StreamSource implements ContentSource {\n /** {@inheritDoc} */\n readonly size: number\n /**\n * Forward-only: ReadableStreams cannot be repositioned, so multipart\n * uploads must take the sequential path. See the interface comment on\n * `canSlice` for what the engine does with this flag.\n */\n readonly canSlice = false\n /** Whether the stream has already been read. */\n private consumed = false\n\n /**\n * Create a StreamSource wrapping the given ReadableStream with a known byte size.\n * @param readable - The ReadableStream to wrap as a content source.\n * @param size - The total number of bytes the stream will produce.\n */\n constructor(\n private readonly readable: ReadableStream<Uint8Array>,\n size: number,\n ) {\n validateStreamSourceSize(size)\n this.size = size\n }\n\n /**\n * Always throws because streams cannot be sliced. Buffer the stream first.\n *\n * @throws If slicing is attempted on a stream-backed source.\n */\n slice(): ContentSource {\n throw new Error('StreamSource does not support slicing. Buffer the stream first.')\n }\n\n /**\n * Open the underlying ReadableStream. Can only be called once.\n * @returns The underlying ReadableStream of bytes.\n *\n * @throws If the stream has already been consumed.\n */\n stream(): ReadableStream<Uint8Array> {\n if (this.consumed) throw new Error('StreamSource can only be consumed once.')\n this.consumed = true\n return this.readable\n }\n\n /**\n * Read the entire stream into an ArrayBuffer.\n * @param options - Optional abort signal used while reading.\n *\n * @returns A promise that resolves with the full content as an ArrayBuffer.\n */\n async toArrayBuffer(options: { readonly signal?: AbortSignal } = {}): Promise<ArrayBuffer> {\n const bytes = await collectStreamExactly(this.stream(), this.size, options.signal)\n return bytes.buffer as ArrayBuffer\n }\n}\n\nfunction validateStreamSourceSize(size: number): void {\n if (!Number.isFinite(size) || !Number.isInteger(size) || size < 0) {\n throw new RangeError('StreamSource size must be a non-negative finite integer.')\n }\n}\n\n/**\n * Reads exactly the advertised number of bytes from a stream.\n * @param stream - Stream to consume.\n * @param expectedSize - Exact number of bytes expected from the stream.\n * @param signal - Optional abort signal for cancelling the read.\n *\n * @returns A byte array of length `expectedSize`.\n *\n * @throws If the stream emits too few bytes, too many bytes, too many empty chunks, or aborts.\n */\nexport async function collectStreamExactly(\n stream: ReadableStream<Uint8Array>,\n expectedSize: number,\n signal?: AbortSignal,\n): Promise<Uint8Array<ArrayBuffer>> {\n const reader = stream.getReader()\n const chunks: Uint8Array[] = []\n let total = 0\n let completed = false\n\n try {\n while (total < expectedSize) {\n const { done, value } = await readNextNonEmptyStreamChunk(\n reader,\n STREAM_SOURCE_TOO_MANY_EMPTY_CHUNKS_ERROR,\n signal,\n )\n if (done) throw new Error(STREAM_SOURCE_ENDED_EARLY_ERROR)\n if (total + value.byteLength > expectedSize) {\n throw new Error(STREAM_SOURCE_TOO_MANY_BYTES_ERROR)\n }\n chunks.push(value)\n total += value.byteLength\n }\n\n const extra = await readNextNonEmptyStreamChunk(\n reader,\n STREAM_SOURCE_TOO_MANY_EMPTY_CHUNKS_ERROR,\n signal,\n )\n if (!extra.done) throw new Error(STREAM_SOURCE_TOO_MANY_BYTES_ERROR)\n\n const result = new Uint8Array(expectedSize)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.byteLength\n }\n completed = true\n return result\n } finally {\n if (!completed) {\n cancelReaderBestEffort(reader)\n }\n try {\n reader.releaseLock()\n } catch {\n // Aborted reads can leave a pending read while best-effort cancel is\n // still unsettled. Preserve the original abort/error instead.\n }\n }\n}\n\n/**\n * Reads from a stream until it receives data, EOF, or too many consecutive empty chunks.\n * @param reader - Locked reader for a Uint8Array stream.\n * @param emptyChunkErrorMessage - Error message to throw when the empty-chunk limit is exceeded.\n * @param signal - Optional abort signal that cancels the reader and rejects the read.\n *\n * @returns The next non-empty chunk or EOF result.\n */\nexport async function readNextNonEmptyStreamChunk(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n emptyChunkErrorMessage: string,\n signal?: AbortSignal,\n): Promise<ReadableStreamReadResult<Uint8Array>> {\n let emptyChunks = 0\n while (true) {\n const result = await readStreamChunk(reader, signal)\n if (result.done || result.value.byteLength > 0) return result\n emptyChunks += 1\n if (emptyChunks > MAX_EMPTY_STREAM_CHUNKS) {\n throw new Error(emptyChunkErrorMessage)\n }\n }\n}\n\nasync function readStreamChunk(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal: AbortSignal | undefined,\n): Promise<ReadableStreamReadResult<Uint8Array>> {\n if (signal === undefined) return reader.read()\n if (signal.aborted) {\n const reason = signal.reason ?? new DOMException('Aborted', 'AbortError')\n cancelReaderBestEffort(reader, reason)\n throw reason\n }\n\n let removeAbortListener: (() => void) | undefined\n const abort = new Promise<never>((_, reject) => {\n const onAbort = (): void => {\n const reason = signal.reason ?? new DOMException('Aborted', 'AbortError')\n cancelReaderBestEffort(reader, reason)\n reject(reason)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortListener = () => signal.removeEventListener('abort', onAbort)\n })\n\n try {\n const result = await Promise.race([reader.read(), abort])\n if (signal.aborted) {\n const reason = signal.reason ?? new DOMException('Aborted', 'AbortError')\n cancelReaderBestEffort(reader, reason)\n throw reason\n }\n return result\n } finally {\n removeAbortListener?.()\n }\n}\n\nfunction cancelReaderBestEffort(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n reason?: unknown,\n): void {\n /* v8 ignore next -- Reader cancellation failure is deliberately best-effort. */\n void reader.cancel(reason).catch(() => {})\n}\n\n/** ContentSource backed by a forward-only async iterable of Uint8Array chunks. */\nclass AsyncIterableSource extends StreamSource {\n /**\n * Create an AsyncIterableSource from a known-size async iterable.\n * @param iterable - Async iterable that yields Uint8Array chunks.\n * @param size - Total byte length the iterable will produce.\n */\n constructor(iterable: AsyncIterable<Uint8Array>, size: number) {\n super(asyncIterableToReadableStream(iterable), size)\n }\n}\n\n/**\n * Convert a Uint8Array, Blob, ReadableStream, or async iterable into a {@link ContentSource}.\n * When passing a ReadableStream or async iterable, the `size` parameter is required.\n * @param input - The content to wrap.\n * @param size - The total byte length, required for forward-only inputs.\n *\n * @returns A ContentSource adapter for the given input.\n *\n * @throws If input is forward-only and size is not provided.\n */\nexport function toContentSource(\n input: Uint8Array | Blob | ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>,\n size?: number,\n): ContentSource {\n if (input instanceof Uint8Array) {\n return new BufferSource(input)\n }\n if (input instanceof Blob) {\n return new BlobSource(input)\n }\n if (isReadableStream(input)) {\n if (size === undefined) {\n throw new Error(READABLE_STREAM_SIZE_REQUIRED_ERROR)\n }\n return new StreamSource(input, size)\n }\n if (isAsyncIterable(input)) {\n if (size === undefined) {\n throw new Error(FORWARD_ONLY_SIZE_REQUIRED_ERROR)\n }\n return new AsyncIterableSource(input, size)\n }\n throw new TypeError('Unsupported content source input.')\n}\n"],"mappings":"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"}
|
|
@@ -1,186 +1,237 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
1
|
+
//#region src/sync/actions/index.ts
|
|
2
|
+
/** Uploads a local file to B2. */
|
|
3
|
+
var UploadAction = class {
|
|
4
|
+
relativePath;
|
|
5
|
+
absolutePath;
|
|
6
|
+
size;
|
|
7
|
+
doUpload;
|
|
8
|
+
type = "upload";
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new UploadAction for the given relative path.
|
|
11
|
+
* @param relativePath - Path relative to the sync root.
|
|
12
|
+
* @param absolutePath - Absolute local filesystem path.
|
|
13
|
+
* @param size - File size in bytes.
|
|
14
|
+
* @param doUpload - Callback that performs the actual upload.
|
|
15
|
+
*/
|
|
16
|
+
constructor(relativePath, absolutePath, size, doUpload) {
|
|
17
|
+
this.relativePath = relativePath;
|
|
18
|
+
this.absolutePath = absolutePath;
|
|
19
|
+
this.size = size;
|
|
20
|
+
this.doUpload = doUpload;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Uploads the file (unless dryRun) and returns an 'upload-done' event.
|
|
24
|
+
* @param dryRun - Whether to simulate the action without making changes.
|
|
25
|
+
* @param signal - Optional abort signal for canceling the upload.
|
|
26
|
+
*
|
|
27
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
28
|
+
*/
|
|
29
|
+
async execute(dryRun, signal) {
|
|
30
|
+
if (!dryRun) await this.doUpload(this.absolutePath, this.relativePath, signal);
|
|
31
|
+
return {
|
|
32
|
+
type: "upload-done",
|
|
33
|
+
path: this.relativePath,
|
|
34
|
+
size: this.size
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/** Downloads a B2 file to the local filesystem. */
|
|
39
|
+
var DownloadAction = class {
|
|
40
|
+
relativePath;
|
|
41
|
+
size;
|
|
42
|
+
doDownload;
|
|
43
|
+
type = "download";
|
|
44
|
+
/**
|
|
45
|
+
* Creates a new DownloadAction for the given relative path.
|
|
46
|
+
* @param relativePath - Path relative to the sync root.
|
|
47
|
+
* @param size - File size in bytes.
|
|
48
|
+
* @param doDownload - Callback that performs the actual download.
|
|
49
|
+
*/
|
|
50
|
+
constructor(relativePath, size, doDownload) {
|
|
51
|
+
this.relativePath = relativePath;
|
|
52
|
+
this.size = size;
|
|
53
|
+
this.doDownload = doDownload;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Downloads the file (unless dryRun) and returns a 'download-done' event.
|
|
57
|
+
* @param dryRun - Whether to simulate the action without making changes.
|
|
58
|
+
* @param signal - Optional abort signal for canceling the download.
|
|
59
|
+
*
|
|
60
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
61
|
+
*/
|
|
62
|
+
async execute(dryRun, signal) {
|
|
63
|
+
if (!dryRun) await this.doDownload(this.relativePath, signal);
|
|
64
|
+
return {
|
|
65
|
+
type: "download-done",
|
|
66
|
+
path: this.relativePath,
|
|
67
|
+
size: this.size
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
/** Server-side copies a B2 file to a new key within the same or different bucket. */
|
|
72
|
+
var CopyAction = class {
|
|
73
|
+
relativePath;
|
|
74
|
+
size;
|
|
75
|
+
doCopy;
|
|
76
|
+
type = "copy";
|
|
77
|
+
/**
|
|
78
|
+
* Creates a new CopyAction for the given relative path.
|
|
79
|
+
* @param relativePath - Path relative to the sync root.
|
|
80
|
+
* @param size - File size in bytes.
|
|
81
|
+
* @param doCopy - Callback that performs the server-side copy.
|
|
82
|
+
*/
|
|
83
|
+
constructor(relativePath, size, doCopy) {
|
|
84
|
+
this.relativePath = relativePath;
|
|
85
|
+
this.size = size;
|
|
86
|
+
this.doCopy = doCopy;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Copies the file (unless dryRun) and returns a 'copy-done' event.
|
|
90
|
+
* @param dryRun - Whether to simulate the action without making changes.
|
|
91
|
+
* @param signal - Optional abort signal for canceling the copy.
|
|
92
|
+
*
|
|
93
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
94
|
+
*/
|
|
95
|
+
async execute(dryRun, signal) {
|
|
96
|
+
if (!dryRun) await this.doCopy(this.relativePath, signal);
|
|
97
|
+
return {
|
|
98
|
+
type: "copy-done",
|
|
99
|
+
path: this.relativePath,
|
|
100
|
+
size: this.size
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/** Hides a file in B2 by creating a hide marker (soft delete). */
|
|
105
|
+
var HideAction = class {
|
|
106
|
+
relativePath;
|
|
107
|
+
doHide;
|
|
108
|
+
type = "hide";
|
|
109
|
+
size = 0;
|
|
110
|
+
/**
|
|
111
|
+
* Creates a new HideAction for the given relative path.
|
|
112
|
+
* @param relativePath - Path relative to the sync root.
|
|
113
|
+
* @param doHide - Callback that creates the hide marker.
|
|
114
|
+
*/
|
|
115
|
+
constructor(relativePath, doHide) {
|
|
116
|
+
this.relativePath = relativePath;
|
|
117
|
+
this.doHide = doHide;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Hides the file (unless dryRun) and returns a 'hide' event.
|
|
121
|
+
* @param dryRun - Whether to simulate the action without making changes.
|
|
122
|
+
* @param signal - Optional abort signal for canceling the hide request.
|
|
123
|
+
*
|
|
124
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
125
|
+
*/
|
|
126
|
+
async execute(dryRun, signal) {
|
|
127
|
+
if (!dryRun) await this.doHide(this.relativePath, signal);
|
|
128
|
+
return {
|
|
129
|
+
type: "hide",
|
|
130
|
+
path: this.relativePath,
|
|
131
|
+
size: 0
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
/** Permanently deletes a specific file version from B2. */
|
|
136
|
+
var DeleteRemoteAction = class {
|
|
137
|
+
relativePath;
|
|
138
|
+
fileId;
|
|
139
|
+
doDelete;
|
|
140
|
+
type = "delete-remote";
|
|
141
|
+
size = 0;
|
|
142
|
+
/**
|
|
143
|
+
* Creates a new DeleteRemoteAction for the given relative path.
|
|
144
|
+
* @param relativePath - Path relative to the sync root.
|
|
145
|
+
* @param fileId - The B2 file version ID to delete.
|
|
146
|
+
* @param doDelete - Callback that performs the deletion.
|
|
147
|
+
*/
|
|
148
|
+
constructor(relativePath, fileId, doDelete) {
|
|
149
|
+
this.relativePath = relativePath;
|
|
150
|
+
this.fileId = fileId;
|
|
151
|
+
this.doDelete = doDelete;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Deletes the remote file version (unless dryRun) and returns a 'delete-remote' event.
|
|
155
|
+
* @param dryRun - Whether to simulate the action without making changes.
|
|
156
|
+
* @param signal - Optional abort signal for canceling the delete request.
|
|
157
|
+
*
|
|
158
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
159
|
+
*/
|
|
160
|
+
async execute(dryRun, signal) {
|
|
161
|
+
if (!dryRun) await this.doDelete(this.fileId, this.relativePath, signal);
|
|
162
|
+
return {
|
|
163
|
+
type: "delete-remote",
|
|
164
|
+
path: this.relativePath,
|
|
165
|
+
size: 0
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
/** Deletes a file from the local filesystem. */
|
|
170
|
+
var DeleteLocalAction = class {
|
|
171
|
+
relativePath;
|
|
172
|
+
absolutePath;
|
|
173
|
+
doDelete;
|
|
174
|
+
type = "delete-local";
|
|
175
|
+
size = 0;
|
|
176
|
+
/**
|
|
177
|
+
* Creates a new DeleteLocalAction for the given relative path.
|
|
178
|
+
* @param relativePath - Path relative to the sync root.
|
|
179
|
+
* @param absolutePath - Absolute local filesystem path.
|
|
180
|
+
* @param doDelete - Callback that performs the deletion.
|
|
181
|
+
*/
|
|
182
|
+
constructor(relativePath, absolutePath, doDelete) {
|
|
183
|
+
this.relativePath = relativePath;
|
|
184
|
+
this.absolutePath = absolutePath;
|
|
185
|
+
this.doDelete = doDelete;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Deletes the local file (unless dryRun) and returns a 'delete-local' event.
|
|
189
|
+
* @param dryRun - Whether to simulate the action without making changes.
|
|
190
|
+
* @param signal - Optional abort signal checked before deleting.
|
|
191
|
+
*
|
|
192
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
193
|
+
*/
|
|
194
|
+
async execute(dryRun, signal) {
|
|
195
|
+
if (!dryRun) await this.doDelete(this.absolutePath, signal);
|
|
196
|
+
return {
|
|
197
|
+
type: "delete-local",
|
|
198
|
+
path: this.relativePath,
|
|
199
|
+
size: 0
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
/** Represents a no-op action for files that do not need syncing. */
|
|
204
|
+
var SkipAction = class {
|
|
205
|
+
relativePath;
|
|
206
|
+
reason;
|
|
207
|
+
type = "skip";
|
|
208
|
+
size = 0;
|
|
209
|
+
/**
|
|
210
|
+
* Creates a new SkipAction for the given relative path.
|
|
211
|
+
* @param relativePath - Path relative to the sync root.
|
|
212
|
+
* @param reason - Human-readable explanation for why the file was skipped.
|
|
213
|
+
*/
|
|
214
|
+
constructor(relativePath, reason) {
|
|
215
|
+
this.relativePath = relativePath;
|
|
216
|
+
this.reason = reason;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Returns a 'skip' event with the reason message. No I/O is performed.
|
|
220
|
+
* @param _dryRun - Whether to simulate the action (unused for no-op).
|
|
221
|
+
* @param _signal - Unused abort signal accepted for the shared action interface.
|
|
222
|
+
*
|
|
223
|
+
* @returns A promise resolving to the sync event produced by the action.
|
|
224
|
+
*/
|
|
225
|
+
async execute(_dryRun, _signal) {
|
|
226
|
+
return {
|
|
227
|
+
type: "skip",
|
|
228
|
+
path: this.relativePath,
|
|
229
|
+
size: 0,
|
|
230
|
+
message: this.reason
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
//#endregion
|
|
184
235
|
exports.CopyAction = CopyAction;
|
|
185
236
|
exports.DeleteLocalAction = DeleteLocalAction;
|
|
186
237
|
exports.DeleteRemoteAction = DeleteRemoteAction;
|
|
@@ -188,4 +239,5 @@ exports.DownloadAction = DownloadAction;
|
|
|
188
239
|
exports.HideAction = HideAction;
|
|
189
240
|
exports.SkipAction = SkipAction;
|
|
190
241
|
exports.UploadAction = UploadAction;
|
|
191
|
-
|
|
242
|
+
|
|
243
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/sync/actions/index.ts"],"sourcesContent":["import type { SyncEvent } from '../types.ts'\n\n/** Discriminated union of all sync action types. */\nexport type SyncActionType =\n | 'upload'\n | 'download'\n | 'copy'\n | 'hide'\n | 'delete-remote'\n | 'delete-local'\n | 'skip'\n\n/** A single executable sync action produced by the policy engine. */\nexport interface SyncAction {\n /** The kind of action. */\n readonly type: SyncActionType\n /** Relative path of the file this action targets. */\n readonly relativePath: string\n /** Size in bytes of the file, or 0 for metadata-only actions. */\n readonly size: number\n /**\n * Executes the action (or no-ops if dryRun is true) and returns a corresponding event.\n * @param dryRun - When true, skip the actual I/O but still return the event.\n */\n execute(dryRun: boolean): Promise<SyncEvent>\n}\n\n/** Uploads a local file to B2. */\nexport class UploadAction implements SyncAction {\n readonly type = 'upload' as const\n\n /**\n * Creates a new UploadAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param absolutePath - Absolute local filesystem path.\n * @param size - File size in bytes.\n * @param doUpload - Callback that performs the actual upload.\n */\n constructor(\n readonly relativePath: string,\n readonly absolutePath: string,\n readonly size: number,\n private readonly doUpload: (absolutePath: string, relativePath: string) => Promise<void>,\n ) {}\n\n /**\n * Uploads the file (unless dryRun) and returns an 'upload-done' event.\n * @param dryRun - Whether to simulate the action without making changes.\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(dryRun: boolean): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doUpload(this.absolutePath, this.relativePath)\n }\n return { type: 'upload-done', path: this.relativePath, size: this.size }\n }\n}\n\n/** Downloads a B2 file to the local filesystem. */\nexport class DownloadAction implements SyncAction {\n readonly type = 'download' as const\n\n /**\n * Creates a new DownloadAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param size - File size in bytes.\n * @param doDownload - Callback that performs the actual download.\n */\n constructor(\n readonly relativePath: string,\n readonly size: number,\n private readonly doDownload: (relativePath: string) => Promise<void>,\n ) {}\n\n /**\n * Downloads the file (unless dryRun) and returns a 'download-done' event.\n * @param dryRun - Whether to simulate the action without making changes.\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(dryRun: boolean): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doDownload(this.relativePath)\n }\n return { type: 'download-done', path: this.relativePath, size: this.size }\n }\n}\n\n/** Server-side copies a B2 file to a new key within the same or different bucket. */\nexport class CopyAction implements SyncAction {\n readonly type = 'copy' as const\n\n /**\n * Creates a new CopyAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param size - File size in bytes.\n * @param doCopy - Callback that performs the server-side copy.\n */\n constructor(\n readonly relativePath: string,\n readonly size: number,\n private readonly doCopy: (relativePath: string) => Promise<void>,\n ) {}\n\n /**\n * Copies the file (unless dryRun) and returns a 'copy-done' event.\n * @param dryRun - Whether to simulate the action without making changes.\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(dryRun: boolean): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doCopy(this.relativePath)\n }\n return { type: 'copy-done', path: this.relativePath, size: this.size }\n }\n}\n\n/** Hides a file in B2 by creating a hide marker (soft delete). */\nexport class HideAction implements SyncAction {\n readonly type = 'hide' as const\n readonly size = 0\n\n /**\n * Creates a new HideAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param doHide - Callback that creates the hide marker.\n */\n constructor(\n readonly relativePath: string,\n private readonly doHide: (relativePath: string) => Promise<void>,\n ) {}\n\n /**\n * Hides the file (unless dryRun) and returns a 'hide' event.\n * @param dryRun - Whether to simulate the action without making changes.\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(dryRun: boolean): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doHide(this.relativePath)\n }\n return { type: 'hide', path: this.relativePath, size: 0 }\n }\n}\n\n/** Permanently deletes a specific file version from B2. */\nexport class DeleteRemoteAction implements SyncAction {\n readonly type = 'delete-remote' as const\n readonly size = 0\n\n /**\n * Creates a new DeleteRemoteAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param fileId - The B2 file version ID to delete.\n * @param doDelete - Callback that performs the deletion.\n */\n constructor(\n readonly relativePath: string,\n readonly fileId: string,\n private readonly doDelete: (fileId: string, fileName: string) => Promise<void>,\n ) {}\n\n /**\n * Deletes the remote file version (unless dryRun) and returns a 'delete-remote' event.\n * @param dryRun - Whether to simulate the action without making changes.\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(dryRun: boolean): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doDelete(this.fileId, this.relativePath)\n }\n return { type: 'delete-remote', path: this.relativePath, size: 0 }\n }\n}\n\n/** Deletes a file from the local filesystem. */\nexport class DeleteLocalAction implements SyncAction {\n readonly type = 'delete-local' as const\n readonly size = 0\n\n /**\n * Creates a new DeleteLocalAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param absolutePath - Absolute local filesystem path.\n * @param doDelete - Callback that performs the deletion.\n */\n constructor(\n readonly relativePath: string,\n readonly absolutePath: string,\n private readonly doDelete: (absolutePath: string) => Promise<void>,\n ) {}\n\n /**\n * Deletes the local file (unless dryRun) and returns a 'delete-local' event.\n * @param dryRun - Whether to simulate the action without making changes.\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(dryRun: boolean): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doDelete(this.absolutePath)\n }\n return { type: 'delete-local', path: this.relativePath, size: 0 }\n }\n}\n\n/** Represents a no-op action for files that do not need syncing. */\nexport class SkipAction implements SyncAction {\n readonly type = 'skip' as const\n readonly size = 0\n\n /**\n * Creates a new SkipAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param reason - Human-readable explanation for why the file was skipped.\n */\n constructor(\n readonly relativePath: string,\n readonly reason: string,\n ) {}\n\n /**\n * Returns a 'skip' event with the reason message. No I/O is performed.\n * @param _dryRun - Whether to simulate the action (unused for no-op).\n *\n * @returns An async generator yielding sync progress events.\n */\n async execute(_dryRun: boolean): Promise<SyncEvent> {\n return { type: 'skip', path: this.relativePath, size: 0, message: this.reason }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/sync/actions/index.ts"],"sourcesContent":["import type { SyncEvent } from '../types.ts'\n\n/** Discriminated union of all sync action types. */\nexport type SyncActionType =\n | 'upload'\n | 'download'\n | 'copy'\n | 'hide'\n | 'delete-remote'\n | 'delete-local'\n | 'skip'\n\n/** A single executable sync action produced by the policy engine. */\nexport interface SyncAction {\n /** The kind of action. */\n readonly type: SyncActionType\n /** Relative path of the file this action targets. */\n readonly relativePath: string\n /** Size in bytes of the file, or 0 for metadata-only actions. */\n readonly size: number\n /**\n * Executes the action (or no-ops if dryRun is true) and returns a corresponding event.\n * @param dryRun - When true, skip the actual I/O but still return the event.\n * @param signal - Optional abort signal for canceling in-flight I/O.\n */\n execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent>\n}\n\n/** Uploads a local file to B2. */\nexport class UploadAction implements SyncAction {\n readonly type = 'upload' as const\n\n /**\n * Creates a new UploadAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param absolutePath - Absolute local filesystem path.\n * @param size - File size in bytes.\n * @param doUpload - Callback that performs the actual upload.\n */\n constructor(\n readonly relativePath: string,\n readonly absolutePath: string,\n readonly size: number,\n private readonly doUpload: (\n absolutePath: string,\n relativePath: string,\n signal?: AbortSignal,\n ) => Promise<void>,\n ) {}\n\n /**\n * Uploads the file (unless dryRun) and returns an 'upload-done' event.\n * @param dryRun - Whether to simulate the action without making changes.\n * @param signal - Optional abort signal for canceling the upload.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doUpload(this.absolutePath, this.relativePath, signal)\n }\n return { type: 'upload-done', path: this.relativePath, size: this.size }\n }\n}\n\n/** Downloads a B2 file to the local filesystem. */\nexport class DownloadAction implements SyncAction {\n readonly type = 'download' as const\n\n /**\n * Creates a new DownloadAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param size - File size in bytes.\n * @param doDownload - Callback that performs the actual download.\n */\n constructor(\n readonly relativePath: string,\n readonly size: number,\n private readonly doDownload: (relativePath: string, signal?: AbortSignal) => Promise<void>,\n ) {}\n\n /**\n * Downloads the file (unless dryRun) and returns a 'download-done' event.\n * @param dryRun - Whether to simulate the action without making changes.\n * @param signal - Optional abort signal for canceling the download.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doDownload(this.relativePath, signal)\n }\n return { type: 'download-done', path: this.relativePath, size: this.size }\n }\n}\n\n/** Server-side copies a B2 file to a new key within the same or different bucket. */\nexport class CopyAction implements SyncAction {\n readonly type = 'copy' as const\n\n /**\n * Creates a new CopyAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param size - File size in bytes.\n * @param doCopy - Callback that performs the server-side copy.\n */\n constructor(\n readonly relativePath: string,\n readonly size: number,\n private readonly doCopy: (relativePath: string, signal?: AbortSignal) => Promise<void>,\n ) {}\n\n /**\n * Copies the file (unless dryRun) and returns a 'copy-done' event.\n * @param dryRun - Whether to simulate the action without making changes.\n * @param signal - Optional abort signal for canceling the copy.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doCopy(this.relativePath, signal)\n }\n return { type: 'copy-done', path: this.relativePath, size: this.size }\n }\n}\n\n/** Hides a file in B2 by creating a hide marker (soft delete). */\nexport class HideAction implements SyncAction {\n readonly type = 'hide' as const\n readonly size = 0\n\n /**\n * Creates a new HideAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param doHide - Callback that creates the hide marker.\n */\n constructor(\n readonly relativePath: string,\n private readonly doHide: (relativePath: string, signal?: AbortSignal) => Promise<void>,\n ) {}\n\n /**\n * Hides the file (unless dryRun) and returns a 'hide' event.\n * @param dryRun - Whether to simulate the action without making changes.\n * @param signal - Optional abort signal for canceling the hide request.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doHide(this.relativePath, signal)\n }\n return { type: 'hide', path: this.relativePath, size: 0 }\n }\n}\n\n/** Permanently deletes a specific file version from B2. */\nexport class DeleteRemoteAction implements SyncAction {\n readonly type = 'delete-remote' as const\n readonly size = 0\n\n /**\n * Creates a new DeleteRemoteAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param fileId - The B2 file version ID to delete.\n * @param doDelete - Callback that performs the deletion.\n */\n constructor(\n readonly relativePath: string,\n readonly fileId: string,\n private readonly doDelete: (\n fileId: string,\n fileName: string,\n signal?: AbortSignal,\n ) => Promise<void>,\n ) {}\n\n /**\n * Deletes the remote file version (unless dryRun) and returns a 'delete-remote' event.\n * @param dryRun - Whether to simulate the action without making changes.\n * @param signal - Optional abort signal for canceling the delete request.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doDelete(this.fileId, this.relativePath, signal)\n }\n return { type: 'delete-remote', path: this.relativePath, size: 0 }\n }\n}\n\n/** Deletes a file from the local filesystem. */\nexport class DeleteLocalAction implements SyncAction {\n readonly type = 'delete-local' as const\n readonly size = 0\n\n /**\n * Creates a new DeleteLocalAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param absolutePath - Absolute local filesystem path.\n * @param doDelete - Callback that performs the deletion.\n */\n constructor(\n readonly relativePath: string,\n readonly absolutePath: string,\n private readonly doDelete: (absolutePath: string, signal?: AbortSignal) => Promise<void>,\n ) {}\n\n /**\n * Deletes the local file (unless dryRun) and returns a 'delete-local' event.\n * @param dryRun - Whether to simulate the action without making changes.\n * @param signal - Optional abort signal checked before deleting.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(dryRun: boolean, signal?: AbortSignal): Promise<SyncEvent> {\n if (!dryRun) {\n await this.doDelete(this.absolutePath, signal)\n }\n return { type: 'delete-local', path: this.relativePath, size: 0 }\n }\n}\n\n/** Represents a no-op action for files that do not need syncing. */\nexport class SkipAction implements SyncAction {\n readonly type = 'skip' as const\n readonly size = 0\n\n /**\n * Creates a new SkipAction for the given relative path.\n * @param relativePath - Path relative to the sync root.\n * @param reason - Human-readable explanation for why the file was skipped.\n */\n constructor(\n readonly relativePath: string,\n readonly reason: string,\n ) {}\n\n /**\n * Returns a 'skip' event with the reason message. No I/O is performed.\n * @param _dryRun - Whether to simulate the action (unused for no-op).\n * @param _signal - Unused abort signal accepted for the shared action interface.\n *\n * @returns A promise resolving to the sync event produced by the action.\n */\n async execute(_dryRun: boolean, _signal?: AbortSignal): Promise<SyncEvent> {\n return { type: 'skip', path: this.relativePath, size: 0, message: this.reason }\n }\n}\n"],"mappings":";;AA6BA,IAAa,eAAb,MAAgD;CAWnC;CACA;CACA;CACQ;CAbnB,OAAgB;;;;;;;;CAShB,YACE,cACA,cACA,MACA,UAKA;EARS,KAAA,eAAA;EACA,KAAA,eAAA;EACA,KAAA,OAAA;EACQ,KAAA,WAAA;CAKhB;;;;;;;;CASH,MAAM,QAAQ,QAAiB,QAA0C;EACvE,IAAI,CAAC,QACH,MAAM,KAAK,SAAS,KAAK,cAAc,KAAK,cAAc,MAAM;EAElE,OAAO;GAAE,MAAM;GAAe,MAAM,KAAK;GAAc,MAAM,KAAK;EAAK;CACzE;AACF;;AAGA,IAAa,iBAAb,MAAkD;CAUrC;CACA;CACQ;CAXnB,OAAgB;;;;;;;CAQhB,YACE,cACA,MACA,YACA;EAHS,KAAA,eAAA;EACA,KAAA,OAAA;EACQ,KAAA,aAAA;CAChB;;;;;;;;CASH,MAAM,QAAQ,QAAiB,QAA0C;EACvE,IAAI,CAAC,QACH,MAAM,KAAK,WAAW,KAAK,cAAc,MAAM;EAEjD,OAAO;GAAE,MAAM;GAAiB,MAAM,KAAK;GAAc,MAAM,KAAK;EAAK;CAC3E;AACF;;AAGA,IAAa,aAAb,MAA8C;CAUjC;CACA;CACQ;CAXnB,OAAgB;;;;;;;CAQhB,YACE,cACA,MACA,QACA;EAHS,KAAA,eAAA;EACA,KAAA,OAAA;EACQ,KAAA,SAAA;CAChB;;;;;;;;CASH,MAAM,QAAQ,QAAiB,QAA0C;EACvE,IAAI,CAAC,QACH,MAAM,KAAK,OAAO,KAAK,cAAc,MAAM;EAE7C,OAAO;GAAE,MAAM;GAAa,MAAM,KAAK;GAAc,MAAM,KAAK;EAAK;CACvE;AACF;;AAGA,IAAa,aAAb,MAA8C;CAUjC;CACQ;CAVnB,OAAgB;CAChB,OAAgB;;;;;;CAOhB,YACE,cACA,QACA;EAFS,KAAA,eAAA;EACQ,KAAA,SAAA;CAChB;;;;;;;;CASH,MAAM,QAAQ,QAAiB,QAA0C;EACvE,IAAI,CAAC,QACH,MAAM,KAAK,OAAO,KAAK,cAAc,MAAM;EAE7C,OAAO;GAAE,MAAM;GAAQ,MAAM,KAAK;GAAc,MAAM;EAAE;CAC1D;AACF;;AAGA,IAAa,qBAAb,MAAsD;CAWzC;CACA;CACQ;CAZnB,OAAgB;CAChB,OAAgB;;;;;;;CAQhB,YACE,cACA,QACA,UAKA;EAPS,KAAA,eAAA;EACA,KAAA,SAAA;EACQ,KAAA,WAAA;CAKhB;;;;;;;;CASH,MAAM,QAAQ,QAAiB,QAA0C;EACvE,IAAI,CAAC,QACH,MAAM,KAAK,SAAS,KAAK,QAAQ,KAAK,cAAc,MAAM;EAE5D,OAAO;GAAE,MAAM;GAAiB,MAAM,KAAK;GAAc,MAAM;EAAE;CACnE;AACF;;AAGA,IAAa,oBAAb,MAAqD;CAWxC;CACA;CACQ;CAZnB,OAAgB;CAChB,OAAgB;;;;;;;CAQhB,YACE,cACA,cACA,UACA;EAHS,KAAA,eAAA;EACA,KAAA,eAAA;EACQ,KAAA,WAAA;CAChB;;;;;;;;CASH,MAAM,QAAQ,QAAiB,QAA0C;EACvE,IAAI,CAAC,QACH,MAAM,KAAK,SAAS,KAAK,cAAc,MAAM;EAE/C,OAAO;GAAE,MAAM;GAAgB,MAAM,KAAK;GAAc,MAAM;EAAE;CAClE;AACF;;AAGA,IAAa,aAAb,MAA8C;CAUjC;CACA;CAVX,OAAgB;CAChB,OAAgB;;;;;;CAOhB,YACE,cACA,QACA;EAFS,KAAA,eAAA;EACA,KAAA,SAAA;CACR;;;;;;;;CASH,MAAM,QAAQ,SAAkB,SAA2C;EACzE,OAAO;GAAE,MAAM;GAAQ,MAAM,KAAK;GAAc,MAAM;GAAG,SAAS,KAAK;EAAO;CAChF;AACF"}
|