@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
@@ -1,4 +1,3 @@
1
- //#region src/streams/progress.ts
2
1
  /**
3
2
  * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.
4
3
  *
@@ -19,31 +18,91 @@ var ProgressTracker = class {
19
18
  partsCompleted = 0;
20
19
  /** Timestamp when tracking began. */
21
20
  startTime;
21
+ /** Minimum milliseconds between byte-only emissions. */
22
+ minIntervalMs;
23
+ /** Timestamp of the most recent emitted snapshot. */
24
+ lastEmitTime = null;
25
+ /** Timer scheduled for a coalesced byte-only emission. */
26
+ pendingEmitTimer;
27
+ /** Listener error captured from a detached timer callback. */
28
+ listenerError;
22
29
  /**
23
30
  * Creates a new ProgressTracker.
24
31
  * @param listener - Callback to receive progress events, or undefined to disable.
25
32
  * @param totalBytes - Expected total bytes, or null if unknown.
26
33
  * @param totalParts - Expected total parts, or null if not a multipart transfer.
34
+ * @param options - Optional emission controls.
27
35
  */
28
- constructor(listener, totalBytes, totalParts) {
36
+ constructor(listener, totalBytes, totalParts, options = {}) {
29
37
  this.listener = listener;
30
38
  this.totalBytes = totalBytes;
31
39
  this.totalParts = totalParts;
32
40
  this.startTime = Date.now();
41
+ this.minIntervalMs = Math.max(0, options.minIntervalMs ?? 100);
33
42
  }
34
43
  /**
35
- * Record that additional bytes have been transferred and notify the listener.
44
+ * Record that additional bytes have been transferred and schedule listener notification.
36
45
  * @param count - The number of additional bytes that were transferred.
37
46
  */
38
47
  addBytes(count) {
48
+ this.throwPendingListenerError();
39
49
  this.bytesTransferred += count;
40
- this.emit();
50
+ this.emitThrottled();
41
51
  }
42
52
  /** Record that a multipart part has completed and notify the listener. */
43
53
  completePart() {
54
+ this.throwPendingListenerError();
55
+ this.flushPendingEmit();
44
56
  this.partsCompleted++;
57
+ this.emitNow();
58
+ }
59
+ /** Cancel any pending coalesced progress emission. */
60
+ dispose() {
61
+ this.clearPendingEmit();
62
+ this.listenerError = void 0;
63
+ }
64
+ emitThrottled() {
65
+ if (this.listener === void 0) return;
66
+ if (this.minIntervalMs === 0) {
67
+ this.emitNow();
68
+ return;
69
+ }
70
+ const now = Date.now();
71
+ if (this.lastEmitTime === null || now - this.lastEmitTime >= this.minIntervalMs) {
72
+ this.emitNow(now);
73
+ return;
74
+ }
75
+ if (this.pendingEmitTimer !== void 0) return;
76
+ const delay = Math.max(0, this.minIntervalMs - (now - this.lastEmitTime));
77
+ this.pendingEmitTimer = setTimeout(() => {
78
+ this.pendingEmitTimer = void 0;
79
+ try {
80
+ this.emitNow();
81
+ } catch (err) {
82
+ this.listenerError = err;
83
+ }
84
+ }, delay);
85
+ this.pendingEmitTimer.unref?.();
86
+ }
87
+ flushPendingEmit() {
88
+ if (this.pendingEmitTimer !== void 0) this.emitNow();
89
+ }
90
+ clearPendingEmit() {
91
+ if (this.pendingEmitTimer === void 0) return;
92
+ clearTimeout(this.pendingEmitTimer);
93
+ this.pendingEmitTimer = void 0;
94
+ }
95
+ emitNow(now = Date.now()) {
96
+ this.clearPendingEmit();
97
+ this.lastEmitTime = now;
45
98
  this.emit();
46
99
  }
100
+ throwPendingListenerError() {
101
+ if (this.listenerError === void 0) return;
102
+ const err = this.listenerError;
103
+ this.listenerError = void 0;
104
+ throw err;
105
+ }
47
106
  /** Emit the current progress snapshot to the listener, if one is registered. */
48
107
  emit() {
49
108
  this.listener?.({
@@ -1 +1 @@
1
- {"version":3,"file":"progress.cjs","names":[],"sources":["../../src/streams/progress.ts"],"sourcesContent":["/** Snapshot of upload or download progress at a point in time. */\nexport interface ProgressEvent {\n /** Number of bytes transferred so far. */\n readonly bytesTransferred: number\n /** Total bytes expected, or null if unknown. */\n readonly totalBytes: number | null\n /** Number of multipart parts completed so far. */\n readonly partsCompleted: number\n /** Total number of parts expected, or null if unknown. */\n readonly totalParts: number | null\n /** Milliseconds elapsed since the operation started. */\n readonly elapsedMs: number\n}\n\n/** Callback invoked each time transfer progress changes. */\nexport type ProgressListener = (event: ProgressEvent) => void\n\n/**\n * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.\n *\n * Internal building block. The SDK wires one of these inside every\n * transfer that accepts an `onProgress` option; users supply the\n * listener callback, not the tracker. Exported only so SDK source\n * modules can import it; not re-exported through any subpath.\n *\n * @internal\n */\nexport class ProgressTracker {\n /** Running total of bytes transferred. */\n private bytesTransferred = 0\n /** Running count of completed parts. */\n private partsCompleted = 0\n /** Timestamp when tracking began. */\n private readonly startTime: number\n\n /**\n * Creates a new ProgressTracker.\n * @param listener - Callback to receive progress events, or undefined to disable.\n * @param totalBytes - Expected total bytes, or null if unknown.\n * @param totalParts - Expected total parts, or null if not a multipart transfer.\n */\n constructor(\n private readonly listener: ProgressListener | undefined,\n private readonly totalBytes: number | null,\n private readonly totalParts: number | null,\n ) {\n this.startTime = Date.now()\n }\n\n /**\n * Record that additional bytes have been transferred and notify the listener.\n * @param count - The number of additional bytes that were transferred.\n */\n addBytes(count: number): void {\n this.bytesTransferred += count\n this.emit()\n }\n\n /** Record that a multipart part has completed and notify the listener. */\n completePart(): void {\n this.partsCompleted++\n this.emit()\n }\n\n /** Emit the current progress snapshot to the listener, if one is registered. */\n private emit(): void {\n this.listener?.({\n bytesTransferred: this.bytesTransferred,\n totalBytes: this.totalBytes,\n partsCompleted: this.partsCompleted,\n totalParts: this.totalParts,\n elapsedMs: Date.now() - this.startTime,\n })\n }\n}\n"],"mappings":";;;;;;;;;;;AA2BA,IAAa,kBAAb,MAA6B;CAeR;CACA;CACA;;CAfnB,mBAA2B;;CAE3B,iBAAyB;;CAEzB;;;;;;;CAQA,YACE,UACA,YACA,YACA;EAHiB,KAAA,WAAA;EACA,KAAA,aAAA;EACA,KAAA,aAAA;EAEjB,KAAK,YAAY,KAAK,IAAI;CAC5B;;;;;CAMA,SAAS,OAAqB;EAC5B,KAAK,oBAAoB;EACzB,KAAK,KAAK;CACZ;;CAGA,eAAqB;EACnB,KAAK;EACL,KAAK,KAAK;CACZ;;CAGA,OAAqB;EACnB,KAAK,WAAW;GACd,kBAAkB,KAAK;GACvB,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,YAAY,KAAK;GACjB,WAAW,KAAK,IAAI,IAAI,KAAK;EAC/B,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"progress.cjs","names":[],"sources":["../../src/streams/progress.ts"],"sourcesContent":["/** Snapshot of upload or download progress at a point in time. */\nexport interface ProgressEvent {\n /** Number of bytes transferred so far. */\n readonly bytesTransferred: number\n /** Total bytes expected, or null if unknown. */\n readonly totalBytes: number | null\n /** Number of multipart parts completed so far. */\n readonly partsCompleted: number\n /** Total number of parts expected, or null if unknown. */\n readonly totalParts: number | null\n /** Milliseconds elapsed since the operation started. */\n readonly elapsedMs: number\n}\n\n/** Callback invoked each time transfer progress changes. */\nexport type ProgressListener = (event: ProgressEvent) => void\n\n/** Default minimum time between byte-progress emissions. */\nexport const DEFAULT_PROGRESS_EMIT_INTERVAL_MS = 100\n\n/** Internal controls for ProgressTracker emission behavior. */\nexport interface ProgressTrackerOptions {\n /**\n * Minimum milliseconds between byte-only progress emissions.\n * Set to 0 to emit every change.\n */\n readonly minIntervalMs?: number\n}\n\n/**\n * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.\n *\n * Internal building block. The SDK wires one of these inside every\n * transfer that accepts an `onProgress` option; users supply the\n * listener callback, not the tracker. Exported only so SDK source\n * modules can import it; not re-exported through any subpath.\n *\n * @internal\n */\nexport class ProgressTracker {\n /** Running total of bytes transferred. */\n private bytesTransferred = 0\n /** Running count of completed parts. */\n private partsCompleted = 0\n /** Timestamp when tracking began. */\n private readonly startTime: number\n /** Minimum milliseconds between byte-only emissions. */\n private readonly minIntervalMs: number\n /** Timestamp of the most recent emitted snapshot. */\n private lastEmitTime: number | null = null\n /** Timer scheduled for a coalesced byte-only emission. */\n private pendingEmitTimer: ReturnType<typeof setTimeout> | undefined\n /** Listener error captured from a detached timer callback. */\n private listenerError: unknown\n\n /**\n * Creates a new ProgressTracker.\n * @param listener - Callback to receive progress events, or undefined to disable.\n * @param totalBytes - Expected total bytes, or null if unknown.\n * @param totalParts - Expected total parts, or null if not a multipart transfer.\n * @param options - Optional emission controls.\n */\n constructor(\n private readonly listener: ProgressListener | undefined,\n private readonly totalBytes: number | null,\n private readonly totalParts: number | null,\n options: ProgressTrackerOptions = {},\n ) {\n this.startTime = Date.now()\n this.minIntervalMs = Math.max(0, options.minIntervalMs ?? DEFAULT_PROGRESS_EMIT_INTERVAL_MS)\n }\n\n /**\n * Record that additional bytes have been transferred and schedule listener notification.\n * @param count - The number of additional bytes that were transferred.\n */\n addBytes(count: number): void {\n this.throwPendingListenerError()\n this.bytesTransferred += count\n this.emitThrottled()\n }\n\n /** Record that a multipart part has completed and notify the listener. */\n completePart(): void {\n this.throwPendingListenerError()\n this.flushPendingEmit()\n this.partsCompleted++\n this.emitNow()\n }\n\n /** Cancel any pending coalesced progress emission. */\n dispose(): void {\n this.clearPendingEmit()\n this.listenerError = undefined\n }\n\n private emitThrottled(): void {\n if (this.listener === undefined) return\n if (this.minIntervalMs === 0) {\n this.emitNow()\n return\n }\n\n const now = Date.now()\n if (this.lastEmitTime === null || now - this.lastEmitTime >= this.minIntervalMs) {\n this.emitNow(now)\n return\n }\n\n if (this.pendingEmitTimer !== undefined) return\n\n const delay = Math.max(0, this.minIntervalMs - (now - this.lastEmitTime))\n this.pendingEmitTimer = setTimeout(() => {\n this.pendingEmitTimer = undefined\n try {\n this.emitNow()\n } catch (err) {\n this.listenerError = err\n }\n }, delay)\n ;(this.pendingEmitTimer as { unref?: () => void }).unref?.()\n }\n\n private flushPendingEmit(): void {\n if (this.pendingEmitTimer !== undefined) {\n this.emitNow()\n }\n }\n\n private clearPendingEmit(): void {\n if (this.pendingEmitTimer === undefined) return\n clearTimeout(this.pendingEmitTimer)\n this.pendingEmitTimer = undefined\n }\n\n private emitNow(now = Date.now()): void {\n this.clearPendingEmit()\n this.lastEmitTime = now\n this.emit()\n }\n\n private throwPendingListenerError(): void {\n if (this.listenerError === undefined) return\n const err = this.listenerError\n this.listenerError = undefined\n throw err\n }\n\n /** Emit the current progress snapshot to the listener, if one is registered. */\n private emit(): void {\n this.listener?.({\n bytesTransferred: this.bytesTransferred,\n totalBytes: this.totalBytes,\n partsCompleted: this.partsCompleted,\n totalParts: this.totalParts,\n elapsedMs: Date.now() - this.startTime,\n })\n }\n}\n"],"mappings":";;;;;;;;;;AAuCA,IAAa,kBAAb,MAA6B;CAwBR;CACA;CACA;;CAxBnB,mBAA2B;;CAE3B,iBAAyB;;CAEzB;;CAEA;;CAEA,eAAsC;;CAEtC;;CAEA;;;;;;;;CASA,YACE,UACA,YACA,YACA,UAAkC,CAAC,GACnC;EAJiB,KAAA,WAAA;EACA,KAAA,aAAA;EACA,KAAA,aAAA;EAGjB,KAAK,YAAY,KAAK,IAAI;EAC1B,KAAK,gBAAgB,KAAK,IAAI,GAAG,QAAQ,iBAAA,GAAkD;CAC7F;;;;;CAMA,SAAS,OAAqB;EAC5B,KAAK,0BAA0B;EAC/B,KAAK,oBAAoB;EACzB,KAAK,cAAc;CACrB;;CAGA,eAAqB;EACnB,KAAK,0BAA0B;EAC/B,KAAK,iBAAiB;EACtB,KAAK;EACL,KAAK,QAAQ;CACf;;CAGA,UAAgB;EACd,KAAK,iBAAiB;EACtB,KAAK,gBAAgB,KAAA;CACvB;CAEA,gBAA8B;EAC5B,IAAI,KAAK,aAAa,KAAA,GAAW;EACjC,IAAI,KAAK,kBAAkB,GAAG;GAC5B,KAAK,QAAQ;GACb;EACF;EAEA,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,KAAK,gBAAgB,KAAK,eAAe;GAC/E,KAAK,QAAQ,GAAG;GAChB;EACF;EAEA,IAAI,KAAK,qBAAqB,KAAA,GAAW;EAEzC,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,iBAAiB,MAAM,KAAK,aAAa;EACxE,KAAK,mBAAmB,iBAAiB;GACvC,KAAK,mBAAmB,KAAA;GACxB,IAAI;IACF,KAAK,QAAQ;GACf,SAAS,KAAK;IACZ,KAAK,gBAAgB;GACvB;EACF,GAAG,KAAK;EACP,KAAM,iBAA4C,QAAQ;CAC7D;CAEA,mBAAiC;EAC/B,IAAI,KAAK,qBAAqB,KAAA,GAC5B,KAAK,QAAQ;CAEjB;CAEA,mBAAiC;EAC/B,IAAI,KAAK,qBAAqB,KAAA,GAAW;EACzC,aAAa,KAAK,gBAAgB;EAClC,KAAK,mBAAmB,KAAA;CAC1B;CAEA,QAAgB,MAAM,KAAK,IAAI,GAAS;EACtC,KAAK,iBAAiB;EACtB,KAAK,eAAe;EACpB,KAAK,KAAK;CACZ;CAEA,4BAA0C;EACxC,IAAI,KAAK,kBAAkB,KAAA,GAAW;EACtC,MAAM,MAAM,KAAK;EACjB,KAAK,gBAAgB,KAAA;EACrB,MAAM;CACR;;CAGA,OAAqB;EACnB,KAAK,WAAW;GACd,kBAAkB,KAAK;GACvB,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,YAAY,KAAK;GACjB,WAAW,KAAK,IAAI,IAAI,KAAK;EAC/B,CAAC;CACH;AACF"}
@@ -13,6 +13,16 @@ export interface ProgressEvent {
13
13
  }
14
14
  /** Callback invoked each time transfer progress changes. */
15
15
  export type ProgressListener = (event: ProgressEvent) => void;
16
+ /** Default minimum time between byte-progress emissions. */
17
+ export declare const DEFAULT_PROGRESS_EMIT_INTERVAL_MS = 100;
18
+ /** Internal controls for ProgressTracker emission behavior. */
19
+ export interface ProgressTrackerOptions {
20
+ /**
21
+ * Minimum milliseconds between byte-only progress emissions.
22
+ * Set to 0 to emit every change.
23
+ */
24
+ readonly minIntervalMs?: number;
25
+ }
16
26
  /**
17
27
  * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.
18
28
  *
@@ -33,20 +43,36 @@ export declare class ProgressTracker {
33
43
  private partsCompleted;
34
44
  /** Timestamp when tracking began. */
35
45
  private readonly startTime;
46
+ /** Minimum milliseconds between byte-only emissions. */
47
+ private readonly minIntervalMs;
48
+ /** Timestamp of the most recent emitted snapshot. */
49
+ private lastEmitTime;
50
+ /** Timer scheduled for a coalesced byte-only emission. */
51
+ private pendingEmitTimer;
52
+ /** Listener error captured from a detached timer callback. */
53
+ private listenerError;
36
54
  /**
37
55
  * Creates a new ProgressTracker.
38
56
  * @param listener - Callback to receive progress events, or undefined to disable.
39
57
  * @param totalBytes - Expected total bytes, or null if unknown.
40
58
  * @param totalParts - Expected total parts, or null if not a multipart transfer.
59
+ * @param options - Optional emission controls.
41
60
  */
42
- constructor(listener: ProgressListener | undefined, totalBytes: number | null, totalParts: number | null);
61
+ constructor(listener: ProgressListener | undefined, totalBytes: number | null, totalParts: number | null, options?: ProgressTrackerOptions);
43
62
  /**
44
- * Record that additional bytes have been transferred and notify the listener.
63
+ * Record that additional bytes have been transferred and schedule listener notification.
45
64
  * @param count - The number of additional bytes that were transferred.
46
65
  */
47
66
  addBytes(count: number): void;
48
67
  /** Record that a multipart part has completed and notify the listener. */
49
68
  completePart(): void;
69
+ /** Cancel any pending coalesced progress emission. */
70
+ dispose(): void;
71
+ private emitThrottled;
72
+ private flushPendingEmit;
73
+ private clearPendingEmit;
74
+ private emitNow;
75
+ private throwPendingListenerError;
50
76
  /** Emit the current progress snapshot to the listener, if one is registered. */
51
77
  private emit;
52
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/streams/progress.js"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,kDAAkD;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;AAE7D;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAexB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAhB7B,0CAA0C;IAC1C,OAAO,CAAC,gBAAgB,CAAI;IAC5B,wCAAwC;IACxC,OAAO,CAAC,cAAc,CAAI;IAC1B,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAElC;;;;;OAKG;gBAEgB,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI;IAK5C;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,0EAA0E;IAC1E,YAAY,IAAI,IAAI;IAKpB,gFAAgF;IAChF,OAAO,CAAC,IAAI;CASb"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/streams/progress.js"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,kDAAkD;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;AAE7D,4DAA4D;AAC5D,eAAO,MAAM,iCAAiC,MAAM,CAAA;AAEpD,+DAA+D;AAC/D,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAwBxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAzB7B,0CAA0C;IAC1C,OAAO,CAAC,gBAAgB,CAAI;IAC5B,wCAAwC;IACxC,OAAO,CAAC,cAAc,CAAI;IAC1B,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,qDAAqD;IACrD,OAAO,CAAC,YAAY,CAAsB;IAC1C,0DAA0D;IAC1D,OAAO,CAAC,gBAAgB,CAA2C;IACnE,8DAA8D;IAC9D,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;;;OAMG;gBAEgB,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,EAC1C,OAAO,GAAE,sBAA2B;IAMtC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,0EAA0E;IAC1E,YAAY,IAAI,IAAI;IAOpB,sDAAsD;IACtD,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,yBAAyB;IAOjC,gFAAgF;IAChF,OAAO,CAAC,IAAI;CASb"}
@@ -13,6 +13,16 @@ export interface ProgressEvent {
13
13
  }
14
14
  /** Callback invoked each time transfer progress changes. */
15
15
  export type ProgressListener = (event: ProgressEvent) => void;
16
+ /** Default minimum time between byte-progress emissions. */
17
+ export declare const DEFAULT_PROGRESS_EMIT_INTERVAL_MS = 100;
18
+ /** Internal controls for ProgressTracker emission behavior. */
19
+ export interface ProgressTrackerOptions {
20
+ /**
21
+ * Minimum milliseconds between byte-only progress emissions.
22
+ * Set to 0 to emit every change.
23
+ */
24
+ readonly minIntervalMs?: number;
25
+ }
16
26
  /**
17
27
  * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.
18
28
  *
@@ -33,20 +43,36 @@ export declare class ProgressTracker {
33
43
  private partsCompleted;
34
44
  /** Timestamp when tracking began. */
35
45
  private readonly startTime;
46
+ /** Minimum milliseconds between byte-only emissions. */
47
+ private readonly minIntervalMs;
48
+ /** Timestamp of the most recent emitted snapshot. */
49
+ private lastEmitTime;
50
+ /** Timer scheduled for a coalesced byte-only emission. */
51
+ private pendingEmitTimer;
52
+ /** Listener error captured from a detached timer callback. */
53
+ private listenerError;
36
54
  /**
37
55
  * Creates a new ProgressTracker.
38
56
  * @param listener - Callback to receive progress events, or undefined to disable.
39
57
  * @param totalBytes - Expected total bytes, or null if unknown.
40
58
  * @param totalParts - Expected total parts, or null if not a multipart transfer.
59
+ * @param options - Optional emission controls.
41
60
  */
42
- constructor(listener: ProgressListener | undefined, totalBytes: number | null, totalParts: number | null);
61
+ constructor(listener: ProgressListener | undefined, totalBytes: number | null, totalParts: number | null, options?: ProgressTrackerOptions);
43
62
  /**
44
- * Record that additional bytes have been transferred and notify the listener.
63
+ * Record that additional bytes have been transferred and schedule listener notification.
45
64
  * @param count - The number of additional bytes that were transferred.
46
65
  */
47
66
  addBytes(count: number): void;
48
67
  /** Record that a multipart part has completed and notify the listener. */
49
68
  completePart(): void;
69
+ /** Cancel any pending coalesced progress emission. */
70
+ dispose(): void;
71
+ private emitThrottled;
72
+ private flushPendingEmit;
73
+ private clearPendingEmit;
74
+ private emitNow;
75
+ private throwPendingListenerError;
50
76
  /** Emit the current progress snapshot to the listener, if one is registered. */
51
77
  private emit;
52
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/streams/progress.js"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,kDAAkD;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;AAE7D;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAexB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAhB7B,0CAA0C;IAC1C,OAAO,CAAC,gBAAgB,CAAI;IAC5B,wCAAwC;IACxC,OAAO,CAAC,cAAc,CAAI;IAC1B,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAElC;;;;;OAKG;gBAEgB,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI;IAK5C;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,0EAA0E;IAC1E,YAAY,IAAI,IAAI;IAKpB,gFAAgF;IAChF,OAAO,CAAC,IAAI;CASb"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/streams/progress.js"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,kDAAkD;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;AAE7D,4DAA4D;AAC5D,eAAO,MAAM,iCAAiC,MAAM,CAAA;AAEpD,+DAA+D;AAC/D,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAwBxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAzB7B,0CAA0C;IAC1C,OAAO,CAAC,gBAAgB,CAAI;IAC5B,wCAAwC;IACxC,OAAO,CAAC,cAAc,CAAI;IAC1B,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,qDAAqD;IACrD,OAAO,CAAC,YAAY,CAAsB;IAC1C,0DAA0D;IAC1D,OAAO,CAAC,gBAAgB,CAA2C;IACnE,8DAA8D;IAC9D,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;;;OAMG;gBAEgB,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,EAC1C,OAAO,GAAE,sBAA2B;IAMtC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,0EAA0E;IAC1E,YAAY,IAAI,IAAI;IAOpB,sDAAsD;IACtD,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,yBAAyB;IAOjC,gFAAgF;IAChF,OAAO,CAAC,IAAI;CASb"}
@@ -1,4 +1,3 @@
1
- //#region src/streams/progress.ts
2
1
  /**
3
2
  * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.
4
3
  *
@@ -19,31 +18,91 @@ var ProgressTracker = class {
19
18
  partsCompleted = 0;
20
19
  /** Timestamp when tracking began. */
21
20
  startTime;
21
+ /** Minimum milliseconds between byte-only emissions. */
22
+ minIntervalMs;
23
+ /** Timestamp of the most recent emitted snapshot. */
24
+ lastEmitTime = null;
25
+ /** Timer scheduled for a coalesced byte-only emission. */
26
+ pendingEmitTimer;
27
+ /** Listener error captured from a detached timer callback. */
28
+ listenerError;
22
29
  /**
23
30
  * Creates a new ProgressTracker.
24
31
  * @param listener - Callback to receive progress events, or undefined to disable.
25
32
  * @param totalBytes - Expected total bytes, or null if unknown.
26
33
  * @param totalParts - Expected total parts, or null if not a multipart transfer.
34
+ * @param options - Optional emission controls.
27
35
  */
28
- constructor(listener, totalBytes, totalParts) {
36
+ constructor(listener, totalBytes, totalParts, options = {}) {
29
37
  this.listener = listener;
30
38
  this.totalBytes = totalBytes;
31
39
  this.totalParts = totalParts;
32
40
  this.startTime = Date.now();
41
+ this.minIntervalMs = Math.max(0, options.minIntervalMs ?? 100);
33
42
  }
34
43
  /**
35
- * Record that additional bytes have been transferred and notify the listener.
44
+ * Record that additional bytes have been transferred and schedule listener notification.
36
45
  * @param count - The number of additional bytes that were transferred.
37
46
  */
38
47
  addBytes(count) {
48
+ this.throwPendingListenerError();
39
49
  this.bytesTransferred += count;
40
- this.emit();
50
+ this.emitThrottled();
41
51
  }
42
52
  /** Record that a multipart part has completed and notify the listener. */
43
53
  completePart() {
54
+ this.throwPendingListenerError();
55
+ this.flushPendingEmit();
44
56
  this.partsCompleted++;
57
+ this.emitNow();
58
+ }
59
+ /** Cancel any pending coalesced progress emission. */
60
+ dispose() {
61
+ this.clearPendingEmit();
62
+ this.listenerError = void 0;
63
+ }
64
+ emitThrottled() {
65
+ if (this.listener === void 0) return;
66
+ if (this.minIntervalMs === 0) {
67
+ this.emitNow();
68
+ return;
69
+ }
70
+ const now = Date.now();
71
+ if (this.lastEmitTime === null || now - this.lastEmitTime >= this.minIntervalMs) {
72
+ this.emitNow(now);
73
+ return;
74
+ }
75
+ if (this.pendingEmitTimer !== void 0) return;
76
+ const delay = Math.max(0, this.minIntervalMs - (now - this.lastEmitTime));
77
+ this.pendingEmitTimer = setTimeout(() => {
78
+ this.pendingEmitTimer = void 0;
79
+ try {
80
+ this.emitNow();
81
+ } catch (err) {
82
+ this.listenerError = err;
83
+ }
84
+ }, delay);
85
+ this.pendingEmitTimer.unref?.();
86
+ }
87
+ flushPendingEmit() {
88
+ if (this.pendingEmitTimer !== void 0) this.emitNow();
89
+ }
90
+ clearPendingEmit() {
91
+ if (this.pendingEmitTimer === void 0) return;
92
+ clearTimeout(this.pendingEmitTimer);
93
+ this.pendingEmitTimer = void 0;
94
+ }
95
+ emitNow(now = Date.now()) {
96
+ this.clearPendingEmit();
97
+ this.lastEmitTime = now;
45
98
  this.emit();
46
99
  }
100
+ throwPendingListenerError() {
101
+ if (this.listenerError === void 0) return;
102
+ const err = this.listenerError;
103
+ this.listenerError = void 0;
104
+ throw err;
105
+ }
47
106
  /** Emit the current progress snapshot to the listener, if one is registered. */
48
107
  emit() {
49
108
  this.listener?.({
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","names":[],"sources":["../../src/streams/progress.ts"],"sourcesContent":["/** Snapshot of upload or download progress at a point in time. */\nexport interface ProgressEvent {\n /** Number of bytes transferred so far. */\n readonly bytesTransferred: number\n /** Total bytes expected, or null if unknown. */\n readonly totalBytes: number | null\n /** Number of multipart parts completed so far. */\n readonly partsCompleted: number\n /** Total number of parts expected, or null if unknown. */\n readonly totalParts: number | null\n /** Milliseconds elapsed since the operation started. */\n readonly elapsedMs: number\n}\n\n/** Callback invoked each time transfer progress changes. */\nexport type ProgressListener = (event: ProgressEvent) => void\n\n/**\n * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.\n *\n * Internal building block. The SDK wires one of these inside every\n * transfer that accepts an `onProgress` option; users supply the\n * listener callback, not the tracker. Exported only so SDK source\n * modules can import it; not re-exported through any subpath.\n *\n * @internal\n */\nexport class ProgressTracker {\n /** Running total of bytes transferred. */\n private bytesTransferred = 0\n /** Running count of completed parts. */\n private partsCompleted = 0\n /** Timestamp when tracking began. */\n private readonly startTime: number\n\n /**\n * Creates a new ProgressTracker.\n * @param listener - Callback to receive progress events, or undefined to disable.\n * @param totalBytes - Expected total bytes, or null if unknown.\n * @param totalParts - Expected total parts, or null if not a multipart transfer.\n */\n constructor(\n private readonly listener: ProgressListener | undefined,\n private readonly totalBytes: number | null,\n private readonly totalParts: number | null,\n ) {\n this.startTime = Date.now()\n }\n\n /**\n * Record that additional bytes have been transferred and notify the listener.\n * @param count - The number of additional bytes that were transferred.\n */\n addBytes(count: number): void {\n this.bytesTransferred += count\n this.emit()\n }\n\n /** Record that a multipart part has completed and notify the listener. */\n completePart(): void {\n this.partsCompleted++\n this.emit()\n }\n\n /** Emit the current progress snapshot to the listener, if one is registered. */\n private emit(): void {\n this.listener?.({\n bytesTransferred: this.bytesTransferred,\n totalBytes: this.totalBytes,\n partsCompleted: this.partsCompleted,\n totalParts: this.totalParts,\n elapsedMs: Date.now() - this.startTime,\n })\n }\n}\n"],"mappings":";;;;;;;;;;;AA2BA,IAAa,kBAAb,MAA6B;CAeR;CACA;CACA;;CAfnB,mBAA2B;;CAE3B,iBAAyB;;CAEzB;;;;;;;CAQA,YACE,UACA,YACA,YACA;EAHiB,KAAA,WAAA;EACA,KAAA,aAAA;EACA,KAAA,aAAA;EAEjB,KAAK,YAAY,KAAK,IAAI;CAC5B;;;;;CAMA,SAAS,OAAqB;EAC5B,KAAK,oBAAoB;EACzB,KAAK,KAAK;CACZ;;CAGA,eAAqB;EACnB,KAAK;EACL,KAAK,KAAK;CACZ;;CAGA,OAAqB;EACnB,KAAK,WAAW;GACd,kBAAkB,KAAK;GACvB,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,YAAY,KAAK;GACjB,WAAW,KAAK,IAAI,IAAI,KAAK;EAC/B,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"progress.js","names":[],"sources":["../../src/streams/progress.ts"],"sourcesContent":["/** Snapshot of upload or download progress at a point in time. */\nexport interface ProgressEvent {\n /** Number of bytes transferred so far. */\n readonly bytesTransferred: number\n /** Total bytes expected, or null if unknown. */\n readonly totalBytes: number | null\n /** Number of multipart parts completed so far. */\n readonly partsCompleted: number\n /** Total number of parts expected, or null if unknown. */\n readonly totalParts: number | null\n /** Milliseconds elapsed since the operation started. */\n readonly elapsedMs: number\n}\n\n/** Callback invoked each time transfer progress changes. */\nexport type ProgressListener = (event: ProgressEvent) => void\n\n/** Default minimum time between byte-progress emissions. */\nexport const DEFAULT_PROGRESS_EMIT_INTERVAL_MS = 100\n\n/** Internal controls for ProgressTracker emission behavior. */\nexport interface ProgressTrackerOptions {\n /**\n * Minimum milliseconds between byte-only progress emissions.\n * Set to 0 to emit every change.\n */\n readonly minIntervalMs?: number\n}\n\n/**\n * Accumulates byte and part counts and emits {@link ProgressEvent}s to a listener.\n *\n * Internal building block. The SDK wires one of these inside every\n * transfer that accepts an `onProgress` option; users supply the\n * listener callback, not the tracker. Exported only so SDK source\n * modules can import it; not re-exported through any subpath.\n *\n * @internal\n */\nexport class ProgressTracker {\n /** Running total of bytes transferred. */\n private bytesTransferred = 0\n /** Running count of completed parts. */\n private partsCompleted = 0\n /** Timestamp when tracking began. */\n private readonly startTime: number\n /** Minimum milliseconds between byte-only emissions. */\n private readonly minIntervalMs: number\n /** Timestamp of the most recent emitted snapshot. */\n private lastEmitTime: number | null = null\n /** Timer scheduled for a coalesced byte-only emission. */\n private pendingEmitTimer: ReturnType<typeof setTimeout> | undefined\n /** Listener error captured from a detached timer callback. */\n private listenerError: unknown\n\n /**\n * Creates a new ProgressTracker.\n * @param listener - Callback to receive progress events, or undefined to disable.\n * @param totalBytes - Expected total bytes, or null if unknown.\n * @param totalParts - Expected total parts, or null if not a multipart transfer.\n * @param options - Optional emission controls.\n */\n constructor(\n private readonly listener: ProgressListener | undefined,\n private readonly totalBytes: number | null,\n private readonly totalParts: number | null,\n options: ProgressTrackerOptions = {},\n ) {\n this.startTime = Date.now()\n this.minIntervalMs = Math.max(0, options.minIntervalMs ?? DEFAULT_PROGRESS_EMIT_INTERVAL_MS)\n }\n\n /**\n * Record that additional bytes have been transferred and schedule listener notification.\n * @param count - The number of additional bytes that were transferred.\n */\n addBytes(count: number): void {\n this.throwPendingListenerError()\n this.bytesTransferred += count\n this.emitThrottled()\n }\n\n /** Record that a multipart part has completed and notify the listener. */\n completePart(): void {\n this.throwPendingListenerError()\n this.flushPendingEmit()\n this.partsCompleted++\n this.emitNow()\n }\n\n /** Cancel any pending coalesced progress emission. */\n dispose(): void {\n this.clearPendingEmit()\n this.listenerError = undefined\n }\n\n private emitThrottled(): void {\n if (this.listener === undefined) return\n if (this.minIntervalMs === 0) {\n this.emitNow()\n return\n }\n\n const now = Date.now()\n if (this.lastEmitTime === null || now - this.lastEmitTime >= this.minIntervalMs) {\n this.emitNow(now)\n return\n }\n\n if (this.pendingEmitTimer !== undefined) return\n\n const delay = Math.max(0, this.minIntervalMs - (now - this.lastEmitTime))\n this.pendingEmitTimer = setTimeout(() => {\n this.pendingEmitTimer = undefined\n try {\n this.emitNow()\n } catch (err) {\n this.listenerError = err\n }\n }, delay)\n ;(this.pendingEmitTimer as { unref?: () => void }).unref?.()\n }\n\n private flushPendingEmit(): void {\n if (this.pendingEmitTimer !== undefined) {\n this.emitNow()\n }\n }\n\n private clearPendingEmit(): void {\n if (this.pendingEmitTimer === undefined) return\n clearTimeout(this.pendingEmitTimer)\n this.pendingEmitTimer = undefined\n }\n\n private emitNow(now = Date.now()): void {\n this.clearPendingEmit()\n this.lastEmitTime = now\n this.emit()\n }\n\n private throwPendingListenerError(): void {\n if (this.listenerError === undefined) return\n const err = this.listenerError\n this.listenerError = undefined\n throw err\n }\n\n /** Emit the current progress snapshot to the listener, if one is registered. */\n private emit(): void {\n this.listener?.({\n bytesTransferred: this.bytesTransferred,\n totalBytes: this.totalBytes,\n partsCompleted: this.partsCompleted,\n totalParts: this.totalParts,\n elapsedMs: Date.now() - this.startTime,\n })\n }\n}\n"],"mappings":";;;;;;;;;;AAuCA,IAAa,kBAAb,MAA6B;CAwBR;CACA;CACA;;CAxBnB,mBAA2B;;CAE3B,iBAAyB;;CAEzB;;CAEA;;CAEA,eAAsC;;CAEtC;;CAEA;;;;;;;;CASA,YACE,UACA,YACA,YACA,UAAkC,CAAC,GACnC;EAJiB,KAAA,WAAA;EACA,KAAA,aAAA;EACA,KAAA,aAAA;EAGjB,KAAK,YAAY,KAAK,IAAI;EAC1B,KAAK,gBAAgB,KAAK,IAAI,GAAG,QAAQ,iBAAA,GAAkD;CAC7F;;;;;CAMA,SAAS,OAAqB;EAC5B,KAAK,0BAA0B;EAC/B,KAAK,oBAAoB;EACzB,KAAK,cAAc;CACrB;;CAGA,eAAqB;EACnB,KAAK,0BAA0B;EAC/B,KAAK,iBAAiB;EACtB,KAAK;EACL,KAAK,QAAQ;CACf;;CAGA,UAAgB;EACd,KAAK,iBAAiB;EACtB,KAAK,gBAAgB,KAAA;CACvB;CAEA,gBAA8B;EAC5B,IAAI,KAAK,aAAa,KAAA,GAAW;EACjC,IAAI,KAAK,kBAAkB,GAAG;GAC5B,KAAK,QAAQ;GACb;EACF;EAEA,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,KAAK,gBAAgB,KAAK,eAAe;GAC/E,KAAK,QAAQ,GAAG;GAChB;EACF;EAEA,IAAI,KAAK,qBAAqB,KAAA,GAAW;EAEzC,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,iBAAiB,MAAM,KAAK,aAAa;EACxE,KAAK,mBAAmB,iBAAiB;GACvC,KAAK,mBAAmB,KAAA;GACxB,IAAI;IACF,KAAK,QAAQ;GACf,SAAS,KAAK;IACZ,KAAK,gBAAgB;GACvB;EACF,GAAG,KAAK;EACP,KAAM,iBAA4C,QAAQ;CAC7D;CAEA,mBAAiC;EAC/B,IAAI,KAAK,qBAAqB,KAAA,GAC5B,KAAK,QAAQ;CAEjB;CAEA,mBAAiC;EAC/B,IAAI,KAAK,qBAAqB,KAAA,GAAW;EACzC,aAAa,KAAK,gBAAgB;EAClC,KAAK,mBAAmB,KAAA;CAC1B;CAEA,QAAgB,MAAM,KAAK,IAAI,GAAS;EACtC,KAAK,iBAAiB;EACtB,KAAK,eAAe;EACpB,KAAK,KAAK;CACZ;CAEA,4BAA0C;EACxC,IAAI,KAAK,kBAAkB,KAAA,GAAW;EACtC,MAAM,MAAM,KAAK;EACjB,KAAK,gBAAgB,KAAA;EACrB,MAAM;CACR;;CAGA,OAAqB;EACnB,KAAK,WAAW;GACd,kBAAkB,KAAK;GACvB,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,YAAY,KAAK;GACjB,WAAW,KAAK,IAAI,IAAI,KAAK;EAC/B,CAAC;CACH;AACF"}