@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.
Files changed (701) hide show
  1. package/CHANGELOG.md +110 -5
  2. package/README.md +144 -33
  3. package/dist/_virtual/_b2-sdk-version-json.cjs +4 -0
  4. package/dist/_virtual/_b2-sdk-version-json.js +4 -0
  5. package/dist/auth/account-info.d.cts +32 -0
  6. package/dist/auth/account-info.d.cts.map +1 -1
  7. package/dist/auth/account-info.d.ts +32 -0
  8. package/dist/auth/account-info.d.ts.map +1 -1
  9. package/dist/auth/file.cjs +408 -207
  10. package/dist/auth/file.cjs.map +1 -1
  11. package/dist/auth/file.d.cts +77 -3
  12. package/dist/auth/file.d.cts.map +1 -1
  13. package/dist/auth/file.d.ts +77 -3
  14. package/dist/auth/file.d.ts.map +1 -1
  15. package/dist/auth/file.js +407 -207
  16. package/dist/auth/file.js.map +1 -1
  17. package/dist/auth/in-memory.cjs +212 -183
  18. package/dist/auth/in-memory.cjs.map +1 -1
  19. package/dist/auth/in-memory.d.cts +8 -0
  20. package/dist/auth/in-memory.d.cts.map +1 -1
  21. package/dist/auth/in-memory.d.ts +8 -0
  22. package/dist/auth/in-memory.d.ts.map +1 -1
  23. package/dist/auth/in-memory.js +211 -182
  24. package/dist/auth/in-memory.js.map +1 -1
  25. package/dist/auth/index.cjs +7 -9
  26. package/dist/auth/index.d.cts +3 -2
  27. package/dist/auth/index.d.cts.map +1 -1
  28. package/dist/auth/index.d.ts +3 -2
  29. package/dist/auth/index.d.ts.map +1 -1
  30. package/dist/auth/index.js +2 -8
  31. package/dist/auth/realms.cjs +80 -7
  32. package/dist/auth/realms.cjs.map +1 -1
  33. package/dist/auth/realms.d.cts +27 -4
  34. package/dist/auth/realms.d.cts.map +1 -1
  35. package/dist/auth/realms.d.ts +27 -4
  36. package/dist/auth/realms.d.ts.map +1 -1
  37. package/dist/auth/realms.js +80 -9
  38. package/dist/auth/realms.js.map +1 -1
  39. package/dist/auth/upload-url-pool.cjs +55 -51
  40. package/dist/auth/upload-url-pool.cjs.map +1 -1
  41. package/dist/auth/upload-url-pool.js +55 -51
  42. package/dist/auth/upload-url-pool.js.map +1 -1
  43. package/dist/bucket.cjs +785 -787
  44. package/dist/bucket.cjs.map +1 -1
  45. package/dist/bucket.d.cts +35 -47
  46. package/dist/bucket.d.cts.map +1 -1
  47. package/dist/bucket.d.ts +35 -47
  48. package/dist/bucket.d.ts.map +1 -1
  49. package/dist/bucket.js +780 -782
  50. package/dist/bucket.js.map +1 -1
  51. package/dist/client.cjs +246 -228
  52. package/dist/client.cjs.map +1 -1
  53. package/dist/client.d.cts +25 -17
  54. package/dist/client.d.cts.map +1 -1
  55. package/dist/client.d.ts +25 -17
  56. package/dist/client.d.ts.map +1 -1
  57. package/dist/client.js +243 -225
  58. package/dist/client.js.map +1 -1
  59. package/dist/copy/large.cjs +114 -71
  60. package/dist/copy/large.cjs.map +1 -1
  61. package/dist/copy/large.d.cts +6 -0
  62. package/dist/copy/large.d.cts.map +1 -1
  63. package/dist/copy/large.d.ts +6 -0
  64. package/dist/copy/large.d.ts.map +1 -1
  65. package/dist/copy/large.js +112 -69
  66. package/dist/copy/large.js.map +1 -1
  67. package/dist/download/checksum.cjs +89 -0
  68. package/dist/download/checksum.cjs.map +1 -0
  69. package/dist/download/checksum.d.cts +40 -0
  70. package/dist/download/checksum.d.cts.map +1 -0
  71. package/dist/download/checksum.d.ts +40 -0
  72. package/dist/download/checksum.d.ts.map +1 -0
  73. package/dist/download/checksum.js +87 -0
  74. package/dist/download/checksum.js.map +1 -0
  75. package/dist/download/parallel.cjs +214 -118
  76. package/dist/download/parallel.cjs.map +1 -1
  77. package/dist/download/parallel.d.cts +5 -1
  78. package/dist/download/parallel.d.cts.map +1 -1
  79. package/dist/download/parallel.d.ts +5 -1
  80. package/dist/download/parallel.d.ts.map +1 -1
  81. package/dist/download/parallel.js +212 -116
  82. package/dist/download/parallel.js.map +1 -1
  83. package/dist/download/single.cjs +188 -97
  84. package/dist/download/single.cjs.map +1 -1
  85. package/dist/download/single.d.cts +6 -1
  86. package/dist/download/single.d.cts.map +1 -1
  87. package/dist/download/single.d.ts +6 -1
  88. package/dist/download/single.d.ts.map +1 -1
  89. package/dist/download/single.js +186 -98
  90. package/dist/download/single.js.map +1 -1
  91. package/dist/errors/index.cjs +699 -243
  92. package/dist/errors/index.cjs.map +1 -1
  93. package/dist/errors/index.d.cts +285 -82
  94. package/dist/errors/index.d.cts.map +1 -1
  95. package/dist/errors/index.d.ts +285 -82
  96. package/dist/errors/index.d.ts.map +1 -1
  97. package/dist/errors/index.js +678 -261
  98. package/dist/errors/index.js.map +1 -1
  99. package/dist/http/retry.cjs +45 -28
  100. package/dist/http/retry.cjs.map +1 -1
  101. package/dist/http/retry.d.cts +15 -2
  102. package/dist/http/retry.d.cts.map +1 -1
  103. package/dist/http/retry.d.ts +15 -2
  104. package/dist/http/retry.d.ts.map +1 -1
  105. package/dist/http/retry.js +46 -31
  106. package/dist/http/retry.js.map +1 -1
  107. package/dist/http/transport.cjs +438 -140
  108. package/dist/http/transport.cjs.map +1 -1
  109. package/dist/http/transport.d.cts +21 -2
  110. package/dist/http/transport.d.cts.map +1 -1
  111. package/dist/http/transport.d.ts +21 -2
  112. package/dist/http/transport.d.ts.map +1 -1
  113. package/dist/http/transport.js +437 -140
  114. package/dist/http/transport.js.map +1 -1
  115. package/dist/http/url-guard.cjs +154 -89
  116. package/dist/http/url-guard.cjs.map +1 -1
  117. package/dist/http/url-guard.d.cts +25 -3
  118. package/dist/http/url-guard.d.cts.map +1 -1
  119. package/dist/http/url-guard.d.ts +25 -3
  120. package/dist/http/url-guard.d.ts.map +1 -1
  121. package/dist/http/url-guard.js +152 -90
  122. package/dist/http/url-guard.js.map +1 -1
  123. package/dist/http/user-agent.cjs +84 -44
  124. package/dist/http/user-agent.cjs.map +1 -1
  125. package/dist/http/user-agent.js +84 -46
  126. package/dist/http/user-agent.js.map +1 -1
  127. package/dist/index.cjs +101 -77
  128. package/dist/index.d.cts +27 -21
  129. package/dist/index.d.cts.map +1 -1
  130. package/dist/index.d.ts +27 -21
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +15 -71
  133. package/dist/internal/b2-naming.cjs +66 -0
  134. package/dist/internal/b2-naming.cjs.map +1 -0
  135. package/dist/internal/b2-naming.d.cts +43 -0
  136. package/dist/internal/b2-naming.d.cts.map +1 -0
  137. package/dist/internal/b2-naming.d.ts +43 -0
  138. package/dist/internal/b2-naming.d.ts.map +1 -0
  139. package/dist/internal/b2-naming.js +60 -0
  140. package/dist/internal/b2-naming.js.map +1 -0
  141. package/dist/internal/upload-retry-options.cjs +21 -0
  142. package/dist/internal/upload-retry-options.cjs.map +1 -0
  143. package/dist/internal/upload-retry-options.d.cts +12 -0
  144. package/dist/internal/upload-retry-options.d.cts.map +1 -0
  145. package/dist/internal/upload-retry-options.d.ts +12 -0
  146. package/dist/internal/upload-retry-options.d.ts.map +1 -0
  147. package/dist/internal/upload-retry-options.js +21 -0
  148. package/dist/internal/upload-retry-options.js.map +1 -0
  149. package/dist/internal/url-redaction.cjs +31 -0
  150. package/dist/internal/url-redaction.cjs.map +1 -0
  151. package/dist/internal/url-redaction.d.cts +17 -0
  152. package/dist/internal/url-redaction.d.cts.map +1 -0
  153. package/dist/internal/url-redaction.d.ts +17 -0
  154. package/dist/internal/url-redaction.d.ts.map +1 -0
  155. package/dist/internal/url-redaction.js +31 -0
  156. package/dist/internal/url-redaction.js.map +1 -0
  157. package/dist/notifications/index.cjs +4 -6
  158. package/dist/notifications/index.d.cts +1 -1
  159. package/dist/notifications/index.d.cts.map +1 -1
  160. package/dist/notifications/index.d.ts +1 -1
  161. package/dist/notifications/index.d.ts.map +1 -1
  162. package/dist/notifications/index.js +1 -6
  163. package/dist/notifications/webhook.cjs +195 -85
  164. package/dist/notifications/webhook.cjs.map +1 -1
  165. package/dist/notifications/webhook.d.cts.map +1 -1
  166. package/dist/notifications/webhook.d.ts.map +1 -1
  167. package/dist/notifications/webhook.js +195 -87
  168. package/dist/notifications/webhook.js.map +1 -1
  169. package/dist/object.cjs +253 -210
  170. package/dist/object.cjs.map +1 -1
  171. package/dist/object.d.cts +9 -55
  172. package/dist/object.d.cts.map +1 -1
  173. package/dist/object.d.ts +9 -55
  174. package/dist/object.d.ts.map +1 -1
  175. package/dist/object.js +249 -206
  176. package/dist/object.js.map +1 -1
  177. package/dist/raw/encoding.cjs +74 -35
  178. package/dist/raw/encoding.cjs.map +1 -1
  179. package/dist/raw/encoding.js +74 -38
  180. package/dist/raw/encoding.js.map +1 -1
  181. package/dist/raw/index.cjs +678 -587
  182. package/dist/raw/index.cjs.map +1 -1
  183. package/dist/raw/index.d.cts +121 -18
  184. package/dist/raw/index.d.cts.map +1 -1
  185. package/dist/raw/index.d.ts +121 -18
  186. package/dist/raw/index.d.ts.map +1 -1
  187. package/dist/raw/index.js +674 -589
  188. package/dist/raw/index.js.map +1 -1
  189. package/dist/s3/index.cjs +355 -18
  190. package/dist/s3/index.cjs.map +1 -1
  191. package/dist/s3/index.d.cts +233 -5
  192. package/dist/s3/index.d.cts.map +1 -1
  193. package/dist/s3/index.d.ts +233 -5
  194. package/dist/s3/index.d.ts.map +1 -1
  195. package/dist/s3/index.js +351 -22
  196. package/dist/s3/index.js.map +1 -1
  197. package/dist/s3/sigv4.cjs +149 -0
  198. package/dist/s3/sigv4.cjs.map +1 -0
  199. package/dist/s3/sigv4.d.cts +43 -0
  200. package/dist/s3/sigv4.d.cts.map +1 -0
  201. package/dist/s3/sigv4.d.ts +43 -0
  202. package/dist/s3/sigv4.d.ts.map +1 -0
  203. package/dist/s3/sigv4.js +148 -0
  204. package/dist/s3/sigv4.js.map +1 -0
  205. package/dist/s3/validation.cjs +69 -0
  206. package/dist/s3/validation.cjs.map +1 -0
  207. package/dist/s3/validation.d.cts +43 -0
  208. package/dist/s3/validation.d.cts.map +1 -0
  209. package/dist/s3/validation.d.ts +43 -0
  210. package/dist/s3/validation.d.ts.map +1 -0
  211. package/dist/s3/validation.js +66 -0
  212. package/dist/s3/validation.js.map +1 -0
  213. package/dist/simulator/capabilities.cjs +63 -48
  214. package/dist/simulator/capabilities.cjs.map +1 -1
  215. package/dist/simulator/capabilities.js +63 -49
  216. package/dist/simulator/capabilities.js.map +1 -1
  217. package/dist/simulator/index.cjs +2124 -1548
  218. package/dist/simulator/index.cjs.map +1 -1
  219. package/dist/simulator/index.d.cts +79 -11
  220. package/dist/simulator/index.d.cts.map +1 -1
  221. package/dist/simulator/index.d.ts +79 -11
  222. package/dist/simulator/index.d.ts.map +1 -1
  223. package/dist/simulator/index.js +2112 -1546
  224. package/dist/simulator/index.js.map +1 -1
  225. package/dist/simulator/validation.cjs +191 -153
  226. package/dist/simulator/validation.cjs.map +1 -1
  227. package/dist/simulator/validation.d.cts +3 -21
  228. package/dist/simulator/validation.d.cts.map +1 -1
  229. package/dist/simulator/validation.d.ts +3 -21
  230. package/dist/simulator/validation.d.ts.map +1 -1
  231. package/dist/simulator/validation.js +188 -162
  232. package/dist/simulator/validation.js.map +1 -1
  233. package/dist/streams/collect.cjs +74 -24
  234. package/dist/streams/collect.cjs.map +1 -1
  235. package/dist/streams/collect.d.cts +14 -1
  236. package/dist/streams/collect.d.cts.map +1 -1
  237. package/dist/streams/collect.d.ts +14 -1
  238. package/dist/streams/collect.d.ts.map +1 -1
  239. package/dist/streams/collect.js +74 -25
  240. package/dist/streams/collect.js.map +1 -1
  241. package/dist/streams/file-source.cjs +287 -0
  242. package/dist/streams/file-source.cjs.map +1 -0
  243. package/dist/streams/file-source.d.cts +96 -0
  244. package/dist/streams/file-source.d.cts.map +1 -0
  245. package/dist/streams/file-source.d.ts +96 -0
  246. package/dist/streams/file-source.d.ts.map +1 -0
  247. package/dist/streams/file-source.js +286 -0
  248. package/dist/streams/file-source.js.map +1 -0
  249. package/dist/streams/hash.cjs +207 -115
  250. package/dist/streams/hash.cjs.map +1 -1
  251. package/dist/streams/hash.d.cts +5 -4
  252. package/dist/streams/hash.d.cts.map +1 -1
  253. package/dist/streams/hash.d.ts +5 -4
  254. package/dist/streams/hash.d.ts.map +1 -1
  255. package/dist/streams/hash.js +208 -95
  256. package/dist/streams/hash.js.map +1 -1
  257. package/dist/streams/index.cjs +12 -12
  258. package/dist/streams/index.d.cts +3 -3
  259. package/dist/streams/index.d.cts.map +1 -1
  260. package/dist/streams/index.d.ts +3 -3
  261. package/dist/streams/index.d.ts.map +1 -1
  262. package/dist/streams/index.js +2 -10
  263. package/dist/streams/progress.cjs +60 -46
  264. package/dist/streams/progress.cjs.map +1 -1
  265. package/dist/streams/progress.js +60 -46
  266. package/dist/streams/progress.js.map +1 -1
  267. package/dist/streams/source.cjs +316 -146
  268. package/dist/streams/source.cjs.map +1 -1
  269. package/dist/streams/source.d.cts +56 -18
  270. package/dist/streams/source.d.cts.map +1 -1
  271. package/dist/streams/source.d.ts +56 -18
  272. package/dist/streams/source.d.ts.map +1 -1
  273. package/dist/streams/source.js +312 -149
  274. package/dist/streams/source.js.map +1 -1
  275. package/dist/sync/actions/index.cjs +236 -184
  276. package/dist/sync/actions/index.cjs.map +1 -1
  277. package/dist/sync/actions/index.d.cts +29 -21
  278. package/dist/sync/actions/index.d.cts.map +1 -1
  279. package/dist/sync/actions/index.d.ts +29 -21
  280. package/dist/sync/actions/index.d.ts.map +1 -1
  281. package/dist/sync/actions/index.js +236 -190
  282. package/dist/sync/actions/index.js.map +1 -1
  283. package/dist/sync/b2-sha1-reader.cjs +148 -0
  284. package/dist/sync/b2-sha1-reader.cjs.map +1 -0
  285. package/dist/sync/b2-sha1-reader.d.cts +58 -0
  286. package/dist/sync/b2-sha1-reader.d.cts.map +1 -0
  287. package/dist/sync/b2-sha1-reader.d.ts +58 -0
  288. package/dist/sync/b2-sha1-reader.d.ts.map +1 -0
  289. package/dist/sync/b2-sha1-reader.js +145 -0
  290. package/dist/sync/b2-sha1-reader.js.map +1 -0
  291. package/dist/sync/download-staging.cjs +265 -0
  292. package/dist/sync/download-staging.cjs.map +1 -0
  293. package/dist/sync/download-staging.d.cts +54 -0
  294. package/dist/sync/download-staging.d.cts.map +1 -0
  295. package/dist/sync/download-staging.d.ts +54 -0
  296. package/dist/sync/download-staging.d.ts.map +1 -0
  297. package/dist/sync/download-staging.js +259 -0
  298. package/dist/sync/download-staging.js.map +1 -0
  299. package/dist/sync/filesystem-errors.cjs +32 -0
  300. package/dist/sync/filesystem-errors.cjs.map +1 -0
  301. package/dist/sync/filesystem-errors.d.cts +8 -0
  302. package/dist/sync/filesystem-errors.d.cts.map +1 -0
  303. package/dist/sync/filesystem-errors.d.ts +8 -0
  304. package/dist/sync/filesystem-errors.d.ts.map +1 -0
  305. package/dist/sync/filesystem-errors.js +32 -0
  306. package/dist/sync/filesystem-errors.js.map +1 -0
  307. package/dist/sync/filters.cjs +217 -0
  308. package/dist/sync/filters.cjs.map +1 -0
  309. package/dist/sync/filters.d.cts +51 -0
  310. package/dist/sync/filters.d.cts.map +1 -0
  311. package/dist/sync/filters.d.ts +51 -0
  312. package/dist/sync/filters.d.ts.map +1 -0
  313. package/dist/sync/filters.js +213 -0
  314. package/dist/sync/filters.js.map +1 -0
  315. package/dist/sync/index.cjs +39 -22
  316. package/dist/sync/index.d.cts +14 -9
  317. package/dist/sync/index.d.cts.map +1 -1
  318. package/dist/sync/index.d.ts +14 -9
  319. package/dist/sync/index.d.ts.map +1 -1
  320. package/dist/sync/index.js +9 -20
  321. package/dist/sync/local-file-identity.cjs +61 -0
  322. package/dist/sync/local-file-identity.cjs.map +1 -0
  323. package/dist/sync/local-file-identity.d.cts +37 -0
  324. package/dist/sync/local-file-identity.d.cts.map +1 -0
  325. package/dist/sync/local-file-identity.d.ts +37 -0
  326. package/dist/sync/local-file-identity.d.ts.map +1 -0
  327. package/dist/sync/local-file-identity.js +60 -0
  328. package/dist/sync/local-file-identity.js.map +1 -0
  329. package/dist/sync/local-file-io.cjs +364 -0
  330. package/dist/sync/local-file-io.cjs.map +1 -0
  331. package/dist/sync/local-file-io.d.cts +75 -0
  332. package/dist/sync/local-file-io.d.cts.map +1 -0
  333. package/dist/sync/local-file-io.d.ts +75 -0
  334. package/dist/sync/local-file-io.d.ts.map +1 -0
  335. package/dist/sync/local-file-io.js +360 -0
  336. package/dist/sync/local-file-io.js.map +1 -0
  337. package/dist/sync/local-filesystem-root.cjs +27 -0
  338. package/dist/sync/local-filesystem-root.cjs.map +1 -0
  339. package/dist/sync/local-filesystem-root.d.cts +18 -0
  340. package/dist/sync/local-filesystem-root.d.cts.map +1 -0
  341. package/dist/sync/local-filesystem-root.d.ts +18 -0
  342. package/dist/sync/local-filesystem-root.d.ts.map +1 -0
  343. package/dist/sync/local-filesystem-root.js +26 -0
  344. package/dist/sync/local-filesystem-root.js.map +1 -0
  345. package/dist/sync/local-sha1.cjs +119 -0
  346. package/dist/sync/local-sha1.cjs.map +1 -0
  347. package/dist/sync/local-sha1.d.cts +39 -0
  348. package/dist/sync/local-sha1.d.cts.map +1 -0
  349. package/dist/sync/local-sha1.d.ts +39 -0
  350. package/dist/sync/local-sha1.d.ts.map +1 -0
  351. package/dist/sync/local-sha1.js +117 -0
  352. package/dist/sync/local-sha1.js.map +1 -0
  353. package/dist/sync/pairing.cjs +118 -29
  354. package/dist/sync/pairing.cjs.map +1 -1
  355. package/dist/sync/pairing.d.cts +7 -2
  356. package/dist/sync/pairing.d.cts.map +1 -1
  357. package/dist/sync/pairing.d.ts +7 -2
  358. package/dist/sync/pairing.d.ts.map +1 -1
  359. package/dist/sync/pairing.js +120 -31
  360. package/dist/sync/pairing.js.map +1 -1
  361. package/dist/sync/path-order.cjs +30 -0
  362. package/dist/sync/path-order.cjs.map +1 -0
  363. package/dist/sync/path-order.d.cts +28 -0
  364. package/dist/sync/path-order.d.cts.map +1 -0
  365. package/dist/sync/path-order.d.ts +28 -0
  366. package/dist/sync/path-order.d.ts.map +1 -0
  367. package/dist/sync/path-order.js +29 -0
  368. package/dist/sync/path-order.js.map +1 -0
  369. package/dist/sync/path-safety.cjs +111 -0
  370. package/dist/sync/path-safety.cjs.map +1 -0
  371. package/dist/sync/path-safety.d.cts +78 -0
  372. package/dist/sync/path-safety.d.cts.map +1 -0
  373. package/dist/sync/path-safety.d.ts +78 -0
  374. package/dist/sync/path-safety.d.ts.map +1 -0
  375. package/dist/sync/path-safety.js +105 -0
  376. package/dist/sync/path-safety.js.map +1 -0
  377. package/dist/sync/paths.d.cts +19 -0
  378. package/dist/sync/paths.d.cts.map +1 -0
  379. package/dist/sync/paths.d.ts +19 -0
  380. package/dist/sync/paths.d.ts.map +1 -0
  381. package/dist/sync/policies/compare.cjs +389 -11
  382. package/dist/sync/policies/compare.cjs.map +1 -1
  383. package/dist/sync/policies/compare.d.cts +100 -2
  384. package/dist/sync/policies/compare.d.cts.map +1 -1
  385. package/dist/sync/policies/compare.d.ts +100 -2
  386. package/dist/sync/policies/compare.d.ts.map +1 -1
  387. package/dist/sync/policies/compare.js +387 -13
  388. package/dist/sync/policies/compare.js.map +1 -1
  389. package/dist/sync/policies/index.cjs +76 -65
  390. package/dist/sync/policies/index.cjs.map +1 -1
  391. package/dist/sync/policies/index.d.cts +35 -6
  392. package/dist/sync/policies/index.d.cts.map +1 -1
  393. package/dist/sync/policies/index.d.ts +35 -6
  394. package/dist/sync/policies/index.d.ts.map +1 -1
  395. package/dist/sync/policies/index.js +76 -65
  396. package/dist/sync/policies/index.js.map +1 -1
  397. package/dist/sync/prefix.cjs +96 -0
  398. package/dist/sync/prefix.cjs.map +1 -0
  399. package/dist/sync/prefix.d.cts +55 -0
  400. package/dist/sync/prefix.d.cts.map +1 -0
  401. package/dist/sync/prefix.d.ts +55 -0
  402. package/dist/sync/prefix.d.ts.map +1 -0
  403. package/dist/sync/prefix.js +92 -0
  404. package/dist/sync/prefix.js.map +1 -0
  405. package/dist/sync/regexp-safety.cjs +192 -0
  406. package/dist/sync/regexp-safety.cjs.map +1 -0
  407. package/dist/sync/regexp-safety.d.cts +29 -0
  408. package/dist/sync/regexp-safety.d.cts.map +1 -0
  409. package/dist/sync/regexp-safety.d.ts +29 -0
  410. package/dist/sync/regexp-safety.d.ts.map +1 -0
  411. package/dist/sync/regexp-safety.js +190 -0
  412. package/dist/sync/regexp-safety.js.map +1 -0
  413. package/dist/sync/scan-events.cjs +33 -0
  414. package/dist/sync/scan-events.cjs.map +1 -0
  415. package/dist/sync/scan-events.d.cts +17 -0
  416. package/dist/sync/scan-events.d.cts.map +1 -0
  417. package/dist/sync/scan-events.d.ts +17 -0
  418. package/dist/sync/scan-events.d.ts.map +1 -0
  419. package/dist/sync/scan-events.js +32 -0
  420. package/dist/sync/scan-events.js.map +1 -0
  421. package/dist/sync/scan-limit.cjs +33 -0
  422. package/dist/sync/scan-limit.cjs.map +1 -0
  423. package/dist/sync/scan-limit.d.cts +21 -0
  424. package/dist/sync/scan-limit.d.cts.map +1 -0
  425. package/dist/sync/scan-limit.d.ts +21 -0
  426. package/dist/sync/scan-limit.d.ts.map +1 -0
  427. package/dist/sync/scan-limit.js +31 -0
  428. package/dist/sync/scan-limit.js.map +1 -0
  429. package/dist/sync/scanners/b2.cjs +239 -55
  430. package/dist/sync/scanners/b2.cjs.map +1 -1
  431. package/dist/sync/scanners/b2.d.cts +26 -7
  432. package/dist/sync/scanners/b2.d.cts.map +1 -1
  433. package/dist/sync/scanners/b2.d.ts +26 -7
  434. package/dist/sync/scanners/b2.d.ts.map +1 -1
  435. package/dist/sync/scanners/b2.js +239 -55
  436. package/dist/sync/scanners/b2.js.map +1 -1
  437. package/dist/sync/scanners/local.cjs +215 -56
  438. package/dist/sync/scanners/local.cjs.map +1 -1
  439. package/dist/sync/scanners/local.d.cts +22 -7
  440. package/dist/sync/scanners/local.d.cts.map +1 -1
  441. package/dist/sync/scanners/local.d.ts +22 -7
  442. package/dist/sync/scanners/local.d.ts.map +1 -1
  443. package/dist/sync/scanners/local.js +216 -57
  444. package/dist/sync/scanners/local.js.map +1 -1
  445. package/dist/sync/sha1-metadata.cjs +94 -0
  446. package/dist/sync/sha1-metadata.cjs.map +1 -0
  447. package/dist/sync/sha1-metadata.d.cts +82 -0
  448. package/dist/sync/sha1-metadata.d.cts.map +1 -0
  449. package/dist/sync/sha1-metadata.d.ts +82 -0
  450. package/dist/sync/sha1-metadata.d.ts.map +1 -0
  451. package/dist/sync/sha1-metadata.js +89 -0
  452. package/dist/sync/sha1-metadata.js.map +1 -0
  453. package/dist/sync/sha1-options.cjs +23 -0
  454. package/dist/sync/sha1-options.cjs.map +1 -0
  455. package/dist/sync/sha1-options.d.cts +14 -0
  456. package/dist/sync/sha1-options.d.cts.map +1 -0
  457. package/dist/sync/sha1-options.d.ts +14 -0
  458. package/dist/sync/sha1-options.d.ts.map +1 -0
  459. package/dist/sync/sha1-options.js +21 -0
  460. package/dist/sync/sha1-options.js.map +1 -0
  461. package/dist/sync/synchronizer.cjs +782 -197
  462. package/dist/sync/synchronizer.cjs.map +1 -1
  463. package/dist/sync/synchronizer.d.cts +47 -1
  464. package/dist/sync/synchronizer.d.cts.map +1 -1
  465. package/dist/sync/synchronizer.d.ts +47 -1
  466. package/dist/sync/synchronizer.d.ts.map +1 -1
  467. package/dist/sync/synchronizer.js +779 -173
  468. package/dist/sync/synchronizer.js.map +1 -1
  469. package/dist/sync/types.d.cts +208 -16
  470. package/dist/sync/types.d.cts.map +1 -1
  471. package/dist/sync/types.d.ts +208 -16
  472. package/dist/sync/types.d.ts.map +1 -1
  473. package/dist/types/auth.cjs +76 -56
  474. package/dist/types/auth.cjs.map +1 -1
  475. package/dist/types/auth.d.cts +67 -9
  476. package/dist/types/auth.d.cts.map +1 -1
  477. package/dist/types/auth.d.ts +67 -9
  478. package/dist/types/auth.d.ts.map +1 -1
  479. package/dist/types/auth.js +77 -57
  480. package/dist/types/auth.js.map +1 -1
  481. package/dist/types/bucket.cjs +74 -38
  482. package/dist/types/bucket.cjs.map +1 -1
  483. package/dist/types/bucket.js +75 -41
  484. package/dist/types/bucket.js.map +1 -1
  485. package/dist/types/encryption.cjs +364 -327
  486. package/dist/types/encryption.cjs.map +1 -1
  487. package/dist/types/encryption.d.cts +16 -0
  488. package/dist/types/encryption.d.cts.map +1 -1
  489. package/dist/types/encryption.d.ts +16 -0
  490. package/dist/types/encryption.d.ts.map +1 -1
  491. package/dist/types/encryption.js +364 -310
  492. package/dist/types/encryption.js.map +1 -1
  493. package/dist/types/errors.cjs +47 -0
  494. package/dist/types/errors.cjs.map +1 -0
  495. package/dist/types/errors.d.cts +13 -4
  496. package/dist/types/errors.d.cts.map +1 -1
  497. package/dist/types/errors.d.ts +13 -4
  498. package/dist/types/errors.d.ts.map +1 -1
  499. package/dist/types/errors.js +47 -0
  500. package/dist/types/errors.js.map +1 -0
  501. package/dist/types/file.cjs +36 -19
  502. package/dist/types/file.cjs.map +1 -1
  503. package/dist/types/file.d.cts +2 -2
  504. package/dist/types/file.d.cts.map +1 -1
  505. package/dist/types/file.d.ts +2 -2
  506. package/dist/types/file.d.ts.map +1 -1
  507. package/dist/types/file.js +37 -21
  508. package/dist/types/file.js.map +1 -1
  509. package/dist/types/ids.cjs +53 -9
  510. package/dist/types/ids.cjs.map +1 -1
  511. package/dist/types/ids.js +54 -15
  512. package/dist/types/ids.js.map +1 -1
  513. package/dist/types/index.d.cts +12 -11
  514. package/dist/types/index.d.cts.map +1 -1
  515. package/dist/types/index.d.ts +12 -11
  516. package/dist/types/index.d.ts.map +1 -1
  517. package/dist/types/key.d.cts +44 -8
  518. package/dist/types/key.d.cts.map +1 -1
  519. package/dist/types/key.d.ts +44 -8
  520. package/dist/types/key.d.ts.map +1 -1
  521. package/dist/types/lock.cjs +33 -13
  522. package/dist/types/lock.cjs.map +1 -1
  523. package/dist/types/lock.js +34 -15
  524. package/dist/types/lock.js.map +1 -1
  525. package/dist/types/notifications.cjs +44 -22
  526. package/dist/types/notifications.cjs.map +1 -1
  527. package/dist/types/notifications.js +45 -23
  528. package/dist/types/notifications.js.map +1 -1
  529. package/dist/types/upload.d.cts +39 -5
  530. package/dist/types/upload.d.cts.map +1 -1
  531. package/dist/types/upload.d.ts +39 -5
  532. package/dist/types/upload.d.ts.map +1 -1
  533. package/dist/upload/abort-scope.cjs +91 -0
  534. package/dist/upload/abort-scope.cjs.map +1 -0
  535. package/dist/upload/abort-scope.d.cts +48 -0
  536. package/dist/upload/abort-scope.d.cts.map +1 -0
  537. package/dist/upload/abort-scope.d.ts +48 -0
  538. package/dist/upload/abort-scope.d.ts.map +1 -0
  539. package/dist/upload/abort-scope.js +88 -0
  540. package/dist/upload/abort-scope.js.map +1 -0
  541. package/dist/upload/cancel.cjs +183 -8
  542. package/dist/upload/cancel.cjs.map +1 -1
  543. package/dist/upload/cancel.d.cts +110 -2
  544. package/dist/upload/cancel.d.cts.map +1 -1
  545. package/dist/upload/cancel.d.ts +110 -2
  546. package/dist/upload/cancel.d.ts.map +1 -1
  547. package/dist/upload/cancel.js +178 -9
  548. package/dist/upload/cancel.js.map +1 -1
  549. package/dist/upload/concurrency.cjs +79 -52
  550. package/dist/upload/concurrency.cjs.map +1 -1
  551. package/dist/upload/concurrency.js +79 -53
  552. package/dist/upload/concurrency.js.map +1 -1
  553. package/dist/upload/finish.cjs +59 -0
  554. package/dist/upload/finish.cjs.map +1 -0
  555. package/dist/upload/finish.d.cts +26 -0
  556. package/dist/upload/finish.d.cts.map +1 -0
  557. package/dist/upload/finish.d.ts +26 -0
  558. package/dist/upload/finish.d.ts.map +1 -0
  559. package/dist/upload/finish.js +59 -0
  560. package/dist/upload/finish.js.map +1 -0
  561. package/dist/upload/large.cjs +301 -218
  562. package/dist/upload/large.cjs.map +1 -1
  563. package/dist/upload/large.d.cts +76 -9
  564. package/dist/upload/large.d.cts.map +1 -1
  565. package/dist/upload/large.d.ts +76 -9
  566. package/dist/upload/large.d.ts.map +1 -1
  567. package/dist/upload/large.js +301 -218
  568. package/dist/upload/large.js.map +1 -1
  569. package/dist/upload/options.cjs +28 -0
  570. package/dist/upload/options.cjs.map +1 -0
  571. package/dist/upload/options.d.cts +104 -0
  572. package/dist/upload/options.d.cts.map +1 -0
  573. package/dist/upload/options.d.ts +104 -0
  574. package/dist/upload/options.d.ts.map +1 -0
  575. package/dist/upload/options.js +27 -0
  576. package/dist/upload/options.js.map +1 -0
  577. package/dist/upload/resume.cjs +333 -33
  578. package/dist/upload/resume.cjs.map +1 -1
  579. package/dist/upload/resume.d.cts +82 -12
  580. package/dist/upload/resume.d.cts.map +1 -1
  581. package/dist/upload/resume.d.ts +82 -12
  582. package/dist/upload/resume.d.ts.map +1 -1
  583. package/dist/upload/resume.js +330 -33
  584. package/dist/upload/resume.js.map +1 -1
  585. package/dist/upload/retry.cjs +186 -0
  586. package/dist/upload/retry.cjs.map +1 -0
  587. package/dist/upload/retry.d.cts +127 -0
  588. package/dist/upload/retry.d.cts.map +1 -0
  589. package/dist/upload/retry.d.ts +127 -0
  590. package/dist/upload/retry.d.ts.map +1 -0
  591. package/dist/upload/retry.js +182 -0
  592. package/dist/upload/retry.js.map +1 -0
  593. package/dist/upload/single.cjs +68 -44
  594. package/dist/upload/single.cjs.map +1 -1
  595. package/dist/upload/single.d.cts +2 -1
  596. package/dist/upload/single.d.cts.map +1 -1
  597. package/dist/upload/single.d.ts +2 -1
  598. package/dist/upload/single.d.ts.map +1 -1
  599. package/dist/upload/single.js +68 -44
  600. package/dist/upload/single.js.map +1 -1
  601. package/dist/upload/stream.cjs +317 -193
  602. package/dist/upload/stream.cjs.map +1 -1
  603. package/dist/upload/stream.d.cts +3 -1
  604. package/dist/upload/stream.d.cts.map +1 -1
  605. package/dist/upload/stream.d.ts +3 -1
  606. package/dist/upload/stream.d.ts.map +1 -1
  607. package/dist/upload/stream.js +316 -192
  608. package/dist/upload/stream.js.map +1 -1
  609. package/dist/util/best-effort.cjs +42 -8
  610. package/dist/util/best-effort.cjs.map +1 -1
  611. package/dist/util/best-effort.d.cts +2 -1
  612. package/dist/util/best-effort.d.cts.map +1 -1
  613. package/dist/util/best-effort.d.ts +2 -1
  614. package/dist/util/best-effort.d.ts.map +1 -1
  615. package/dist/util/best-effort.js +43 -9
  616. package/dist/util/best-effort.js.map +1 -1
  617. package/dist/util/bytes.cjs +23 -0
  618. package/dist/util/bytes.cjs.map +1 -0
  619. package/dist/util/bytes.d.cts +15 -0
  620. package/dist/util/bytes.d.cts.map +1 -0
  621. package/dist/util/bytes.d.ts +15 -0
  622. package/dist/util/bytes.d.ts.map +1 -0
  623. package/dist/util/bytes.js +23 -0
  624. package/dist/util/bytes.js.map +1 -0
  625. package/dist/util/crypto.cjs +68 -0
  626. package/dist/util/crypto.cjs.map +1 -0
  627. package/dist/util/crypto.d.cts +26 -0
  628. package/dist/util/crypto.d.cts.map +1 -0
  629. package/dist/util/crypto.d.ts +26 -0
  630. package/dist/util/crypto.d.ts.map +1 -0
  631. package/dist/util/crypto.js +66 -0
  632. package/dist/util/crypto.js.map +1 -0
  633. package/dist/util/defaults.cjs +25 -9
  634. package/dist/util/defaults.cjs.map +1 -1
  635. package/dist/util/defaults.js +26 -11
  636. package/dist/util/defaults.js.map +1 -1
  637. package/dist/util/error-reason.cjs +41 -0
  638. package/dist/util/error-reason.cjs.map +1 -0
  639. package/dist/util/error-reason.d.cts +9 -0
  640. package/dist/util/error-reason.d.cts.map +1 -0
  641. package/dist/util/error-reason.d.ts +9 -0
  642. package/dist/util/error-reason.d.ts.map +1 -0
  643. package/dist/util/error-reason.js +41 -0
  644. package/dist/util/error-reason.js.map +1 -0
  645. package/dist/util/http.cjs +23 -0
  646. package/dist/util/http.cjs.map +1 -0
  647. package/dist/util/http.d.cts +13 -0
  648. package/dist/util/http.d.cts.map +1 -0
  649. package/dist/util/http.d.ts +13 -0
  650. package/dist/util/http.d.ts.map +1 -0
  651. package/dist/util/http.js +23 -0
  652. package/dist/util/http.js.map +1 -0
  653. package/dist/util/normalize.cjs +66 -7
  654. package/dist/util/normalize.cjs.map +1 -1
  655. package/dist/util/normalize.js +67 -10
  656. package/dist/util/normalize.js.map +1 -1
  657. package/dist/util/paginator.cjs +63 -14
  658. package/dist/util/paginator.cjs.map +1 -1
  659. package/dist/util/paginator.js +64 -16
  660. package/dist/util/paginator.js.map +1 -1
  661. package/dist/util/plan-ranges.cjs +47 -22
  662. package/dist/util/plan-ranges.cjs.map +1 -1
  663. package/dist/util/plan-ranges.js +48 -24
  664. package/dist/util/plan-ranges.js.map +1 -1
  665. package/dist/util/sha1.cjs +27 -0
  666. package/dist/util/sha1.cjs.map +1 -0
  667. package/dist/util/sha1.d.cts +17 -0
  668. package/dist/util/sha1.d.cts.map +1 -0
  669. package/dist/util/sha1.d.ts +17 -0
  670. package/dist/util/sha1.d.ts.map +1 -0
  671. package/dist/util/sha1.js +26 -0
  672. package/dist/util/sha1.js.map +1 -0
  673. package/dist/util/text-codec.cjs +29 -5
  674. package/dist/util/text-codec.cjs.map +1 -1
  675. package/dist/util/text-codec.js +30 -7
  676. package/dist/util/text-codec.js.map +1 -1
  677. package/dist/util/to-error.cjs +18 -4
  678. package/dist/util/to-error.cjs.map +1 -1
  679. package/dist/util/to-error.js +19 -5
  680. package/dist/util/to-error.js.map +1 -1
  681. package/dist/version.cjs +17 -5
  682. package/dist/version.cjs.map +1 -1
  683. package/dist/version.d.cts +3 -3
  684. package/dist/version.d.ts +3 -3
  685. package/dist/version.js +19 -6
  686. package/dist/version.js.map +1 -1
  687. package/package.json +19 -16
  688. package/dist/auth/index.cjs.map +0 -1
  689. package/dist/auth/index.js.map +0 -1
  690. package/dist/index.cjs.map +0 -1
  691. package/dist/index.js.map +0 -1
  692. package/dist/notifications/index.cjs.map +0 -1
  693. package/dist/notifications/index.js.map +0 -1
  694. package/dist/package.json.cjs +0 -9
  695. package/dist/package.json.cjs.map +0 -1
  696. package/dist/package.json.js +0 -9
  697. package/dist/package.json.js.map +0 -1
  698. package/dist/streams/index.cjs.map +0 -1
  699. package/dist/streams/index.js.map +0 -1
  700. package/dist/sync/index.cjs.map +0 -1
  701. package/dist/sync/index.js.map +0 -1
@@ -1,222 +1,305 @@
1
- import { IncrementalSha1 } from "../streams/hash.js";
2
- import { ProgressTracker } from "../streams/progress.js";
3
- import { DEFAULT_TRANSFER_CONCURRENCY, DEFAULT_CONTENT_TYPE } from "../util/defaults.js";
4
- import { planRanges } from "../util/plan-ranges.js";
5
- import { cancelLargeFileBestEffort } from "./cancel.js";
1
+ import { createAbortScope, raceWithAbort, throwRejectedOrAbortReason } from "./abort-scope.js";
2
+ import { ResumeFileIdMismatchError } from "../errors/index.js";
3
+ import { cancelLargeFileBestEffort, cleanupAfterLargeFileError } from "./cancel.js";
6
4
  import { Semaphore } from "./concurrency.js";
7
- import { collectPartSha1s, findResumeCandidate } from "./resume.js";
5
+ import { finishLargeFileWithAbortReconciliation } from "./finish.js";
6
+ import "../util/defaults.js";
7
+ import { planRanges } from "../util/plan-ranges.js";
8
+ import { ProgressTracker } from "../streams/progress.js";
9
+ import { IncrementalSha1 } from "../streams/hash.js";
10
+ import { readNextNonEmptyStreamChunk } from "../streams/source.js";
11
+ import { findResumeCandidate } from "./resume.js";
12
+ import { resolveRetryResponseBodyFailures, uploadPartWithFreshUrl } from "./retry.js";
13
+ //#region src/upload/large.ts
14
+ var MAX_CONSECUTIVE_EMPTY_STREAM_CHUNKS = 1024;
15
+ function createResumeCandidateCriteria(options, request, totalSize, partSize, parts) {
16
+ return {
17
+ contentType: request.contentType,
18
+ fileInfo: request.fileInfo,
19
+ sourceSize: totalSize,
20
+ partSize,
21
+ parts,
22
+ ...options.signal !== void 0 ? { signal: options.signal } : {},
23
+ ...request.serverSideEncryption !== void 0 ? { serverSideEncryption: request.serverSideEncryption } : options.bucketDefaultServerSideEncryption !== void 0 ? { serverSideEncryption: options.bucketDefaultServerSideEncryption } : {},
24
+ ...request.fileRetention !== void 0 ? { fileRetention: request.fileRetention } : options.bucketDefaultRetention !== void 0 ? { defaultFileRetention: options.bucketDefaultRetention } : options.bucketDefaultRetentionUnreadable === true ? { defaultFileRetentionUnreadable: true } : {},
25
+ ...request.legalHold !== void 0 ? { legalHold: request.legalHold } : {},
26
+ ...options.resumeDiscoveryTimeoutMs !== void 0 ? { discoveryTimeoutMs: options.resumeDiscoveryTimeoutMs } : {},
27
+ ...options.onResumeCandidateRejected !== void 0 ? { onCandidateRejected: options.onResumeCandidateRejected } : {},
28
+ ...options.resumeMaxListPages !== void 0 ? { maxListPages: options.resumeMaxListPages } : {},
29
+ ...options.resumeMaxPartCandidates !== void 0 ? { maxPartCandidates: options.resumeMaxPartCandidates } : {},
30
+ ...options.resumeMaxPartPages !== void 0 ? { maxPartPages: options.resumeMaxPartPages } : {}
31
+ };
32
+ }
33
+ /**
34
+ * Uploads a file using the B2 multipart (large file) protocol.
35
+ *
36
+ * The source is sliced into parts and uploaded concurrently via
37
+ * `b2_upload_part`. This is appropriate for files larger than the recommended
38
+ * part size. For smaller files, use {@link uploadSmallFile} which sends the
39
+ * entire payload in a single request.
40
+ *
41
+ * On failure, the in-progress large file is cancelled on a best-effort basis.
42
+ *
43
+ * @param raw - Low-level B2 API client.
44
+ * @param accountInfo - Authorized account state (tokens, URLs, upload URL pool).
45
+ * @param options - Upload parameters including part size and concurrency.
46
+ *
47
+ * @returns The resulting {@link FileVersion} metadata.
48
+ */
8
49
  async function uploadLargeFile(raw, accountInfo, options) {
9
- const recommendedPartSize = accountInfo.getRecommendedPartSize();
10
- const minPartSize = accountInfo.getAbsoluteMinimumPartSize();
11
- const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize);
12
- const concurrency = options.concurrency ?? DEFAULT_TRANSFER_CONCURRENCY;
13
- const totalSize = options.source.size;
14
- const parts = planRanges(totalSize, partSize);
15
- const fileInfo = { ...options.fileInfo };
16
- const startLargeFileRequest = {
17
- bucketId: options.bucketId,
18
- fileName: options.fileName,
19
- contentType: options.contentType ?? DEFAULT_CONTENT_TYPE,
20
- fileInfo,
21
- ...options.serverSideEncryption !== void 0 ? { serverSideEncryption: options.serverSideEncryption } : {},
22
- ...options.fileRetention !== void 0 ? { fileRetention: options.fileRetention } : {},
23
- ...options.legalHold !== void 0 ? { legalHold: options.legalHold } : {}
24
- };
25
- let largeFileId;
26
- let preUploaded;
27
- if (options.resumeFileId !== void 0) {
28
- largeFileId = options.resumeFileId;
29
- preUploaded = await collectPartSha1s(raw, accountInfo, largeFileId);
30
- } else if (options.resume === true) {
31
- const candidate = await findResumeCandidate(
32
- raw,
33
- accountInfo,
34
- options.bucketId,
35
- options.fileName
36
- );
37
- if (candidate) {
38
- largeFileId = candidate.fileId;
39
- preUploaded = candidate.uploadedPartSha1s;
40
- } else {
41
- const startResp = await raw.startLargeFile(
42
- accountInfo.getApiUrl(),
43
- accountInfo.getAuthToken(),
44
- startLargeFileRequest
45
- );
46
- largeFileId = startResp.fileId;
47
- preUploaded = /* @__PURE__ */ new Map();
48
- }
49
- } else {
50
- const startResp = await raw.startLargeFile(
51
- accountInfo.getApiUrl(),
52
- accountInfo.getAuthToken(),
53
- startLargeFileRequest
54
- );
55
- largeFileId = startResp.fileId;
56
- preUploaded = /* @__PURE__ */ new Map();
57
- }
58
- const partSha1s = new Array(parts.length);
59
- const tracker = new ProgressTracker(options.onProgress, totalSize, parts.length);
60
- const sem = new Semaphore(concurrency);
61
- if (!options.source.canSlice) {
62
- if (options.resume === true || options.resumeFileId !== void 0) {
63
- await cancelLargeFileBestEffort(raw, accountInfo, largeFileId);
64
- throw new Error(
65
- "uploadLargeFile: resume is not supported on non-sliceable sources (e.g. StreamSource)."
66
- );
67
- }
68
- try {
69
- await uploadPartsSequentially(
70
- raw,
71
- accountInfo,
72
- options,
73
- largeFileId,
74
- parts,
75
- partSha1s,
76
- tracker
77
- );
78
- return await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
79
- fileId: largeFileId,
80
- partSha1Array: partSha1s
81
- });
82
- } catch (err) {
83
- await cancelLargeFileBestEffort(raw, accountInfo, largeFileId);
84
- throw err;
85
- }
86
- }
87
- try {
88
- const tasks = parts.map(async (part) => {
89
- await sem.acquire();
90
- try {
91
- options.signal?.throwIfAborted();
92
- const partSource = options.source.slice(part.offset, part.offset + part.length);
93
- const data = new Uint8Array(await partSource.toArrayBuffer());
94
- const partSha1 = new IncrementalSha1();
95
- await partSha1.update(data);
96
- const sha1Hex = await partSha1.digest();
97
- const serverSha1 = preUploaded.get(part.partNumber);
98
- if (serverSha1 !== void 0 && serverSha1 === sha1Hex) {
99
- partSha1s[part.partNumber - 1] = serverSha1;
100
- tracker.addBytes(data.byteLength);
101
- tracker.completePart();
102
- return;
103
- }
104
- let uploadEntry = accountInfo.checkoutPartUploadUrl(largeFileId);
105
- if (!uploadEntry) {
106
- const resp = await raw.getUploadPartUrl(
107
- accountInfo.getApiUrl(),
108
- accountInfo.getAuthToken(),
109
- { fileId: largeFileId }
110
- );
111
- uploadEntry = { uploadUrl: resp.uploadUrl, authorizationToken: resp.authorizationToken };
112
- }
113
- try {
114
- const result2 = await raw.uploadPart(
115
- uploadEntry.uploadUrl,
116
- {
117
- authorization: uploadEntry.authorizationToken,
118
- partNumber: part.partNumber,
119
- contentLength: data.byteLength,
120
- contentSha1: sha1Hex,
121
- ...options.serverSideEncryption !== void 0 ? { serverSideEncryption: options.serverSideEncryption } : {}
122
- },
123
- data,
124
- options.signal
125
- );
126
- accountInfo.returnPartUploadUrl(largeFileId, uploadEntry);
127
- partSha1s[part.partNumber - 1] = result2.contentSha1;
128
- tracker.addBytes(data.byteLength);
129
- tracker.completePart();
130
- } catch (err) {
131
- accountInfo.evictPartUploadUrl(largeFileId, uploadEntry);
132
- throw err;
133
- }
134
- } finally {
135
- sem.release();
136
- }
137
- });
138
- await Promise.all(tasks);
139
- const result = await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
140
- fileId: largeFileId,
141
- partSha1Array: partSha1s
142
- });
143
- return result;
144
- } catch (err) {
145
- await cancelLargeFileBestEffort(raw, accountInfo, largeFileId);
146
- throw err;
147
- }
50
+ const recommendedPartSize = accountInfo.getRecommendedPartSize();
51
+ const minPartSize = accountInfo.getAbsoluteMinimumPartSize();
52
+ const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize);
53
+ const concurrency = options.concurrency ?? 4;
54
+ const totalSize = options.source.size;
55
+ const parts = planRanges(totalSize, partSize);
56
+ const fileInfo = Object.create(null);
57
+ if (options.fileInfo !== void 0) for (const [key, value] of Object.entries(options.fileInfo)) fileInfo[key] = value;
58
+ const startLargeFileRequest = {
59
+ bucketId: options.bucketId,
60
+ fileName: options.fileName,
61
+ contentType: options.contentType ?? "b2/x-auto",
62
+ fileInfo,
63
+ ...options.serverSideEncryption !== void 0 ? { serverSideEncryption: options.serverSideEncryption } : {},
64
+ ...options.fileRetention !== void 0 ? { fileRetention: options.fileRetention } : {},
65
+ ...options.legalHold !== void 0 ? { legalHold: options.legalHold } : {}
66
+ };
67
+ const resumeCandidateCriteria = createResumeCandidateCriteria(options, startLargeFileRequest, totalSize, partSize, parts);
68
+ if (!options.source.canSlice && options.resumeFileId !== void 0) throw new Error("uploadLargeFile: resume is not supported on non-sliceable sources.");
69
+ let largeFileId;
70
+ let preUploaded = /* @__PURE__ */ new Map();
71
+ let createdLargeFile = false;
72
+ const abortScope = createAbortScope(options.signal);
73
+ const startFreshLargeFile = async () => {
74
+ if (abortScope.signal.aborted && !options.source.canSlice) await cancelForwardOnlySource(options.source, abortScope.signal.reason);
75
+ abortScope.signal.throwIfAborted();
76
+ const startPromise = raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), startLargeFileRequest, {
77
+ signal: abortScope.signal,
78
+ ...options.retry !== void 0 ? { retry: options.retry } : {}
79
+ });
80
+ try {
81
+ largeFileId = (await raceWithAbort(startPromise, abortScope.signal)).fileId;
82
+ } catch (err) {
83
+ if (abortScope.signal.aborted) {
84
+ if (!options.source.canSlice) await cancelForwardOnlySource(options.source, abortScope.signal.reason).catch(() => {});
85
+ cancelLargeFileAfterStart(startPromise, raw, accountInfo, options.onCleanupFailure);
86
+ }
87
+ throw err;
88
+ }
89
+ preUploaded = /* @__PURE__ */ new Map();
90
+ createdLargeFile = true;
91
+ };
92
+ try {
93
+ if (abortScope.signal.aborted && !options.source.canSlice) await cancelForwardOnlySource(options.source, abortScope.signal.reason);
94
+ abortScope.signal.throwIfAborted();
95
+ if (options.resumeFileId !== void 0) {
96
+ const candidate = await findResumeCandidate(raw, accountInfo, options.bucketId, options.fileName, {
97
+ ...resumeCandidateCriteria,
98
+ resumeFileId: options.resumeFileId
99
+ });
100
+ if (candidate === null) throw new ResumeFileIdMismatchError(options.resumeFileId, options.fileName);
101
+ largeFileId = candidate.fileId;
102
+ preUploaded = candidate.uploadedPartSha1s;
103
+ } else if (options.resume === true && options.source.canSlice) {
104
+ const candidate = await findResumeCandidate(raw, accountInfo, options.bucketId, options.fileName, resumeCandidateCriteria);
105
+ if (candidate) {
106
+ largeFileId = candidate.fileId;
107
+ preUploaded = /* @__PURE__ */ new Map();
108
+ } else await startFreshLargeFile();
109
+ } else await startFreshLargeFile();
110
+ const activeLargeFileId = largeFileId;
111
+ if (activeLargeFileId === void 0) throw new Error("uploadLargeFile: start did not return a large file ID.");
112
+ const partSha1s = new Array(parts.length);
113
+ const tracker = new ProgressTracker(options.onProgress, totalSize, parts.length);
114
+ const sem = new Semaphore(concurrency);
115
+ if (!options.source.canSlice) {
116
+ await uploadPartsSequentially(raw, accountInfo, options, activeLargeFileId, parts, partSha1s, tracker, abortScope.signal);
117
+ return await finishLargeFileWithAbortReconciliation(raw, accountInfo, {
118
+ fileId: activeLargeFileId,
119
+ bucketId: options.bucketId,
120
+ fileName: options.fileName,
121
+ partSha1s,
122
+ signal: abortScope.signal,
123
+ ...options.retry !== void 0 ? { retry: options.retry } : {}
124
+ });
125
+ }
126
+ const tasks = parts.map(async (part) => {
127
+ await sem.acquire();
128
+ try {
129
+ abortScope.signal.throwIfAborted();
130
+ const partSource = options.source.slice(part.offset, part.offset + part.length);
131
+ const data = new Uint8Array(await partSource.toArrayBuffer({ signal: abortScope.signal }));
132
+ abortScope.signal.throwIfAborted();
133
+ const partSha1 = new IncrementalSha1();
134
+ await partSha1.update(data);
135
+ const sha1Hex = await partSha1.digest();
136
+ abortScope.signal.throwIfAborted();
137
+ const serverSha1 = preUploaded.get(part.partNumber);
138
+ if (serverSha1 !== void 0 && serverSha1 === sha1Hex) {
139
+ notifyResumePartReused(options.onResumePartReused, {
140
+ fileName: options.fileName,
141
+ fileId: activeLargeFileId,
142
+ partNumber: part.partNumber,
143
+ contentLength: data.byteLength,
144
+ contentSha1: serverSha1
145
+ });
146
+ partSha1s[part.partNumber - 1] = serverSha1;
147
+ tracker.addBytes(data.byteLength);
148
+ tracker.completePart();
149
+ return;
150
+ }
151
+ const result = await uploadPartWithFreshUrl(raw, accountInfo, activeLargeFileId, {
152
+ fileName: options.fileName,
153
+ partNumber: part.partNumber,
154
+ data,
155
+ contentLength: data.byteLength,
156
+ contentSha1: sha1Hex,
157
+ retry: options.retry,
158
+ signal: abortScope.signal,
159
+ onUploadRetry: options.onUploadRetry,
160
+ retryResponseBodyFailures: resolveRetryResponseBodyFailures(options.retryResponseBodyFailures),
161
+ ...options.serverSideEncryption !== void 0 ? { serverSideEncryption: options.serverSideEncryption } : {}
162
+ });
163
+ partSha1s[part.partNumber - 1] = result.contentSha1;
164
+ tracker.addBytes(data.byteLength);
165
+ tracker.completePart();
166
+ } catch (err) {
167
+ abortScope.abort(err);
168
+ throw err;
169
+ } finally {
170
+ sem.release();
171
+ }
172
+ });
173
+ throwRejectedOrAbortReason(await Promise.allSettled(tasks), abortScope);
174
+ return await finishLargeFileWithAbortReconciliation(raw, accountInfo, {
175
+ fileId: activeLargeFileId,
176
+ bucketId: options.bucketId,
177
+ fileName: options.fileName,
178
+ partSha1s,
179
+ signal: abortScope.signal,
180
+ ...options.retry !== void 0 ? { retry: options.retry } : {}
181
+ });
182
+ } catch (err) {
183
+ abortScope.abort(err);
184
+ if (largeFileId === void 0) throw err;
185
+ return await cleanupAfterUploadLargeFileError(err, raw, accountInfo, options, largeFileId, createdLargeFile);
186
+ } finally {
187
+ abortScope.dispose();
188
+ }
189
+ }
190
+ function cancelLargeFileAfterStart(started, raw, accountInfo, onCleanupFailure) {
191
+ started.then((resp) => cancelLargeFileBestEffort(raw, accountInfo, resp.fileId, onCleanupFailure === void 0 ? void 0 : { onCleanupFailure })).catch(() => {});
192
+ }
193
+ async function cleanupAfterUploadLargeFileError(err, raw, accountInfo, options, largeFileId, createdLargeFile) {
194
+ return await cleanupAfterLargeFileError(err, raw, accountInfo, {
195
+ fileId: largeFileId,
196
+ bucketId: options.bucketId,
197
+ fileName: options.fileName,
198
+ signal: options.signal,
199
+ onCleanupFailure: options.onCleanupFailure
200
+ }, { cancelOnError: createdLargeFile });
201
+ }
202
+ /**
203
+ * Sequential upload path for non-sliceable sources.
204
+ *
205
+ * Reads the source's `stream()` once and accumulates exactly `partSize`
206
+ * bytes into an in-memory buffer per iteration. Each filled buffer is
207
+ * hashed, dispatched to `b2_upload_part`, then released before the next
208
+ * part starts — so peak memory is ~partSize regardless of file size.
209
+ *
210
+ * Concurrency is forced to 1 here because the stream is a single
211
+ * forward-only cursor; the engine can't read part N+1 until part N is
212
+ * fully consumed.
213
+ *
214
+ * @param raw - Low-level B2 API client.
215
+ * @param accountInfo - Authorized account state.
216
+ * @param options - The original `uploadLargeFile` options.
217
+ * @param largeFileId - ID of the in-progress large file (already started).
218
+ * @param parts - Pre-planned part layout (used for part numbers + count).
219
+ * @param partSha1s - Output array, written in-place at index `partNumber - 1`.
220
+ * @param tracker - Progress tracker; bytes added per chunk, part completed
221
+ * each time a part finishes.
222
+ * @param signal - Linked abort signal for source reads and part uploads.
223
+ */
224
+ async function uploadPartsSequentially(raw, accountInfo, options, largeFileId, parts, partSha1s, tracker, signal) {
225
+ const reader = options.source.stream().getReader();
226
+ let bytesRead = 0;
227
+ let carry = null;
228
+ try {
229
+ for (const planned of parts) {
230
+ signal.throwIfAborted();
231
+ const buf = new Uint8Array(planned.length);
232
+ let filled = 0;
233
+ if (carry !== null) {
234
+ const take = Math.min(carry.byteLength, buf.byteLength - filled);
235
+ buf.set(carry.subarray(0, take), filled);
236
+ filled += take;
237
+ carry = take < carry.byteLength ? carry.subarray(take) : null;
238
+ }
239
+ while (filled < buf.byteLength) {
240
+ const { done, value } = await readNextNonEmptyStreamChunk(reader, emptyChunkError(), signal);
241
+ if (done) throw new Error(`uploadLargeFile: source stream ended after ${bytesRead} bytes, expected ${options.source.size}.`);
242
+ bytesRead += value.byteLength;
243
+ const take = Math.min(value.byteLength, buf.byteLength - filled);
244
+ buf.set(value.subarray(0, take), filled);
245
+ filled += take;
246
+ if (take < value.byteLength) carry = value.subarray(take);
247
+ }
248
+ signal.throwIfAborted();
249
+ const data = buf;
250
+ const partSha1 = new IncrementalSha1();
251
+ await partSha1.update(data);
252
+ const sha1Hex = await partSha1.digest();
253
+ signal.throwIfAborted();
254
+ const result = await uploadPartWithFreshUrl(raw, accountInfo, largeFileId, {
255
+ fileName: options.fileName,
256
+ partNumber: planned.partNumber,
257
+ data,
258
+ contentLength: data.byteLength,
259
+ contentSha1: sha1Hex,
260
+ retry: options.retry,
261
+ signal,
262
+ onUploadRetry: options.onUploadRetry,
263
+ retryResponseBodyFailures: resolveRetryResponseBodyFailures(options.retryResponseBodyFailures),
264
+ ...options.serverSideEncryption !== void 0 ? { serverSideEncryption: options.serverSideEncryption } : {}
265
+ });
266
+ partSha1s[planned.partNumber - 1] = result.contentSha1;
267
+ tracker.addBytes(data.byteLength);
268
+ tracker.completePart();
269
+ }
270
+ if (carry !== null && carry.byteLength > 0) throw new Error(tooManyBytesError(options.source.size));
271
+ const extra = await readNextNonEmptyStreamChunk(reader, emptyChunkError(), signal);
272
+ if (!extra.done) {
273
+ bytesRead += extra.value.byteLength;
274
+ throw new Error(tooManyBytesError(options.source.size));
275
+ }
276
+ } catch (err) {
277
+ await reader.cancel(err).catch(() => {});
278
+ throw err;
279
+ } finally {
280
+ reader.releaseLock();
281
+ }
282
+ }
283
+ function emptyChunkError() {
284
+ return `uploadLargeFile: source stream emitted more than ${MAX_CONSECUTIVE_EMPTY_STREAM_CHUNKS} consecutive empty chunks. too many empty chunks.`;
285
+ }
286
+ function tooManyBytesError(advertisedSize) {
287
+ return `uploadLargeFile: source stream emitted more than advertised ${advertisedSize} bytes. source stream emitted more bytes than advertised size.`;
288
+ }
289
+ async function cancelForwardOnlySource(source, reason) {
290
+ const reader = source.stream().getReader();
291
+ try {
292
+ await reader.cancel(reason);
293
+ } finally {
294
+ reader.releaseLock();
295
+ }
148
296
  }
149
- async function uploadPartsSequentially(raw, accountInfo, options, largeFileId, parts, partSha1s, tracker) {
150
- const reader = options.source.stream().getReader();
151
- let partNumber = 1;
152
- let carry = null;
153
- try {
154
- for (const planned of parts) {
155
- options.signal?.throwIfAborted();
156
- const buf = new Uint8Array(planned.length);
157
- let filled = 0;
158
- if (carry !== null) {
159
- const take = Math.min(carry.byteLength, buf.byteLength - filled);
160
- buf.set(carry.subarray(0, take), filled);
161
- filled += take;
162
- carry = take < carry.byteLength ? carry.subarray(take) : null;
163
- }
164
- while (filled < buf.byteLength) {
165
- const { done, value } = await reader.read();
166
- if (done) break;
167
- const take = Math.min(value.byteLength, buf.byteLength - filled);
168
- buf.set(value.subarray(0, take), filled);
169
- filled += take;
170
- if (take < value.byteLength) {
171
- carry = value.subarray(take);
172
- }
173
- }
174
- const data = filled === buf.byteLength ? buf : buf.subarray(0, filled);
175
- if (data.byteLength === 0) {
176
- throw new Error(
177
- `uploadLargeFile: source stream ended before part ${partNumber}; advertised size does not match emitted bytes.`
178
- );
179
- }
180
- const partSha1 = new IncrementalSha1();
181
- await partSha1.update(data);
182
- const sha1Hex = await partSha1.digest();
183
- let uploadEntry = accountInfo.checkoutPartUploadUrl(largeFileId);
184
- if (!uploadEntry) {
185
- const resp = await raw.getUploadPartUrl(
186
- accountInfo.getApiUrl(),
187
- accountInfo.getAuthToken(),
188
- { fileId: largeFileId }
189
- );
190
- uploadEntry = { uploadUrl: resp.uploadUrl, authorizationToken: resp.authorizationToken };
191
- }
192
- try {
193
- const result = await raw.uploadPart(
194
- uploadEntry.uploadUrl,
195
- {
196
- authorization: uploadEntry.authorizationToken,
197
- partNumber: planned.partNumber,
198
- contentLength: data.byteLength,
199
- contentSha1: sha1Hex,
200
- ...options.serverSideEncryption !== void 0 ? { serverSideEncryption: options.serverSideEncryption } : {}
201
- },
202
- data,
203
- options.signal
204
- );
205
- accountInfo.returnPartUploadUrl(largeFileId, uploadEntry);
206
- partSha1s[planned.partNumber - 1] = result.contentSha1;
207
- tracker.addBytes(data.byteLength);
208
- tracker.completePart();
209
- } catch (err) {
210
- accountInfo.evictPartUploadUrl(largeFileId, uploadEntry);
211
- throw err;
212
- }
213
- partNumber++;
214
- }
215
- } finally {
216
- reader.releaseLock();
217
- }
297
+ function notifyResumePartReused(listener, event) {
298
+ try {
299
+ listener?.(event);
300
+ } catch {}
218
301
  }
219
- export {
220
- uploadLargeFile
221
- };
222
- //# sourceMappingURL=large.js.map
302
+ //#endregion
303
+ export { uploadLargeFile };
304
+
305
+ //# sourceMappingURL=large.js.map