@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 +1 @@
1
- {"version":3,"file":"large.js","sources":["../../src/upload/large.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport { IncrementalSha1 } from '../streams/hash.ts'\nimport type { ProgressListener } from '../streams/progress.ts'\nimport { ProgressTracker } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { FileVersion } from '../types/file.ts'\nimport type { BucketId, LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from '../util/defaults.ts'\nimport { type RangePlan, planRanges } from '../util/plan-ranges.ts'\nimport { cancelLargeFileBestEffort } from './cancel.ts'\nimport { Semaphore } from './concurrency.ts'\nimport { collectPartSha1s, findResumeCandidate } from './resume.ts'\n\n/** Options for uploading a large file via the multipart protocol. */\nexport interface UploadLargeFileOptions {\n /** Target bucket for the upload. */\n readonly bucketId: BucketId\n /** Full B2 file name including any path prefix. */\n readonly fileName: string\n /**\n * Content to upload. Sliceable sources ({@link BufferSource},\n * {@link BlobSource}) use the parallel-parts path. Non-sliceable\n * sources ({@link StreamSource}) fall back to a sequential read path\n * — one part at a time, concurrency forced to 1 — so callers can\n * stream a multi-GB file without buffering the whole payload in\n * memory. The `resume` / `resumeFileId` options require a sliceable\n * source; they throw on a `StreamSource`.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `b2/x-auto` for server-side detection. */\n readonly contentType?: string\n /** Custom file info key/value pairs stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy applied at upload time. */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status applied at upload time. */\n readonly legalHold?: LegalHoldValue\n /** Size of each part in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress updates. */\n readonly onProgress?: ProgressListener\n /** Signal to abort the upload. Triggers cancellation of the large file. */\n readonly signal?: AbortSignal\n /**\n * If true, look for an unfinished large file with the same bucket and file name\n * and skip parts whose locally-recomputed SHA-1 matches the server's.\n */\n readonly resume?: boolean\n /**\n * Explicit large file ID to resume into. Overrides {@link resume} discovery\n * but the local `partSize` must still match the server's plan.\n */\n readonly resumeFileId?: LargeFileId\n}\n\n/**\n * Uploads a file using the B2 multipart (large file) protocol.\n *\n * The source is sliced into parts and uploaded concurrently via\n * `b2_upload_part`. This is appropriate for files larger than the recommended\n * part size. For smaller files, use {@link uploadSmallFile} which sends the\n * entire payload in a single request.\n *\n * On failure, the in-progress large file is cancelled on a best-effort basis.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state (tokens, URLs, upload URL pool).\n * @param options - Upload parameters including part size and concurrency.\n *\n * @returns The resulting {@link FileVersion} metadata.\n */\nexport async function uploadLargeFile(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: UploadLargeFileOptions,\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 const totalSize = options.source.size\n\n const parts = planRanges(totalSize, partSize)\n const fileInfo: Record<string, string> = { ...options.fileInfo }\n\n // Construct the `b2_start_large_file` request body once so the two\n // non-resume branches below (no `resume`, resume-but-no-candidate)\n // can dispatch without re-spelling the conditional spreads.\n const startLargeFileRequest = {\n bucketId: options.bucketId,\n fileName: options.fileName,\n contentType: options.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo,\n ...(options.serverSideEncryption !== undefined\n ? { serverSideEncryption: options.serverSideEncryption }\n : {}),\n ...(options.fileRetention !== undefined ? { fileRetention: options.fileRetention } : {}),\n ...(options.legalHold !== undefined ? { legalHold: options.legalHold } : {}),\n }\n\n // --- Resume discovery (M11.1) ---\n let largeFileId: LargeFileId\n let preUploaded: ReadonlyMap<number, string>\n\n if (options.resumeFileId !== undefined) {\n largeFileId = options.resumeFileId\n preUploaded = await collectPartSha1s(raw, accountInfo, largeFileId)\n } else if (options.resume === true) {\n const candidate = await findResumeCandidate(\n raw,\n accountInfo,\n options.bucketId,\n options.fileName,\n )\n if (candidate) {\n largeFileId = candidate.fileId\n preUploaded = candidate.uploadedPartSha1s\n } else {\n const startResp = await raw.startLargeFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n startLargeFileRequest,\n )\n largeFileId = startResp.fileId\n preUploaded = new Map<number, string>()\n }\n } else {\n const startResp = await raw.startLargeFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n startLargeFileRequest,\n )\n largeFileId = startResp.fileId\n preUploaded = new Map<number, string>()\n }\n\n const partSha1s: string[] = new Array(parts.length)\n const tracker = new ProgressTracker(options.onProgress, totalSize, parts.length)\n const sem = new Semaphore(concurrency)\n\n // Non-sliceable sources (e.g. `StreamSource` wrapping a Node\n // `Readable.toWeb`) can't be read in parallel — there's only one\n // forward-only cursor. Resume is also impossible (no seek). Bail to a\n // sequential read loop instead. Each part is buffered, hashed,\n // shipped, then dropped before the next read starts, so the peak\n // memory footprint is ~partSize bytes regardless of total file size.\n if (!options.source.canSlice) {\n if (options.resume === true || options.resumeFileId !== undefined) {\n // Cancel the unfinished large file before throwing so the caller\n // doesn't have to clean it up themselves.\n await cancelLargeFileBestEffort(raw, accountInfo, largeFileId)\n throw new Error(\n 'uploadLargeFile: resume is not supported on non-sliceable sources (e.g. StreamSource).',\n )\n }\n try {\n await uploadPartsSequentially(\n raw,\n accountInfo,\n options,\n largeFileId,\n parts,\n partSha1s,\n tracker,\n )\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\n try {\n const tasks = parts.map(async (part) => {\n await sem.acquire()\n try {\n options.signal?.throwIfAborted()\n\n const partSource = options.source.slice(part.offset, part.offset + part.length)\n const data = new Uint8Array(await partSource.toArrayBuffer())\n\n const partSha1 = new IncrementalSha1()\n await partSha1.update(data)\n const sha1Hex = await partSha1.digest()\n\n // Resume short-circuit: server already has this part with matching SHA-1\n const serverSha1 = preUploaded.get(part.partNumber)\n if (serverSha1 !== undefined && serverSha1 === sha1Hex) {\n partSha1s[part.partNumber - 1] = serverSha1\n tracker.addBytes(data.byteLength)\n tracker.completePart()\n return\n }\n\n let uploadEntry = accountInfo.checkoutPartUploadUrl(largeFileId)\n if (!uploadEntry) {\n const resp = await raw.getUploadPartUrl(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n { fileId: largeFileId },\n )\n uploadEntry = { uploadUrl: resp.uploadUrl, authorizationToken: resp.authorizationToken }\n }\n\n try {\n const result = await raw.uploadPart(\n uploadEntry.uploadUrl,\n {\n authorization: uploadEntry.authorizationToken,\n partNumber: part.partNumber,\n contentLength: data.byteLength,\n contentSha1: sha1Hex,\n ...(options.serverSideEncryption !== undefined\n ? { serverSideEncryption: options.serverSideEncryption }\n : {}),\n },\n data,\n options.signal,\n )\n\n accountInfo.returnPartUploadUrl(largeFileId, uploadEntry)\n partSha1s[part.partNumber - 1] = result.contentSha1\n tracker.addBytes(data.byteLength)\n tracker.completePart()\n } catch (err) {\n accountInfo.evictPartUploadUrl(largeFileId, uploadEntry)\n throw err\n }\n } finally {\n sem.release()\n }\n })\n\n await Promise.all(tasks)\n\n const result = await raw.finishLargeFile(accountInfo.getApiUrl(), accountInfo.getAuthToken(), {\n fileId: largeFileId,\n partSha1Array: partSha1s,\n })\n\n return result\n } catch (err) {\n await cancelLargeFileBestEffort(raw, accountInfo, largeFileId)\n throw err\n }\n}\n\n/**\n * Sequential upload path for non-sliceable sources (`StreamSource`).\n *\n * Reads the source's `stream()` once and accumulates exactly `partSize`\n * bytes into an in-memory buffer per iteration. Each filled buffer is\n * hashed, dispatched to `b2_upload_part`, then released before the next\n * part starts — so peak memory is ~partSize regardless of file size.\n *\n * Concurrency is forced to 1 here because the stream is a single\n * forward-only cursor; the engine can't read part N+1 until part N is\n * fully consumed.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state.\n * @param options - The original `uploadLargeFile` options.\n * @param largeFileId - ID of the in-progress large file (already started).\n * @param parts - Pre-planned part layout (used for part numbers + count).\n * @param partSha1s - Output array, written in-place at index `partNumber - 1`.\n * @param tracker - Progress tracker; bytes added per chunk, part completed\n * each time a part finishes.\n */\nasync function uploadPartsSequentially(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: UploadLargeFileOptions,\n largeFileId: LargeFileId,\n parts: readonly RangePlan[],\n partSha1s: string[],\n tracker: ProgressTracker,\n): Promise<void> {\n const reader = options.source.stream().getReader()\n let partNumber = 1\n // Carry-over bytes from a previous read when the read returned more\n // than we needed to fill one part. Kept as an array to avoid an\n // allocation per loop iteration on a typical multi-part upload.\n let carry: Uint8Array | null = null\n\n try {\n for (const planned of parts) {\n options.signal?.throwIfAborted()\n\n const buf = new Uint8Array(planned.length)\n let filled = 0\n\n if (carry !== null) {\n const take = Math.min(carry.byteLength, buf.byteLength - filled)\n buf.set(carry.subarray(0, take), filled)\n filled += take\n carry = take < carry.byteLength ? carry.subarray(take) : null\n }\n\n while (filled < buf.byteLength) {\n const { done, value } = await reader.read()\n if (done) break\n const take = Math.min(value.byteLength, buf.byteLength - filled)\n buf.set(value.subarray(0, take), filled)\n filled += take\n if (take < value.byteLength) {\n carry = value.subarray(take)\n }\n }\n\n // For the LAST part the stream may run dry mid-buffer, leaving a\n // shorter chunk. B2 accepts a final part smaller than `partSize`.\n const data = filled === buf.byteLength ? buf : buf.subarray(0, filled)\n /* v8 ignore start -- defensive: only fires when the source's advertised\n size over-reports the actual emitted byte count, which a well-behaved\n ContentSource implementation cannot do. Kept so callers feeding the\n engine a buggy custom stream get an actionable error rather than a\n B2 wire-level failure. */\n if (data.byteLength === 0) {\n throw new Error(\n `uploadLargeFile: source stream ended before part ${partNumber}; advertised size does not match emitted bytes.`,\n )\n }\n /* v8 ignore stop */\n\n const partSha1 = new IncrementalSha1()\n await partSha1.update(data)\n const sha1Hex = await partSha1.digest()\n\n let uploadEntry = accountInfo.checkoutPartUploadUrl(largeFileId)\n if (!uploadEntry) {\n const resp = await raw.getUploadPartUrl(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n { fileId: largeFileId },\n )\n uploadEntry = { uploadUrl: resp.uploadUrl, authorizationToken: resp.authorizationToken }\n }\n\n try {\n const result = await raw.uploadPart(\n uploadEntry.uploadUrl,\n {\n authorization: uploadEntry.authorizationToken,\n partNumber: planned.partNumber,\n contentLength: data.byteLength,\n contentSha1: sha1Hex,\n ...(options.serverSideEncryption !== undefined\n ? { serverSideEncryption: options.serverSideEncryption }\n : {}),\n },\n data,\n options.signal,\n )\n\n accountInfo.returnPartUploadUrl(largeFileId, uploadEntry)\n partSha1s[planned.partNumber - 1] = result.contentSha1\n tracker.addBytes(data.byteLength)\n tracker.completePart()\n } catch (err) {\n accountInfo.evictPartUploadUrl(largeFileId, uploadEntry)\n throw err\n }\n\n partNumber++\n }\n } finally {\n // Releasing the lock lets the underlying stream propagate close /\n // error events to any upstream producer (e.g. a Node `Readable`).\n reader.releaseLock()\n }\n}\n"],"names":["result"],"mappings":"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"}
1
+ {"version":3,"file":"large.js","names":[],"sources":["../../src/upload/large.ts"],"sourcesContent":["import type { AccountInfo } from '../auth/account-info.ts'\nimport type { RawClient } from '../raw/index.ts'\nimport { IncrementalSha1 } from '../streams/hash.ts'\nimport type { ProgressListener } from '../streams/progress.ts'\nimport { ProgressTracker } from '../streams/progress.ts'\nimport { type ContentSource, readNextNonEmptyStreamChunk } from '../streams/source.ts'\nimport type { BucketRetentionPolicy } from '../types/bucket.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { FileVersion } from '../types/file.ts'\nimport type { BucketId, LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport { DEFAULT_CONTENT_TYPE, DEFAULT_TRANSFER_CONCURRENCY } from '../util/defaults.ts'\nimport { planRanges, type RangePlan } from '../util/plan-ranges.ts'\nimport { createAbortScope, raceWithAbort, throwRejectedOrAbortReason } from './abort-scope.ts'\nimport {\n type CleanupFailureOptions,\n cancelLargeFileBestEffort,\n cleanupAfterLargeFileError,\n} from './cancel.ts'\nimport { Semaphore } from './concurrency.ts'\nimport { finishLargeFileWithAbortReconciliation } from './finish.ts'\nimport {\n findResumeCandidate,\n type ResumeCandidateCriteria,\n type ResumeCandidateRejectedListener,\n ResumeFileIdMismatchError,\n} from './resume.ts'\nimport {\n resolveRetryResponseBodyFailures,\n type UploadRetryOptions,\n uploadPartWithFreshUrl,\n} from './retry.ts'\n\n/** Event emitted when explicit resume skips a local part because B2 already has matching SHA-1 bytes. */\nexport interface ResumePartReusedEvent {\n /** File name being resumed. */\n readonly fileName: string\n /** Unfinished large-file ID that supplied the existing part. */\n readonly fileId: LargeFileId\n /** One-based part number reused from the unfinished large file. */\n readonly partNumber: number\n /** Number of bytes in the reused part. */\n readonly contentLength: number\n /** SHA-1 hex digest that matched the local part bytes. */\n readonly contentSha1: string\n}\n\n/** Callback invoked when explicit resume accepts a pre-existing server part. */\nexport type ResumePartReusedListener = (event: ResumePartReusedEvent) => void\n\nconst MAX_CONSECUTIVE_EMPTY_STREAM_CHUNKS = 1024\n\n/** Options for uploading a large file via the multipart protocol. */\nexport interface UploadLargeFileOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** Target bucket for the upload. */\n readonly bucketId: BucketId\n /** Full B2 file name including any path prefix. */\n readonly fileName: string\n /**\n * Content to upload. Sliceable sources ({@link BufferSource},\n * {@link BlobSource}, {@link FileSource}) use the parallel-parts path.\n * Non-sliceable streams and async iterables fall back to a sequential read\n * path — one part at a time, concurrency forced to 1 — so callers can stream\n * a multi-GB file without buffering the whole payload in memory. The\n * `resumeFileId` requires a sliceable source; deprecated `resume: true`\n * without an explicit file ID is ignored on forward-only sources.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `b2/x-auto` for server-side detection. */\n readonly contentType?: string\n /** Custom file info key/value pairs stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /** Effective bucket default encryption used when serverSideEncryption is omitted. */\n readonly bucketDefaultServerSideEncryption?: EncryptionSetting\n /** File retention policy applied at upload time. */\n readonly fileRetention?: FileRetentionValue\n /** Effective readable bucket default retention used when fileRetention is omitted. */\n readonly bucketDefaultRetention?: BucketRetentionPolicy\n /** Bucket default retention exists but cannot be read, so resume must fail closed. */\n readonly bucketDefaultRetentionUnreadable?: boolean\n /** Legal hold status applied at upload time. */\n readonly legalHold?: LegalHoldValue\n /** Size of each part in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress updates. */\n readonly onProgress?: ProgressListener\n /** Signal to abort the upload. Triggers cancellation of the large file. */\n readonly signal?: AbortSignal\n /**\n * If true, look for an unfinished large file with the same bucket and file name\n * and continue uploading into it. Automatic discovery only reuses unfinished\n * files whose upload options and already-uploaded part lengths match;\n * otherwise a new large file is started. Existing server parts are overwritten\n * with locally read bytes instead of being trusted by SHA-1 alone.\n *\n * Discovery runs before the first upload byte and can make up to the\n * list-page budget plus the candidate budget times the part-page budget in\n * sequential B2 list calls. Pass `resumeDiscoveryTimeoutMs` or an\n * `AbortSignal` to enforce a hard discovery deadline. SSE-C uploads are\n * never auto-resumed because B2 does not expose the customer key identity\n * needed to verify a compatible unfinished file. Candidates with unreadable\n * Object Lock fields are rejected unless the caller provides explicit\n * settings that can be verified.\n */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /**\n * Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. Defaults to 10.\n * If the scan truncates, resume falls back to a fresh upload and\n * `onResumeCandidateRejected` is the only SDK signal.\n */\n readonly resumeMaxListPages?: number\n /**\n * Maximum metadata-compatible candidates whose parts may be listed before upload starts. Defaults to 25.\n * Hitting the limit can leave older unfinished uploads orphaned while a fresh\n * large file is started; tune for high-churn buckets.\n */\n readonly resumeMaxPartCandidates?: number\n /**\n * Maximum `b2_list_parts` pages inspected per metadata-compatible candidate before upload starts. Defaults to 10.\n * A candidate whose parts exceed this bound is skipped and reported through\n * `onResumeCandidateRejected`.\n */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit large file ID to resume into. Overrides {@link resume} discovery\n * after verifying that the ID belongs to the requested bucket/file name and\n * matches the current upload options and already-uploaded part lengths. This\n * verification also rejects SSE-C uploads because B2 does not expose\n * customer key identity for unfinished files. A mismatch, or a file ID that\n * cannot be verified through B2's unfinished-large-file listing, throws\n * {@link ResumeFileIdMismatchError}. Unreadable Object Lock fields reject\n * the candidate.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\ninterface StartLargeFileResumeRequest {\n readonly contentType: string\n readonly fileInfo: Record<string, string>\n readonly serverSideEncryption?: EncryptionSetting\n readonly fileRetention?: FileRetentionValue\n readonly legalHold?: LegalHoldValue\n}\n\nfunction createResumeCandidateCriteria(\n options: UploadLargeFileOptions,\n request: StartLargeFileResumeRequest,\n totalSize: number,\n partSize: number,\n parts: readonly RangePlan[],\n): ResumeCandidateCriteria {\n return {\n contentType: request.contentType,\n fileInfo: request.fileInfo,\n sourceSize: totalSize,\n partSize,\n parts,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n ...(request.serverSideEncryption !== undefined\n ? { serverSideEncryption: request.serverSideEncryption }\n : options.bucketDefaultServerSideEncryption !== undefined\n ? { serverSideEncryption: options.bucketDefaultServerSideEncryption }\n : {}),\n ...(request.fileRetention !== undefined\n ? { fileRetention: request.fileRetention }\n : options.bucketDefaultRetention !== undefined\n ? { defaultFileRetention: options.bucketDefaultRetention }\n : options.bucketDefaultRetentionUnreadable === true\n ? { defaultFileRetentionUnreadable: true }\n : {}),\n ...(request.legalHold !== undefined ? { legalHold: request.legalHold } : {}),\n ...(options.resumeDiscoveryTimeoutMs !== undefined\n ? { discoveryTimeoutMs: options.resumeDiscoveryTimeoutMs }\n : {}),\n ...(options.onResumeCandidateRejected !== undefined\n ? { onCandidateRejected: options.onResumeCandidateRejected }\n : {}),\n ...(options.resumeMaxListPages !== undefined\n ? { maxListPages: options.resumeMaxListPages }\n : {}),\n ...(options.resumeMaxPartCandidates !== undefined\n ? { maxPartCandidates: options.resumeMaxPartCandidates }\n : {}),\n ...(options.resumeMaxPartPages !== undefined\n ? { maxPartPages: options.resumeMaxPartPages }\n : {}),\n }\n}\n\n/**\n * Uploads a file using the B2 multipart (large file) protocol.\n *\n * The source is sliced into parts and uploaded concurrently via\n * `b2_upload_part`. This is appropriate for files larger than the recommended\n * part size. For smaller files, use {@link uploadSmallFile} which sends the\n * entire payload in a single request.\n *\n * On failure, the in-progress large file is cancelled on a best-effort basis.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state (tokens, URLs, upload URL pool).\n * @param options - Upload parameters including part size and concurrency.\n *\n * @returns The resulting {@link FileVersion} metadata.\n */\nexport async function uploadLargeFile(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: UploadLargeFileOptions,\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 const totalSize = options.source.size\n\n const parts = planRanges(totalSize, partSize)\n // Keep caller fileInfo on a null-prototype record so resume identity\n // comparison only sees caller-owned enumerable keys.\n const fileInfo: Record<string, string> = Object.create(null)\n if (options.fileInfo !== undefined) {\n for (const [key, value] of Object.entries(options.fileInfo)) {\n fileInfo[key] = value\n }\n }\n\n // Construct the `b2_start_large_file` request body once so the two\n // non-resume branches below (no `resume`, resume-but-no-candidate)\n // can dispatch without re-spelling the conditional spreads.\n const startLargeFileRequest = {\n bucketId: options.bucketId,\n fileName: options.fileName,\n contentType: options.contentType ?? DEFAULT_CONTENT_TYPE,\n fileInfo,\n ...(options.serverSideEncryption !== undefined\n ? { serverSideEncryption: options.serverSideEncryption }\n : {}),\n ...(options.fileRetention !== undefined ? { fileRetention: options.fileRetention } : {}),\n ...(options.legalHold !== undefined ? { legalHold: options.legalHold } : {}),\n }\n const resumeCandidateCriteria = createResumeCandidateCriteria(\n options,\n startLargeFileRequest,\n totalSize,\n partSize,\n parts,\n )\n\n if (!options.source.canSlice && options.resumeFileId !== undefined) {\n throw new Error('uploadLargeFile: resume is not supported on non-sliceable sources.')\n }\n\n // --- Explicit resume file reuse (M11.1) ---\n let largeFileId: LargeFileId | undefined\n let preUploaded: ReadonlyMap<number, string> = new Map()\n let createdLargeFile = false\n const abortScope = createAbortScope(options.signal)\n const startFreshLargeFile = async (): Promise<void> => {\n if (abortScope.signal.aborted && !options.source.canSlice) {\n await cancelForwardOnlySource(options.source, abortScope.signal.reason)\n }\n abortScope.signal.throwIfAborted()\n const startPromise = raw.startLargeFile(\n accountInfo.getApiUrl(),\n accountInfo.getAuthToken(),\n startLargeFileRequest,\n {\n signal: abortScope.signal,\n ...(options.retry !== undefined ? { retry: options.retry } : {}),\n },\n )\n try {\n const startResp = await raceWithAbort(startPromise, abortScope.signal)\n largeFileId = startResp.fileId\n } catch (err) {\n if (abortScope.signal.aborted) {\n if (!options.source.canSlice) {\n await cancelForwardOnlySource(options.source, abortScope.signal.reason).catch(() => {})\n }\n cancelLargeFileAfterStart(startPromise, raw, accountInfo, options.onCleanupFailure)\n }\n throw err\n }\n preUploaded = new Map<number, string>()\n createdLargeFile = true\n }\n\n try {\n if (abortScope.signal.aborted && !options.source.canSlice) {\n await cancelForwardOnlySource(options.source, abortScope.signal.reason)\n }\n abortScope.signal.throwIfAborted()\n if (options.resumeFileId !== undefined) {\n const candidate = await findResumeCandidate(\n raw,\n accountInfo,\n options.bucketId,\n options.fileName,\n {\n ...resumeCandidateCriteria,\n resumeFileId: options.resumeFileId,\n },\n )\n if (candidate === null) {\n throw new ResumeFileIdMismatchError(options.resumeFileId, options.fileName)\n }\n largeFileId = candidate.fileId\n preUploaded = candidate.uploadedPartSha1s\n } else if (options.resume === true && options.source.canSlice) {\n const candidate = await findResumeCandidate(\n raw,\n accountInfo,\n options.bucketId,\n options.fileName,\n resumeCandidateCriteria,\n )\n if (candidate) {\n largeFileId = candidate.fileId\n preUploaded = new Map<number, string>()\n } else {\n await startFreshLargeFile()\n }\n } else {\n await startFreshLargeFile()\n }\n const activeLargeFileId = largeFileId\n if (activeLargeFileId === undefined) {\n throw new Error('uploadLargeFile: start did not return a large file ID.')\n }\n\n const partSha1s: string[] = new Array(parts.length)\n const tracker = new ProgressTracker(options.onProgress, totalSize, parts.length)\n const sem = new Semaphore(concurrency)\n\n // Non-sliceable sources can't be read in parallel — there's only one\n // forward-only cursor. Resume is also impossible (no seek). Bail to a\n // sequential read loop instead. Each part is buffered, hashed, shipped,\n // then dropped before the next read starts, so the peak memory footprint is\n // ~partSize bytes regardless of total file size.\n if (!options.source.canSlice) {\n await uploadPartsSequentially(\n raw,\n accountInfo,\n options,\n activeLargeFileId,\n parts,\n partSha1s,\n tracker,\n abortScope.signal,\n )\n return await finishLargeFileWithAbortReconciliation(raw, accountInfo, {\n fileId: activeLargeFileId,\n bucketId: options.bucketId,\n fileName: options.fileName,\n partSha1s,\n signal: abortScope.signal,\n ...(options.retry !== undefined ? { retry: options.retry } : {}),\n })\n }\n\n const tasks = parts.map(async (part) => {\n await sem.acquire()\n try {\n abortScope.signal.throwIfAborted()\n\n const partSource = options.source.slice(part.offset, part.offset + part.length)\n const data = new Uint8Array(await partSource.toArrayBuffer({ signal: abortScope.signal }))\n abortScope.signal.throwIfAborted()\n\n const partSha1 = new IncrementalSha1()\n await partSha1.update(data)\n const sha1Hex = await partSha1.digest()\n abortScope.signal.throwIfAborted()\n\n // Explicit resume is the only mode that trusts an already-uploaded\n // server part enough to skip sending the local bytes again.\n const serverSha1 = preUploaded.get(part.partNumber)\n if (serverSha1 !== undefined && serverSha1 === sha1Hex) {\n notifyResumePartReused(options.onResumePartReused, {\n fileName: options.fileName,\n fileId: activeLargeFileId,\n partNumber: part.partNumber,\n contentLength: data.byteLength,\n contentSha1: serverSha1,\n })\n partSha1s[part.partNumber - 1] = serverSha1\n tracker.addBytes(data.byteLength)\n tracker.completePart()\n return\n }\n\n const result = await uploadPartWithFreshUrl(raw, accountInfo, activeLargeFileId, {\n fileName: options.fileName,\n partNumber: part.partNumber,\n data,\n contentLength: data.byteLength,\n contentSha1: sha1Hex,\n retry: options.retry,\n signal: abortScope.signal,\n onUploadRetry: options.onUploadRetry,\n retryResponseBodyFailures: resolveRetryResponseBodyFailures(\n options.retryResponseBodyFailures,\n ),\n ...(options.serverSideEncryption !== undefined\n ? { serverSideEncryption: options.serverSideEncryption }\n : {}),\n })\n\n partSha1s[part.partNumber - 1] = result.contentSha1\n tracker.addBytes(data.byteLength)\n tracker.completePart()\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 const result = await finishLargeFileWithAbortReconciliation(raw, accountInfo, {\n fileId: activeLargeFileId,\n bucketId: options.bucketId,\n fileName: options.fileName,\n partSha1s,\n signal: abortScope.signal,\n ...(options.retry !== undefined ? { retry: options.retry } : {}),\n })\n\n return result\n } catch (err) {\n abortScope.abort(err)\n if (largeFileId === undefined) throw err\n return await cleanupAfterUploadLargeFileError(\n err,\n raw,\n accountInfo,\n options,\n largeFileId,\n createdLargeFile,\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: CleanupFailureOptions['onCleanupFailure'],\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\nasync function cleanupAfterUploadLargeFileError(\n err: unknown,\n raw: RawClient,\n accountInfo: AccountInfo,\n options: UploadLargeFileOptions,\n largeFileId: LargeFileId,\n createdLargeFile: boolean,\n): Promise<never> {\n return await cleanupAfterLargeFileError(\n err,\n raw,\n accountInfo,\n {\n fileId: largeFileId,\n bucketId: options.bucketId,\n fileName: options.fileName,\n signal: options.signal,\n onCleanupFailure: options.onCleanupFailure,\n },\n { cancelOnError: createdLargeFile },\n )\n}\n\n/**\n * Sequential upload path for non-sliceable sources.\n *\n * Reads the source's `stream()` once and accumulates exactly `partSize`\n * bytes into an in-memory buffer per iteration. Each filled buffer is\n * hashed, dispatched to `b2_upload_part`, then released before the next\n * part starts — so peak memory is ~partSize regardless of file size.\n *\n * Concurrency is forced to 1 here because the stream is a single\n * forward-only cursor; the engine can't read part N+1 until part N is\n * fully consumed.\n *\n * @param raw - Low-level B2 API client.\n * @param accountInfo - Authorized account state.\n * @param options - The original `uploadLargeFile` options.\n * @param largeFileId - ID of the in-progress large file (already started).\n * @param parts - Pre-planned part layout (used for part numbers + count).\n * @param partSha1s - Output array, written in-place at index `partNumber - 1`.\n * @param tracker - Progress tracker; bytes added per chunk, part completed\n * each time a part finishes.\n * @param signal - Linked abort signal for source reads and part uploads.\n */\nasync function uploadPartsSequentially(\n raw: RawClient,\n accountInfo: AccountInfo,\n options: UploadLargeFileOptions,\n largeFileId: LargeFileId,\n parts: readonly RangePlan[],\n partSha1s: string[],\n tracker: ProgressTracker,\n signal: AbortSignal,\n): Promise<void> {\n const reader = options.source.stream().getReader()\n let bytesRead = 0\n // Carry-over bytes from a previous read when the read returned more\n // than we needed to fill one part. Kept as an array to avoid an\n // allocation per loop iteration on a typical multi-part upload.\n let carry: Uint8Array | null = null\n\n try {\n for (const planned of parts) {\n signal.throwIfAborted()\n\n const buf = new Uint8Array(planned.length)\n let filled = 0\n\n if (carry !== null) {\n const take = Math.min(carry.byteLength, buf.byteLength - filled)\n buf.set(carry.subarray(0, take), filled)\n filled += take\n carry = take < carry.byteLength ? carry.subarray(take) : null\n }\n\n while (filled < buf.byteLength) {\n const { done, value } = await readNextNonEmptyStreamChunk(reader, emptyChunkError(), signal)\n if (done) {\n throw new Error(\n `uploadLargeFile: source stream ended after ${bytesRead} bytes, expected ${options.source.size}.`,\n )\n }\n bytesRead += value.byteLength\n const take = Math.min(value.byteLength, buf.byteLength - filled)\n buf.set(value.subarray(0, take), filled)\n filled += take\n if (take < value.byteLength) {\n carry = value.subarray(take)\n }\n }\n\n signal.throwIfAborted()\n const data = buf\n\n const partSha1 = new IncrementalSha1()\n await partSha1.update(data)\n const sha1Hex = await partSha1.digest()\n signal.throwIfAborted()\n\n const result = await uploadPartWithFreshUrl(raw, accountInfo, largeFileId, {\n fileName: options.fileName,\n partNumber: planned.partNumber,\n data,\n contentLength: data.byteLength,\n contentSha1: sha1Hex,\n retry: options.retry,\n signal,\n onUploadRetry: options.onUploadRetry,\n retryResponseBodyFailures: resolveRetryResponseBodyFailures(\n options.retryResponseBodyFailures,\n ),\n ...(options.serverSideEncryption !== undefined\n ? { serverSideEncryption: options.serverSideEncryption }\n : {}),\n })\n\n partSha1s[planned.partNumber - 1] = result.contentSha1\n tracker.addBytes(data.byteLength)\n tracker.completePart()\n }\n if (carry !== null && carry.byteLength > 0) {\n throw new Error(tooManyBytesError(options.source.size))\n }\n const extra = await readNextNonEmptyStreamChunk(reader, emptyChunkError(), signal)\n if (!extra.done) {\n bytesRead += extra.value.byteLength\n throw new Error(tooManyBytesError(options.source.size))\n }\n } catch (err) {\n await reader.cancel(err).catch(() => {})\n throw err\n } finally {\n // Releasing the lock lets the underlying stream propagate close / error\n // events to any upstream producer (e.g. a Node `Readable`).\n reader.releaseLock()\n }\n}\n\nfunction emptyChunkError(): string {\n return `uploadLargeFile: source stream emitted more than ${MAX_CONSECUTIVE_EMPTY_STREAM_CHUNKS} consecutive empty chunks. too many empty chunks.`\n}\n\nfunction tooManyBytesError(advertisedSize: number): string {\n return `uploadLargeFile: source stream emitted more than advertised ${advertisedSize} bytes. source stream emitted more bytes than advertised size.`\n}\n\nasync function cancelForwardOnlySource(source: ContentSource, reason: unknown): Promise<void> {\n const reader = source.stream().getReader()\n try {\n await reader.cancel(reason)\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction notifyResumePartReused(\n listener: ResumePartReusedListener | undefined,\n event: ResumePartReusedEvent,\n): void {\n try {\n listener?.(event)\n } catch {\n // Diagnostic observers must not change upload success or failure.\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ //#region src/upload/options.ts
2
+ /**
3
+ * Explicit resume targets are multipart-only and must fail closed on small uploads.
4
+ *
5
+ * @param options - High-level upload options.
6
+ * @param caller - Public method name used in the thrown error.
7
+ *
8
+ * @throws Error when an explicit resume target is supplied for a small upload.
9
+ */
10
+ function rejectSmallResumeFileId(options, caller) {
11
+ if (options.resumeFileId !== void 0) throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`);
12
+ }
13
+ /**
14
+ * Removes resume-only options before forwarding to the small-file upload path.
15
+ *
16
+ * @param options - High-level upload options.
17
+ *
18
+ * @returns Options accepted by the single-request upload implementation.
19
+ */
20
+ function stripResumeOnlyOptions(options) {
21
+ const { resume: _resume, resumeFileId: _resumeFileId, onResumeCandidateRejected: _onResumeCandidateRejected, onResumePartReused: _onResumePartReused, resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs, resumeMaxListPages: _resumeMaxListPages, resumeMaxPartCandidates: _resumeMaxPartCandidates, resumeMaxPartPages: _resumeMaxPartPages, ...smallOptions } = options;
22
+ return smallOptions;
23
+ }
24
+ //#endregion
25
+ exports.rejectSmallResumeFileId = rejectSmallResumeFileId;
26
+ exports.stripResumeOnlyOptions = stripResumeOnlyOptions;
27
+
28
+ //# sourceMappingURL=options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.cjs","names":[],"sources":["../../src/upload/options.ts"],"sourcesContent":["import type { ProgressListener } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type { CleanupFailureOptions } from './cancel.ts'\nimport type { ResumePartReusedListener } from './large.ts'\nimport type { ResumeCandidateRejectedListener } from './resume.ts'\nimport type { UploadRetryOptions } from './retry.ts'\n\n/** Shared options for high-level file uploads. */\nexport interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {\n /**\n * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},\n * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `\"b2/x-auto\"` (auto-detected by B2). */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy (requires file lock on the bucket). */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status for the file. */\n readonly legalHold?: LegalHoldValue\n /** Last-modified timestamp in milliseconds since epoch. */\n readonly lastModifiedMillis?: number\n /** Part size override for multipart uploads, in bytes. */\n readonly partSize?: number\n /** Number of concurrent part uploads for large files. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal for cancelling the upload. */\n readonly signal?: AbortSignal\n /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */\n readonly resumeMaxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */\n readonly resumeMaxPartCandidates?: number\n /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit unfinished large-file ID to verify and resume. Only supported on\n * the large-file path; small-file uploads throw.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\n/** Backwards-compatible name for high-level upload options. */\nexport type UploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link Bucket.upload}. */\nexport interface BucketUploadOptions extends HighLevelUploadOptions {\n /** Destination file name (path) in the bucket. */\n readonly fileName: string\n}\n\n/** Options accepted by {@link B2Object.upload}. */\nexport type B2ObjectUploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link B2Object.createWriteStream}. */\nexport interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** MIME type. Defaults to `\"b2/x-auto\"`. */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /** Target part size in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal that cancels the upload and the unfinished large file. */\n readonly signal?: AbortSignal\n}\n\ntype ResumeOnlyUploadOptions = Pick<\n HighLevelUploadOptions,\n | 'resume'\n | 'resumeFileId'\n | 'onResumeCandidateRejected'\n | 'onResumePartReused'\n | 'resumeDiscoveryTimeoutMs'\n | 'resumeMaxListPages'\n | 'resumeMaxPartCandidates'\n | 'resumeMaxPartPages'\n>\n\n/** High-level upload options after resume-only settings have been removed. */\nexport type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<\n T,\n keyof ResumeOnlyUploadOptions\n>\n\n/**\n * Explicit resume targets are multipart-only and must fail closed on small uploads.\n *\n * @param options - High-level upload options.\n * @param caller - Public method name used in the thrown error.\n *\n * @throws Error when an explicit resume target is supplied for a small upload.\n */\nexport function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void {\n if (options.resumeFileId !== undefined) {\n throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`)\n }\n}\n\n/**\n * Removes resume-only options before forwarding to the small-file upload path.\n *\n * @param options - High-level upload options.\n *\n * @returns Options accepted by the single-request upload implementation.\n */\nexport function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(\n options: T,\n): SmallUploadOptions<T> {\n const {\n resume: _resume,\n resumeFileId: _resumeFileId,\n onResumeCandidateRejected: _onResumeCandidateRejected,\n onResumePartReused: _onResumePartReused,\n resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs,\n resumeMaxListPages: _resumeMaxListPages,\n resumeMaxPartCandidates: _resumeMaxPartCandidates,\n resumeMaxPartPages: _resumeMaxPartPages,\n ...smallOptions\n } = options\n return smallOptions\n}\n"],"mappings":";;;;;;;;;AAkHA,SAAgB,wBAAwB,SAAiC,QAAsB;CAC7F,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,MAAM,IAAI,MAAM,GAAG,OAAO,wDAAwD;AAEtF;;;;;;;;AASA,SAAgB,uBACd,SACuB;CACvB,MAAM,EACJ,QAAQ,SACR,cAAc,eACd,2BAA2B,4BAC3B,oBAAoB,qBACpB,0BAA0B,2BAC1B,oBAAoB,qBACpB,yBAAyB,0BACzB,oBAAoB,qBACpB,GAAG,iBACD;CACJ,OAAO;AACT"}
@@ -0,0 +1,104 @@
1
+ import { ProgressListener } from '../streams/progress.js';
2
+ import { ContentSource } from '../streams/source.js';
3
+ import { EncryptionSetting } from '../types/encryption.js';
4
+ import { LargeFileId } from '../types/ids.js';
5
+ import { FileRetentionValue, LegalHoldValue } from '../types/lock.js';
6
+ import { CleanupFailureOptions } from './cancel.js';
7
+ import { ResumePartReusedListener } from './large.js';
8
+ import { ResumeCandidateRejectedListener } from './resume.js';
9
+ import { UploadRetryOptions } from './retry.js';
10
+ /** Shared options for high-level file uploads. */
11
+ export interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {
12
+ /**
13
+ * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},
14
+ * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.
15
+ */
16
+ readonly source: ContentSource;
17
+ /** MIME type. Defaults to `"b2/x-auto"` (auto-detected by B2). */
18
+ readonly contentType?: string;
19
+ /** Custom key-value metadata stored with the file. */
20
+ readonly fileInfo?: Record<string, string>;
21
+ /** Server-side encryption settings. */
22
+ readonly serverSideEncryption?: EncryptionSetting;
23
+ /** File retention policy (requires file lock on the bucket). */
24
+ readonly fileRetention?: FileRetentionValue;
25
+ /** Legal hold status for the file. */
26
+ readonly legalHold?: LegalHoldValue;
27
+ /** Last-modified timestamp in milliseconds since epoch. */
28
+ readonly lastModifiedMillis?: number;
29
+ /** Part size override for multipart uploads, in bytes. */
30
+ readonly partSize?: number;
31
+ /** Number of concurrent part uploads for large files. */
32
+ readonly concurrency?: number;
33
+ /** Callback invoked with upload progress events. */
34
+ readonly onProgress?: ProgressListener;
35
+ /** Abort signal for cancelling the upload. */
36
+ readonly signal?: AbortSignal;
37
+ /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */
38
+ readonly resume?: boolean;
39
+ /** Optional aggregate SDK-enforced timeout for resume discovery. */
40
+ readonly resumeDiscoveryTimeoutMs?: number;
41
+ /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */
42
+ readonly resumeMaxListPages?: number;
43
+ /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */
44
+ readonly resumeMaxPartCandidates?: number;
45
+ /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */
46
+ readonly resumeMaxPartPages?: number;
47
+ /**
48
+ * Explicit unfinished large-file ID to verify and resume. Only supported on
49
+ * the large-file path; small-file uploads throw.
50
+ */
51
+ readonly resumeFileId?: LargeFileId;
52
+ /** Diagnostic callback invoked when resume discovery rejects a candidate. */
53
+ readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener;
54
+ /** Diagnostic callback invoked when resume reuses an already-uploaded part. */
55
+ readonly onResumePartReused?: ResumePartReusedListener;
56
+ }
57
+ /** Backwards-compatible name for high-level upload options. */
58
+ export type UploadOptions = HighLevelUploadOptions;
59
+ /** Options accepted by {@link Bucket.upload}. */
60
+ export interface BucketUploadOptions extends HighLevelUploadOptions {
61
+ /** Destination file name (path) in the bucket. */
62
+ readonly fileName: string;
63
+ }
64
+ /** Options accepted by {@link B2Object.upload}. */
65
+ export type B2ObjectUploadOptions = HighLevelUploadOptions;
66
+ /** Options accepted by {@link B2Object.createWriteStream}. */
67
+ export interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {
68
+ /** MIME type. Defaults to `"b2/x-auto"`. */
69
+ readonly contentType?: string;
70
+ /** Custom key-value metadata stored with the file. */
71
+ readonly fileInfo?: Record<string, string>;
72
+ /** Server-side encryption applied to each part. */
73
+ readonly serverSideEncryption?: EncryptionSetting;
74
+ /** Target part size in bytes. Defaults to the account's recommended part size. */
75
+ readonly partSize?: number;
76
+ /** Maximum number of parts uploaded in parallel. Defaults to 4. */
77
+ readonly concurrency?: number;
78
+ /** Callback invoked with upload progress events. */
79
+ readonly onProgress?: ProgressListener;
80
+ /** Abort signal that cancels the upload and the unfinished large file. */
81
+ readonly signal?: AbortSignal;
82
+ }
83
+ type ResumeOnlyUploadOptions = Pick<HighLevelUploadOptions, 'resume' | 'resumeFileId' | 'onResumeCandidateRejected' | 'onResumePartReused' | 'resumeDiscoveryTimeoutMs' | 'resumeMaxListPages' | 'resumeMaxPartCandidates' | 'resumeMaxPartPages'>;
84
+ /** High-level upload options after resume-only settings have been removed. */
85
+ export type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<T, keyof ResumeOnlyUploadOptions>;
86
+ /**
87
+ * Explicit resume targets are multipart-only and must fail closed on small uploads.
88
+ *
89
+ * @param options - High-level upload options.
90
+ * @param caller - Public method name used in the thrown error.
91
+ *
92
+ * @throws Error when an explicit resume target is supplied for a small upload.
93
+ */
94
+ export declare function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void;
95
+ /**
96
+ * Removes resume-only options before forwarding to the small-file upload path.
97
+ *
98
+ * @param options - High-level upload options.
99
+ *
100
+ * @returns Options accepted by the single-request upload implementation.
101
+ */
102
+ export declare function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(options: T): SmallUploadOptions<T>;
103
+ export {};
104
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/upload/options.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { ProgressListener } from '../streams/progress.js';
2
+ import { ContentSource } from '../streams/source.js';
3
+ import { EncryptionSetting } from '../types/encryption.js';
4
+ import { LargeFileId } from '../types/ids.js';
5
+ import { FileRetentionValue, LegalHoldValue } from '../types/lock.js';
6
+ import { CleanupFailureOptions } from './cancel.js';
7
+ import { ResumePartReusedListener } from './large.js';
8
+ import { ResumeCandidateRejectedListener } from './resume.js';
9
+ import { UploadRetryOptions } from './retry.js';
10
+ /** Shared options for high-level file uploads. */
11
+ export interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {
12
+ /**
13
+ * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},
14
+ * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.
15
+ */
16
+ readonly source: ContentSource;
17
+ /** MIME type. Defaults to `"b2/x-auto"` (auto-detected by B2). */
18
+ readonly contentType?: string;
19
+ /** Custom key-value metadata stored with the file. */
20
+ readonly fileInfo?: Record<string, string>;
21
+ /** Server-side encryption settings. */
22
+ readonly serverSideEncryption?: EncryptionSetting;
23
+ /** File retention policy (requires file lock on the bucket). */
24
+ readonly fileRetention?: FileRetentionValue;
25
+ /** Legal hold status for the file. */
26
+ readonly legalHold?: LegalHoldValue;
27
+ /** Last-modified timestamp in milliseconds since epoch. */
28
+ readonly lastModifiedMillis?: number;
29
+ /** Part size override for multipart uploads, in bytes. */
30
+ readonly partSize?: number;
31
+ /** Number of concurrent part uploads for large files. */
32
+ readonly concurrency?: number;
33
+ /** Callback invoked with upload progress events. */
34
+ readonly onProgress?: ProgressListener;
35
+ /** Abort signal for cancelling the upload. */
36
+ readonly signal?: AbortSignal;
37
+ /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */
38
+ readonly resume?: boolean;
39
+ /** Optional aggregate SDK-enforced timeout for resume discovery. */
40
+ readonly resumeDiscoveryTimeoutMs?: number;
41
+ /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */
42
+ readonly resumeMaxListPages?: number;
43
+ /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */
44
+ readonly resumeMaxPartCandidates?: number;
45
+ /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */
46
+ readonly resumeMaxPartPages?: number;
47
+ /**
48
+ * Explicit unfinished large-file ID to verify and resume. Only supported on
49
+ * the large-file path; small-file uploads throw.
50
+ */
51
+ readonly resumeFileId?: LargeFileId;
52
+ /** Diagnostic callback invoked when resume discovery rejects a candidate. */
53
+ readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener;
54
+ /** Diagnostic callback invoked when resume reuses an already-uploaded part. */
55
+ readonly onResumePartReused?: ResumePartReusedListener;
56
+ }
57
+ /** Backwards-compatible name for high-level upload options. */
58
+ export type UploadOptions = HighLevelUploadOptions;
59
+ /** Options accepted by {@link Bucket.upload}. */
60
+ export interface BucketUploadOptions extends HighLevelUploadOptions {
61
+ /** Destination file name (path) in the bucket. */
62
+ readonly fileName: string;
63
+ }
64
+ /** Options accepted by {@link B2Object.upload}. */
65
+ export type B2ObjectUploadOptions = HighLevelUploadOptions;
66
+ /** Options accepted by {@link B2Object.createWriteStream}. */
67
+ export interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {
68
+ /** MIME type. Defaults to `"b2/x-auto"`. */
69
+ readonly contentType?: string;
70
+ /** Custom key-value metadata stored with the file. */
71
+ readonly fileInfo?: Record<string, string>;
72
+ /** Server-side encryption applied to each part. */
73
+ readonly serverSideEncryption?: EncryptionSetting;
74
+ /** Target part size in bytes. Defaults to the account's recommended part size. */
75
+ readonly partSize?: number;
76
+ /** Maximum number of parts uploaded in parallel. Defaults to 4. */
77
+ readonly concurrency?: number;
78
+ /** Callback invoked with upload progress events. */
79
+ readonly onProgress?: ProgressListener;
80
+ /** Abort signal that cancels the upload and the unfinished large file. */
81
+ readonly signal?: AbortSignal;
82
+ }
83
+ type ResumeOnlyUploadOptions = Pick<HighLevelUploadOptions, 'resume' | 'resumeFileId' | 'onResumeCandidateRejected' | 'onResumePartReused' | 'resumeDiscoveryTimeoutMs' | 'resumeMaxListPages' | 'resumeMaxPartCandidates' | 'resumeMaxPartPages'>;
84
+ /** High-level upload options after resume-only settings have been removed. */
85
+ export type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<T, keyof ResumeOnlyUploadOptions>;
86
+ /**
87
+ * Explicit resume targets are multipart-only and must fail closed on small uploads.
88
+ *
89
+ * @param options - High-level upload options.
90
+ * @param caller - Public method name used in the thrown error.
91
+ *
92
+ * @throws Error when an explicit resume target is supplied for a small upload.
93
+ */
94
+ export declare function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void;
95
+ /**
96
+ * Removes resume-only options before forwarding to the small-file upload path.
97
+ *
98
+ * @param options - High-level upload options.
99
+ *
100
+ * @returns Options accepted by the single-request upload implementation.
101
+ */
102
+ export declare function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(options: T): SmallUploadOptions<T>;
103
+ export {};
104
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/upload/options.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ //#region src/upload/options.ts
2
+ /**
3
+ * Explicit resume targets are multipart-only and must fail closed on small uploads.
4
+ *
5
+ * @param options - High-level upload options.
6
+ * @param caller - Public method name used in the thrown error.
7
+ *
8
+ * @throws Error when an explicit resume target is supplied for a small upload.
9
+ */
10
+ function rejectSmallResumeFileId(options, caller) {
11
+ if (options.resumeFileId !== void 0) throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`);
12
+ }
13
+ /**
14
+ * Removes resume-only options before forwarding to the small-file upload path.
15
+ *
16
+ * @param options - High-level upload options.
17
+ *
18
+ * @returns Options accepted by the single-request upload implementation.
19
+ */
20
+ function stripResumeOnlyOptions(options) {
21
+ const { resume: _resume, resumeFileId: _resumeFileId, onResumeCandidateRejected: _onResumeCandidateRejected, onResumePartReused: _onResumePartReused, resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs, resumeMaxListPages: _resumeMaxListPages, resumeMaxPartCandidates: _resumeMaxPartCandidates, resumeMaxPartPages: _resumeMaxPartPages, ...smallOptions } = options;
22
+ return smallOptions;
23
+ }
24
+ //#endregion
25
+ export { rejectSmallResumeFileId, stripResumeOnlyOptions };
26
+
27
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../src/upload/options.ts"],"sourcesContent":["import type { ProgressListener } from '../streams/progress.ts'\nimport type { ContentSource } from '../streams/source.ts'\nimport type { EncryptionSetting } from '../types/encryption.ts'\nimport type { LargeFileId } from '../types/ids.ts'\nimport type { FileRetentionValue, LegalHoldValue } from '../types/lock.ts'\nimport type { CleanupFailureOptions } from './cancel.ts'\nimport type { ResumePartReusedListener } from './large.ts'\nimport type { ResumeCandidateRejectedListener } from './resume.ts'\nimport type { UploadRetryOptions } from './retry.ts'\n\n/** Shared options for high-level file uploads. */\nexport interface HighLevelUploadOptions extends UploadRetryOptions, CleanupFailureOptions {\n /**\n * Data source to upload. Use {@link BufferSource}, {@link BlobSource}, {@link FileSource},\n * {@link StreamSource}, or {@link toContentSource} for async iterables and Node Readables.\n */\n readonly source: ContentSource\n /** MIME type. Defaults to `\"b2/x-auto\"` (auto-detected by B2). */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption settings. */\n readonly serverSideEncryption?: EncryptionSetting\n /** File retention policy (requires file lock on the bucket). */\n readonly fileRetention?: FileRetentionValue\n /** Legal hold status for the file. */\n readonly legalHold?: LegalHoldValue\n /** Last-modified timestamp in milliseconds since epoch. */\n readonly lastModifiedMillis?: number\n /** Part size override for multipart uploads, in bytes. */\n readonly partSize?: number\n /** Number of concurrent part uploads for large files. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal for cancelling the upload. */\n readonly signal?: AbortSignal\n /** Enable bounded same-name multipart resume discovery. Ignored on the small-file path. */\n readonly resume?: boolean\n /** Optional aggregate SDK-enforced timeout for resume discovery. */\n readonly resumeDiscoveryTimeoutMs?: number\n /** Maximum `b2_list_unfinished_large_files` pages inspected before upload starts. */\n readonly resumeMaxListPages?: number\n /** Maximum metadata-compatible candidates whose parts may be listed before upload starts. */\n readonly resumeMaxPartCandidates?: number\n /** Maximum `b2_list_parts` pages inspected per metadata-compatible candidate. */\n readonly resumeMaxPartPages?: number\n /**\n * Explicit unfinished large-file ID to verify and resume. Only supported on\n * the large-file path; small-file uploads throw.\n */\n readonly resumeFileId?: LargeFileId\n /** Diagnostic callback invoked when resume discovery rejects a candidate. */\n readonly onResumeCandidateRejected?: ResumeCandidateRejectedListener\n /** Diagnostic callback invoked when resume reuses an already-uploaded part. */\n readonly onResumePartReused?: ResumePartReusedListener\n}\n\n/** Backwards-compatible name for high-level upload options. */\nexport type UploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link Bucket.upload}. */\nexport interface BucketUploadOptions extends HighLevelUploadOptions {\n /** Destination file name (path) in the bucket. */\n readonly fileName: string\n}\n\n/** Options accepted by {@link B2Object.upload}. */\nexport type B2ObjectUploadOptions = HighLevelUploadOptions\n\n/** Options accepted by {@link B2Object.createWriteStream}. */\nexport interface B2ObjectWriteStreamOptions extends UploadRetryOptions, CleanupFailureOptions {\n /** MIME type. Defaults to `\"b2/x-auto\"`. */\n readonly contentType?: string\n /** Custom key-value metadata stored with the file. */\n readonly fileInfo?: Record<string, string>\n /** Server-side encryption applied to each part. */\n readonly serverSideEncryption?: EncryptionSetting\n /** Target part size in bytes. Defaults to the account's recommended part size. */\n readonly partSize?: number\n /** Maximum number of parts uploaded in parallel. Defaults to 4. */\n readonly concurrency?: number\n /** Callback invoked with upload progress events. */\n readonly onProgress?: ProgressListener\n /** Abort signal that cancels the upload and the unfinished large file. */\n readonly signal?: AbortSignal\n}\n\ntype ResumeOnlyUploadOptions = Pick<\n HighLevelUploadOptions,\n | 'resume'\n | 'resumeFileId'\n | 'onResumeCandidateRejected'\n | 'onResumePartReused'\n | 'resumeDiscoveryTimeoutMs'\n | 'resumeMaxListPages'\n | 'resumeMaxPartCandidates'\n | 'resumeMaxPartPages'\n>\n\n/** High-level upload options after resume-only settings have been removed. */\nexport type SmallUploadOptions<T extends HighLevelUploadOptions> = Omit<\n T,\n keyof ResumeOnlyUploadOptions\n>\n\n/**\n * Explicit resume targets are multipart-only and must fail closed on small uploads.\n *\n * @param options - High-level upload options.\n * @param caller - Public method name used in the thrown error.\n *\n * @throws Error when an explicit resume target is supplied for a small upload.\n */\nexport function rejectSmallResumeFileId(options: HighLevelUploadOptions, caller: string): void {\n if (options.resumeFileId !== undefined) {\n throw new Error(`${caller}: resumeFileId is only supported for multipart uploads.`)\n }\n}\n\n/**\n * Removes resume-only options before forwarding to the small-file upload path.\n *\n * @param options - High-level upload options.\n *\n * @returns Options accepted by the single-request upload implementation.\n */\nexport function stripResumeOnlyOptions<T extends HighLevelUploadOptions>(\n options: T,\n): SmallUploadOptions<T> {\n const {\n resume: _resume,\n resumeFileId: _resumeFileId,\n onResumeCandidateRejected: _onResumeCandidateRejected,\n onResumePartReused: _onResumePartReused,\n resumeDiscoveryTimeoutMs: _resumeDiscoveryTimeoutMs,\n resumeMaxListPages: _resumeMaxListPages,\n resumeMaxPartCandidates: _resumeMaxPartCandidates,\n resumeMaxPartPages: _resumeMaxPartPages,\n ...smallOptions\n } = options\n return smallOptions\n}\n"],"mappings":";;;;;;;;;AAkHA,SAAgB,wBAAwB,SAAiC,QAAsB;CAC7F,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,MAAM,IAAI,MAAM,GAAG,OAAO,wDAAwD;AAEtF;;;;;;;;AASA,SAAgB,uBACd,SACuB;CACvB,MAAM,EACJ,QAAQ,SACR,cAAc,eACd,2BAA2B,4BAC3B,oBAAoB,qBACpB,0BAA0B,2BAC1B,oBAAoB,qBACpB,yBAAyB,0BACzB,oBAAoB,qBACpB,GAAG,iBACD;CACJ,OAAO;AACT"}