@backblaze-labs/b2-sdk 0.3.0 → 0.4.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 (393) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/README.md +18 -5
  3. package/dist/_virtual/_b2-sdk-version-json.cjs +1 -1
  4. package/dist/_virtual/_b2-sdk-version-json.js +1 -1
  5. package/dist/auth/reauth-coalescer.cjs +65 -0
  6. package/dist/auth/reauth-coalescer.cjs.map +1 -0
  7. package/dist/auth/reauth-coalescer.d.cts +34 -0
  8. package/dist/auth/reauth-coalescer.d.cts.map +1 -0
  9. package/dist/auth/reauth-coalescer.d.ts +34 -0
  10. package/dist/auth/reauth-coalescer.d.ts.map +1 -0
  11. package/dist/auth/reauth-coalescer.js +65 -0
  12. package/dist/auth/reauth-coalescer.js.map +1 -0
  13. package/dist/backup/raw.cjs +37 -15
  14. package/dist/backup/raw.cjs.map +1 -1
  15. package/dist/backup/raw.d.cts +2 -2
  16. package/dist/backup/raw.d.cts.map +1 -1
  17. package/dist/backup/raw.d.ts +2 -2
  18. package/dist/backup/raw.d.ts.map +1 -1
  19. package/dist/backup/raw.js +37 -15
  20. package/dist/backup/raw.js.map +1 -1
  21. package/dist/bucket-validation.cjs +111 -0
  22. package/dist/bucket-validation.cjs.map +1 -0
  23. package/dist/bucket-validation.d.cts +27 -0
  24. package/dist/bucket-validation.d.cts.map +1 -0
  25. package/dist/bucket-validation.d.ts +27 -0
  26. package/dist/bucket-validation.d.ts.map +1 -0
  27. package/dist/bucket-validation.js +109 -0
  28. package/dist/bucket-validation.js.map +1 -0
  29. package/dist/bucket.cjs +123 -73
  30. package/dist/bucket.cjs.map +1 -1
  31. package/dist/bucket.d.cts +156 -61
  32. package/dist/bucket.d.cts.map +1 -1
  33. package/dist/bucket.d.ts +156 -61
  34. package/dist/bucket.d.ts.map +1 -1
  35. package/dist/bucket.js +123 -73
  36. package/dist/bucket.js.map +1 -1
  37. package/dist/client.cjs +29 -8
  38. package/dist/client.cjs.map +1 -1
  39. package/dist/client.d.cts +30 -9
  40. package/dist/client.d.cts.map +1 -1
  41. package/dist/client.d.ts +30 -9
  42. package/dist/client.d.ts.map +1 -1
  43. package/dist/client.js +29 -8
  44. package/dist/client.js.map +1 -1
  45. package/dist/download/single.cjs +38 -13
  46. package/dist/download/single.cjs.map +1 -1
  47. package/dist/download/single.d.cts +10 -4
  48. package/dist/download/single.d.cts.map +1 -1
  49. package/dist/download/single.d.ts +10 -4
  50. package/dist/download/single.d.ts.map +1 -1
  51. package/dist/download/single.js +38 -13
  52. package/dist/download/single.js.map +1 -1
  53. package/dist/errors/index.cjs +27 -4
  54. package/dist/errors/index.cjs.map +1 -1
  55. package/dist/errors/index.d.cts +15 -0
  56. package/dist/errors/index.d.cts.map +1 -1
  57. package/dist/errors/index.d.ts +15 -0
  58. package/dist/errors/index.d.ts.map +1 -1
  59. package/dist/errors/index.js +27 -5
  60. package/dist/errors/index.js.map +1 -1
  61. package/dist/http/non-idempotent-mutations.cjs +38 -0
  62. package/dist/http/non-idempotent-mutations.cjs.map +1 -0
  63. package/dist/http/non-idempotent-mutations.d.cts +25 -0
  64. package/dist/http/non-idempotent-mutations.d.cts.map +1 -0
  65. package/dist/http/non-idempotent-mutations.d.ts +25 -0
  66. package/dist/http/non-idempotent-mutations.d.ts.map +1 -0
  67. package/dist/http/non-idempotent-mutations.js +35 -0
  68. package/dist/http/non-idempotent-mutations.js.map +1 -0
  69. package/dist/http/transport.cjs +9 -8
  70. package/dist/http/transport.cjs.map +1 -1
  71. package/dist/http/transport.d.cts +5 -0
  72. package/dist/http/transport.d.cts.map +1 -1
  73. package/dist/http/transport.d.ts +5 -0
  74. package/dist/http/transport.d.ts.map +1 -1
  75. package/dist/http/transport.js +9 -8
  76. package/dist/http/transport.js.map +1 -1
  77. package/dist/http/user-agent.cjs +12 -1
  78. package/dist/http/user-agent.cjs.map +1 -1
  79. package/dist/http/user-agent.d.cts +8 -0
  80. package/dist/http/user-agent.d.cts.map +1 -1
  81. package/dist/http/user-agent.d.ts +8 -0
  82. package/dist/http/user-agent.d.ts.map +1 -1
  83. package/dist/http/user-agent.js +13 -3
  84. package/dist/http/user-agent.js.map +1 -1
  85. package/dist/index.cjs +25 -0
  86. package/dist/index.d.cts +10 -9
  87. package/dist/index.d.cts.map +1 -1
  88. package/dist/index.d.ts +10 -9
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +7 -6
  91. package/dist/notifications/index.cjs +3 -0
  92. package/dist/notifications/index.d.cts +2 -0
  93. package/dist/notifications/index.d.cts.map +1 -1
  94. package/dist/notifications/index.d.ts +2 -0
  95. package/dist/notifications/index.d.ts.map +1 -1
  96. package/dist/notifications/index.js +2 -1
  97. package/dist/object.cjs +12 -1
  98. package/dist/object.cjs.map +1 -1
  99. package/dist/object.d.cts +7 -1
  100. package/dist/object.d.cts.map +1 -1
  101. package/dist/object.d.ts +7 -1
  102. package/dist/object.d.ts.map +1 -1
  103. package/dist/object.js +12 -1
  104. package/dist/object.js.map +1 -1
  105. package/dist/partner/auth-core.cjs +4 -23
  106. package/dist/partner/auth-core.cjs.map +1 -1
  107. package/dist/partner/auth-core.d.cts +1 -1
  108. package/dist/partner/auth-core.d.cts.map +1 -1
  109. package/dist/partner/auth-core.d.ts +1 -1
  110. package/dist/partner/auth-core.d.ts.map +1 -1
  111. package/dist/partner/auth-core.js +5 -24
  112. package/dist/partner/auth-core.js.map +1 -1
  113. package/dist/partner/client.cjs +25 -10
  114. package/dist/partner/client.cjs.map +1 -1
  115. package/dist/partner/client.d.cts +32 -10
  116. package/dist/partner/client.d.cts.map +1 -1
  117. package/dist/partner/client.d.ts +32 -10
  118. package/dist/partner/client.d.ts.map +1 -1
  119. package/dist/partner/client.js +25 -10
  120. package/dist/partner/client.js.map +1 -1
  121. package/dist/partner/endpoint-url.cjs +1 -0
  122. package/dist/partner/endpoint-url.cjs.map +1 -1
  123. package/dist/partner/endpoint-url.d.cts +2 -0
  124. package/dist/partner/endpoint-url.d.cts.map +1 -1
  125. package/dist/partner/endpoint-url.d.ts +2 -0
  126. package/dist/partner/endpoint-url.d.ts.map +1 -1
  127. package/dist/partner/endpoint-url.js +1 -0
  128. package/dist/partner/endpoint-url.js.map +1 -1
  129. package/dist/partner/in-memory.cjs.map +1 -1
  130. package/dist/partner/in-memory.js.map +1 -1
  131. package/dist/partner/index.cjs +9 -0
  132. package/dist/partner/index.d.cts +11 -2
  133. package/dist/partner/index.d.cts.map +1 -1
  134. package/dist/partner/index.d.ts +11 -2
  135. package/dist/partner/index.d.ts.map +1 -1
  136. package/dist/partner/index.js +3 -1
  137. package/dist/partner/raw.cjs +52 -44
  138. package/dist/partner/raw.cjs.map +1 -1
  139. package/dist/partner/raw.d.cts +16 -19
  140. package/dist/partner/raw.d.cts.map +1 -1
  141. package/dist/partner/raw.d.ts +16 -19
  142. package/dist/partner/raw.d.ts.map +1 -1
  143. package/dist/partner/raw.js +52 -44
  144. package/dist/partner/raw.js.map +1 -1
  145. package/dist/partner/redaction.cjs +133 -108
  146. package/dist/partner/redaction.cjs.map +1 -1
  147. package/dist/partner/redaction.d.cts +47 -13
  148. package/dist/partner/redaction.d.cts.map +1 -1
  149. package/dist/partner/redaction.d.ts +47 -13
  150. package/dist/partner/redaction.d.ts.map +1 -1
  151. package/dist/partner/redaction.js +133 -109
  152. package/dist/partner/redaction.js.map +1 -1
  153. package/dist/raw/encoding.cjs +29 -10
  154. package/dist/raw/encoding.cjs.map +1 -1
  155. package/dist/raw/encoding.d.cts +3 -2
  156. package/dist/raw/encoding.d.cts.map +1 -1
  157. package/dist/raw/encoding.d.ts +3 -2
  158. package/dist/raw/encoding.d.ts.map +1 -1
  159. package/dist/raw/encoding.js +29 -10
  160. package/dist/raw/encoding.js.map +1 -1
  161. package/dist/raw/index.cjs +64 -39
  162. package/dist/raw/index.cjs.map +1 -1
  163. package/dist/raw/index.d.cts +21 -19
  164. package/dist/raw/index.d.cts.map +1 -1
  165. package/dist/raw/index.d.ts +21 -19
  166. package/dist/raw/index.d.ts.map +1 -1
  167. package/dist/raw/index.js +47 -40
  168. package/dist/raw/index.js.map +1 -1
  169. package/dist/raw/url.cjs.map +1 -1
  170. package/dist/raw/url.d.cts +3 -3
  171. package/dist/raw/url.d.ts +3 -3
  172. package/dist/raw/url.js.map +1 -1
  173. package/dist/simulator/index.cjs +456 -125
  174. package/dist/simulator/index.cjs.map +1 -1
  175. package/dist/simulator/index.d.cts +16 -1
  176. package/dist/simulator/index.d.cts.map +1 -1
  177. package/dist/simulator/index.d.ts +16 -1
  178. package/dist/simulator/index.d.ts.map +1 -1
  179. package/dist/simulator/index.js +449 -130
  180. package/dist/simulator/index.js.map +1 -1
  181. package/dist/simulator/partner-capabilities.cjs +77 -0
  182. package/dist/simulator/partner-capabilities.cjs.map +1 -0
  183. package/dist/simulator/partner-capabilities.d.cts +53 -0
  184. package/dist/simulator/partner-capabilities.d.cts.map +1 -0
  185. package/dist/simulator/partner-capabilities.d.ts +53 -0
  186. package/dist/simulator/partner-capabilities.d.ts.map +1 -0
  187. package/dist/simulator/partner-capabilities.js +73 -0
  188. package/dist/simulator/partner-capabilities.js.map +1 -0
  189. package/dist/simulator/partner.cjs +55 -61
  190. package/dist/simulator/partner.cjs.map +1 -1
  191. package/dist/simulator/partner.d.cts +5 -2
  192. package/dist/simulator/partner.d.cts.map +1 -1
  193. package/dist/simulator/partner.d.ts +5 -2
  194. package/dist/simulator/partner.d.ts.map +1 -1
  195. package/dist/simulator/partner.js +56 -61
  196. package/dist/simulator/partner.js.map +1 -1
  197. package/dist/simulator/validation.cjs +160 -30
  198. package/dist/simulator/validation.cjs.map +1 -1
  199. package/dist/simulator/validation.d.cts +28 -6
  200. package/dist/simulator/validation.d.cts.map +1 -1
  201. package/dist/simulator/validation.d.ts +28 -6
  202. package/dist/simulator/validation.d.ts.map +1 -1
  203. package/dist/simulator/validation.js +148 -31
  204. package/dist/simulator/validation.js.map +1 -1
  205. package/dist/streams/file-source.cjs +1 -1
  206. package/dist/streams/file-source.cjs.map +1 -1
  207. package/dist/streams/file-source.js +1 -1
  208. package/dist/streams/file-source.js.map +1 -1
  209. package/dist/streams/hash.cjs +246 -13
  210. package/dist/streams/hash.cjs.map +1 -1
  211. package/dist/streams/hash.d.cts +37 -12
  212. package/dist/streams/hash.d.cts.map +1 -1
  213. package/dist/streams/hash.d.ts +37 -12
  214. package/dist/streams/hash.d.ts.map +1 -1
  215. package/dist/streams/hash.js +246 -15
  216. package/dist/streams/hash.js.map +1 -1
  217. package/dist/streams/index.cjs +2 -0
  218. package/dist/streams/index.d.cts +1 -1
  219. package/dist/streams/index.d.cts.map +1 -1
  220. package/dist/streams/index.d.ts +1 -1
  221. package/dist/streams/index.d.ts.map +1 -1
  222. package/dist/streams/index.js +2 -2
  223. package/dist/streams/progress.cjs +63 -4
  224. package/dist/streams/progress.cjs.map +1 -1
  225. package/dist/streams/progress.d.cts +28 -2
  226. package/dist/streams/progress.d.cts.map +1 -1
  227. package/dist/streams/progress.d.ts +28 -2
  228. package/dist/streams/progress.d.ts.map +1 -1
  229. package/dist/streams/progress.js +63 -4
  230. package/dist/streams/progress.js.map +1 -1
  231. package/dist/sync/download-staging.cjs +147 -35
  232. package/dist/sync/download-staging.cjs.map +1 -1
  233. package/dist/sync/download-staging.d.cts +25 -2
  234. package/dist/sync/download-staging.d.cts.map +1 -1
  235. package/dist/sync/download-staging.d.ts +25 -2
  236. package/dist/sync/download-staging.d.ts.map +1 -1
  237. package/dist/sync/download-staging.js +146 -36
  238. package/dist/sync/download-staging.js.map +1 -1
  239. package/dist/sync/index.d.cts +1 -1
  240. package/dist/sync/index.d.cts.map +1 -1
  241. package/dist/sync/index.d.ts +1 -1
  242. package/dist/sync/index.d.ts.map +1 -1
  243. package/dist/sync/local-file-io.cjs +5 -1
  244. package/dist/sync/local-file-io.cjs.map +1 -1
  245. package/dist/sync/local-file-io.d.cts +2 -0
  246. package/dist/sync/local-file-io.d.cts.map +1 -1
  247. package/dist/sync/local-file-io.d.ts +2 -0
  248. package/dist/sync/local-file-io.d.ts.map +1 -1
  249. package/dist/sync/local-file-io.js +5 -1
  250. package/dist/sync/local-file-io.js.map +1 -1
  251. package/dist/sync/pairing.cjs +1 -0
  252. package/dist/sync/pairing.cjs.map +1 -1
  253. package/dist/sync/pairing.js +1 -0
  254. package/dist/sync/pairing.js.map +1 -1
  255. package/dist/sync/scanners/b2.cjs +2 -0
  256. package/dist/sync/scanners/b2.cjs.map +1 -1
  257. package/dist/sync/scanners/b2.d.cts.map +1 -1
  258. package/dist/sync/scanners/b2.d.ts.map +1 -1
  259. package/dist/sync/scanners/b2.js +2 -0
  260. package/dist/sync/scanners/b2.js.map +1 -1
  261. package/dist/sync/scanners/local.cjs +150 -33
  262. package/dist/sync/scanners/local.cjs.map +1 -1
  263. package/dist/sync/scanners/local.d.cts +6 -0
  264. package/dist/sync/scanners/local.d.cts.map +1 -1
  265. package/dist/sync/scanners/local.d.ts +6 -0
  266. package/dist/sync/scanners/local.d.ts.map +1 -1
  267. package/dist/sync/scanners/local.js +150 -33
  268. package/dist/sync/scanners/local.js.map +1 -1
  269. package/dist/sync/synchronizer.cjs +76 -29
  270. package/dist/sync/synchronizer.cjs.map +1 -1
  271. package/dist/sync/synchronizer.d.cts +1 -0
  272. package/dist/sync/synchronizer.d.cts.map +1 -1
  273. package/dist/sync/synchronizer.d.ts +1 -0
  274. package/dist/sync/synchronizer.d.ts.map +1 -1
  275. package/dist/sync/synchronizer.js +76 -29
  276. package/dist/sync/synchronizer.js.map +1 -1
  277. package/dist/sync/types.d.cts +19 -3
  278. package/dist/sync/types.d.cts.map +1 -1
  279. package/dist/sync/types.d.ts +19 -3
  280. package/dist/sync/types.d.ts.map +1 -1
  281. package/dist/types/backup.d.cts +6 -1
  282. package/dist/types/backup.d.cts.map +1 -1
  283. package/dist/types/backup.d.ts +6 -1
  284. package/dist/types/backup.d.ts.map +1 -1
  285. package/dist/types/bucket.cjs +81 -11
  286. package/dist/types/bucket.cjs.map +1 -1
  287. package/dist/types/bucket.d.cts +190 -39
  288. package/dist/types/bucket.d.cts.map +1 -1
  289. package/dist/types/bucket.d.ts +190 -39
  290. package/dist/types/bucket.d.ts.map +1 -1
  291. package/dist/types/bucket.js +67 -12
  292. package/dist/types/bucket.js.map +1 -1
  293. package/dist/types/download.cjs.map +1 -1
  294. package/dist/types/download.d.cts +3 -17
  295. package/dist/types/download.d.cts.map +1 -1
  296. package/dist/types/download.d.ts +3 -17
  297. package/dist/types/download.d.ts.map +1 -1
  298. package/dist/types/download.js.map +1 -1
  299. package/dist/types/encryption.cjs +18 -0
  300. package/dist/types/encryption.cjs.map +1 -1
  301. package/dist/types/encryption.d.cts +21 -11
  302. package/dist/types/encryption.d.cts.map +1 -1
  303. package/dist/types/encryption.d.ts +21 -11
  304. package/dist/types/encryption.d.ts.map +1 -1
  305. package/dist/types/encryption.js +18 -0
  306. package/dist/types/encryption.js.map +1 -1
  307. package/dist/types/file.cjs +3 -0
  308. package/dist/types/file.cjs.map +1 -1
  309. package/dist/types/file.d.cts +125 -16
  310. package/dist/types/file.d.cts.map +1 -1
  311. package/dist/types/file.d.ts +125 -16
  312. package/dist/types/file.d.ts.map +1 -1
  313. package/dist/types/file.js +3 -1
  314. package/dist/types/file.js.map +1 -1
  315. package/dist/types/index.d.cts +7 -7
  316. package/dist/types/index.d.cts.map +1 -1
  317. package/dist/types/index.d.ts +7 -7
  318. package/dist/types/index.d.ts.map +1 -1
  319. package/dist/types/key.d.cts +4 -3
  320. package/dist/types/key.d.cts.map +1 -1
  321. package/dist/types/key.d.ts +4 -3
  322. package/dist/types/key.d.ts.map +1 -1
  323. package/dist/types/notifications.cjs +30 -0
  324. package/dist/types/notifications.cjs.map +1 -1
  325. package/dist/types/notifications.d.cts +26 -1
  326. package/dist/types/notifications.d.cts.map +1 -1
  327. package/dist/types/notifications.d.ts +26 -1
  328. package/dist/types/notifications.d.ts.map +1 -1
  329. package/dist/types/notifications.js +29 -1
  330. package/dist/types/notifications.js.map +1 -1
  331. package/dist/types/partner.cjs.map +1 -1
  332. package/dist/types/partner.d.cts +28 -36
  333. package/dist/types/partner.d.cts.map +1 -1
  334. package/dist/types/partner.d.ts +28 -36
  335. package/dist/types/partner.d.ts.map +1 -1
  336. package/dist/types/partner.js.map +1 -1
  337. package/dist/types/upload.d.cts +4 -0
  338. package/dist/types/upload.d.cts.map +1 -1
  339. package/dist/types/upload.d.ts +4 -0
  340. package/dist/types/upload.d.ts.map +1 -1
  341. package/dist/upload/large.cjs +10 -7
  342. package/dist/upload/large.cjs.map +1 -1
  343. package/dist/upload/large.d.cts +15 -6
  344. package/dist/upload/large.d.cts.map +1 -1
  345. package/dist/upload/large.d.ts +15 -6
  346. package/dist/upload/large.d.ts.map +1 -1
  347. package/dist/upload/large.js +10 -7
  348. package/dist/upload/large.js.map +1 -1
  349. package/dist/upload/options.cjs.map +1 -1
  350. package/dist/upload/options.d.cts +12 -0
  351. package/dist/upload/options.d.cts.map +1 -1
  352. package/dist/upload/options.d.ts +12 -0
  353. package/dist/upload/options.d.ts.map +1 -1
  354. package/dist/upload/options.js.map +1 -1
  355. package/dist/upload/resume.cjs +4 -3
  356. package/dist/upload/resume.cjs.map +1 -1
  357. package/dist/upload/resume.d.cts +6 -4
  358. package/dist/upload/resume.d.cts.map +1 -1
  359. package/dist/upload/resume.d.ts +6 -4
  360. package/dist/upload/resume.d.ts.map +1 -1
  361. package/dist/upload/resume.js +4 -3
  362. package/dist/upload/resume.js.map +1 -1
  363. package/dist/upload/retry.cjs +17 -10
  364. package/dist/upload/retry.cjs.map +1 -1
  365. package/dist/upload/retry.d.cts.map +1 -1
  366. package/dist/upload/retry.d.ts.map +1 -1
  367. package/dist/upload/retry.js +17 -10
  368. package/dist/upload/retry.js.map +1 -1
  369. package/dist/upload/single.cjs +35 -31
  370. package/dist/upload/single.cjs.map +1 -1
  371. package/dist/upload/single.d.cts +6 -0
  372. package/dist/upload/single.d.cts.map +1 -1
  373. package/dist/upload/single.d.ts +6 -0
  374. package/dist/upload/single.d.ts.map +1 -1
  375. package/dist/upload/single.js +35 -31
  376. package/dist/upload/single.js.map +1 -1
  377. package/dist/upload/stream.cjs +12 -1
  378. package/dist/upload/stream.cjs.map +1 -1
  379. package/dist/upload/stream.d.cts +6 -0
  380. package/dist/upload/stream.d.cts.map +1 -1
  381. package/dist/upload/stream.d.ts +6 -0
  382. package/dist/upload/stream.d.ts.map +1 -1
  383. package/dist/upload/stream.js +12 -1
  384. package/dist/upload/stream.js.map +1 -1
  385. package/dist/version.cjs +56 -4
  386. package/dist/version.cjs.map +1 -1
  387. package/dist/version.d.cts +53 -4
  388. package/dist/version.d.cts.map +1 -1
  389. package/dist/version.d.ts +53 -4
  390. package/dist/version.d.ts.map +1 -1
  391. package/dist/version.js +52 -5
  392. package/dist/version.js.map +1 -1
  393. package/package.json +11 -4
@@ -14,6 +14,11 @@ export interface HttpRequest {
14
14
  readonly signal?: AbortSignal;
15
15
  /** Optional per-request retry override. */
16
16
  readonly retry?: Partial<RetryOptions>;
17
+ /**
18
+ * Set false to disable automatic retry and expired-token reauth replay.
19
+ * This is not a general idempotency override.
20
+ */
21
+ readonly idempotent?: false;
17
22
  }
18
23
  /** Represents a parsed HTTP response from the B2 API. */
19
24
  export interface HttpResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/http/transport.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/http/transport.js"],"names":[],"mappings":"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"}
@@ -14,6 +14,11 @@ export interface HttpRequest {
14
14
  readonly signal?: AbortSignal;
15
15
  /** Optional per-request retry override. */
16
16
  readonly retry?: Partial<RetryOptions>;
17
+ /**
18
+ * Set false to disable automatic retry and expired-token reauth replay.
19
+ * This is not a general idempotency override.
20
+ */
21
+ readonly idempotent?: false;
17
22
  }
18
23
  /** Represents a parsed HTTP response from the B2 API. */
19
24
  export interface HttpResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/http/transport.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/http/transport.js"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { B2Error, B2RedirectError, B2SsrfError, ExpiredAuthTokenError, NetworkError, classifyError } from "../errors/index.js";
2
2
  import { abortReason, raceWithAbort, throwIfSignalAborted } from "../util/abort.js";
3
3
  import { DEFAULT_RETRY_OPTIONS, computeBackoff, sleep } from "./retry.js";
4
+ import { isBackupNonIdempotentMutationEndpoint, isPartnerNonIdempotentMutationEndpoint } from "./non-idempotent-mutations.js";
4
5
  import { UrlGuard } from "./url-guard.js";
5
6
  import { getUserAgent } from "./user-agent.js";
6
7
  //#region src/http/transport.ts
@@ -295,15 +296,14 @@ function isAuthorizeEndpoint(url) {
295
296
  function isStartLargeFileEndpoint(url) {
296
297
  return b2ApiEndpointName(url) === "b2_start_large_file";
297
298
  }
298
- function isPartnerMutationEndpoint(url) {
299
- const endpoint = b2ApiEndpointName(url);
300
- return endpoint === "b2_create_group_member" || endpoint === "b2_eject_group_member" || endpoint === "b2_reserve_trial_create_account";
299
+ function isKnownPartnerNonIdempotentMutationEndpoint(url) {
300
+ return isPartnerNonIdempotentMutationEndpoint(b2ApiEndpointName(url));
301
301
  }
302
- function isBackupMutationEndpoint(url) {
303
- return backupApiEndpointName(url) === "bz_delete_computer";
302
+ function isKnownBackupNonIdempotentMutationEndpoint(url) {
303
+ return isBackupNonIdempotentMutationEndpoint(backupApiEndpointName(url));
304
304
  }
305
305
  function isNonIdempotentMutationRequest(request) {
306
- return request.method === "POST" && (isPartnerMutationEndpoint(request.url) || isBackupMutationEndpoint(request.url));
306
+ return request.idempotent === false || request.method === "POST" && (isKnownPartnerNonIdempotentMutationEndpoint(request.url) || isKnownBackupNonIdempotentMutationEndpoint(request.url));
307
307
  }
308
308
  function b2ApiEndpointName(url) {
309
309
  const segments = new URL(url).pathname.split("/").filter((segment) => segment.length > 0);
@@ -318,7 +318,8 @@ function backupApiEndpointName(url) {
318
318
  if (!/^v\d+$/.test(segments[apiRootIndex + 2] ?? "")) return void 0;
319
319
  return segments[apiRootIndex + 3];
320
320
  }
321
- function isReplayUnsafePostRequest(request) {
321
+ function isReplayUnsafeRequest(request) {
322
+ if (request.idempotent === false) return true;
322
323
  if (request.method !== "POST") return false;
323
324
  return isUploadEndpoint(request.url) || isStartLargeFileEndpoint(request.url) || isFinishLargeFileEndpoint(request.url) || isNonIdempotentMutationRequest(request);
324
325
  }
@@ -455,7 +456,7 @@ var RetryTransport = class {
455
456
  throwIfSignalAborted(request.signal);
456
457
  if (isTerminalTransportError(err)) throw err;
457
458
  const networkErr = new NetworkError(err instanceof Error ? err.message : "Network error", err);
458
- if (isReplayUnsafePostRequest(request) || attempt === retryOptions.maxRetries) throw networkErr;
459
+ if (isReplayUnsafeRequest(request) || attempt === retryOptions.maxRetries) throw networkErr;
459
460
  lastError = networkErr;
460
461
  attempt += 1;
461
462
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","names":[],"sources":["../../src/http/transport.ts"],"sourcesContent":["import {\n B2Error,\n B2RedirectError,\n B2SsrfError,\n classifyError,\n ExpiredAuthTokenError,\n NetworkError,\n} from '../errors/index.ts'\nimport type { B2ErrorResponse } from '../types/errors.ts'\nimport { abortReason, raceWithAbort, throwIfSignalAborted } from '../util/abort.ts'\nimport { computeBackoff, DEFAULT_RETRY_OPTIONS, type RetryOptions, sleep } from './retry.ts'\nimport { UrlGuard } from './url-guard.ts'\nimport { getUserAgent } from './user-agent.ts'\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308])\nconst MAX_SAME_ORIGIN_REDIRECTS = 5\n\n/** Describes an outgoing HTTP request to the B2 API. */\nexport interface HttpRequest {\n /** Fully qualified URL to send the request to. */\n readonly url: string\n /** HTTP method. B2 uses GET for downloads (HEAD to fetch only headers) and POST for all other operations. */\n readonly method: 'GET' | 'HEAD' | 'POST'\n /** Request headers. Authorization and content-type are typically included. */\n readonly headers?: Record<string, string>\n /** Request body. Used for POST requests (JSON payloads or file uploads). */\n readonly body?: BodyInit | null\n /** Optional abort signal for request cancellation. */\n readonly signal?: AbortSignal\n /** Optional per-request retry override. */\n readonly retry?: Partial<RetryOptions>\n}\n\n/** Represents a parsed HTTP response from the B2 API. */\nexport interface HttpResponse {\n /** HTTP status code. */\n readonly status: number\n /** Response headers. */\n readonly headers: Headers\n /** Response body as a readable stream, or null for empty responses. */\n readonly body: ReadableStream<Uint8Array> | null\n /** Parses the response body as JSON. */\n json<T>(): Promise<T>\n /** Reads the response body as a UTF-8 string. */\n text(): Promise<string>\n /** Reads the response body as an ArrayBuffer. */\n arrayBuffer(): Promise<ArrayBuffer>\n}\n\n/**\n * Transport layer abstraction for sending HTTP requests.\n * Implementations handle the actual network I/O and can be composed\n * (e.g. wrapping a {@link FetchTransport} with a {@link RetryTransport}).\n */\nexport interface HttpTransport {\n /** Sends an HTTP request and returns the response. */\n send(request: HttpRequest): Promise<HttpResponse>\n}\n\n/**\n * Transport capability for implementations that expose the SSRF URL guard\n * protecting credential-bearing requests. Wrappers that preserve this\n * capability should forward the same `urlGuard` property.\n */\nexport interface UrlGuardedTransport extends HttpTransport {\n /** SSRF allow-list applied to outgoing URLs. */\n readonly urlGuard: UrlGuard\n}\n\n/**\n * Returns the URL guard exposed by `transport`, if it implements\n * {@link UrlGuardedTransport}.\n *\n * @param transport - Transport to inspect.\n *\n * @returns The exposed URL guard, or undefined for unguarded transports.\n */\nexport function getTransportUrlGuard(transport: HttpTransport): UrlGuard | undefined {\n const candidate = transport as Partial<UrlGuardedTransport>\n return candidate.urlGuard instanceof UrlGuard ? candidate.urlGuard : undefined\n}\n\n/**\n * Default transport implementation using the global `fetch` API.\n * Automatically sets the User-Agent header on each request and applies the\n * SSRF {@link UrlGuard} (if configured) before opening the connection.\n * Redirect following is disabled so redirected URLs cannot bypass the guard or\n * receive credential-bearing headers without an explicit checked request.\n */\nexport class FetchTransport implements UrlGuardedTransport {\n /** User-Agent string sent with every request. */\n private readonly userAgent: string\n /** Whether same-origin GET/HEAD redirects should be followed after guard checks. */\n private readonly followSameOriginRedirects: boolean\n /** SSRF allow-list applied to every outgoing URL. Mutable so `B2Client.authorize()` can lock it down post-auth. */\n readonly urlGuard: UrlGuard\n\n /**\n * Creates a new FetchTransport.\n * @param options - Optional configuration: custom User-Agent prefix and SSRF guard.\n */\n constructor(options?: {\n userAgent?: string\n urlGuard?: UrlGuard\n /**\n * Follow same-origin GET/HEAD redirects after checking the target with the\n * URL guard. POST redirects are still blocked to avoid replaying\n * credential-bearing payloads to an unexpected endpoint. Defaults to true.\n */\n followSameOriginRedirects?: boolean\n }) {\n this.userAgent = getUserAgent(options?.userAgent)\n this.followSameOriginRedirects = options?.followSameOriginRedirects ?? true\n this.urlGuard = options?.urlGuard ?? new UrlGuard()\n }\n\n /**\n * Sends the request using the global `fetch` function.\n * @param request - The HTTP request to execute.\n *\n * @returns The HTTP response.\n *\n * @throws B2SsrfError when the URL fails the configured SSRF guard.\n * @throws B2RedirectError when a response attempts to redirect.\n */\n async send(request: HttpRequest): Promise<HttpResponse> {\n let currentRequest = request\n let redirectCount = 0\n\n while (true) {\n this.urlGuard.check(currentRequest.url)\n\n const headers = new Headers(currentRequest.headers)\n if (!headers.has('User-Agent')) {\n headers.set('User-Agent', this.userAgent)\n }\n\n const timeoutScope = createRequestTimeoutScope(currentRequest)\n let response: Response\n try {\n response = await fetch(currentRequest.url, {\n method: currentRequest.method,\n headers,\n body: currentRequest.body ?? null,\n redirect: 'manual',\n ...(timeoutScope.signal !== undefined ? { signal: timeoutScope.signal } : {}),\n })\n } catch (err) {\n timeoutScope.dispose()\n if (timeoutScope.timedOut) {\n throw createRequestTimeoutError(timeoutScope)\n }\n throw err\n }\n\n if (isBlockedRedirect(response)) {\n const location = response.headers.get('Location')\n if (\n this.followSameOriginRedirects &&\n location !== null &&\n redirectCount < MAX_SAME_ORIGIN_REDIRECTS &&\n canFollowSameOriginRedirect(currentRequest, location)\n ) {\n const nextUrl = new URL(location, currentRequest.url).toString()\n await cancelResponseBody(response)\n timeoutScope.dispose()\n this.urlGuard.check(nextUrl)\n currentRequest = { ...currentRequest, url: nextUrl }\n redirectCount += 1\n continue\n }\n\n await cancelResponseBody(response)\n timeoutScope.dispose()\n throw new B2RedirectError(currentRequest.url, response.status, location)\n }\n\n return createTimedHttpResponse(response, timeoutScope)\n }\n }\n}\n\ninterface RequestTimeoutScope {\n readonly signal?: AbortSignal\n readonly timeoutMs: number\n readonly timedOut: boolean\n reset(): void\n dispose(): void\n}\n\nfunction createRequestTimeoutScope(request: HttpRequest): RequestTimeoutScope {\n const timeoutMs = request.retry?.requestTimeoutMs ?? DEFAULT_RETRY_OPTIONS.requestTimeoutMs\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n const scope: RequestTimeoutScope = {\n timeoutMs: 0,\n timedOut: false,\n reset() {},\n dispose() {},\n }\n if (request.signal !== undefined) return { ...scope, signal: request.signal }\n return scope\n }\n\n const controller = new AbortController()\n let timedOut = false\n let timer: ReturnType<typeof setTimeout>\n const abortFromUpstream = (): void => {\n clearTimeout(timer)\n controller.abort(request.signal?.reason ?? new DOMException('Aborted', 'AbortError'))\n }\n const armTimer = (): ReturnType<typeof setTimeout> => {\n const nextTimer = setTimeout(() => {\n timedOut = true\n controller.abort(new DOMException('HTTP request timed out', 'TimeoutError'))\n }, timeoutMs)\n unrefTimer(nextTimer)\n return nextTimer\n }\n timer = armTimer()\n\n const reset = (): void => {\n if (timedOut || controller.signal.aborted) return\n clearTimeout(timer)\n timer = armTimer()\n }\n\n if (request.signal?.aborted === true) {\n clearTimeout(timer)\n abortFromUpstream()\n } else {\n request.signal?.addEventListener('abort', abortFromUpstream, { once: true })\n }\n\n return {\n signal: controller.signal,\n timeoutMs,\n get timedOut() {\n return timedOut\n },\n reset,\n dispose() {\n clearTimeout(timer)\n request.signal?.removeEventListener('abort', abortFromUpstream)\n },\n }\n}\n\nfunction unrefTimer(timer: ReturnType<typeof setTimeout>): void {\n const maybeUnref = (timer as { unref?: () => void }).unref\n if (typeof maybeUnref === 'function') maybeUnref.call(timer)\n}\n\nfunction createRequestTimeoutError(scope: RequestTimeoutScope): DOMException {\n return new DOMException(`HTTP request timed out after ${scope.timeoutMs} ms`, 'TimeoutError')\n}\n\nfunction createTimedHttpResponse(\n response: Response,\n timeoutScope: RequestTimeoutScope,\n): HttpResponse {\n const body = response.body\n if (body === null) timeoutScope.dispose()\n let timedBody: ReadableStream<Uint8Array> | undefined\n\n return {\n status: response.status,\n headers: response.headers,\n get body() {\n if (body === null) return null\n timedBody ??= createTimedResponseBody(body, timeoutScope)\n return timedBody\n },\n json: <T>() =>\n readTimedResponseBody(timeoutScope, response, () => response.json() as Promise<T>),\n text: () => readTimedResponseBody(timeoutScope, response, () => response.text()),\n arrayBuffer: () => readTimedResponseBody(timeoutScope, response, () => response.arrayBuffer()),\n }\n}\n\nasync function readTimedResponseBody<T>(\n timeoutScope: RequestTimeoutScope,\n response: Response,\n read: () => Promise<T>,\n): Promise<T> {\n try {\n return await raceBodyReadWithAbort(timeoutScope, read(), (reason) =>\n cancelResponseBody(response, reason),\n )\n } catch (err) {\n if (timeoutScope.timedOut) {\n throw createRequestTimeoutError(timeoutScope)\n }\n throw err\n } finally {\n timeoutScope.dispose()\n }\n}\n\nfunction createTimedResponseBody(\n body: ReadableStream<Uint8Array>,\n timeoutScope: RequestTimeoutScope,\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n let disposed = false\n const dispose = (): void => {\n if (disposed) return\n disposed = true\n timeoutScope.dispose()\n }\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n reader ??= body.getReader()\n try {\n const result = await raceBodyReadWithAbort(timeoutScope, reader.read(), (reason) =>\n reader?.cancel(reason),\n )\n if (result.done) {\n dispose()\n controller.close()\n return\n }\n timeoutScope.reset()\n controller.enqueue(result.value)\n } catch (err) {\n dispose()\n if (timeoutScope.timedOut) {\n controller.error(createRequestTimeoutError(timeoutScope))\n return\n }\n controller.error(err)\n }\n },\n async cancel(reason) {\n dispose()\n try {\n if (reader !== undefined) {\n await reader.cancel(reason)\n return\n }\n await body.cancel(reason)\n } catch {\n // Best-effort cleanup when the caller cancels the wrapper body.\n }\n },\n })\n}\n\nasync function raceBodyReadWithAbort<T>(\n timeoutScope: RequestTimeoutScope,\n read: Promise<T>,\n abortCleanup?: ((reason: unknown) => Promise<void> | void) | undefined,\n): Promise<T> {\n const signal = timeoutScope.signal\n if (signal === undefined) return read\n if (signal.aborted) {\n void read.catch(() => {})\n const reason = abortReason(signal)\n await runAbortCleanup(abortCleanup, reason)\n throw reason\n }\n\n let removeAbortListener: (() => void) | undefined\n const abort = new Promise<never>((_, reject) => {\n const onAbort = (): void => {\n const reason = abortReason(signal)\n void read.catch(() => {})\n reject(reason)\n void runAbortCleanup(abortCleanup, reason)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortListener = () => signal.removeEventListener('abort', onAbort)\n })\n\n try {\n return await Promise.race([read, abort])\n } finally {\n removeAbortListener?.()\n }\n}\n\nasync function runAbortCleanup(\n abortCleanup: ((reason: unknown) => Promise<void> | void) | undefined,\n reason: unknown,\n): Promise<void> {\n try {\n await abortCleanup?.(reason)\n } catch {\n // Abort cleanup is best-effort and must not mask the abort reason.\n }\n}\n\nfunction isBlockedRedirect(response: Response): boolean {\n return response.type === 'opaqueredirect' || REDIRECT_STATUSES.has(response.status)\n}\n\nfunction canFollowSameOriginRedirect(request: HttpRequest, location: string): boolean {\n if (request.method !== 'GET' && request.method !== 'HEAD') return false\n try {\n return new URL(request.url).origin === new URL(location, request.url).origin\n } catch {\n return false\n }\n}\n\nasync function cancelResponseBody(response: Response, reason?: unknown): Promise<void> {\n try {\n await response.body?.cancel(reason)\n } catch {\n // Best-effort cleanup before throwing the primary error.\n }\n}\n\n/** Configuration for {@link RetryTransport}. */\nexport interface RetryTransportOptions {\n /** The underlying transport to delegate requests to. */\n readonly transport: HttpTransport\n /** Override default retry settings (max retries, delays). */\n readonly retry?: Partial<RetryOptions>\n /**\n * Callback invoked on expired auth token errors. Must refresh\n * credentials AND return the fresh auth token. The original request's\n * abort signal is forwarded so reauthorization can be cancelled with the\n * operation that triggered it. The transport\n * substitutes the new token into `request.headers.Authorization`\n * before retrying — without this, the retried request would still\n * carry the expired token captured by the original caller and the\n * loop would never make progress.\n */\n readonly onReauth?: (signal?: AbortSignal) => Promise<string>\n /**\n * Sleep implementation used between retry attempts. Defaults to the real\n * `sleep` from `./retry.js`. Test code can inject a no-op to avoid real\n * delays without relying on module mocking (which differs across runners).\n *\n * @internal\n */\n readonly sleepImpl?: (ms: number, signal?: AbortSignal) => Promise<void>\n}\n\n/**\n * Decide whether `url` points at a URL-pinned upload POST endpoint.\n *\n * @param url - Request URL to inspect.\n *\n * @returns Whether the request is a direct upload endpoint.\n */\nfunction isUploadEndpoint(url: string): boolean {\n const endpoint = b2ApiEndpointName(url)\n return endpoint === 'b2_upload_file' || endpoint === 'b2_upload_part'\n}\n\nfunction isFinishLargeFileEndpoint(url: string): boolean {\n return b2ApiEndpointName(url) === 'b2_finish_large_file'\n}\n\nfunction isAuthorizeEndpoint(url: string): boolean {\n return b2ApiEndpointName(url) === 'b2_authorize_account'\n}\n\nfunction isStartLargeFileEndpoint(url: string): boolean {\n return b2ApiEndpointName(url) === 'b2_start_large_file'\n}\n\nfunction isPartnerMutationEndpoint(url: string): boolean {\n const endpoint = b2ApiEndpointName(url)\n return (\n endpoint === 'b2_create_group_member' ||\n endpoint === 'b2_eject_group_member' ||\n endpoint === 'b2_reserve_trial_create_account'\n )\n}\n\nfunction isBackupMutationEndpoint(url: string): boolean {\n return backupApiEndpointName(url) === 'bz_delete_computer'\n}\n\nfunction isNonIdempotentMutationRequest(request: HttpRequest): boolean {\n return (\n request.method === 'POST' &&\n (isPartnerMutationEndpoint(request.url) || isBackupMutationEndpoint(request.url))\n )\n}\n\nfunction b2ApiEndpointName(url: string): string | undefined {\n const segments = new URL(url).pathname.split('/').filter((segment) => segment.length > 0)\n // Partner endpoint base URLs can themselves contain a b2api-looking segment\n // before the SDK appends the real API route. Classify the terminal route.\n const apiRootIndex = segments.lastIndexOf('b2api')\n if (apiRootIndex === -1) return undefined\n return segments[apiRootIndex + 2]\n}\n\nfunction backupApiEndpointName(url: string): string | undefined {\n const segments = new URL(url).pathname.split('/').filter((segment) => segment.length > 0)\n const apiRootIndex = segments.lastIndexOf('api')\n if (apiRootIndex === -1 || segments[apiRootIndex + 1] !== 'backup') return undefined\n if (!/^v\\d+$/.test(segments[apiRootIndex + 2] ?? '')) return undefined\n return segments[apiRootIndex + 3]\n}\n\nfunction isReplayUnsafePostRequest(request: HttpRequest): boolean {\n if (request.method !== 'POST') return false\n return (\n isUploadEndpoint(request.url) ||\n isStartLargeFileEndpoint(request.url) ||\n isFinishLargeFileEndpoint(request.url) ||\n isNonIdempotentMutationRequest(request)\n )\n}\n\n/**\n * Decide whether a classified error should be retried in place for `url`.\n * Transient errors normally retry; upload endpoints bubble to the upload layer\n * for fresh-URL retry except account-level 429 throttling, where fetching a new\n * upload URL only amplifies the rate limit.\n *\n * @param error - The classified, retryability-tagged error.\n * @param request - The request being considered for in-place retry.\n *\n * @returns Whether to retry the request in place.\n */\nfunction shouldRetryInPlace(error: B2Error, request: HttpRequest): boolean {\n if (!error.retryable) return false\n if (isAuthorizeEndpoint(request.url) && error instanceof ExpiredAuthTokenError) return false\n if (isNonIdempotentMutationRequest(request)) return false\n if (isStartLargeFileEndpoint(request.url) || isFinishLargeFileEndpoint(request.url)) return false\n if (isUploadEndpoint(request.url) && error.status === 429) return true\n if (isUploadEndpoint(request.url)) return false\n return true\n}\n\nfunction isRequestTimeoutError(err: unknown): boolean {\n return err instanceof DOMException && err.name === 'TimeoutError'\n}\n\nfunction isTerminalTransportError(err: unknown): boolean {\n return (\n err instanceof B2Error ||\n err instanceof B2RedirectError ||\n err instanceof NetworkError ||\n err instanceof B2SsrfError ||\n (err instanceof DOMException && err.name === 'AbortError')\n )\n}\n\n/**\n * Transport wrapper that adds automatic retry with exponential backoff.\n * Handles transient errors (408, 429, and the transient 5xx set 500/502/503/504),\n * expired auth tokens, and network failures. Delegates to an inner\n * {@link HttpTransport}.\n *\n * Upload endpoints (`b2_upload_file` / `b2_upload_part`) are URL-pinned. Their\n * retryable pod failures bubble to the upload layer, which evicts the failed\n * URL, fetches a fresh one, and retries there. HTTP 429 remains an in-place\n * retry so account-level throttling does not trigger extra upload URL fetches.\n */\nexport class RetryTransport implements HttpTransport {\n /** URL guard from the wrapped transport, when the transport exposes one. */\n readonly urlGuard: UrlGuard | undefined\n /** The wrapped transport that performs actual HTTP requests. */\n private readonly inner: HttpTransport\n /** Resolved retry options (defaults merged with user overrides). */\n private readonly options: RetryOptions\n /** Optional callback to refresh auth credentials on 401 — returns the fresh token. */\n private readonly onReauth?: (signal?: AbortSignal) => Promise<string>\n /** Sleep implementation used between retries; injectable for tests. */\n private readonly sleepImpl: (ms: number, signal?: AbortSignal) => Promise<void>\n\n /**\n * Creates a new RetryTransport.\n * @param opts - Retry transport configuration.\n */\n constructor(opts: RetryTransportOptions) {\n this.inner = opts.transport\n this.urlGuard = getTransportUrlGuard(opts.transport)\n this.options = { ...DEFAULT_RETRY_OPTIONS, ...opts.retry }\n if (opts.onReauth !== undefined) this.onReauth = opts.onReauth\n this.sleepImpl = opts.sleepImpl ?? sleep\n }\n\n /**\n * Sends the request with automatic retry on transient failures.\n * On expired auth tokens, calls {@link RetryTransportOptions.onReauth} and retries.\n * @param originalRequest - The HTTP request to execute. The caller's\n * reference is not mutated; on reauth, a copy with a refreshed\n * Authorization header is sent.\n *\n * @returns The HTTP response.\n */\n async send(originalRequest: HttpRequest): Promise<HttpResponse> {\n // `request` is reassigned (not mutated) when reauth produces a\n // fresh Authorization header, so the caller's `originalRequest`\n // stays untouched.\n let request: HttpRequest = originalRequest\n const retryOptions = { ...this.options, ...originalRequest.retry }\n let lastError: B2Error | NetworkError | undefined\n let didReauth = false\n let attempt = 0\n\n while (attempt <= retryOptions.maxRetries) {\n throwIfSignalAborted(request.signal)\n\n if (attempt > 0 && lastError) {\n const retryAfter = lastError instanceof NetworkError ? undefined : lastError.retryAfter\n const delay = computeBackoff(attempt - 1, retryOptions, retryAfter)\n await this.sleepImpl(delay, request.signal)\n }\n\n try {\n const response = await this.inner.send({ ...request, retry: retryOptions })\n await throwIfSignalAbortedAfterResponse(request.signal, response)\n\n if (response.status >= 200 && response.status < 300) {\n return response\n }\n\n let errorBody: B2ErrorResponse\n try {\n errorBody = await response.json<B2ErrorResponse>()\n } catch (err) {\n if (isRequestTimeoutError(err)) throw err\n errorBody = {\n status: response.status,\n code: 'internal_error',\n message: `HTTP ${response.status}`,\n }\n }\n\n const retryAfterHeader = response.headers.get('Retry-After')\n const retryAfterSec = retryAfterHeader ? Number.parseInt(retryAfterHeader, 10) : undefined\n const requestId = response.headers.get('X-Bz-Request-Id') ?? undefined\n\n const error = classifyError(errorBody, {\n ...(retryAfterSec !== undefined ? { retryAfter: retryAfterSec } : {}),\n ...(requestId !== undefined ? { requestId } : {}),\n })\n\n if (\n error instanceof ExpiredAuthTokenError &&\n this.onReauth &&\n !isAuthorizeEndpoint(request.url) &&\n !isUploadEndpoint(request.url) &&\n !isNonIdempotentMutationRequest(request) &&\n !didReauth\n ) {\n // Reauth returns the FRESH token; build a new request with a\n // shallow-copied headers object so the Authorization swap\n // doesn't mutate the caller's original request (which they\n // may hold for retry / introspection). Without this swap the\n // retry would carry the expired token captured at\n // request-build time and bounce off the server again,\n // exhausting the retry budget.\n const freshToken = await raceWithAbort(this.onReauth(request.signal), request.signal)\n throwIfSignalAborted(request.signal)\n request = {\n ...request,\n headers: { ...(request.headers ?? {}), Authorization: freshToken },\n }\n didReauth = true\n lastError = undefined\n continue\n }\n\n if (!shouldRetryInPlace(error, request) || attempt === retryOptions.maxRetries) {\n throw error\n }\n\n lastError = error\n attempt += 1\n } catch (err) {\n throwIfSignalAborted(request.signal)\n if (isTerminalTransportError(err)) {\n throw err\n }\n\n const networkErr = new NetworkError(\n err instanceof Error ? err.message : 'Network error',\n err,\n )\n\n if (isReplayUnsafePostRequest(request) || attempt === retryOptions.maxRetries) {\n throw networkErr\n }\n\n lastError = networkErr\n attempt += 1\n }\n }\n\n throw lastError ?? new NetworkError('Max retries exceeded')\n }\n}\n\nasync function throwIfSignalAbortedAfterResponse(\n signal: AbortSignal | undefined,\n response: HttpResponse,\n): Promise<void> {\n if (signal?.aborted !== true) return\n const reason = abortReason(signal)\n try {\n await response.body?.cancel(reason)\n } catch {\n // Best-effort cleanup before preserving the caller's abort reason.\n }\n throw reason\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","names":[],"sources":["../../src/http/transport.ts"],"sourcesContent":["import {\n B2Error,\n B2RedirectError,\n B2SsrfError,\n classifyError,\n ExpiredAuthTokenError,\n NetworkError,\n} from '../errors/index.ts'\nimport type { B2ErrorResponse } from '../types/errors.ts'\nimport { abortReason, raceWithAbort, throwIfSignalAborted } from '../util/abort.ts'\nimport {\n isBackupNonIdempotentMutationEndpoint,\n isPartnerNonIdempotentMutationEndpoint,\n} from './non-idempotent-mutations.ts'\nimport { computeBackoff, DEFAULT_RETRY_OPTIONS, type RetryOptions, sleep } from './retry.ts'\nimport { UrlGuard } from './url-guard.ts'\nimport { getUserAgent } from './user-agent.ts'\n\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308])\nconst MAX_SAME_ORIGIN_REDIRECTS = 5\n\n/** Describes an outgoing HTTP request to the B2 API. */\nexport interface HttpRequest {\n /** Fully qualified URL to send the request to. */\n readonly url: string\n /** HTTP method. B2 uses GET for downloads (HEAD to fetch only headers) and POST for all other operations. */\n readonly method: 'GET' | 'HEAD' | 'POST'\n /** Request headers. Authorization and content-type are typically included. */\n readonly headers?: Record<string, string>\n /** Request body. Used for POST requests (JSON payloads or file uploads). */\n readonly body?: BodyInit | null\n /** Optional abort signal for request cancellation. */\n readonly signal?: AbortSignal\n /** Optional per-request retry override. */\n readonly retry?: Partial<RetryOptions>\n /**\n * Set false to disable automatic retry and expired-token reauth replay.\n * This is not a general idempotency override.\n */\n readonly idempotent?: false\n}\n\n/** Represents a parsed HTTP response from the B2 API. */\nexport interface HttpResponse {\n /** HTTP status code. */\n readonly status: number\n /** Response headers. */\n readonly headers: Headers\n /** Response body as a readable stream, or null for empty responses. */\n readonly body: ReadableStream<Uint8Array> | null\n /** Parses the response body as JSON. */\n json<T>(): Promise<T>\n /** Reads the response body as a UTF-8 string. */\n text(): Promise<string>\n /** Reads the response body as an ArrayBuffer. */\n arrayBuffer(): Promise<ArrayBuffer>\n}\n\n/**\n * Transport layer abstraction for sending HTTP requests.\n * Implementations handle the actual network I/O and can be composed\n * (e.g. wrapping a {@link FetchTransport} with a {@link RetryTransport}).\n */\nexport interface HttpTransport {\n /** Sends an HTTP request and returns the response. */\n send(request: HttpRequest): Promise<HttpResponse>\n}\n\n/**\n * Transport capability for implementations that expose the SSRF URL guard\n * protecting credential-bearing requests. Wrappers that preserve this\n * capability should forward the same `urlGuard` property.\n */\nexport interface UrlGuardedTransport extends HttpTransport {\n /** SSRF allow-list applied to outgoing URLs. */\n readonly urlGuard: UrlGuard\n}\n\n/**\n * Returns the URL guard exposed by `transport`, if it implements\n * {@link UrlGuardedTransport}.\n *\n * @param transport - Transport to inspect.\n *\n * @returns The exposed URL guard, or undefined for unguarded transports.\n */\nexport function getTransportUrlGuard(transport: HttpTransport): UrlGuard | undefined {\n const candidate = transport as Partial<UrlGuardedTransport>\n return candidate.urlGuard instanceof UrlGuard ? candidate.urlGuard : undefined\n}\n\n/**\n * Default transport implementation using the global `fetch` API.\n * Automatically sets the User-Agent header on each request and applies the\n * SSRF {@link UrlGuard} (if configured) before opening the connection.\n * Redirect following is disabled so redirected URLs cannot bypass the guard or\n * receive credential-bearing headers without an explicit checked request.\n */\nexport class FetchTransport implements UrlGuardedTransport {\n /** User-Agent string sent with every request. */\n private readonly userAgent: string\n /** Whether same-origin GET/HEAD redirects should be followed after guard checks. */\n private readonly followSameOriginRedirects: boolean\n /** SSRF allow-list applied to every outgoing URL. Mutable so `B2Client.authorize()` can lock it down post-auth. */\n readonly urlGuard: UrlGuard\n\n /**\n * Creates a new FetchTransport.\n * @param options - Optional configuration: custom User-Agent prefix and SSRF guard.\n */\n constructor(options?: {\n userAgent?: string\n urlGuard?: UrlGuard\n /**\n * Follow same-origin GET/HEAD redirects after checking the target with the\n * URL guard. POST redirects are still blocked to avoid replaying\n * credential-bearing payloads to an unexpected endpoint. Defaults to true.\n */\n followSameOriginRedirects?: boolean\n }) {\n this.userAgent = getUserAgent(options?.userAgent)\n this.followSameOriginRedirects = options?.followSameOriginRedirects ?? true\n this.urlGuard = options?.urlGuard ?? new UrlGuard()\n }\n\n /**\n * Sends the request using the global `fetch` function.\n * @param request - The HTTP request to execute.\n *\n * @returns The HTTP response.\n *\n * @throws B2SsrfError when the URL fails the configured SSRF guard.\n * @throws B2RedirectError when a response attempts to redirect.\n */\n async send(request: HttpRequest): Promise<HttpResponse> {\n let currentRequest = request\n let redirectCount = 0\n\n while (true) {\n this.urlGuard.check(currentRequest.url)\n\n const headers = new Headers(currentRequest.headers)\n if (!headers.has('User-Agent')) {\n headers.set('User-Agent', this.userAgent)\n }\n\n const timeoutScope = createRequestTimeoutScope(currentRequest)\n let response: Response\n try {\n response = await fetch(currentRequest.url, {\n method: currentRequest.method,\n headers,\n body: currentRequest.body ?? null,\n redirect: 'manual',\n ...(timeoutScope.signal !== undefined ? { signal: timeoutScope.signal } : {}),\n })\n } catch (err) {\n timeoutScope.dispose()\n if (timeoutScope.timedOut) {\n throw createRequestTimeoutError(timeoutScope)\n }\n throw err\n }\n\n if (isBlockedRedirect(response)) {\n const location = response.headers.get('Location')\n if (\n this.followSameOriginRedirects &&\n location !== null &&\n redirectCount < MAX_SAME_ORIGIN_REDIRECTS &&\n canFollowSameOriginRedirect(currentRequest, location)\n ) {\n const nextUrl = new URL(location, currentRequest.url).toString()\n await cancelResponseBody(response)\n timeoutScope.dispose()\n this.urlGuard.check(nextUrl)\n currentRequest = { ...currentRequest, url: nextUrl }\n redirectCount += 1\n continue\n }\n\n await cancelResponseBody(response)\n timeoutScope.dispose()\n throw new B2RedirectError(currentRequest.url, response.status, location)\n }\n\n return createTimedHttpResponse(response, timeoutScope)\n }\n }\n}\n\ninterface RequestTimeoutScope {\n readonly signal?: AbortSignal\n readonly timeoutMs: number\n readonly timedOut: boolean\n reset(): void\n dispose(): void\n}\n\nfunction createRequestTimeoutScope(request: HttpRequest): RequestTimeoutScope {\n const timeoutMs = request.retry?.requestTimeoutMs ?? DEFAULT_RETRY_OPTIONS.requestTimeoutMs\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n const scope: RequestTimeoutScope = {\n timeoutMs: 0,\n timedOut: false,\n reset() {},\n dispose() {},\n }\n if (request.signal !== undefined) return { ...scope, signal: request.signal }\n return scope\n }\n\n const controller = new AbortController()\n let timedOut = false\n let timer: ReturnType<typeof setTimeout>\n const abortFromUpstream = (): void => {\n clearTimeout(timer)\n controller.abort(request.signal?.reason ?? new DOMException('Aborted', 'AbortError'))\n }\n const armTimer = (): ReturnType<typeof setTimeout> => {\n const nextTimer = setTimeout(() => {\n timedOut = true\n controller.abort(new DOMException('HTTP request timed out', 'TimeoutError'))\n }, timeoutMs)\n unrefTimer(nextTimer)\n return nextTimer\n }\n timer = armTimer()\n\n const reset = (): void => {\n if (timedOut || controller.signal.aborted) return\n clearTimeout(timer)\n timer = armTimer()\n }\n\n if (request.signal?.aborted === true) {\n clearTimeout(timer)\n abortFromUpstream()\n } else {\n request.signal?.addEventListener('abort', abortFromUpstream, { once: true })\n }\n\n return {\n signal: controller.signal,\n timeoutMs,\n get timedOut() {\n return timedOut\n },\n reset,\n dispose() {\n clearTimeout(timer)\n request.signal?.removeEventListener('abort', abortFromUpstream)\n },\n }\n}\n\nfunction unrefTimer(timer: ReturnType<typeof setTimeout>): void {\n const maybeUnref = (timer as { unref?: () => void }).unref\n if (typeof maybeUnref === 'function') maybeUnref.call(timer)\n}\n\nfunction createRequestTimeoutError(scope: RequestTimeoutScope): DOMException {\n return new DOMException(`HTTP request timed out after ${scope.timeoutMs} ms`, 'TimeoutError')\n}\n\nfunction createTimedHttpResponse(\n response: Response,\n timeoutScope: RequestTimeoutScope,\n): HttpResponse {\n const body = response.body\n if (body === null) timeoutScope.dispose()\n let timedBody: ReadableStream<Uint8Array> | undefined\n\n return {\n status: response.status,\n headers: response.headers,\n get body() {\n if (body === null) return null\n timedBody ??= createTimedResponseBody(body, timeoutScope)\n return timedBody\n },\n json: <T>() =>\n readTimedResponseBody(timeoutScope, response, () => response.json() as Promise<T>),\n text: () => readTimedResponseBody(timeoutScope, response, () => response.text()),\n arrayBuffer: () => readTimedResponseBody(timeoutScope, response, () => response.arrayBuffer()),\n }\n}\n\nasync function readTimedResponseBody<T>(\n timeoutScope: RequestTimeoutScope,\n response: Response,\n read: () => Promise<T>,\n): Promise<T> {\n try {\n return await raceBodyReadWithAbort(timeoutScope, read(), (reason) =>\n cancelResponseBody(response, reason),\n )\n } catch (err) {\n if (timeoutScope.timedOut) {\n throw createRequestTimeoutError(timeoutScope)\n }\n throw err\n } finally {\n timeoutScope.dispose()\n }\n}\n\nfunction createTimedResponseBody(\n body: ReadableStream<Uint8Array>,\n timeoutScope: RequestTimeoutScope,\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n let disposed = false\n const dispose = (): void => {\n if (disposed) return\n disposed = true\n timeoutScope.dispose()\n }\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n reader ??= body.getReader()\n try {\n const result = await raceBodyReadWithAbort(timeoutScope, reader.read(), (reason) =>\n reader?.cancel(reason),\n )\n if (result.done) {\n dispose()\n controller.close()\n return\n }\n timeoutScope.reset()\n controller.enqueue(result.value)\n } catch (err) {\n dispose()\n if (timeoutScope.timedOut) {\n controller.error(createRequestTimeoutError(timeoutScope))\n return\n }\n controller.error(err)\n }\n },\n async cancel(reason) {\n dispose()\n try {\n if (reader !== undefined) {\n await reader.cancel(reason)\n return\n }\n await body.cancel(reason)\n } catch {\n // Best-effort cleanup when the caller cancels the wrapper body.\n }\n },\n })\n}\n\nasync function raceBodyReadWithAbort<T>(\n timeoutScope: RequestTimeoutScope,\n read: Promise<T>,\n abortCleanup?: ((reason: unknown) => Promise<void> | void) | undefined,\n): Promise<T> {\n const signal = timeoutScope.signal\n if (signal === undefined) return read\n if (signal.aborted) {\n void read.catch(() => {})\n const reason = abortReason(signal)\n await runAbortCleanup(abortCleanup, reason)\n throw reason\n }\n\n let removeAbortListener: (() => void) | undefined\n const abort = new Promise<never>((_, reject) => {\n const onAbort = (): void => {\n const reason = abortReason(signal)\n void read.catch(() => {})\n reject(reason)\n void runAbortCleanup(abortCleanup, reason)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortListener = () => signal.removeEventListener('abort', onAbort)\n })\n\n try {\n return await Promise.race([read, abort])\n } finally {\n removeAbortListener?.()\n }\n}\n\nasync function runAbortCleanup(\n abortCleanup: ((reason: unknown) => Promise<void> | void) | undefined,\n reason: unknown,\n): Promise<void> {\n try {\n await abortCleanup?.(reason)\n } catch {\n // Abort cleanup is best-effort and must not mask the abort reason.\n }\n}\n\nfunction isBlockedRedirect(response: Response): boolean {\n return response.type === 'opaqueredirect' || REDIRECT_STATUSES.has(response.status)\n}\n\nfunction canFollowSameOriginRedirect(request: HttpRequest, location: string): boolean {\n if (request.method !== 'GET' && request.method !== 'HEAD') return false\n try {\n return new URL(request.url).origin === new URL(location, request.url).origin\n } catch {\n return false\n }\n}\n\nasync function cancelResponseBody(response: Response, reason?: unknown): Promise<void> {\n try {\n await response.body?.cancel(reason)\n } catch {\n // Best-effort cleanup before throwing the primary error.\n }\n}\n\n/** Configuration for {@link RetryTransport}. */\nexport interface RetryTransportOptions {\n /** The underlying transport to delegate requests to. */\n readonly transport: HttpTransport\n /** Override default retry settings (max retries, delays). */\n readonly retry?: Partial<RetryOptions>\n /**\n * Callback invoked on expired auth token errors. Must refresh\n * credentials AND return the fresh auth token. The original request's\n * abort signal is forwarded so reauthorization can be cancelled with the\n * operation that triggered it. The transport\n * substitutes the new token into `request.headers.Authorization`\n * before retrying — without this, the retried request would still\n * carry the expired token captured by the original caller and the\n * loop would never make progress.\n */\n readonly onReauth?: (signal?: AbortSignal) => Promise<string>\n /**\n * Sleep implementation used between retry attempts. Defaults to the real\n * `sleep` from `./retry.js`. Test code can inject a no-op to avoid real\n * delays without relying on module mocking (which differs across runners).\n *\n * @internal\n */\n readonly sleepImpl?: (ms: number, signal?: AbortSignal) => Promise<void>\n}\n\n/**\n * Decide whether `url` points at a URL-pinned upload POST endpoint.\n *\n * @param url - Request URL to inspect.\n *\n * @returns Whether the request is a direct upload endpoint.\n */\nfunction isUploadEndpoint(url: string): boolean {\n const endpoint = b2ApiEndpointName(url)\n return endpoint === 'b2_upload_file' || endpoint === 'b2_upload_part'\n}\n\nfunction isFinishLargeFileEndpoint(url: string): boolean {\n return b2ApiEndpointName(url) === 'b2_finish_large_file'\n}\n\nfunction isAuthorizeEndpoint(url: string): boolean {\n return b2ApiEndpointName(url) === 'b2_authorize_account'\n}\n\nfunction isStartLargeFileEndpoint(url: string): boolean {\n return b2ApiEndpointName(url) === 'b2_start_large_file'\n}\n\nfunction isKnownPartnerNonIdempotentMutationEndpoint(url: string): boolean {\n return isPartnerNonIdempotentMutationEndpoint(b2ApiEndpointName(url))\n}\n\nfunction isKnownBackupNonIdempotentMutationEndpoint(url: string): boolean {\n return isBackupNonIdempotentMutationEndpoint(backupApiEndpointName(url))\n}\n\nfunction isNonIdempotentMutationRequest(request: HttpRequest): boolean {\n // Defense in depth: known mutations must not replay if a wrapper drops\n // the raw client's explicit `idempotent: false` marker.\n return (\n request.idempotent === false ||\n (request.method === 'POST' &&\n (isKnownPartnerNonIdempotentMutationEndpoint(request.url) ||\n isKnownBackupNonIdempotentMutationEndpoint(request.url)))\n )\n}\n\nfunction b2ApiEndpointName(url: string): string | undefined {\n const segments = new URL(url).pathname.split('/').filter((segment) => segment.length > 0)\n // Partner endpoint base URLs can themselves contain a b2api-looking segment\n // before the SDK appends the real API route. Classify the terminal route.\n const apiRootIndex = segments.lastIndexOf('b2api')\n if (apiRootIndex === -1) return undefined\n return segments[apiRootIndex + 2]\n}\n\nfunction backupApiEndpointName(url: string): string | undefined {\n const segments = new URL(url).pathname.split('/').filter((segment) => segment.length > 0)\n const apiRootIndex = segments.lastIndexOf('api')\n if (apiRootIndex === -1 || segments[apiRootIndex + 1] !== 'backup') return undefined\n if (!/^v\\d+$/.test(segments[apiRootIndex + 2] ?? '')) return undefined\n return segments[apiRootIndex + 3]\n}\n\nfunction isReplayUnsafeRequest(request: HttpRequest): boolean {\n if (request.idempotent === false) return true\n if (request.method !== 'POST') return false\n return (\n isUploadEndpoint(request.url) ||\n isStartLargeFileEndpoint(request.url) ||\n isFinishLargeFileEndpoint(request.url) ||\n isNonIdempotentMutationRequest(request)\n )\n}\n\n/**\n * Decide whether a classified error should be retried in place for `url`.\n * Transient errors normally retry; upload endpoints bubble to the upload layer\n * for fresh-URL retry except account-level 429 throttling, where fetching a new\n * upload URL only amplifies the rate limit.\n *\n * @param error - The classified, retryability-tagged error.\n * @param request - The request being considered for in-place retry.\n *\n * @returns Whether to retry the request in place.\n */\nfunction shouldRetryInPlace(error: B2Error, request: HttpRequest): boolean {\n if (!error.retryable) return false\n if (isAuthorizeEndpoint(request.url) && error instanceof ExpiredAuthTokenError) return false\n if (isNonIdempotentMutationRequest(request)) return false\n if (isStartLargeFileEndpoint(request.url) || isFinishLargeFileEndpoint(request.url)) return false\n if (isUploadEndpoint(request.url) && error.status === 429) return true\n if (isUploadEndpoint(request.url)) return false\n return true\n}\n\nfunction isRequestTimeoutError(err: unknown): boolean {\n return err instanceof DOMException && err.name === 'TimeoutError'\n}\n\nfunction isTerminalTransportError(err: unknown): boolean {\n return (\n err instanceof B2Error ||\n err instanceof B2RedirectError ||\n err instanceof NetworkError ||\n err instanceof B2SsrfError ||\n (err instanceof DOMException && err.name === 'AbortError')\n )\n}\n\n/**\n * Transport wrapper that adds automatic retry with exponential backoff.\n * Handles transient errors (408, 429, and the transient 5xx set 500/502/503/504),\n * expired auth tokens, and network failures. Delegates to an inner\n * {@link HttpTransport}.\n *\n * Upload endpoints (`b2_upload_file` / `b2_upload_part`) are URL-pinned. Their\n * retryable pod failures bubble to the upload layer, which evicts the failed\n * URL, fetches a fresh one, and retries there. HTTP 429 remains an in-place\n * retry so account-level throttling does not trigger extra upload URL fetches.\n */\nexport class RetryTransport implements HttpTransport {\n /** URL guard from the wrapped transport, when the transport exposes one. */\n readonly urlGuard: UrlGuard | undefined\n /** The wrapped transport that performs actual HTTP requests. */\n private readonly inner: HttpTransport\n /** Resolved retry options (defaults merged with user overrides). */\n private readonly options: RetryOptions\n /** Optional callback to refresh auth credentials on 401 — returns the fresh token. */\n private readonly onReauth?: (signal?: AbortSignal) => Promise<string>\n /** Sleep implementation used between retries; injectable for tests. */\n private readonly sleepImpl: (ms: number, signal?: AbortSignal) => Promise<void>\n\n /**\n * Creates a new RetryTransport.\n * @param opts - Retry transport configuration.\n */\n constructor(opts: RetryTransportOptions) {\n this.inner = opts.transport\n this.urlGuard = getTransportUrlGuard(opts.transport)\n this.options = { ...DEFAULT_RETRY_OPTIONS, ...opts.retry }\n if (opts.onReauth !== undefined) this.onReauth = opts.onReauth\n this.sleepImpl = opts.sleepImpl ?? sleep\n }\n\n /**\n * Sends the request with automatic retry on transient failures.\n * On expired auth tokens, calls {@link RetryTransportOptions.onReauth} and retries.\n * @param originalRequest - The HTTP request to execute. The caller's\n * reference is not mutated; on reauth, a copy with a refreshed\n * Authorization header is sent.\n *\n * @returns The HTTP response.\n */\n async send(originalRequest: HttpRequest): Promise<HttpResponse> {\n // `request` is reassigned (not mutated) when reauth produces a\n // fresh Authorization header, so the caller's `originalRequest`\n // stays untouched.\n let request: HttpRequest = originalRequest\n const retryOptions = { ...this.options, ...originalRequest.retry }\n let lastError: B2Error | NetworkError | undefined\n let didReauth = false\n let attempt = 0\n\n while (attempt <= retryOptions.maxRetries) {\n throwIfSignalAborted(request.signal)\n\n if (attempt > 0 && lastError) {\n const retryAfter = lastError instanceof NetworkError ? undefined : lastError.retryAfter\n const delay = computeBackoff(attempt - 1, retryOptions, retryAfter)\n await this.sleepImpl(delay, request.signal)\n }\n\n try {\n const response = await this.inner.send({ ...request, retry: retryOptions })\n await throwIfSignalAbortedAfterResponse(request.signal, response)\n\n if (response.status >= 200 && response.status < 300) {\n return response\n }\n\n let errorBody: B2ErrorResponse\n try {\n errorBody = await response.json<B2ErrorResponse>()\n } catch (err) {\n if (isRequestTimeoutError(err)) throw err\n errorBody = {\n status: response.status,\n code: 'internal_error',\n message: `HTTP ${response.status}`,\n }\n }\n\n const retryAfterHeader = response.headers.get('Retry-After')\n const retryAfterSec = retryAfterHeader ? Number.parseInt(retryAfterHeader, 10) : undefined\n const requestId = response.headers.get('X-Bz-Request-Id') ?? undefined\n\n const error = classifyError(errorBody, {\n ...(retryAfterSec !== undefined ? { retryAfter: retryAfterSec } : {}),\n ...(requestId !== undefined ? { requestId } : {}),\n })\n\n if (\n error instanceof ExpiredAuthTokenError &&\n this.onReauth &&\n !isAuthorizeEndpoint(request.url) &&\n !isUploadEndpoint(request.url) &&\n !isNonIdempotentMutationRequest(request) &&\n !didReauth\n ) {\n // Reauth returns the FRESH token; build a new request with a\n // shallow-copied headers object so the Authorization swap\n // doesn't mutate the caller's original request (which they\n // may hold for retry / introspection). Without this swap the\n // retry would carry the expired token captured at\n // request-build time and bounce off the server again,\n // exhausting the retry budget.\n const freshToken = await raceWithAbort(this.onReauth(request.signal), request.signal)\n throwIfSignalAborted(request.signal)\n request = {\n ...request,\n headers: { ...(request.headers ?? {}), Authorization: freshToken },\n }\n didReauth = true\n lastError = undefined\n continue\n }\n\n if (!shouldRetryInPlace(error, request) || attempt === retryOptions.maxRetries) {\n throw error\n }\n\n lastError = error\n attempt += 1\n } catch (err) {\n throwIfSignalAborted(request.signal)\n if (isTerminalTransportError(err)) {\n throw err\n }\n\n const networkErr = new NetworkError(\n err instanceof Error ? err.message : 'Network error',\n err,\n )\n\n if (isReplayUnsafeRequest(request) || attempt === retryOptions.maxRetries) {\n throw networkErr\n }\n\n lastError = networkErr\n attempt += 1\n }\n }\n\n throw lastError ?? new NetworkError('Max retries exceeded')\n }\n}\n\nasync function throwIfSignalAbortedAfterResponse(\n signal: AbortSignal | undefined,\n response: HttpResponse,\n): Promise<void> {\n if (signal?.aborted !== true) return\n const reason = abortReason(signal)\n try {\n await response.body?.cancel(reason)\n } catch {\n // Best-effort cleanup before preserving the caller's abort reason.\n }\n throw reason\n}\n"],"mappings":"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"}
@@ -12,6 +12,16 @@ var SDK_PRODUCT = "b2-sdk-typescript";
12
12
  */
13
13
  var SDK_PACKAGE = "@backblaze-labs/b2-sdk";
14
14
  /**
15
+ * Build the stable SDK product token for the User-Agent header.
16
+ *
17
+ * @param version - Version segment resolved by {@link productVersion}.
18
+ *
19
+ * @returns The `b2-sdk-typescript/<version-or-dev>` product token.
20
+ */
21
+ function sdkProductToken(version = require_version.productVersion()) {
22
+ return `${SDK_PRODUCT}/${version}`;
23
+ }
24
+ /**
15
25
  * Best-effort detection of the JS runtime and host OS. Used to populate the
16
26
  * User-Agent comment so server-side logs can spot Bun/Deno adoption and
17
27
  * triage OS-specific issues without asking for a repro environment.
@@ -80,12 +90,13 @@ function getUserAgent(custom) {
80
90
  ];
81
91
  if (os !== void 0) parts.push(os);
82
92
  if (arch !== void 0) parts.push(arch);
83
- const base = `${SDK_PRODUCT}/${require_version.VERSION} (${parts.join("; ")})`;
93
+ const base = `${sdkProductToken()} (${parts.join("; ")})`;
84
94
  return custom ? `${custom} ${base}` : base;
85
95
  }
86
96
  //#endregion
87
97
  exports.SDK_PACKAGE = SDK_PACKAGE;
88
98
  exports.SDK_PRODUCT = SDK_PRODUCT;
89
99
  exports.getUserAgent = getUserAgent;
100
+ exports.sdkProductToken = sdkProductToken;
90
101
 
91
102
  //# sourceMappingURL=user-agent.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-agent.cjs","names":[],"sources":["../../src/http/user-agent.ts"],"sourcesContent":["import { VERSION } from '../version.ts'\n\n/**\n * Stable identifier Backblaze can grep server logs for to find every request\n * issued by this SDK regardless of how the User-Agent comment evolves.\n * Treat as part of the public contract: do NOT rename without coordinating.\n */\nexport const SDK_PRODUCT = 'b2-sdk-typescript'\n\n/**\n * The npm package name. Embedded in the User-Agent comment alongside\n * {@link SDK_PRODUCT} so log queries that grep on either token work.\n */\nexport const SDK_PACKAGE = '@backblaze-labs/b2-sdk'\n\n/** Detected runtime + OS information for the User-Agent comment. */\ninterface Platform {\n /** Runtime identifier: `node/<x.y.z>`, `bun/<x.y.z>`, `deno/<x.y.z>`, `browser`, or `unknown`. */\n readonly runtime: string\n /** OS identifier (`linux`, `darwin`, `win32`, etc.) when available, or `undefined`. */\n readonly os: string | undefined\n /** CPU architecture (`x64`, `arm64`, etc.) when available, or `undefined`. */\n readonly arch: string | undefined\n}\n\n/**\n * Best-effort detection of the JS runtime and host OS. Used to populate the\n * User-Agent comment so server-side logs can spot Bun/Deno adoption and\n * triage OS-specific issues without asking for a repro environment.\n *\n * @returns The detected runtime, OS, and architecture tokens.\n */\nfunction detectPlatform(): Platform {\n const g = globalThis as Record<string, unknown>\n\n // Deno: Deno.version.deno, Deno.build.{os,arch}.\n if (typeof g['Deno'] !== 'undefined') {\n const deno = g['Deno'] as {\n version?: { deno?: string }\n build?: { os?: string; arch?: string }\n }\n return {\n runtime: deno.version?.deno ? `deno/${deno.version.deno}` : 'deno',\n os: deno.build?.os,\n arch: deno.build?.arch,\n }\n }\n\n // Bun: globalThis.Bun.version, process.platform/arch (Bun is Node-compat).\n if (typeof g['Bun'] !== 'undefined') {\n const bun = g['Bun'] as { version?: string }\n const proc = g['process'] as { platform?: string; arch?: string } | undefined\n return {\n runtime: bun.version ? `bun/${bun.version}` : 'bun',\n os: proc?.platform,\n arch: proc?.arch,\n }\n }\n\n // Node: process.versions.node, process.platform, process.arch.\n if (typeof g['process'] !== 'undefined') {\n const proc = g['process'] as {\n versions?: { node?: string }\n platform?: string\n arch?: string\n }\n if (proc.versions?.node) {\n return {\n runtime: `node/${proc.versions.node}`,\n os: proc.platform,\n arch: proc.arch,\n }\n }\n }\n\n // Browsers (and other navigator-only runtimes like Cloudflare Workers,\n // Vercel Edge, etc.). We deliberately do NOT parse the existing navigator\n // UA — that's noisy, often spoofed, and the request layer already adds the\n // browser's own UA on top.\n if (typeof g['navigator'] !== 'undefined') {\n return { runtime: 'browser', os: undefined, arch: undefined }\n }\n\n return { runtime: 'unknown', os: undefined, arch: undefined }\n}\n\n/**\n * Build the User-Agent header value the SDK sends on every B2 request.\n *\n * The product token, npm package name, language label, runtime, OS, and\n * architecture are emitted in that order, separated by semicolons inside a\n * single parenthesised comment block. OS and architecture are omitted on\n * runtimes that don't expose them (notably browsers). A custom prefix passed\n * via `B2ClientOptions.userAgent` is prepended verbatim so app-level\n * identifiers come first. See the README \"Identifying your traffic\" section\n * for examples.\n *\n * @param custom - Optional prefix prepended to the default User-Agent.\n *\n * @returns The formatted User-Agent header string.\n */\nexport function getUserAgent(custom?: string): string {\n const { runtime, os, arch } = detectPlatform()\n const parts = ['typescript', SDK_PACKAGE, runtime]\n if (os !== undefined) parts.push(os)\n if (arch !== undefined) parts.push(arch)\n const base = `${SDK_PRODUCT}/${VERSION} (${parts.join('; ')})`\n return custom ? `${custom} ${base}` : base\n}\n"],"mappings":";;;;;;;AAOA,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;;;;AAmB3B,SAAS,iBAA2B;CAClC,MAAM,IAAI;CAGV,IAAI,OAAO,EAAE,YAAY,aAAa;EACpC,MAAM,OAAO,EAAE;EAIf,OAAO;GACL,SAAS,KAAK,SAAS,OAAO,QAAQ,KAAK,QAAQ,SAAS;GAC5D,IAAI,KAAK,OAAO;GAChB,MAAM,KAAK,OAAO;EACpB;CACF;CAGA,IAAI,OAAO,EAAE,WAAW,aAAa;EACnC,MAAM,MAAM,EAAE;EACd,MAAM,OAAO,EAAE;EACf,OAAO;GACL,SAAS,IAAI,UAAU,OAAO,IAAI,YAAY;GAC9C,IAAI,MAAM;GACV,MAAM,MAAM;EACd;CACF;CAGA,IAAI,OAAO,EAAE,eAAe,aAAa;EACvC,MAAM,OAAO,EAAE;EAKf,IAAI,KAAK,UAAU,MACjB,OAAO;GACL,SAAS,QAAQ,KAAK,SAAS;GAC/B,IAAI,KAAK;GACT,MAAM,KAAK;EACb;CAEJ;CAMA,IAAI,OAAO,EAAE,iBAAiB,aAC5B,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;CAG9D,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;AAC9D;;;;;;;;;;;;;;;;AAiBA,SAAgB,aAAa,QAAyB;CACpD,MAAM,EAAE,SAAS,IAAI,SAAS,eAAe;CAC7C,MAAM,QAAQ;EAAC;EAAc;EAAa;CAAO;CACjD,IAAI,OAAO,KAAA,GAAW,MAAM,KAAK,EAAE;CACnC,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,IAAI;CACvC,MAAM,OAAO,GAAG,YAAY,GAAG,gBAAA,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;CAC5D,OAAO,SAAS,GAAG,OAAO,GAAG,SAAS;AACxC"}
1
+ {"version":3,"file":"user-agent.cjs","names":[],"sources":["../../src/http/user-agent.ts"],"sourcesContent":["import { productVersion } from '../version.ts'\n\n/**\n * Stable identifier Backblaze can grep server logs for to find every request\n * issued by this SDK regardless of how the User-Agent comment evolves.\n * Treat as part of the public contract: do NOT rename without coordinating.\n */\nexport const SDK_PRODUCT = 'b2-sdk-typescript'\n\n/**\n * The npm package name. Embedded in the User-Agent comment alongside\n * {@link SDK_PRODUCT} so log queries that grep on either token work.\n */\nexport const SDK_PACKAGE = '@backblaze-labs/b2-sdk'\n\n/**\n * Build the stable SDK product token for the User-Agent header.\n *\n * @param version - Version segment resolved by {@link productVersion}.\n *\n * @returns The `b2-sdk-typescript/<version-or-dev>` product token.\n */\nexport function sdkProductToken(version: string = productVersion()): string {\n return `${SDK_PRODUCT}/${version}`\n}\n\n/** Detected runtime + OS information for the User-Agent comment. */\ninterface Platform {\n /** Runtime identifier: `node/<x.y.z>`, `bun/<x.y.z>`, `deno/<x.y.z>`, `browser`, or `unknown`. */\n readonly runtime: string\n /** OS identifier (`linux`, `darwin`, `win32`, etc.) when available, or `undefined`. */\n readonly os: string | undefined\n /** CPU architecture (`x64`, `arm64`, etc.) when available, or `undefined`. */\n readonly arch: string | undefined\n}\n\n/**\n * Best-effort detection of the JS runtime and host OS. Used to populate the\n * User-Agent comment so server-side logs can spot Bun/Deno adoption and\n * triage OS-specific issues without asking for a repro environment.\n *\n * @returns The detected runtime, OS, and architecture tokens.\n */\nfunction detectPlatform(): Platform {\n const g = globalThis as Record<string, unknown>\n\n // Deno: Deno.version.deno, Deno.build.{os,arch}.\n if (typeof g['Deno'] !== 'undefined') {\n const deno = g['Deno'] as {\n version?: { deno?: string }\n build?: { os?: string; arch?: string }\n }\n return {\n runtime: deno.version?.deno ? `deno/${deno.version.deno}` : 'deno',\n os: deno.build?.os,\n arch: deno.build?.arch,\n }\n }\n\n // Bun: globalThis.Bun.version, process.platform/arch (Bun is Node-compat).\n if (typeof g['Bun'] !== 'undefined') {\n const bun = g['Bun'] as { version?: string }\n const proc = g['process'] as { platform?: string; arch?: string } | undefined\n return {\n runtime: bun.version ? `bun/${bun.version}` : 'bun',\n os: proc?.platform,\n arch: proc?.arch,\n }\n }\n\n // Node: process.versions.node, process.platform, process.arch.\n if (typeof g['process'] !== 'undefined') {\n const proc = g['process'] as {\n versions?: { node?: string }\n platform?: string\n arch?: string\n }\n if (proc.versions?.node) {\n return {\n runtime: `node/${proc.versions.node}`,\n os: proc.platform,\n arch: proc.arch,\n }\n }\n }\n\n // Browsers (and other navigator-only runtimes like Cloudflare Workers,\n // Vercel Edge, etc.). We deliberately do NOT parse the existing navigator\n // UA — that's noisy, often spoofed, and the request layer already adds the\n // browser's own UA on top.\n if (typeof g['navigator'] !== 'undefined') {\n return { runtime: 'browser', os: undefined, arch: undefined }\n }\n\n return { runtime: 'unknown', os: undefined, arch: undefined }\n}\n\n/**\n * Build the User-Agent header value the SDK sends on every B2 request.\n *\n * The product token, npm package name, language label, runtime, OS, and\n * architecture are emitted in that order, separated by semicolons inside a\n * single parenthesised comment block. OS and architecture are omitted on\n * runtimes that don't expose them (notably browsers). A custom prefix passed\n * via `B2ClientOptions.userAgent` is prepended verbatim so app-level\n * identifiers come first. See the README \"Identifying your traffic\" section\n * for examples.\n *\n * @param custom - Optional prefix prepended to the default User-Agent.\n *\n * @returns The formatted User-Agent header string.\n */\nexport function getUserAgent(custom?: string): string {\n const { runtime, os, arch } = detectPlatform()\n const parts = ['typescript', SDK_PACKAGE, runtime]\n if (os !== undefined) parts.push(os)\n if (arch !== undefined) parts.push(arch)\n const base = `${sdkProductToken()} (${parts.join('; ')})`\n return custom ? `${custom} ${base}` : base\n}\n"],"mappings":";;;;;;;AAOA,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;;;;AAS3B,SAAgB,gBAAgB,UAAkB,gBAAA,eAAe,GAAW;CAC1E,OAAO,GAAG,YAAY,GAAG;AAC3B;;;;;;;;AAmBA,SAAS,iBAA2B;CAClC,MAAM,IAAI;CAGV,IAAI,OAAO,EAAE,YAAY,aAAa;EACpC,MAAM,OAAO,EAAE;EAIf,OAAO;GACL,SAAS,KAAK,SAAS,OAAO,QAAQ,KAAK,QAAQ,SAAS;GAC5D,IAAI,KAAK,OAAO;GAChB,MAAM,KAAK,OAAO;EACpB;CACF;CAGA,IAAI,OAAO,EAAE,WAAW,aAAa;EACnC,MAAM,MAAM,EAAE;EACd,MAAM,OAAO,EAAE;EACf,OAAO;GACL,SAAS,IAAI,UAAU,OAAO,IAAI,YAAY;GAC9C,IAAI,MAAM;GACV,MAAM,MAAM;EACd;CACF;CAGA,IAAI,OAAO,EAAE,eAAe,aAAa;EACvC,MAAM,OAAO,EAAE;EAKf,IAAI,KAAK,UAAU,MACjB,OAAO;GACL,SAAS,QAAQ,KAAK,SAAS;GAC/B,IAAI,KAAK;GACT,MAAM,KAAK;EACb;CAEJ;CAMA,IAAI,OAAO,EAAE,iBAAiB,aAC5B,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;CAG9D,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;AAC9D;;;;;;;;;;;;;;;;AAiBA,SAAgB,aAAa,QAAyB;CACpD,MAAM,EAAE,SAAS,IAAI,SAAS,eAAe;CAC7C,MAAM,QAAQ;EAAC;EAAc;EAAa;CAAO;CACjD,IAAI,OAAO,KAAA,GAAW,MAAM,KAAK,EAAE;CACnC,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,IAAI;CACvC,MAAM,OAAO,GAAG,gBAAgB,EAAE,IAAI,MAAM,KAAK,IAAI,EAAE;CACvD,OAAO,SAAS,GAAG,OAAO,GAAG,SAAS;AACxC"}
@@ -9,6 +9,14 @@ export declare const SDK_PRODUCT = "b2-sdk-typescript";
9
9
  * {@link SDK_PRODUCT} so log queries that grep on either token work.
10
10
  */
11
11
  export declare const SDK_PACKAGE = "@backblaze-labs/b2-sdk";
12
+ /**
13
+ * Build the stable SDK product token for the User-Agent header.
14
+ *
15
+ * @param version - Version segment resolved by {@link productVersion}.
16
+ *
17
+ * @returns The `b2-sdk-typescript/<version-or-dev>` product token.
18
+ */
19
+ export declare function sdkProductToken(version?: string): string;
12
20
  /**
13
21
  * Build the User-Agent header value the SDK sends on every B2 request.
14
22
  *
@@ -1 +1 @@
1
- {"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/http/user-agent.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,WAAW,sBAAsB,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,WAAW,2BAA2B,CAAA;AAyEnD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpD"}
1
+ {"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/http/user-agent.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,WAAW,sBAAsB,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,WAAW,2BAA2B,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAE1E;AAyED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpD"}
@@ -9,6 +9,14 @@ export declare const SDK_PRODUCT = "b2-sdk-typescript";
9
9
  * {@link SDK_PRODUCT} so log queries that grep on either token work.
10
10
  */
11
11
  export declare const SDK_PACKAGE = "@backblaze-labs/b2-sdk";
12
+ /**
13
+ * Build the stable SDK product token for the User-Agent header.
14
+ *
15
+ * @param version - Version segment resolved by {@link productVersion}.
16
+ *
17
+ * @returns The `b2-sdk-typescript/<version-or-dev>` product token.
18
+ */
19
+ export declare function sdkProductToken(version?: string): string;
12
20
  /**
13
21
  * Build the User-Agent header value the SDK sends on every B2 request.
14
22
  *
@@ -1 +1 @@
1
- {"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/http/user-agent.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,WAAW,sBAAsB,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,WAAW,2BAA2B,CAAA;AAyEnD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpD"}
1
+ {"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/http/user-agent.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,WAAW,sBAAsB,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,WAAW,2BAA2B,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAE1E;AAyED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpD"}
@@ -1,4 +1,4 @@
1
- import { VERSION } from "../version.js";
1
+ import { productVersion } from "../version.js";
2
2
  //#region src/http/user-agent.ts
3
3
  /**
4
4
  * Stable identifier Backblaze can grep server logs for to find every request
@@ -12,6 +12,16 @@ var SDK_PRODUCT = "b2-sdk-typescript";
12
12
  */
13
13
  var SDK_PACKAGE = "@backblaze-labs/b2-sdk";
14
14
  /**
15
+ * Build the stable SDK product token for the User-Agent header.
16
+ *
17
+ * @param version - Version segment resolved by {@link productVersion}.
18
+ *
19
+ * @returns The `b2-sdk-typescript/<version-or-dev>` product token.
20
+ */
21
+ function sdkProductToken(version = productVersion()) {
22
+ return `${SDK_PRODUCT}/${version}`;
23
+ }
24
+ /**
15
25
  * Best-effort detection of the JS runtime and host OS. Used to populate the
16
26
  * User-Agent comment so server-side logs can spot Bun/Deno adoption and
17
27
  * triage OS-specific issues without asking for a repro environment.
@@ -80,10 +90,10 @@ function getUserAgent(custom) {
80
90
  ];
81
91
  if (os !== void 0) parts.push(os);
82
92
  if (arch !== void 0) parts.push(arch);
83
- const base = `${SDK_PRODUCT}/${VERSION} (${parts.join("; ")})`;
93
+ const base = `${sdkProductToken()} (${parts.join("; ")})`;
84
94
  return custom ? `${custom} ${base}` : base;
85
95
  }
86
96
  //#endregion
87
- export { SDK_PACKAGE, SDK_PRODUCT, getUserAgent };
97
+ export { SDK_PACKAGE, SDK_PRODUCT, getUserAgent, sdkProductToken };
88
98
 
89
99
  //# sourceMappingURL=user-agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-agent.js","names":[],"sources":["../../src/http/user-agent.ts"],"sourcesContent":["import { VERSION } from '../version.ts'\n\n/**\n * Stable identifier Backblaze can grep server logs for to find every request\n * issued by this SDK regardless of how the User-Agent comment evolves.\n * Treat as part of the public contract: do NOT rename without coordinating.\n */\nexport const SDK_PRODUCT = 'b2-sdk-typescript'\n\n/**\n * The npm package name. Embedded in the User-Agent comment alongside\n * {@link SDK_PRODUCT} so log queries that grep on either token work.\n */\nexport const SDK_PACKAGE = '@backblaze-labs/b2-sdk'\n\n/** Detected runtime + OS information for the User-Agent comment. */\ninterface Platform {\n /** Runtime identifier: `node/<x.y.z>`, `bun/<x.y.z>`, `deno/<x.y.z>`, `browser`, or `unknown`. */\n readonly runtime: string\n /** OS identifier (`linux`, `darwin`, `win32`, etc.) when available, or `undefined`. */\n readonly os: string | undefined\n /** CPU architecture (`x64`, `arm64`, etc.) when available, or `undefined`. */\n readonly arch: string | undefined\n}\n\n/**\n * Best-effort detection of the JS runtime and host OS. Used to populate the\n * User-Agent comment so server-side logs can spot Bun/Deno adoption and\n * triage OS-specific issues without asking for a repro environment.\n *\n * @returns The detected runtime, OS, and architecture tokens.\n */\nfunction detectPlatform(): Platform {\n const g = globalThis as Record<string, unknown>\n\n // Deno: Deno.version.deno, Deno.build.{os,arch}.\n if (typeof g['Deno'] !== 'undefined') {\n const deno = g['Deno'] as {\n version?: { deno?: string }\n build?: { os?: string; arch?: string }\n }\n return {\n runtime: deno.version?.deno ? `deno/${deno.version.deno}` : 'deno',\n os: deno.build?.os,\n arch: deno.build?.arch,\n }\n }\n\n // Bun: globalThis.Bun.version, process.platform/arch (Bun is Node-compat).\n if (typeof g['Bun'] !== 'undefined') {\n const bun = g['Bun'] as { version?: string }\n const proc = g['process'] as { platform?: string; arch?: string } | undefined\n return {\n runtime: bun.version ? `bun/${bun.version}` : 'bun',\n os: proc?.platform,\n arch: proc?.arch,\n }\n }\n\n // Node: process.versions.node, process.platform, process.arch.\n if (typeof g['process'] !== 'undefined') {\n const proc = g['process'] as {\n versions?: { node?: string }\n platform?: string\n arch?: string\n }\n if (proc.versions?.node) {\n return {\n runtime: `node/${proc.versions.node}`,\n os: proc.platform,\n arch: proc.arch,\n }\n }\n }\n\n // Browsers (and other navigator-only runtimes like Cloudflare Workers,\n // Vercel Edge, etc.). We deliberately do NOT parse the existing navigator\n // UA — that's noisy, often spoofed, and the request layer already adds the\n // browser's own UA on top.\n if (typeof g['navigator'] !== 'undefined') {\n return { runtime: 'browser', os: undefined, arch: undefined }\n }\n\n return { runtime: 'unknown', os: undefined, arch: undefined }\n}\n\n/**\n * Build the User-Agent header value the SDK sends on every B2 request.\n *\n * The product token, npm package name, language label, runtime, OS, and\n * architecture are emitted in that order, separated by semicolons inside a\n * single parenthesised comment block. OS and architecture are omitted on\n * runtimes that don't expose them (notably browsers). A custom prefix passed\n * via `B2ClientOptions.userAgent` is prepended verbatim so app-level\n * identifiers come first. See the README \"Identifying your traffic\" section\n * for examples.\n *\n * @param custom - Optional prefix prepended to the default User-Agent.\n *\n * @returns The formatted User-Agent header string.\n */\nexport function getUserAgent(custom?: string): string {\n const { runtime, os, arch } = detectPlatform()\n const parts = ['typescript', SDK_PACKAGE, runtime]\n if (os !== undefined) parts.push(os)\n if (arch !== undefined) parts.push(arch)\n const base = `${SDK_PRODUCT}/${VERSION} (${parts.join('; ')})`\n return custom ? `${custom} ${base}` : base\n}\n"],"mappings":";;;;;;;AAOA,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;;;;AAmB3B,SAAS,iBAA2B;CAClC,MAAM,IAAI;CAGV,IAAI,OAAO,EAAE,YAAY,aAAa;EACpC,MAAM,OAAO,EAAE;EAIf,OAAO;GACL,SAAS,KAAK,SAAS,OAAO,QAAQ,KAAK,QAAQ,SAAS;GAC5D,IAAI,KAAK,OAAO;GAChB,MAAM,KAAK,OAAO;EACpB;CACF;CAGA,IAAI,OAAO,EAAE,WAAW,aAAa;EACnC,MAAM,MAAM,EAAE;EACd,MAAM,OAAO,EAAE;EACf,OAAO;GACL,SAAS,IAAI,UAAU,OAAO,IAAI,YAAY;GAC9C,IAAI,MAAM;GACV,MAAM,MAAM;EACd;CACF;CAGA,IAAI,OAAO,EAAE,eAAe,aAAa;EACvC,MAAM,OAAO,EAAE;EAKf,IAAI,KAAK,UAAU,MACjB,OAAO;GACL,SAAS,QAAQ,KAAK,SAAS;GAC/B,IAAI,KAAK;GACT,MAAM,KAAK;EACb;CAEJ;CAMA,IAAI,OAAO,EAAE,iBAAiB,aAC5B,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;CAG9D,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;AAC9D;;;;;;;;;;;;;;;;AAiBA,SAAgB,aAAa,QAAyB;CACpD,MAAM,EAAE,SAAS,IAAI,SAAS,eAAe;CAC7C,MAAM,QAAQ;EAAC;EAAc;EAAa;CAAO;CACjD,IAAI,OAAO,KAAA,GAAW,MAAM,KAAK,EAAE;CACnC,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,IAAI;CACvC,MAAM,OAAO,GAAG,YAAY,GAAG,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;CAC5D,OAAO,SAAS,GAAG,OAAO,GAAG,SAAS;AACxC"}
1
+ {"version":3,"file":"user-agent.js","names":[],"sources":["../../src/http/user-agent.ts"],"sourcesContent":["import { productVersion } from '../version.ts'\n\n/**\n * Stable identifier Backblaze can grep server logs for to find every request\n * issued by this SDK regardless of how the User-Agent comment evolves.\n * Treat as part of the public contract: do NOT rename without coordinating.\n */\nexport const SDK_PRODUCT = 'b2-sdk-typescript'\n\n/**\n * The npm package name. Embedded in the User-Agent comment alongside\n * {@link SDK_PRODUCT} so log queries that grep on either token work.\n */\nexport const SDK_PACKAGE = '@backblaze-labs/b2-sdk'\n\n/**\n * Build the stable SDK product token for the User-Agent header.\n *\n * @param version - Version segment resolved by {@link productVersion}.\n *\n * @returns The `b2-sdk-typescript/<version-or-dev>` product token.\n */\nexport function sdkProductToken(version: string = productVersion()): string {\n return `${SDK_PRODUCT}/${version}`\n}\n\n/** Detected runtime + OS information for the User-Agent comment. */\ninterface Platform {\n /** Runtime identifier: `node/<x.y.z>`, `bun/<x.y.z>`, `deno/<x.y.z>`, `browser`, or `unknown`. */\n readonly runtime: string\n /** OS identifier (`linux`, `darwin`, `win32`, etc.) when available, or `undefined`. */\n readonly os: string | undefined\n /** CPU architecture (`x64`, `arm64`, etc.) when available, or `undefined`. */\n readonly arch: string | undefined\n}\n\n/**\n * Best-effort detection of the JS runtime and host OS. Used to populate the\n * User-Agent comment so server-side logs can spot Bun/Deno adoption and\n * triage OS-specific issues without asking for a repro environment.\n *\n * @returns The detected runtime, OS, and architecture tokens.\n */\nfunction detectPlatform(): Platform {\n const g = globalThis as Record<string, unknown>\n\n // Deno: Deno.version.deno, Deno.build.{os,arch}.\n if (typeof g['Deno'] !== 'undefined') {\n const deno = g['Deno'] as {\n version?: { deno?: string }\n build?: { os?: string; arch?: string }\n }\n return {\n runtime: deno.version?.deno ? `deno/${deno.version.deno}` : 'deno',\n os: deno.build?.os,\n arch: deno.build?.arch,\n }\n }\n\n // Bun: globalThis.Bun.version, process.platform/arch (Bun is Node-compat).\n if (typeof g['Bun'] !== 'undefined') {\n const bun = g['Bun'] as { version?: string }\n const proc = g['process'] as { platform?: string; arch?: string } | undefined\n return {\n runtime: bun.version ? `bun/${bun.version}` : 'bun',\n os: proc?.platform,\n arch: proc?.arch,\n }\n }\n\n // Node: process.versions.node, process.platform, process.arch.\n if (typeof g['process'] !== 'undefined') {\n const proc = g['process'] as {\n versions?: { node?: string }\n platform?: string\n arch?: string\n }\n if (proc.versions?.node) {\n return {\n runtime: `node/${proc.versions.node}`,\n os: proc.platform,\n arch: proc.arch,\n }\n }\n }\n\n // Browsers (and other navigator-only runtimes like Cloudflare Workers,\n // Vercel Edge, etc.). We deliberately do NOT parse the existing navigator\n // UA — that's noisy, often spoofed, and the request layer already adds the\n // browser's own UA on top.\n if (typeof g['navigator'] !== 'undefined') {\n return { runtime: 'browser', os: undefined, arch: undefined }\n }\n\n return { runtime: 'unknown', os: undefined, arch: undefined }\n}\n\n/**\n * Build the User-Agent header value the SDK sends on every B2 request.\n *\n * The product token, npm package name, language label, runtime, OS, and\n * architecture are emitted in that order, separated by semicolons inside a\n * single parenthesised comment block. OS and architecture are omitted on\n * runtimes that don't expose them (notably browsers). A custom prefix passed\n * via `B2ClientOptions.userAgent` is prepended verbatim so app-level\n * identifiers come first. See the README \"Identifying your traffic\" section\n * for examples.\n *\n * @param custom - Optional prefix prepended to the default User-Agent.\n *\n * @returns The formatted User-Agent header string.\n */\nexport function getUserAgent(custom?: string): string {\n const { runtime, os, arch } = detectPlatform()\n const parts = ['typescript', SDK_PACKAGE, runtime]\n if (os !== undefined) parts.push(os)\n if (arch !== undefined) parts.push(arch)\n const base = `${sdkProductToken()} (${parts.join('; ')})`\n return custom ? `${custom} ${base}` : base\n}\n"],"mappings":";;;;;;;AAOA,IAAa,cAAc;;;;;AAM3B,IAAa,cAAc;;;;;;;;AAS3B,SAAgB,gBAAgB,UAAkB,eAAe,GAAW;CAC1E,OAAO,GAAG,YAAY,GAAG;AAC3B;;;;;;;;AAmBA,SAAS,iBAA2B;CAClC,MAAM,IAAI;CAGV,IAAI,OAAO,EAAE,YAAY,aAAa;EACpC,MAAM,OAAO,EAAE;EAIf,OAAO;GACL,SAAS,KAAK,SAAS,OAAO,QAAQ,KAAK,QAAQ,SAAS;GAC5D,IAAI,KAAK,OAAO;GAChB,MAAM,KAAK,OAAO;EACpB;CACF;CAGA,IAAI,OAAO,EAAE,WAAW,aAAa;EACnC,MAAM,MAAM,EAAE;EACd,MAAM,OAAO,EAAE;EACf,OAAO;GACL,SAAS,IAAI,UAAU,OAAO,IAAI,YAAY;GAC9C,IAAI,MAAM;GACV,MAAM,MAAM;EACd;CACF;CAGA,IAAI,OAAO,EAAE,eAAe,aAAa;EACvC,MAAM,OAAO,EAAE;EAKf,IAAI,KAAK,UAAU,MACjB,OAAO;GACL,SAAS,QAAQ,KAAK,SAAS;GAC/B,IAAI,KAAK;GACT,MAAM,KAAK;EACb;CAEJ;CAMA,IAAI,OAAO,EAAE,iBAAiB,aAC5B,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;CAG9D,OAAO;EAAE,SAAS;EAAW,IAAI,KAAA;EAAW,MAAM,KAAA;CAAU;AAC9D;;;;;;;;;;;;;;;;AAiBA,SAAgB,aAAa,QAAyB;CACpD,MAAM,EAAE,SAAS,IAAI,SAAS,eAAe;CAC7C,MAAM,QAAQ;EAAC;EAAc;EAAa;CAAO;CACjD,IAAI,OAAO,KAAA,GAAW,MAAM,KAAK,EAAE;CACnC,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,IAAI;CACvC,MAAM,OAAO,GAAG,gBAAgB,EAAE,IAAI,MAAM,KAAK,IAAI,EAAE;CACvD,OAAO,SAAS,GAAG,OAAO,GAAG,SAAS;AACxC"}
package/dist/index.cjs CHANGED
@@ -14,6 +14,7 @@ const require_bucket = require("./types/bucket.cjs");
14
14
  const require_object = require("./object.cjs");
15
15
  const require_paginator = require("./util/paginator.cjs");
16
16
  const require_bucket$1 = require("./bucket.cjs");
17
+ const require_bucket_validation = require("./bucket-validation.cjs");
17
18
  const require_url_guard = require("./http/url-guard.cjs");
18
19
  const require_version = require("./version.cjs");
19
20
  const require_transport = require("./http/transport.cjs");
@@ -23,6 +24,7 @@ const require_auth = require("./types/auth.cjs");
23
24
  const require_notifications = require("./types/notifications.cjs");
24
25
  const require_partner = require("./types/partner.cjs");
25
26
  exports.AccessDeniedError = require_errors_index.AccessDeniedError;
27
+ exports.B2BucketConfigurationError = require_errors_index.B2BucketConfigurationError;
26
28
  exports.B2Client = require_client.B2Client;
27
29
  exports.B2Error = require_errors_index.B2Error;
28
30
  exports.B2InsufficientCapabilityError = require_errors_index.B2InsufficientCapabilityError;
@@ -31,6 +33,11 @@ exports.B2PartnerAuthorizationError = require_errors_index.B2PartnerAuthorizatio
31
33
  exports.B2RealmConfigurationError = require_errors_index.B2RealmConfigurationError;
32
34
  exports.B2RedirectError = require_errors_index.B2RedirectError;
33
35
  exports.B2SsrfError = require_errors_index.B2SsrfError;
36
+ exports.BUCKET_INFO_KEY_MAX_BYTES = require_bucket.BUCKET_INFO_KEY_MAX_BYTES;
37
+ exports.BUCKET_INFO_KEY_MIN_BYTES = require_bucket.BUCKET_INFO_KEY_MIN_BYTES;
38
+ exports.BUCKET_INFO_KEY_PATTERN = require_bucket.BUCKET_INFO_KEY_PATTERN;
39
+ exports.BUCKET_INFO_RESERVED_PREFIX = require_bucket.BUCKET_INFO_RESERVED_PREFIX;
40
+ exports.BUCKET_INFO_VALUES_MAX_BYTES = require_bucket.BUCKET_INFO_VALUES_MAX_BYTES;
34
41
  exports.BadAuthTokenError = require_errors_index.BadAuthTokenError;
35
42
  exports.BadBucketIdError = require_errors_index.BadBucketIdError;
36
43
  exports.BadJsonError = require_errors_index.BadJsonError;
@@ -38,9 +45,18 @@ exports.BadRequestError = require_errors_index.BadRequestError;
38
45
  exports.BadUploadUrlError = require_errors_index.BadUploadUrlError;
39
46
  exports.BlobSource = require_source.BlobSource;
40
47
  exports.Bucket = require_bucket$1.Bucket;
48
+ exports.BucketKeyOption = require_bucket.BucketKeyOption;
41
49
  exports.BucketRetentionMode = require_bucket.BucketRetentionMode;
42
50
  exports.BucketType = require_bucket.BucketType;
43
51
  exports.BufferSource = require_source.BufferSource;
52
+ exports.CORS_ALLOWED_OPERATIONS = require_bucket.CORS_ALLOWED_OPERATIONS;
53
+ exports.CORS_MAX_AGE_SECONDS_MAX = require_bucket.CORS_MAX_AGE_SECONDS_MAX;
54
+ exports.CORS_RULES_MAX_COUNT = require_bucket.CORS_RULES_MAX_COUNT;
55
+ exports.CORS_RULE_MAX_BYTES = require_bucket.CORS_RULE_MAX_BYTES;
56
+ exports.CORS_RULE_NAME_MAX_LENGTH = require_bucket.CORS_RULE_NAME_MAX_LENGTH;
57
+ exports.CORS_RULE_NAME_MIN_LENGTH = require_bucket.CORS_RULE_NAME_MIN_LENGTH;
58
+ exports.CORS_RULE_NAME_PATTERN = require_bucket.CORS_RULE_NAME_PATTERN;
59
+ exports.CORS_RULE_NAME_RESERVED_PREFIX = require_bucket.CORS_RULE_NAME_RESERVED_PREFIX;
44
60
  exports.CapExceededError = require_errors_index.CapExceededError;
45
61
  exports.Capability = require_auth.Capability;
46
62
  exports.ChecksumMismatchError = require_errors_index.ChecksumMismatchError;
@@ -60,8 +76,10 @@ exports.FileNotPresentError = require_errors_index.FileNotPresentError;
60
76
  exports.FileSource = require_file_source.FileSource;
61
77
  exports.FinishLargeFileResponseBodyError = require_errors_index.FinishLargeFileResponseBodyError;
62
78
  exports.GroupMemberCreationFailedError = require_errors_index.GroupMemberCreationFailedError;
79
+ exports.HIDE_MARKER_CONTENT_TYPE = require_file.HIDE_MARKER_CONTENT_TYPE;
63
80
  exports.InMemoryAccountInfo = require_in_memory.InMemoryAccountInfo;
64
81
  exports.IncrementalSha1 = require_hash.IncrementalSha1;
82
+ exports.IncrementalSha256 = require_hash.IncrementalSha256;
65
83
  exports.InternalError = require_errors_index.InternalError;
66
84
  exports.InvalidAccountIdError = require_errors_index.InvalidAccountIdError;
67
85
  exports.InvalidBucketIdError = require_errors_index.InvalidBucketIdError;
@@ -78,6 +96,7 @@ exports.InvalidPartNumberError = require_errors_index.InvalidPartNumberError;
78
96
  exports.InvalidRegionError = require_errors_index.InvalidRegionError;
79
97
  exports.InvalidSmsPhoneError = require_errors_index.InvalidSmsPhoneError;
80
98
  exports.KNOWN_B2_ERROR_CODES = require_errors.KNOWN_B2_ERROR_CODES;
99
+ exports.KnownBucketResponseType = require_bucket.KnownBucketResponseType;
81
100
  exports.LegalHoldValue = require_lock.LegalHoldValue;
82
101
  exports.MetadataDirective = require_file.MetadataDirective;
83
102
  exports.MethodFailureError = require_errors_index.MethodFailureError;
@@ -108,6 +127,9 @@ exports.UrlGuard = require_url_guard.UrlGuard;
108
127
  exports.VERSION = require_version.VERSION;
109
128
  exports.accountId = require_ids.accountId;
110
129
  exports.applicationKeyId = require_ids.applicationKeyId;
130
+ exports.assertValidBucketConfiguration = require_bucket_validation.assertValidBucketConfiguration;
131
+ exports.assertValidBucketInfo = require_bucket_validation.assertValidBucketInfo;
132
+ exports.assertValidCorsRules = require_bucket_validation.assertValidCorsRules;
111
133
  exports.bucketId = require_ids.bucketId;
112
134
  exports.classifyError = require_errors_index.classifyError;
113
135
  exports.computerId = require_ids.computerId;
@@ -117,9 +139,12 @@ exports.getTransportUrlGuard = require_transport.getTransportUrlGuard;
117
139
  exports.groupId = require_ids.groupId;
118
140
  exports.keyId = require_ids.keyId;
119
141
  exports.largeFileId = require_ids.largeFileId;
142
+ exports.notificationCustomHeadersToRecord = require_notifications.notificationCustomHeadersToRecord;
120
143
  exports.paginateItems = require_paginator.paginateItems;
121
144
  exports.paginatePages = require_paginator.paginatePages;
122
145
  exports.partnerToken = require_ids.partnerToken;
146
+ exports.recordToNotificationCustomHeaders = require_notifications.recordToNotificationCustomHeaders;
123
147
  exports.sha1Hex = require_hash.sha1Hex;
148
+ exports.sha256Hex = require_hash.sha256Hex;
124
149
  exports.sseCustomer = require_encryption.sseCustomer;
125
150
  exports.toContentSource = require_source.toContentSource;
package/dist/index.d.cts CHANGED
@@ -9,31 +9,32 @@
9
9
  */
10
10
  export type { AccountInfo, AuthContextAwareAccountInfo, UploadUrlEntry, } from './auth/account-info.js';
11
11
  export { InMemoryAccountInfo } from './auth/in-memory.js';
12
- export { Bucket, type DeleteAllDeleteEvent, type DeleteAllErrorEvent, type DeleteAllEvent, type DeleteAllSkipEvent, type DeleteError, type DeleteManyResult, type DeleteTarget, } from './bucket.js';
13
- export { B2Client, type B2ClientOptions, type CapabilityCheckResult } from './client.js';
12
+ export { Bucket, type BucketListFileNamesBaseOptions, type BucketListFileNamesMaybeDelimiterOptions, type BucketListFileNamesOptions, type BucketListFileNamesWithDelimiterOptions, type BucketListFileVersionsBaseOptions, type BucketListFileVersionsMaybeDelimiterOptions, type BucketListFileVersionsOptions, type BucketListFileVersionsWithDelimiterOptions, type BucketPaginateFileNamesMaybeDelimiterOptions, type BucketPaginateFileNamesOptions, type BucketPaginateFileNamesWithDelimiterOptions, type BucketPaginateFileVersionsMaybeDelimiterOptions, type BucketPaginateFileVersionsOptions, type BucketPaginateFileVersionsWithDelimiterOptions, type DeleteAllDeleteEvent, type DeleteAllErrorEvent, type DeleteAllEvent, type DeleteAllSkipEvent, type DeleteError, type DeleteManyResult, type DeleteTarget, } from './bucket.js';
13
+ export { assertValidBucketConfiguration, assertValidBucketInfo, assertValidCorsRules, } from './bucket-validation.js';
14
+ export { B2Client, type B2ClientAuthorizeOptions, type B2ClientOptions, type CapabilityCheckResult, } from './client.js';
14
15
  export type { DownloadResult, HeadResult } from './download/single.js';
15
- export type { B2ErrorOptions } from './errors/index.js';
16
- export { AccessDeniedError, B2Error, B2InsufficientCapabilityError, B2PartnerAuthorizationError, B2RealmConfigurationError, B2RedirectError, B2SsrfError, BadAuthTokenError, BadBucketIdError, BadJsonError, BadRequestError, BadUploadUrlError, CapExceededError, ChecksumMismatchError, ConflictError, classifyError, DuplicateBucketNameError, ExpiredAuthTokenError, FileNotPresentError, FinishLargeFileResponseBodyError, GroupMemberCreationFailedError, InternalError, InvalidAccountIdError, InvalidBucketIdError, InvalidBucketInfoError, InvalidBucketNameError, InvalidComputerIdError, InvalidEmailError, InvalidFileIdError, InvalidFileInfoError, InvalidFileNameError, InvalidGroupIdError, InvalidMemberAccountIdError, InvalidPartNumberError, InvalidRegionError, InvalidSmsPhoneError, MethodFailureError, MethodNotAllowedError, MissingSmsPhoneError, NetworkError, NotFoundError, OutOfRangeError, RangeNotSatisfiableError, RequestTimeoutError, ResumeFileIdMismatchError, ServiceUnavailableError, TooManyBucketsError, TooManyFilesError, TooManyGroupMembersError, TooManyMembersError, TooManyRequestsError, UploadResponseBodyError, } from './errors/index.js';
16
+ export type { B2BucketConfigurationErrorField, B2ErrorOptions } from './errors/index.js';
17
+ export { AccessDeniedError, B2BucketConfigurationError, B2Error, B2InsufficientCapabilityError, B2PartnerAuthorizationError, B2RealmConfigurationError, B2RedirectError, B2SsrfError, BadAuthTokenError, BadBucketIdError, BadJsonError, BadRequestError, BadUploadUrlError, CapExceededError, ChecksumMismatchError, ConflictError, classifyError, DuplicateBucketNameError, ExpiredAuthTokenError, FileNotPresentError, FinishLargeFileResponseBodyError, GroupMemberCreationFailedError, InternalError, InvalidAccountIdError, InvalidBucketIdError, InvalidBucketInfoError, InvalidBucketNameError, InvalidComputerIdError, InvalidEmailError, InvalidFileIdError, InvalidFileInfoError, InvalidFileNameError, InvalidGroupIdError, InvalidMemberAccountIdError, InvalidPartNumberError, InvalidRegionError, InvalidSmsPhoneError, MethodFailureError, MethodNotAllowedError, MissingSmsPhoneError, NetworkError, NotFoundError, OutOfRangeError, RangeNotSatisfiableError, RequestTimeoutError, ResumeFileIdMismatchError, ServiceUnavailableError, TooManyBucketsError, TooManyFilesError, TooManyGroupMembersError, TooManyMembersError, TooManyRequestsError, UploadResponseBodyError, } from './errors/index.js';
17
18
  export type { RetryOptions } from './http/retry.js';
18
19
  export type { HttpRequest, HttpResponse, HttpTransport, RetryTransportOptions, UrlGuardedTransport, } from './http/transport.js';
19
20
  export { FetchTransport, getTransportUrlGuard, RetryTransport } from './http/transport.js';
20
21
  export { deriveAllowedSuffixes, UrlGuard } from './http/url-guard.js';
21
22
  export { B2Object, type DownloadCallOptions, type HeadCallOptions } from './object.js';
22
- export { type DownloadFileOptions, RawClient, type RawClientOptions, type RawRequestOptions, type SseCDownloadKey, } from './raw/index.js';
23
- export { IncrementalSha1, sha1Hex } from './streams/hash.js';
23
+ export { type AuthorizeAccountOptions, type DownloadFileOptions, RawClient, type RawClientOptions, type RawRequestOptions, type SseCDownloadKey, } from './raw/index.js';
24
+ export { IncrementalSha1, IncrementalSha256, sha1Hex, sha256Hex } from './streams/hash.js';
24
25
  export type { ProgressEvent, ProgressListener } from './streams/progress.js';
25
26
  export type { ContentSource, FileSourcePath } from './streams/source.js';
26
27
  export { BlobSource, BufferSource, FileSource, StreamSource, toContentSource, } from './streams/source.js';
27
28
  export { Capability } from './types/auth.js';
28
- export { BucketRetentionMode, BucketType, CorsOperation } from './types/bucket.js';
29
+ export { BUCKET_INFO_KEY_MAX_BYTES, BUCKET_INFO_KEY_MIN_BYTES, BUCKET_INFO_KEY_PATTERN, BUCKET_INFO_RESERVED_PREFIX, BUCKET_INFO_VALUES_MAX_BYTES, BucketKeyOption, BucketRetentionMode, BucketType, CORS_ALLOWED_OPERATIONS, CORS_MAX_AGE_SECONDS_MAX, CORS_RULE_MAX_BYTES, CORS_RULE_NAME_MAX_LENGTH, CORS_RULE_NAME_MIN_LENGTH, CORS_RULE_NAME_PATTERN, CORS_RULE_NAME_RESERVED_PREFIX, CORS_RULES_MAX_COUNT, CorsOperation, KnownBucketResponseType, } from './types/bucket.js';
29
30
  export { DownloadClientUnauthorizedToReadMarker, DownloadHeaderName, } from './types/download.js';
30
31
  export { EncryptionAlgorithm, EncryptionKey, EncryptionMode, SSE_B2, SSE_NONE, sseCustomer, } from './types/encryption.js';
31
32
  export { KNOWN_B2_ERROR_CODES } from './types/errors.js';
32
- export { FileAction, MetadataDirective } from './types/file.js';
33
+ export { FileAction, HIDE_MARKER_CONTENT_TYPE, MetadataDirective } from './types/file.js';
33
34
  export { accountId, applicationKeyId, bucketId, computerId, fileId, groupId, keyId, largeFileId, partnerToken, } from './types/ids.js';
34
35
  export type * from './types/index.js';
35
36
  export { LegalHoldValue, RetentionMode } from './types/lock.js';
36
- export { EventType } from './types/notifications.js';
37
+ export { EventType, notificationCustomHeadersToRecord, recordToNotificationCustomHeaders, } from './types/notifications.js';
37
38
  export { PartnerCapability, Region } from './types/partner.js';
38
39
  export type { AmbiguousFinishCleanupFailureEvent, CancelLargeFileCleanupFailureEvent, CleanupFailureEvent, CleanupFailureListener, CleanupFailureOptions, } from './upload/cancel.js';
39
40
  export type { ResumePartReusedEvent, ResumePartReusedListener, } from './upload/large.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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"}