@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,74 +1,117 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const ids = require("../types/ids.cjs");
4
- const cancel = require("../upload/cancel.cjs");
5
- const concurrency = require("../upload/concurrency.cjs");
6
- const defaults = require("../util/defaults.cjs");
7
- const planRanges = require("../util/plan-ranges.cjs");
1
+ const require_file = require("../types/file.cjs");
2
+ const require_ids = require("../types/ids.cjs");
3
+ const require_abort_scope = require("../upload/abort-scope.cjs");
4
+ const require_cancel = require("../upload/cancel.cjs");
5
+ const require_concurrency = require("../upload/concurrency.cjs");
6
+ const require_finish = require("../upload/finish.cjs");
7
+ require("../util/defaults.cjs");
8
+ const require_plan_ranges = require("../util/plan-ranges.cjs");
9
+ //#region src/copy/large.ts
10
+ /**
11
+ * Performs a server-side copy of a file using the multipart `b2_copy_part` protocol.
12
+ * The source bytes never traverse the client; B2 copies each range internally.
13
+ *
14
+ * Falls back to a single `copyFile` call when the source fits in one part.
15
+ *
16
+ * @param raw - Low-level B2 API client.
17
+ * @param accountInfo - Authorized account state (used to resolve API URL, recommended part size).
18
+ * @param options - Copy parameters including source, destination, and concurrency.
19
+ *
20
+ * @returns The resulting destination {@link FileVersion}.
21
+ */
8
22
  async function copyLargeFile(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$1 = options.concurrency ?? defaults.DEFAULT_TRANSFER_CONCURRENCY;
13
- const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
14
- fileId: options.sourceFileId
15
- });
16
- const totalSize = sourceInfo.contentLength;
17
- if (totalSize <= partSize) {
18
- return raw.copyFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
19
- sourceFileId: options.sourceFileId,
20
- fileName: options.fileName,
21
- ...options.destinationBucketId !== void 0 ? { destinationBucketId: options.destinationBucketId } : {},
22
- ...options.contentType !== void 0 ? { contentType: options.contentType } : {},
23
- ...options.fileInfo !== void 0 ? { fileInfo: options.fileInfo } : {},
24
- ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {},
25
- ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {}
26
- });
27
- }
28
- const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId;
29
- const startResp = await raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
30
- bucketId: destBucketId,
31
- fileName: options.fileName,
32
- contentType: options.contentType ?? sourceInfo.contentType ?? defaults.DEFAULT_CONTENT_TYPE,
33
- fileInfo: options.fileInfo ?? {},
34
- ...options.destinationServerSideEncryption !== void 0 ? { serverSideEncryption: options.destinationServerSideEncryption } : {}
35
- });
36
- const largeFileId = startResp.fileId;
37
- const ranges = planRanges.planRanges(totalSize, partSize);
38
- const partSha1s = new Array(ranges.length);
39
- const sem = new concurrency.Semaphore(concurrency$1);
40
- try {
41
- options.signal?.throwIfAborted();
42
- await Promise.all(
43
- ranges.map(async (range) => {
44
- await sem.acquire();
45
- try {
46
- options.signal?.throwIfAborted();
47
- const resp = await raw.copyPart(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
48
- sourceFileId: options.sourceFileId,
49
- // `startLargeFile` returns `LargeFileId`; `copyPart` takes the
50
- // same value typed as `FileId`. Re-brand via the factory.
51
- largeFileId: ids.fileId(largeFileId),
52
- partNumber: range.partNumber,
53
- range: planRanges.byteRangeHeader(range.start, range.end),
54
- ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {},
55
- ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {}
56
- });
57
- partSha1s[range.partNumber - 1] = resp.contentSha1;
58
- } finally {
59
- sem.release();
60
- }
61
- })
62
- );
63
- options.signal?.throwIfAborted();
64
- return await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
65
- fileId: largeFileId,
66
- partSha1Array: partSha1s
67
- });
68
- } catch (err) {
69
- await cancel.cancelLargeFileBestEffort(raw, accountInfo, largeFileId);
70
- throw err;
71
- }
23
+ options.signal?.throwIfAborted();
24
+ const recommendedPartSize = accountInfo.getRecommendedPartSize();
25
+ const minPartSize = accountInfo.getAbsoluteMinimumPartSize();
26
+ const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize);
27
+ const concurrency = options.concurrency ?? 4;
28
+ const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), { fileId: options.sourceFileId });
29
+ const totalSize = sourceInfo.contentLength;
30
+ if (totalSize <= partSize) {
31
+ options.signal?.throwIfAborted();
32
+ const replaceMetadata = options.contentType !== void 0 || options.fileInfo !== void 0;
33
+ return raw.copyFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
34
+ sourceFileId: options.sourceFileId,
35
+ fileName: options.fileName,
36
+ ...options.destinationBucketId !== void 0 ? { destinationBucketId: options.destinationBucketId } : {},
37
+ ...replaceMetadata ? {
38
+ metadataDirective: require_file.MetadataDirective.Replace,
39
+ contentType: options.contentType ?? sourceInfo.contentType ?? "b2/x-auto",
40
+ fileInfo: options.fileInfo ?? {}
41
+ } : {},
42
+ ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {},
43
+ ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {}
44
+ }, options.signal !== void 0 ? { signal: options.signal } : void 0);
45
+ }
46
+ const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId;
47
+ const ranges = require_plan_ranges.planRanges(totalSize, partSize);
48
+ const partSha1s = new Array(ranges.length);
49
+ const sem = new require_concurrency.Semaphore(concurrency);
50
+ const abortScope = require_abort_scope.createAbortScope(options.signal);
51
+ let largeFileId;
52
+ try {
53
+ abortScope.signal.throwIfAborted();
54
+ const startPromise = raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
55
+ bucketId: destBucketId,
56
+ fileName: options.fileName,
57
+ contentType: options.contentType ?? sourceInfo.contentType ?? "b2/x-auto",
58
+ fileInfo: options.fileInfo ?? {},
59
+ ...options.destinationServerSideEncryption !== void 0 ? { serverSideEncryption: options.destinationServerSideEncryption } : {}
60
+ }, { signal: abortScope.signal });
61
+ try {
62
+ largeFileId = (await require_abort_scope.raceWithAbort(startPromise, abortScope.signal)).fileId;
63
+ } catch (err) {
64
+ if (abortScope.signal.aborted) cancelLargeFileAfterStart(startPromise, raw, accountInfo, options.onCleanupFailure);
65
+ throw err;
66
+ }
67
+ const startedLargeFileId = largeFileId;
68
+ if (startedLargeFileId === void 0) throw new Error("copyLargeFile: start did not return a large file ID.");
69
+ const tasks = ranges.map(async (range) => {
70
+ await sem.acquire();
71
+ try {
72
+ abortScope.signal.throwIfAborted();
73
+ const resp = await require_abort_scope.raceWithAbort(raw.copyPart(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
74
+ sourceFileId: options.sourceFileId,
75
+ largeFileId: require_ids.fileId(startedLargeFileId),
76
+ partNumber: range.partNumber,
77
+ range: require_plan_ranges.byteRangeHeader(range.start, range.end),
78
+ ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {},
79
+ ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {}
80
+ }, { signal: abortScope.signal }), abortScope.signal);
81
+ partSha1s[range.partNumber - 1] = resp.contentSha1;
82
+ } catch (err) {
83
+ abortScope.abort(err);
84
+ throw err;
85
+ } finally {
86
+ sem.release();
87
+ }
88
+ });
89
+ require_abort_scope.throwRejectedOrAbortReason(await Promise.allSettled(tasks), abortScope);
90
+ return await require_finish.finishLargeFileWithAbortReconciliation(raw, accountInfo, {
91
+ fileId: startedLargeFileId,
92
+ bucketId: destBucketId,
93
+ fileName: options.fileName,
94
+ partSha1s,
95
+ signal: abortScope.signal
96
+ });
97
+ } catch (err) {
98
+ abortScope.abort(err);
99
+ if (largeFileId === void 0) throw err;
100
+ return await require_cancel.cleanupAfterLargeFileError(err, raw, accountInfo, {
101
+ fileId: largeFileId,
102
+ bucketId: destBucketId,
103
+ fileName: options.fileName,
104
+ signal: options.signal,
105
+ onCleanupFailure: options.onCleanupFailure
106
+ });
107
+ } finally {
108
+ abortScope.dispose();
109
+ }
72
110
  }
111
+ function cancelLargeFileAfterStart(started, raw, accountInfo, onCleanupFailure) {
112
+ started.then((resp) => require_cancel.cancelLargeFileBestEffort(raw, accountInfo, resp.fileId, onCleanupFailure === void 0 ? void 0 : { onCleanupFailure })).catch(() => {});
113
+ }
114
+ //#endregion
73
115
  exports.copyLargeFile = copyLargeFile;
74
- //# sourceMappingURL=large.cjs.map
116
+
117
+ //# sourceMappingURL=large.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"large.cjs","sources":["../../src/copy/large.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { FileVersion } from '../types/file.ts'\nimport { type BucketId, type FileId, fileId as fileIdOf } from '../types/ids.ts'\nimport { cancelLargeFileBestEffort } from '../upload/cancel.ts'\nimport { Semaphore } from '../upload/concurrency.ts'\nimport { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from '../util/defaults.ts'\nimport { byteRangeHeader, planRanges } from '../util/plan-ranges.ts'\n\n/** Options for a server-side multipart copy. */\nexport interface CopyLargeFileOptions {\n /** ID of the source file version to copy. */\n readonly sourceFileId: FileId\n /** Destination file name in the target bucket. */\n readonly fileName: string\n /** Target bucket. Defaults to the source's bucket. */\n readonly destinationBucketId?: BucketId\n /** Size of each part in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /**\n * Maximum number of parts copied in parallel. Defaults to\n * {@link DEFAULT_TRANSFER_CONCURRENCY}.\n */\n readonly concurrency?: number\n /** MIME type for the destination file. Defaults to `b2/x-auto`. */\n readonly contentType?: string\n /** Custom file info merged into the destination. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to the destination. */\n readonly destinationServerSideEncryption?: EncryptionSetting\n /** SSE-C settings used to read the source if it was uploaded with SSE-C. */\n readonly sourceServerSideEncryption?: EncryptionSetting\n /**\n * Optional abort signal. Checked before dispatching each part and\n * between parts; an aborted signal cancels remaining parts and rolls\n * back the unfinished large file via best-effort `cancelLargeFile`.\n *\n * Aborting does NOT roll back parts already accepted by B2; those\n * exist on the unfinished large file until the cancel call completes\n * or B2's lifecycle expires the in-progress upload (24 hours).\n */\n readonly signal?: AbortSignal\n}\n\n/**\n * Performs a server-side copy of a file using the multipart `b2_copy_part` protocol.\n * The source bytes never traverse the client; B2 copies each range internally.\n *\n * Falls back to a single `copyFile` call when the source fits in one part.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state (used to resolve API URL, recommended part size).\n * @param options - Copy parameters including source, destination, and concurrency.\n *\n * @returns The resulting destination {@link FileVersion}.\n */\nexport async function copyLargeFile(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: CopyLargeFileOptions,\n): Promise<FileVersion> {\n const recommendedPartSize = accountInfo.getRecommendedPartSize()\n const minPartSize = accountInfo.getAbsoluteMinimumPartSize()\n const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize)\n const concurrency = options.concurrency ?? DEFAULT_TRANSFER_CONCURRENCY\n\n // Discover the source size via getFileInfo.\n const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: options.sourceFileId,\n })\n const totalSize = sourceInfo.contentLength\n\n // Below the part threshold, take the single-call fast path.\n if (totalSize <= partSize) {\n return raw.copyFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n sourceFileId: options.sourceFileId,\n fileName: options.fileName,\n ...(options.destinationBucketId !== undefined\n ? { destinationBucketId: options.destinationBucketId }\n : {}),\n ...(options.contentType !== undefined ? { contentType: options.contentType } : {}),\n ...(options.fileInfo !== undefined ? { fileInfo: options.fileInfo } : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n })\n }\n\n // Resolve destination bucket (defaults to source's bucket). Both operands\n // are already typed `BucketId`, so no cast is needed.\n const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId\n\n // Start the multipart file.\n const startResp = await raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n bucketId: destBucketId,\n fileName: options.fileName,\n contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo: options.fileInfo ?? {},\n ...(options.destinationServerSideEncryption !== undefined\n ? { serverSideEncryption: options.destinationServerSideEncryption }\n : {}),\n })\n const largeFileId = startResp.fileId\n\n const ranges = planRanges(totalSize, partSize)\n const partSha1s: string[] = new Array(ranges.length)\n const sem = new Semaphore(concurrency)\n\n try {\n options.signal?.throwIfAborted()\n await Promise.all(\n ranges.map(async (range) => {\n await sem.acquire()\n try {\n // Re-check the abort flag after every queue handoff so the\n // first cancelled task short-circuits the remaining parts.\n options.signal?.throwIfAborted()\n const resp = await raw.copyPart(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n sourceFileId: options.sourceFileId,\n // `startLargeFile` returns `LargeFileId`; `copyPart` takes the\n // same value typed as `FileId`. Re-brand via the factory.\n largeFileId: fileIdOf(largeFileId),\n partNumber: range.partNumber,\n range: byteRangeHeader(range.start, range.end),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n })\n partSha1s[range.partNumber - 1] = resp.contentSha1\n } finally {\n sem.release()\n }\n }),\n )\n\n options.signal?.throwIfAborted()\n return await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: largeFileId,\n partSha1Array: partSha1s,\n })\n } catch (err) {\n await cancelLargeFileBestEffort(raw, accountInfo, largeFileId)\n throw err\n }\n}\n"],"names":["concurrency","DEFAULT_TRANSFER_CONCURRENCY","DEFAULT_CONTENT_TYPE","planRanges","Semaphore","fileIdOf","byteRangeHeader","cancelLargeFileBestEffort"],"mappings":";;;;;;;AAyDA,eAAsB,cACpB,KACA,aACA,SACsB;AACtB,QAAM,sBAAsB,YAAY,uBAAA;AACxC,QAAM,cAAc,YAAY,2BAAA;AAChC,QAAM,WAAW,KAAK,IAAI,QAAQ,YAAY,qBAAqB,WAAW;AAC9E,QAAMA,gBAAc,QAAQ,eAAeC,SAAAA;AAG3C,QAAM,aAAa,MAAM,IAAI,YAAY,YAAY,UAAA,GAAa,YAAY,gBAAgB;AAAA,IAC5F,QAAQ,QAAQ;AAAA,EAAA,CACjB;AACD,QAAM,YAAY,WAAW;AAG7B,MAAI,aAAa,UAAU;AACzB,WAAO,IAAI,SAAS,YAAY,aAAa,YAAY,gBAAgB;AAAA,MACvE,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,wBAAwB,SAChC,EAAE,qBAAqB,QAAQ,oBAAA,IAC/B,CAAA;AAAA,MACJ,GAAI,QAAQ,gBAAgB,SAAY,EAAE,aAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,MAC/E,GAAI,QAAQ,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAA,IAAa,CAAA;AAAA,MACtE,GAAI,QAAQ,oCAAoC,SAC5C,EAAE,iCAAiC,QAAQ,gCAAA,IAC3C,CAAA;AAAA,MACJ,GAAI,QAAQ,+BAA+B,SACvC,EAAE,4BAA4B,QAAQ,+BACtC,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAIA,QAAM,eAAe,QAAQ,uBAAuB,WAAW;AAG/D,QAAM,YAAY,MAAM,IAAI,eAAe,YAAY,UAAA,GAAa,YAAY,gBAAgB;AAAA,IAC9F,UAAU;AAAA,IACV,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ,eAAe,WAAW,eAAeC,SAAAA;AAAAA,IAC9D,UAAU,QAAQ,YAAY,CAAA;AAAA,IAC9B,GAAI,QAAQ,oCAAoC,SAC5C,EAAE,sBAAsB,QAAQ,oCAChC,CAAA;AAAA,EAAC,CACN;AACD,QAAM,cAAc,UAAU;AAE9B,QAAM,SAASC,WAAAA,WAAW,WAAW,QAAQ;AAC7C,QAAM,YAAsB,IAAI,MAAM,OAAO,MAAM;AACnD,QAAM,MAAM,IAAIC,YAAAA,UAAUJ,aAAW;AAErC,MAAI;AACF,YAAQ,QAAQ,eAAA;AAChB,UAAM,QAAQ;AAAA,MACZ,OAAO,IAAI,OAAO,UAAU;AAC1B,cAAM,IAAI,QAAA;AACV,YAAI;AAGF,kBAAQ,QAAQ,eAAA;AAChB,gBAAM,OAAO,MAAM,IAAI,SAAS,YAAY,UAAA,GAAa,YAAY,gBAAgB;AAAA,YACnF,cAAc,QAAQ;AAAA;AAAA;AAAA,YAGtB,aAAaK,IAAAA,OAAS,WAAW;AAAA,YACjC,YAAY,MAAM;AAAA,YAClB,OAAOC,WAAAA,gBAAgB,MAAM,OAAO,MAAM,GAAG;AAAA,YAC7C,GAAI,QAAQ,+BAA+B,SACvC,EAAE,4BAA4B,QAAQ,2BAAA,IACtC,CAAA;AAAA,YACJ,GAAI,QAAQ,oCAAoC,SAC5C,EAAE,iCAAiC,QAAQ,oCAC3C,CAAA;AAAA,UAAC,CACN;AACD,oBAAU,MAAM,aAAa,CAAC,IAAI,KAAK;AAAA,QACzC,UAAA;AACE,cAAI,QAAA;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IAAA;AAGH,YAAQ,QAAQ,eAAA;AAChB,WAAO,MAAM,IAAI,gBAAgB,YAAY,aAAa,YAAY,gBAAgB;AAAA,MACpF,QAAQ;AAAA,MACR,eAAe;AAAA,IAAA,CAChB;AAAA,EACH,SAAS,KAAK;AACZ,UAAMC,iCAA0B,KAAK,aAAa,WAAW;AAC7D,UAAM;AAAA,EACR;AACF;;"}
1
+ {"version":3,"file":"large.cjs","names":[],"sources":["../../src/copy/large.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport { type FileVersion, MetadataDirective } from '../types/file.ts'\nimport { type BucketId, type FileId, fileId as fileIdOf, type LargeFileId } from '../types/ids.ts'\nimport {\n createAbortScope,\n raceWithAbort,\n throwRejectedOrAbortReason,\n} from '../upload/abort-scope.ts'\nimport {\n type CleanupFailureListener,\n cancelLargeFileBestEffort,\n cleanupAfterLargeFileError,\n} from '../upload/cancel.ts'\nimport { Semaphore } from '../upload/concurrency.ts'\nimport { finishLargeFileWithAbortReconciliation } from '../upload/finish.ts'\nimport { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from '../util/defaults.ts'\nimport { byteRangeHeader, planRanges } from '../util/plan-ranges.ts'\n\n/** Options for a server-side multipart copy. */\nexport interface CopyLargeFileOptions {\n /** ID of the source file version to copy. */\n readonly sourceFileId: FileId\n /** Destination file name in the target bucket. */\n readonly fileName: string\n /** Target bucket. Defaults to the source's bucket. */\n readonly destinationBucketId?: BucketId\n /** Size of each part in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /**\n * Maximum number of parts copied in parallel. Defaults to\n * {@link DEFAULT_TRANSFER_CONCURRENCY}.\n */\n readonly concurrency?: number\n /** MIME type for the destination file. Defaults to `b2/x-auto`. */\n readonly contentType?: string\n /** Custom file info merged into the destination. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to the destination. */\n readonly destinationServerSideEncryption?: EncryptionSetting\n /** SSE-C settings used to read the source if it was uploaded with SSE-C. */\n readonly sourceServerSideEncryption?: EncryptionSetting\n /**\n * Callback invoked if best-effort cancellation fails, or if cancellation is\n * skipped because `b2_finish_large_file` may already have committed.\n */\n readonly onCleanupFailure?: CleanupFailureListener\n /**\n * Optional abort signal. Checked before dispatching each part and\n * between parts; an aborted signal cancels remaining parts and rolls\n * back the unfinished large file via best-effort `cancelLargeFile`.\n *\n * Aborting does NOT roll back parts already accepted by B2; those\n * exist on the unfinished large file until the cancel call completes\n * or B2's lifecycle expires the in-progress upload (24 hours).\n */\n readonly signal?: AbortSignal\n}\n\n/**\n * Performs a server-side copy of a file using the multipart `b2_copy_part` protocol.\n * The source bytes never traverse the client; B2 copies each range internally.\n *\n * Falls back to a single `copyFile` call when the source fits in one part.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state (used to resolve API URL, recommended part size).\n * @param options - Copy parameters including source, destination, and concurrency.\n *\n * @returns The resulting destination {@link FileVersion}.\n */\nexport async function copyLargeFile(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: CopyLargeFileOptions,\n): Promise<FileVersion> {\n options.signal?.throwIfAborted()\n const recommendedPartSize = accountInfo.getRecommendedPartSize()\n const minPartSize = accountInfo.getAbsoluteMinimumPartSize()\n const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize)\n const concurrency = options.concurrency ?? DEFAULT_TRANSFER_CONCURRENCY\n\n // Discover the source size via getFileInfo.\n const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: options.sourceFileId,\n })\n const totalSize = sourceInfo.contentLength\n\n // Below the part threshold, take the single-call fast path.\n if (totalSize <= partSize) {\n options.signal?.throwIfAborted()\n // `b2_copy_file` only accepts replacement contentType/fileInfo under\n // `metadataDirective: REPLACE`; supplying them in the default COPY mode is\n // rejected by B2. When the caller sets either, switch to REPLACE with a\n // required contentType (the override, else the source's, else b2/x-auto),\n // matching the multipart path's metadata semantics below.\n const replaceMetadata = options.contentType !== undefined || options.fileInfo !== undefined\n return raw.copyFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n sourceFileId: options.sourceFileId,\n fileName: options.fileName,\n ...(options.destinationBucketId !== undefined\n ? { destinationBucketId: options.destinationBucketId }\n : {}),\n ...(replaceMetadata\n ? {\n metadataDirective: MetadataDirective.Replace,\n contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo: options.fileInfo ?? {},\n }\n : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n },\n options.signal !== undefined ? { signal: options.signal } : undefined,\n )\n }\n\n // Resolve destination bucket (defaults to source's bucket). Both operands\n // are already typed `BucketId`, so no cast is needed.\n const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId\n\n const ranges = planRanges(totalSize, partSize)\n const partSha1s: string[] = new Array(ranges.length)\n const sem = new Semaphore(concurrency)\n const abortScope = createAbortScope(options.signal)\n let largeFileId: LargeFileId | undefined\n\n try {\n abortScope.signal.throwIfAborted()\n const startPromise = raw.startLargeFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n bucketId: destBucketId,\n fileName: options.fileName,\n contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo: options.fileInfo ?? {},\n ...(options.destinationServerSideEncryption !== undefined\n ? { serverSideEncryption: options.destinationServerSideEncryption }\n : {}),\n },\n { signal: abortScope.signal },\n )\n try {\n const startResp = await raceWithAbort(startPromise, abortScope.signal)\n largeFileId = startResp.fileId\n } catch (err) {\n if (abortScope.signal.aborted) {\n cancelLargeFileAfterStart(startPromise, raw, accountInfo, options.onCleanupFailure)\n }\n throw err\n }\n const startedLargeFileId = largeFileId\n if (startedLargeFileId === undefined) {\n throw new Error('copyLargeFile: start did not return a large file ID.')\n }\n\n const tasks = ranges.map(async (range) => {\n await sem.acquire()\n try {\n abortScope.signal.throwIfAborted()\n const copyPromise = raw.copyPart(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n sourceFileId: options.sourceFileId,\n // `startLargeFile` returns `LargeFileId`; `copyPart` takes the\n // same value typed as `FileId`. Re-brand via the factory.\n largeFileId: fileIdOf(startedLargeFileId),\n partNumber: range.partNumber,\n range: byteRangeHeader(range.start, range.end),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n },\n { signal: abortScope.signal },\n )\n const resp = await raceWithAbort(copyPromise, abortScope.signal)\n partSha1s[range.partNumber - 1] = resp.contentSha1\n } catch (err) {\n abortScope.abort(err)\n throw err\n } finally {\n sem.release()\n }\n })\n\n throwRejectedOrAbortReason(await Promise.allSettled(tasks), abortScope)\n\n return await finishLargeFileWithAbortReconciliation(raw, accountInfo, {\n fileId: startedLargeFileId,\n bucketId: destBucketId,\n fileName: options.fileName,\n partSha1s,\n signal: abortScope.signal,\n })\n } catch (err) {\n abortScope.abort(err)\n if (largeFileId === undefined) throw err\n return await cleanupAfterLargeFileError(err, raw, accountInfo, {\n fileId: largeFileId,\n bucketId: destBucketId,\n fileName: options.fileName,\n signal: options.signal,\n onCleanupFailure: options.onCleanupFailure,\n })\n } finally {\n abortScope.dispose()\n }\n}\n\nfunction cancelLargeFileAfterStart(\n started: Promise<{ readonly fileId: LargeFileId }>,\n raw: RawClient,\n accountInfo: AccountInfo,\n onCleanupFailure: CleanupFailureListener | undefined,\n): void {\n void started\n .then((resp) =>\n cancelLargeFileBestEffort(\n raw,\n accountInfo,\n resp.fileId,\n onCleanupFailure === undefined ? undefined : { onCleanupFailure },\n ),\n )\n .catch(() => {\n // If start failed, no file ID is available to cancel.\n })\n}\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { RawClient } from '../raw/index.js';
3
3
  import { EncryptionSetting } from '../types/encryption.js';
4
4
  import { FileVersion } from '../types/file.js';
5
5
  import { BucketId, FileId } from '../types/ids.js';
6
+ import { CleanupFailureListener } from '../upload/cancel.js';
6
7
  /** Options for a server-side multipart copy. */
7
8
  export interface CopyLargeFileOptions {
8
9
  /** ID of the source file version to copy. */
@@ -26,6 +27,11 @@ export interface CopyLargeFileOptions {
26
27
  readonly destinationServerSideEncryption?: EncryptionSetting;
27
28
  /** SSE-C settings used to read the source if it was uploaded with SSE-C. */
28
29
  readonly sourceServerSideEncryption?: EncryptionSetting;
30
+ /**
31
+ * Callback invoked if best-effort cancellation fails, or if cancellation is
32
+ * skipped because `b2_finish_large_file` may already have committed.
33
+ */
34
+ readonly onCleanupFailure?: CleanupFailureListener;
29
35
  /**
30
36
  * Optional abort signal. Checked before dispatching each part and
31
37
  * between parts; an aborted signal cancels remaining parts and rolls
@@ -1 +1 @@
1
- {"version":3,"file":"large.d.ts","sourceRoot":"","sources":["../../src/copy/large.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAsB,MAAM,iBAAiB,CAAA;AAMhF,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,sDAAsD;IACtD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAA;IACvC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,CAAA;IAC5D,4EAA4E;IAC5E,QAAQ,CAAC,0BAA0B,CAAC,EAAE,iBAAiB,CAAA;IACvD;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA0FtB"}
1
+ {"version":3,"file":"large.d.ts","sourceRoot":"","sources":["../../src/copy/large.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAwC,MAAM,iBAAiB,CAAA;AAMlG,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,qBAAqB,CAAA;AAM5B,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,sDAAsD;IACtD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAA;IACvC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,CAAA;IAC5D,4EAA4E;IAC5E,QAAQ,CAAC,0BAA0B,CAAC,EAAE,iBAAiB,CAAA;IACvD;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IAClD;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CAgJtB"}
@@ -3,6 +3,7 @@ import { RawClient } from '../raw/index.js';
3
3
  import { EncryptionSetting } from '../types/encryption.js';
4
4
  import { FileVersion } from '../types/file.js';
5
5
  import { BucketId, FileId } from '../types/ids.js';
6
+ import { CleanupFailureListener } from '../upload/cancel.js';
6
7
  /** Options for a server-side multipart copy. */
7
8
  export interface CopyLargeFileOptions {
8
9
  /** ID of the source file version to copy. */
@@ -26,6 +27,11 @@ export interface CopyLargeFileOptions {
26
27
  readonly destinationServerSideEncryption?: EncryptionSetting;
27
28
  /** SSE-C settings used to read the source if it was uploaded with SSE-C. */
28
29
  readonly sourceServerSideEncryption?: EncryptionSetting;
30
+ /**
31
+ * Callback invoked if best-effort cancellation fails, or if cancellation is
32
+ * skipped because `b2_finish_large_file` may already have committed.
33
+ */
34
+ readonly onCleanupFailure?: CleanupFailureListener;
29
35
  /**
30
36
  * Optional abort signal. Checked before dispatching each part and
31
37
  * between parts; an aborted signal cancels remaining parts and rolls
@@ -1 +1 @@
1
- {"version":3,"file":"large.d.ts","sourceRoot":"","sources":["../../src/copy/large.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAsB,MAAM,iBAAiB,CAAA;AAMhF,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,sDAAsD;IACtD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAA;IACvC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,CAAA;IAC5D,4EAA4E;IAC5E,QAAQ,CAAC,0BAA0B,CAAC,EAAE,iBAAiB,CAAA;IACvD;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA0FtB"}
1
+ {"version":3,"file":"large.d.ts","sourceRoot":"","sources":["../../src/copy/large.js"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAwC,MAAM,iBAAiB,CAAA;AAMlG,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,qBAAqB,CAAA;AAM5B,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,sDAAsD;IACtD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAA;IACvC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,+BAA+B,CAAC,EAAE,iBAAiB,CAAA;IAC5D,4EAA4E;IAC5E,QAAQ,CAAC,0BAA0B,CAAC,EAAE,iBAAiB,CAAA;IACvD;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IAClD;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CAgJtB"}
@@ -1,74 +1,117 @@
1
+ import { MetadataDirective } from "../types/file.js";
1
2
  import { fileId } from "../types/ids.js";
2
- import { cancelLargeFileBestEffort } from "../upload/cancel.js";
3
+ import { createAbortScope, raceWithAbort, throwRejectedOrAbortReason } from "../upload/abort-scope.js";
4
+ import { cancelLargeFileBestEffort, cleanupAfterLargeFileError } from "../upload/cancel.js";
3
5
  import { Semaphore } from "../upload/concurrency.js";
4
- import { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from "../util/defaults.js";
6
+ import { finishLargeFileWithAbortReconciliation } from "../upload/finish.js";
7
+ import "../util/defaults.js";
5
8
  import { byteRangeHeader, planRanges } from "../util/plan-ranges.js";
9
+ //#region src/copy/large.ts
10
+ /**
11
+ * Performs a server-side copy of a file using the multipart `b2_copy_part` protocol.
12
+ * The source bytes never traverse the client; B2 copies each range internally.
13
+ *
14
+ * Falls back to a single `copyFile` call when the source fits in one part.
15
+ *
16
+ * @param raw - Low-level B2 API client.
17
+ * @param accountInfo - Authorized account state (used to resolve API URL, recommended part size).
18
+ * @param options - Copy parameters including source, destination, and concurrency.
19
+ *
20
+ * @returns The resulting destination {@link FileVersion}.
21
+ */
6
22
  async function copyLargeFile(raw, accountInfo, options) {
7
- const recommendedPartSize = accountInfo.getRecommendedPartSize();
8
- const minPartSize = accountInfo.getAbsoluteMinimumPartSize();
9
- const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize);
10
- const concurrency = options.concurrency ?? DEFAULT_TRANSFER_CONCURRENCY;
11
- const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
12
- fileId: options.sourceFileId
13
- });
14
- const totalSize = sourceInfo.contentLength;
15
- if (totalSize <= partSize) {
16
- return raw.copyFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
17
- sourceFileId: options.sourceFileId,
18
- fileName: options.fileName,
19
- ...options.destinationBucketId !== void 0 ? { destinationBucketId: options.destinationBucketId } : {},
20
- ...options.contentType !== void 0 ? { contentType: options.contentType } : {},
21
- ...options.fileInfo !== void 0 ? { fileInfo: options.fileInfo } : {},
22
- ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {},
23
- ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {}
24
- });
25
- }
26
- const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId;
27
- const startResp = await raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
28
- bucketId: destBucketId,
29
- fileName: options.fileName,
30
- contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,
31
- fileInfo: options.fileInfo ?? {},
32
- ...options.destinationServerSideEncryption !== void 0 ? { serverSideEncryption: options.destinationServerSideEncryption } : {}
33
- });
34
- const largeFileId = startResp.fileId;
35
- const ranges = planRanges(totalSize, partSize);
36
- const partSha1s = new Array(ranges.length);
37
- const sem = new Semaphore(concurrency);
38
- try {
39
- options.signal?.throwIfAborted();
40
- await Promise.all(
41
- ranges.map(async (range) => {
42
- await sem.acquire();
43
- try {
44
- options.signal?.throwIfAborted();
45
- const resp = await raw.copyPart(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
46
- sourceFileId: options.sourceFileId,
47
- // `startLargeFile` returns `LargeFileId`; `copyPart` takes the
48
- // same value typed as `FileId`. Re-brand via the factory.
49
- largeFileId: fileId(largeFileId),
50
- partNumber: range.partNumber,
51
- range: byteRangeHeader(range.start, range.end),
52
- ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {},
53
- ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {}
54
- });
55
- partSha1s[range.partNumber - 1] = resp.contentSha1;
56
- } finally {
57
- sem.release();
58
- }
59
- })
60
- );
61
- options.signal?.throwIfAborted();
62
- return await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
63
- fileId: largeFileId,
64
- partSha1Array: partSha1s
65
- });
66
- } catch (err) {
67
- await cancelLargeFileBestEffort(raw, accountInfo, largeFileId);
68
- throw err;
69
- }
23
+ options.signal?.throwIfAborted();
24
+ const recommendedPartSize = accountInfo.getRecommendedPartSize();
25
+ const minPartSize = accountInfo.getAbsoluteMinimumPartSize();
26
+ const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize);
27
+ const concurrency = options.concurrency ?? 4;
28
+ const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), { fileId: options.sourceFileId });
29
+ const totalSize = sourceInfo.contentLength;
30
+ if (totalSize <= partSize) {
31
+ options.signal?.throwIfAborted();
32
+ const replaceMetadata = options.contentType !== void 0 || options.fileInfo !== void 0;
33
+ return raw.copyFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
34
+ sourceFileId: options.sourceFileId,
35
+ fileName: options.fileName,
36
+ ...options.destinationBucketId !== void 0 ? { destinationBucketId: options.destinationBucketId } : {},
37
+ ...replaceMetadata ? {
38
+ metadataDirective: MetadataDirective.Replace,
39
+ contentType: options.contentType ?? sourceInfo.contentType ?? "b2/x-auto",
40
+ fileInfo: options.fileInfo ?? {}
41
+ } : {},
42
+ ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {},
43
+ ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {}
44
+ }, options.signal !== void 0 ? { signal: options.signal } : void 0);
45
+ }
46
+ const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId;
47
+ const ranges = planRanges(totalSize, partSize);
48
+ const partSha1s = new Array(ranges.length);
49
+ const sem = new Semaphore(concurrency);
50
+ const abortScope = createAbortScope(options.signal);
51
+ let largeFileId;
52
+ try {
53
+ abortScope.signal.throwIfAborted();
54
+ const startPromise = raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
55
+ bucketId: destBucketId,
56
+ fileName: options.fileName,
57
+ contentType: options.contentType ?? sourceInfo.contentType ?? "b2/x-auto",
58
+ fileInfo: options.fileInfo ?? {},
59
+ ...options.destinationServerSideEncryption !== void 0 ? { serverSideEncryption: options.destinationServerSideEncryption } : {}
60
+ }, { signal: abortScope.signal });
61
+ try {
62
+ largeFileId = (await raceWithAbort(startPromise, abortScope.signal)).fileId;
63
+ } catch (err) {
64
+ if (abortScope.signal.aborted) cancelLargeFileAfterStart(startPromise, raw, accountInfo, options.onCleanupFailure);
65
+ throw err;
66
+ }
67
+ const startedLargeFileId = largeFileId;
68
+ if (startedLargeFileId === void 0) throw new Error("copyLargeFile: start did not return a large file ID.");
69
+ const tasks = ranges.map(async (range) => {
70
+ await sem.acquire();
71
+ try {
72
+ abortScope.signal.throwIfAborted();
73
+ const resp = await raceWithAbort(raw.copyPart(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {
74
+ sourceFileId: options.sourceFileId,
75
+ largeFileId: fileId(startedLargeFileId),
76
+ partNumber: range.partNumber,
77
+ range: byteRangeHeader(range.start, range.end),
78
+ ...options.sourceServerSideEncryption !== void 0 ? { sourceServerSideEncryption: options.sourceServerSideEncryption } : {},
79
+ ...options.destinationServerSideEncryption !== void 0 ? { destinationServerSideEncryption: options.destinationServerSideEncryption } : {}
80
+ }, { signal: abortScope.signal }), abortScope.signal);
81
+ partSha1s[range.partNumber - 1] = resp.contentSha1;
82
+ } catch (err) {
83
+ abortScope.abort(err);
84
+ throw err;
85
+ } finally {
86
+ sem.release();
87
+ }
88
+ });
89
+ throwRejectedOrAbortReason(await Promise.allSettled(tasks), abortScope);
90
+ return await finishLargeFileWithAbortReconciliation(raw, accountInfo, {
91
+ fileId: startedLargeFileId,
92
+ bucketId: destBucketId,
93
+ fileName: options.fileName,
94
+ partSha1s,
95
+ signal: abortScope.signal
96
+ });
97
+ } catch (err) {
98
+ abortScope.abort(err);
99
+ if (largeFileId === void 0) throw err;
100
+ return await cleanupAfterLargeFileError(err, raw, accountInfo, {
101
+ fileId: largeFileId,
102
+ bucketId: destBucketId,
103
+ fileName: options.fileName,
104
+ signal: options.signal,
105
+ onCleanupFailure: options.onCleanupFailure
106
+ });
107
+ } finally {
108
+ abortScope.dispose();
109
+ }
70
110
  }
71
- export {
72
- copyLargeFile
73
- };
74
- //# sourceMappingURL=large.js.map
111
+ function cancelLargeFileAfterStart(started, raw, accountInfo, onCleanupFailure) {
112
+ started.then((resp) => cancelLargeFileBestEffort(raw, accountInfo, resp.fileId, onCleanupFailure === void 0 ? void 0 : { onCleanupFailure })).catch(() => {});
113
+ }
114
+ //#endregion
115
+ export { copyLargeFile };
116
+
117
+ //# sourceMappingURL=large.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"large.js","sources":["../../src/copy/large.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { FileVersion } from '../types/file.ts'\nimport { type BucketId, type FileId, fileId as fileIdOf } from '../types/ids.ts'\nimport { cancelLargeFileBestEffort } from '../upload/cancel.ts'\nimport { Semaphore } from '../upload/concurrency.ts'\nimport { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from '../util/defaults.ts'\nimport { byteRangeHeader, planRanges } from '../util/plan-ranges.ts'\n\n/** Options for a server-side multipart copy. */\nexport interface CopyLargeFileOptions {\n /** ID of the source file version to copy. */\n readonly sourceFileId: FileId\n /** Destination file name in the target bucket. */\n readonly fileName: string\n /** Target bucket. Defaults to the source's bucket. */\n readonly destinationBucketId?: BucketId\n /** Size of each part in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /**\n * Maximum number of parts copied in parallel. Defaults to\n * {@link DEFAULT_TRANSFER_CONCURRENCY}.\n */\n readonly concurrency?: number\n /** MIME type for the destination file. Defaults to `b2/x-auto`. */\n readonly contentType?: string\n /** Custom file info merged into the destination. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to the destination. */\n readonly destinationServerSideEncryption?: EncryptionSetting\n /** SSE-C settings used to read the source if it was uploaded with SSE-C. */\n readonly sourceServerSideEncryption?: EncryptionSetting\n /**\n * Optional abort signal. Checked before dispatching each part and\n * between parts; an aborted signal cancels remaining parts and rolls\n * back the unfinished large file via best-effort `cancelLargeFile`.\n *\n * Aborting does NOT roll back parts already accepted by B2; those\n * exist on the unfinished large file until the cancel call completes\n * or B2's lifecycle expires the in-progress upload (24 hours).\n */\n readonly signal?: AbortSignal\n}\n\n/**\n * Performs a server-side copy of a file using the multipart `b2_copy_part` protocol.\n * The source bytes never traverse the client; B2 copies each range internally.\n *\n * Falls back to a single `copyFile` call when the source fits in one part.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state (used to resolve API URL, recommended part size).\n * @param options - Copy parameters including source, destination, and concurrency.\n *\n * @returns The resulting destination {@link FileVersion}.\n */\nexport async function copyLargeFile(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: CopyLargeFileOptions,\n): Promise<FileVersion> {\n const recommendedPartSize = accountInfo.getRecommendedPartSize()\n const minPartSize = accountInfo.getAbsoluteMinimumPartSize()\n const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize)\n const concurrency = options.concurrency ?? DEFAULT_TRANSFER_CONCURRENCY\n\n // Discover the source size via getFileInfo.\n const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: options.sourceFileId,\n })\n const totalSize = sourceInfo.contentLength\n\n // Below the part threshold, take the single-call fast path.\n if (totalSize <= partSize) {\n return raw.copyFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n sourceFileId: options.sourceFileId,\n fileName: options.fileName,\n ...(options.destinationBucketId !== undefined\n ? { destinationBucketId: options.destinationBucketId }\n : {}),\n ...(options.contentType !== undefined ? { contentType: options.contentType } : {}),\n ...(options.fileInfo !== undefined ? { fileInfo: options.fileInfo } : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n })\n }\n\n // Resolve destination bucket (defaults to source's bucket). Both operands\n // are already typed `BucketId`, so no cast is needed.\n const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId\n\n // Start the multipart file.\n const startResp = await raw.startLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n bucketId: destBucketId,\n fileName: options.fileName,\n contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo: options.fileInfo ?? {},\n ...(options.destinationServerSideEncryption !== undefined\n ? { serverSideEncryption: options.destinationServerSideEncryption }\n : {}),\n })\n const largeFileId = startResp.fileId\n\n const ranges = planRanges(totalSize, partSize)\n const partSha1s: string[] = new Array(ranges.length)\n const sem = new Semaphore(concurrency)\n\n try {\n options.signal?.throwIfAborted()\n await Promise.all(\n ranges.map(async (range) => {\n await sem.acquire()\n try {\n // Re-check the abort flag after every queue handoff so the\n // first cancelled task short-circuits the remaining parts.\n options.signal?.throwIfAborted()\n const resp = await raw.copyPart(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n sourceFileId: options.sourceFileId,\n // `startLargeFile` returns `LargeFileId`; `copyPart` takes the\n // same value typed as `FileId`. Re-brand via the factory.\n largeFileId: fileIdOf(largeFileId),\n partNumber: range.partNumber,\n range: byteRangeHeader(range.start, range.end),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n })\n partSha1s[range.partNumber - 1] = resp.contentSha1\n } finally {\n sem.release()\n }\n }),\n )\n\n options.signal?.throwIfAborted()\n return await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: largeFileId,\n partSha1Array: partSha1s,\n })\n } catch (err) {\n await cancelLargeFileBestEffort(raw, accountInfo, largeFileId)\n throw err\n }\n}\n"],"names":["fileIdOf"],"mappings":";;;;;AAyDA,eAAsB,cACpB,KACA,aACA,SACsB;AACtB,QAAM,sBAAsB,YAAY,uBAAA;AACxC,QAAM,cAAc,YAAY,2BAAA;AAChC,QAAM,WAAW,KAAK,IAAI,QAAQ,YAAY,qBAAqB,WAAW;AAC9E,QAAM,cAAc,QAAQ,eAAe;AAG3C,QAAM,aAAa,MAAM,IAAI,YAAY,YAAY,UAAA,GAAa,YAAY,gBAAgB;AAAA,IAC5F,QAAQ,QAAQ;AAAA,EAAA,CACjB;AACD,QAAM,YAAY,WAAW;AAG7B,MAAI,aAAa,UAAU;AACzB,WAAO,IAAI,SAAS,YAAY,aAAa,YAAY,gBAAgB;AAAA,MACvE,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,wBAAwB,SAChC,EAAE,qBAAqB,QAAQ,oBAAA,IAC/B,CAAA;AAAA,MACJ,GAAI,QAAQ,gBAAgB,SAAY,EAAE,aAAa,QAAQ,YAAA,IAAgB,CAAA;AAAA,MAC/E,GAAI,QAAQ,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAA,IAAa,CAAA;AAAA,MACtE,GAAI,QAAQ,oCAAoC,SAC5C,EAAE,iCAAiC,QAAQ,gCAAA,IAC3C,CAAA;AAAA,MACJ,GAAI,QAAQ,+BAA+B,SACvC,EAAE,4BAA4B,QAAQ,+BACtC,CAAA;AAAA,IAAC,CACN;AAAA,EACH;AAIA,QAAM,eAAe,QAAQ,uBAAuB,WAAW;AAG/D,QAAM,YAAY,MAAM,IAAI,eAAe,YAAY,UAAA,GAAa,YAAY,gBAAgB;AAAA,IAC9F,UAAU;AAAA,IACV,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ,eAAe,WAAW,eAAe;AAAA,IAC9D,UAAU,QAAQ,YAAY,CAAA;AAAA,IAC9B,GAAI,QAAQ,oCAAoC,SAC5C,EAAE,sBAAsB,QAAQ,oCAChC,CAAA;AAAA,EAAC,CACN;AACD,QAAM,cAAc,UAAU;AAE9B,QAAM,SAAS,WAAW,WAAW,QAAQ;AAC7C,QAAM,YAAsB,IAAI,MAAM,OAAO,MAAM;AACnD,QAAM,MAAM,IAAI,UAAU,WAAW;AAErC,MAAI;AACF,YAAQ,QAAQ,eAAA;AAChB,UAAM,QAAQ;AAAA,MACZ,OAAO,IAAI,OAAO,UAAU;AAC1B,cAAM,IAAI,QAAA;AACV,YAAI;AAGF,kBAAQ,QAAQ,eAAA;AAChB,gBAAM,OAAO,MAAM,IAAI,SAAS,YAAY,UAAA,GAAa,YAAY,gBAAgB;AAAA,YACnF,cAAc,QAAQ;AAAA;AAAA;AAAA,YAGtB,aAAaA,OAAS,WAAW;AAAA,YACjC,YAAY,MAAM;AAAA,YAClB,OAAO,gBAAgB,MAAM,OAAO,MAAM,GAAG;AAAA,YAC7C,GAAI,QAAQ,+BAA+B,SACvC,EAAE,4BAA4B,QAAQ,2BAAA,IACtC,CAAA;AAAA,YACJ,GAAI,QAAQ,oCAAoC,SAC5C,EAAE,iCAAiC,QAAQ,oCAC3C,CAAA;AAAA,UAAC,CACN;AACD,oBAAU,MAAM,aAAa,CAAC,IAAI,KAAK;AAAA,QACzC,UAAA;AACE,cAAI,QAAA;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IAAA;AAGH,YAAQ,QAAQ,eAAA;AAChB,WAAO,MAAM,IAAI,gBAAgB,YAAY,aAAa,YAAY,gBAAgB;AAAA,MACpF,QAAQ;AAAA,MACR,eAAe;AAAA,IAAA,CAChB;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,0BAA0B,KAAK,aAAa,WAAW;AAC7D,UAAM;AAAA,EACR;AACF;"}
1
+ {"version":3,"file":"large.js","names":[],"sources":["../../src/copy/large.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport { type FileVersion, MetadataDirective } from '../types/file.ts'\nimport { type BucketId, type FileId, fileId as fileIdOf, type LargeFileId } from '../types/ids.ts'\nimport {\n createAbortScope,\n raceWithAbort,\n throwRejectedOrAbortReason,\n} from '../upload/abort-scope.ts'\nimport {\n type CleanupFailureListener,\n cancelLargeFileBestEffort,\n cleanupAfterLargeFileError,\n} from '../upload/cancel.ts'\nimport { Semaphore } from '../upload/concurrency.ts'\nimport { finishLargeFileWithAbortReconciliation } from '../upload/finish.ts'\nimport { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from '../util/defaults.ts'\nimport { byteRangeHeader, planRanges } from '../util/plan-ranges.ts'\n\n/** Options for a server-side multipart copy. */\nexport interface CopyLargeFileOptions {\n /** ID of the source file version to copy. */\n readonly sourceFileId: FileId\n /** Destination file name in the target bucket. */\n readonly fileName: string\n /** Target bucket. Defaults to the source's bucket. */\n readonly destinationBucketId?: BucketId\n /** Size of each part in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /**\n * Maximum number of parts copied in parallel. Defaults to\n * {@link DEFAULT_TRANSFER_CONCURRENCY}.\n */\n readonly concurrency?: number\n /** MIME type for the destination file. Defaults to `b2/x-auto`. */\n readonly contentType?: string\n /** Custom file info merged into the destination. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to the destination. */\n readonly destinationServerSideEncryption?: EncryptionSetting\n /** SSE-C settings used to read the source if it was uploaded with SSE-C. */\n readonly sourceServerSideEncryption?: EncryptionSetting\n /**\n * Callback invoked if best-effort cancellation fails, or if cancellation is\n * skipped because `b2_finish_large_file` may already have committed.\n */\n readonly onCleanupFailure?: CleanupFailureListener\n /**\n * Optional abort signal. Checked before dispatching each part and\n * between parts; an aborted signal cancels remaining parts and rolls\n * back the unfinished large file via best-effort `cancelLargeFile`.\n *\n * Aborting does NOT roll back parts already accepted by B2; those\n * exist on the unfinished large file until the cancel call completes\n * or B2's lifecycle expires the in-progress upload (24 hours).\n */\n readonly signal?: AbortSignal\n}\n\n/**\n * Performs a server-side copy of a file using the multipart `b2_copy_part` protocol.\n * The source bytes never traverse the client; B2 copies each range internally.\n *\n * Falls back to a single `copyFile` call when the source fits in one part.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state (used to resolve API URL, recommended part size).\n * @param options - Copy parameters including source, destination, and concurrency.\n *\n * @returns The resulting destination {@link FileVersion}.\n */\nexport async function copyLargeFile(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: CopyLargeFileOptions,\n): Promise<FileVersion> {\n options.signal?.throwIfAborted()\n const recommendedPartSize = accountInfo.getRecommendedPartSize()\n const minPartSize = accountInfo.getAbsoluteMinimumPartSize()\n const partSize = Math.max(options.partSize ?? recommendedPartSize, minPartSize)\n const concurrency = options.concurrency ?? DEFAULT_TRANSFER_CONCURRENCY\n\n // Discover the source size via getFileInfo.\n const sourceInfo = await raw.getFileInfo(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: options.sourceFileId,\n })\n const totalSize = sourceInfo.contentLength\n\n // Below the part threshold, take the single-call fast path.\n if (totalSize <= partSize) {\n options.signal?.throwIfAborted()\n // `b2_copy_file` only accepts replacement contentType/fileInfo under\n // `metadataDirective: REPLACE`; supplying them in the default COPY mode is\n // rejected by B2. When the caller sets either, switch to REPLACE with a\n // required contentType (the override, else the source's, else b2/x-auto),\n // matching the multipart path's metadata semantics below.\n const replaceMetadata = options.contentType !== undefined || options.fileInfo !== undefined\n return raw.copyFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n sourceFileId: options.sourceFileId,\n fileName: options.fileName,\n ...(options.destinationBucketId !== undefined\n ? { destinationBucketId: options.destinationBucketId }\n : {}),\n ...(replaceMetadata\n ? {\n metadataDirective: MetadataDirective.Replace,\n contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo: options.fileInfo ?? {},\n }\n : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n },\n options.signal !== undefined ? { signal: options.signal } : undefined,\n )\n }\n\n // Resolve destination bucket (defaults to source's bucket). Both operands\n // are already typed `BucketId`, so no cast is needed.\n const destBucketId = options.destinationBucketId ?? sourceInfo.bucketId\n\n const ranges = planRanges(totalSize, partSize)\n const partSha1s: string[] = new Array(ranges.length)\n const sem = new Semaphore(concurrency)\n const abortScope = createAbortScope(options.signal)\n let largeFileId: LargeFileId | undefined\n\n try {\n abortScope.signal.throwIfAborted()\n const startPromise = raw.startLargeFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n bucketId: destBucketId,\n fileName: options.fileName,\n contentType: options.contentType ?? sourceInfo.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo: options.fileInfo ?? {},\n ...(options.destinationServerSideEncryption !== undefined\n ? { serverSideEncryption: options.destinationServerSideEncryption }\n : {}),\n },\n { signal: abortScope.signal },\n )\n try {\n const startResp = await raceWithAbort(startPromise, abortScope.signal)\n largeFileId = startResp.fileId\n } catch (err) {\n if (abortScope.signal.aborted) {\n cancelLargeFileAfterStart(startPromise, raw, accountInfo, options.onCleanupFailure)\n }\n throw err\n }\n const startedLargeFileId = largeFileId\n if (startedLargeFileId === undefined) {\n throw new Error('copyLargeFile: start did not return a large file ID.')\n }\n\n const tasks = ranges.map(async (range) => {\n await sem.acquire()\n try {\n abortScope.signal.throwIfAborted()\n const copyPromise = raw.copyPart(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n {\n sourceFileId: options.sourceFileId,\n // `startLargeFile` returns `LargeFileId`; `copyPart` takes the\n // same value typed as `FileId`. Re-brand via the factory.\n largeFileId: fileIdOf(startedLargeFileId),\n partNumber: range.partNumber,\n range: byteRangeHeader(range.start, range.end),\n ...(options.sourceServerSideEncryption !== undefined\n ? { sourceServerSideEncryption: options.sourceServerSideEncryption }\n : {}),\n ...(options.destinationServerSideEncryption !== undefined\n ? { destinationServerSideEncryption: options.destinationServerSideEncryption }\n : {}),\n },\n { signal: abortScope.signal },\n )\n const resp = await raceWithAbort(copyPromise, abortScope.signal)\n partSha1s[range.partNumber - 1] = resp.contentSha1\n } catch (err) {\n abortScope.abort(err)\n throw err\n } finally {\n sem.release()\n }\n })\n\n throwRejectedOrAbortReason(await Promise.allSettled(tasks), abortScope)\n\n return await finishLargeFileWithAbortReconciliation(raw, accountInfo, {\n fileId: startedLargeFileId,\n bucketId: destBucketId,\n fileName: options.fileName,\n partSha1s,\n signal: abortScope.signal,\n })\n } catch (err) {\n abortScope.abort(err)\n if (largeFileId === undefined) throw err\n return await cleanupAfterLargeFileError(err, raw, accountInfo, {\n fileId: largeFileId,\n bucketId: destBucketId,\n fileName: options.fileName,\n signal: options.signal,\n onCleanupFailure: options.onCleanupFailure,\n })\n } finally {\n abortScope.dispose()\n }\n}\n\nfunction cancelLargeFileAfterStart(\n started: Promise<{ readonly fileId: LargeFileId }>,\n raw: RawClient,\n accountInfo: AccountInfo,\n onCleanupFailure: CleanupFailureListener | undefined,\n): void {\n void started\n .then((resp) =>\n cancelLargeFileBestEffort(\n raw,\n accountInfo,\n resp.fileId,\n onCleanupFailure === undefined ? undefined : { onCleanupFailure },\n ),\n )\n .catch(() => {\n // If start failed, no file ID is available to cancel.\n })\n}\n"],"mappings":"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"}