@vielzeug/arsenal 3.0.0 → 26.10.1

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 (518) hide show
  1. package/README.md +2 -2
  2. package/dist/_common/_lruMap.cjs +1 -1
  3. package/dist/_common/_lruMap.cjs.map +1 -1
  4. package/dist/_common/_lruMap.d.ts +1 -1
  5. package/dist/_common/_lruMap.js +1 -17
  6. package/dist/_common/_lruMap.js.map +1 -1
  7. package/dist/_common/_selectorSet.cjs +1 -1
  8. package/dist/_common/_selectorSet.cjs.map +1 -1
  9. package/dist/_common/_selectorSet.js +1 -15
  10. package/dist/_common/_selectorSet.js.map +1 -1
  11. package/dist/_common/unsafePaths.cjs +1 -1
  12. package/dist/_common/unsafePaths.cjs.map +1 -1
  13. package/dist/_common/unsafePaths.d.ts +1 -1
  14. package/dist/_common/unsafePaths.js +1 -12
  15. package/dist/_common/unsafePaths.js.map +1 -1
  16. package/dist/_dev.cjs +1 -1
  17. package/dist/_dev.cjs.map +1 -1
  18. package/dist/_dev.js +1 -5
  19. package/dist/_dev.js.map +1 -1
  20. package/dist/array/chunk.cjs +1 -1
  21. package/dist/array/chunk.cjs.map +1 -1
  22. package/dist/array/chunk.js +1 -9
  23. package/dist/array/chunk.js.map +1 -1
  24. package/dist/array/compact.cjs +1 -1
  25. package/dist/array/compact.cjs.map +1 -1
  26. package/dist/array/compact.js +1 -7
  27. package/dist/array/compact.js.map +1 -1
  28. package/dist/array/compare.cjs +1 -1
  29. package/dist/array/compare.cjs.map +1 -1
  30. package/dist/array/compare.js +1 -18
  31. package/dist/array/compare.js.map +1 -1
  32. package/dist/array/compareBy.cjs +1 -1
  33. package/dist/array/compareBy.cjs.map +1 -1
  34. package/dist/array/compareBy.js +1 -15
  35. package/dist/array/compareBy.js.map +1 -1
  36. package/dist/array/contains.cjs +1 -1
  37. package/dist/array/contains.cjs.map +1 -1
  38. package/dist/array/contains.js +1 -8
  39. package/dist/array/contains.js.map +1 -1
  40. package/dist/array/countBy.cjs +1 -1
  41. package/dist/array/countBy.cjs.map +1 -1
  42. package/dist/array/countBy.js +1 -13
  43. package/dist/array/countBy.js.map +1 -1
  44. package/dist/array/difference.cjs +1 -1
  45. package/dist/array/difference.cjs.map +1 -1
  46. package/dist/array/difference.js +1 -13
  47. package/dist/array/difference.js.map +1 -1
  48. package/dist/array/drop.cjs +1 -1
  49. package/dist/array/drop.cjs.map +1 -1
  50. package/dist/array/drop.js +1 -8
  51. package/dist/array/drop.js.map +1 -1
  52. package/dist/array/dropLast.cjs +1 -1
  53. package/dist/array/dropLast.cjs.map +1 -1
  54. package/dist/array/dropLast.js +1 -8
  55. package/dist/array/dropLast.js.map +1 -1
  56. package/dist/array/filterMap.cjs +1 -1
  57. package/dist/array/filterMap.cjs.map +1 -1
  58. package/dist/array/filterMap.js +1 -12
  59. package/dist/array/filterMap.js.map +1 -1
  60. package/dist/array/first.cjs +1 -1
  61. package/dist/array/first.cjs.map +1 -1
  62. package/dist/array/first.js +1 -7
  63. package/dist/array/first.js.map +1 -1
  64. package/dist/array/groupBy.cjs +1 -1
  65. package/dist/array/groupBy.cjs.map +1 -1
  66. package/dist/array/groupBy.js +1 -13
  67. package/dist/array/groupBy.js.map +1 -1
  68. package/dist/array/index.js +1 -28
  69. package/dist/array/indexBy.cjs +1 -1
  70. package/dist/array/indexBy.cjs.map +1 -1
  71. package/dist/array/indexBy.js +1 -13
  72. package/dist/array/indexBy.js.map +1 -1
  73. package/dist/array/intersection.cjs +1 -1
  74. package/dist/array/intersection.cjs.map +1 -1
  75. package/dist/array/intersection.js +1 -13
  76. package/dist/array/intersection.js.map +1 -1
  77. package/dist/array/last.cjs +1 -1
  78. package/dist/array/last.cjs.map +1 -1
  79. package/dist/array/last.js +1 -7
  80. package/dist/array/last.js.map +1 -1
  81. package/dist/array/partition.cjs +1 -1
  82. package/dist/array/partition.cjs.map +1 -1
  83. package/dist/array/partition.js +1 -9
  84. package/dist/array/partition.js.map +1 -1
  85. package/dist/array/replace.cjs +1 -1
  86. package/dist/array/replace.cjs.map +1 -1
  87. package/dist/array/replace.js +1 -12
  88. package/dist/array/replace.js.map +1 -1
  89. package/dist/array/rotate.cjs +1 -1
  90. package/dist/array/rotate.cjs.map +1 -1
  91. package/dist/array/rotate.js +1 -9
  92. package/dist/array/rotate.js.map +1 -1
  93. package/dist/array/search.cjs +1 -1
  94. package/dist/array/search.cjs.map +1 -1
  95. package/dist/array/search.js +1 -29
  96. package/dist/array/search.js.map +1 -1
  97. package/dist/array/sort.cjs +1 -1
  98. package/dist/array/sort.cjs.map +1 -1
  99. package/dist/array/sort.d.ts +1 -1
  100. package/dist/array/sort.js +1 -14
  101. package/dist/array/sort.js.map +1 -1
  102. package/dist/array/take.cjs +1 -1
  103. package/dist/array/take.cjs.map +1 -1
  104. package/dist/array/take.js +1 -8
  105. package/dist/array/take.js.map +1 -1
  106. package/dist/array/takeLast.cjs +1 -1
  107. package/dist/array/takeLast.cjs.map +1 -1
  108. package/dist/array/takeLast.js +1 -8
  109. package/dist/array/takeLast.js.map +1 -1
  110. package/dist/array/toggle.cjs +1 -1
  111. package/dist/array/toggle.cjs.map +1 -1
  112. package/dist/array/toggle.js +1 -8
  113. package/dist/array/toggle.js.map +1 -1
  114. package/dist/array/union.cjs +1 -1
  115. package/dist/array/union.cjs.map +1 -1
  116. package/dist/array/union.js +1 -8
  117. package/dist/array/union.js.map +1 -1
  118. package/dist/array/uniq.cjs +1 -1
  119. package/dist/array/uniq.cjs.map +1 -1
  120. package/dist/array/uniq.js +1 -8
  121. package/dist/array/uniq.js.map +1 -1
  122. package/dist/array/unzip.cjs +1 -1
  123. package/dist/array/unzip.cjs.map +1 -1
  124. package/dist/array/unzip.js +1 -10
  125. package/dist/array/unzip.js.map +1 -1
  126. package/dist/array/zip.cjs +1 -1
  127. package/dist/array/zip.cjs.map +1 -1
  128. package/dist/array/zip.js +1 -10
  129. package/dist/array/zip.js.map +1 -1
  130. package/dist/arsenal.cjs +1 -1
  131. package/dist/arsenal.cjs.map +1 -1
  132. package/dist/arsenal.iife.js +1 -1
  133. package/dist/arsenal.iife.js.map +1 -1
  134. package/dist/arsenal.js +1 -1
  135. package/dist/arsenal.js.map +1 -1
  136. package/dist/async/abortError.cjs +1 -1
  137. package/dist/async/abortError.cjs.map +1 -1
  138. package/dist/async/abortError.js +1 -7
  139. package/dist/async/abortError.js.map +1 -1
  140. package/dist/async/abortable.cjs +1 -1
  141. package/dist/async/abortable.cjs.map +1 -1
  142. package/dist/async/abortable.d.ts +1 -1
  143. package/dist/async/abortable.js +1 -11
  144. package/dist/async/abortable.js.map +1 -1
  145. package/dist/async/attempt.cjs +1 -1
  146. package/dist/async/attempt.cjs.map +1 -1
  147. package/dist/async/attempt.d.ts +1 -1
  148. package/dist/async/attempt.js +1 -23
  149. package/dist/async/attempt.js.map +1 -1
  150. package/dist/async/backoff.cjs +1 -1
  151. package/dist/async/backoff.cjs.map +1 -1
  152. package/dist/async/backoff.d.ts +1 -1
  153. package/dist/async/backoff.js +1 -7
  154. package/dist/async/backoff.js.map +1 -1
  155. package/dist/async/index.js +1 -10
  156. package/dist/async/parallel.cjs +1 -1
  157. package/dist/async/parallel.cjs.map +1 -1
  158. package/dist/async/parallel.js +1 -24
  159. package/dist/async/parallel.js.map +1 -1
  160. package/dist/async/retry.cjs +1 -1
  161. package/dist/async/retry.cjs.map +1 -1
  162. package/dist/async/retry.d.ts +5 -7
  163. package/dist/async/retry.d.ts.map +1 -1
  164. package/dist/async/retry.js +1 -24
  165. package/dist/async/retry.js.map +1 -1
  166. package/dist/async/sleep.cjs +1 -1
  167. package/dist/async/sleep.cjs.map +1 -1
  168. package/dist/async/sleep.js +1 -15
  169. package/dist/async/sleep.js.map +1 -1
  170. package/dist/async/taskPool.cjs +1 -1
  171. package/dist/async/taskPool.cjs.map +1 -1
  172. package/dist/async/taskPool.js +1 -50
  173. package/dist/async/taskPool.js.map +1 -1
  174. package/dist/async/waitFor.cjs +1 -1
  175. package/dist/async/waitFor.cjs.map +1 -1
  176. package/dist/async/waitFor.js +1 -12
  177. package/dist/async/waitFor.js.map +1 -1
  178. package/dist/cache/cache.cjs +1 -1
  179. package/dist/cache/cache.cjs.map +1 -1
  180. package/dist/cache/cache.js +1 -59
  181. package/dist/cache/cache.js.map +1 -1
  182. package/dist/cache/index.js +1 -3
  183. package/dist/cache/memo.cjs +1 -1
  184. package/dist/cache/memo.cjs.map +1 -1
  185. package/dist/cache/memo.d.ts +1 -1
  186. package/dist/cache/memo.js +1 -37
  187. package/dist/cache/memo.js.map +1 -1
  188. package/dist/encoding/base64url.cjs +2 -0
  189. package/dist/encoding/base64url.cjs.map +1 -0
  190. package/dist/encoding/base64url.d.ts +9 -0
  191. package/dist/encoding/base64url.d.ts.map +1 -0
  192. package/dist/encoding/base64url.js +2 -0
  193. package/dist/encoding/base64url.js.map +1 -0
  194. package/dist/encoding/index.cjs +1 -0
  195. package/dist/encoding/index.d.ts +2 -0
  196. package/dist/encoding/index.d.ts.map +1 -0
  197. package/dist/encoding/index.js +1 -0
  198. package/dist/errors.cjs +1 -1
  199. package/dist/errors.cjs.map +1 -1
  200. package/dist/errors.d.ts +1 -1
  201. package/dist/errors.js +1 -9
  202. package/dist/errors.js.map +1 -1
  203. package/dist/function/assert.cjs +1 -1
  204. package/dist/function/assert.cjs.map +1 -1
  205. package/dist/function/assert.d.ts +1 -0
  206. package/dist/function/assert.d.ts.map +1 -1
  207. package/dist/function/assert.js +1 -7
  208. package/dist/function/assert.js.map +1 -1
  209. package/dist/function/debounce.cjs +1 -1
  210. package/dist/function/debounce.cjs.map +1 -1
  211. package/dist/function/debounce.d.ts +2 -2
  212. package/dist/function/debounce.js +1 -26
  213. package/dist/function/debounce.js.map +1 -1
  214. package/dist/function/index.cjs +1 -1
  215. package/dist/function/index.d.ts +1 -0
  216. package/dist/function/index.d.ts.map +1 -1
  217. package/dist/function/index.js +1 -8
  218. package/dist/function/once.cjs +1 -1
  219. package/dist/function/once.cjs.map +1 -1
  220. package/dist/function/once.d.ts +3 -3
  221. package/dist/function/once.js +1 -10
  222. package/dist/function/once.js.map +1 -1
  223. package/dist/function/pipe.cjs +1 -1
  224. package/dist/function/pipe.cjs.map +1 -1
  225. package/dist/function/pipe.d.ts +1 -1
  226. package/dist/function/pipe.js +1 -9
  227. package/dist/function/pipe.js.map +1 -1
  228. package/dist/function/runAll.cjs +1 -1
  229. package/dist/function/runAll.cjs.map +1 -1
  230. package/dist/function/runAll.js +1 -18
  231. package/dist/function/runAll.js.map +1 -1
  232. package/dist/function/tap.cjs +1 -1
  233. package/dist/function/tap.cjs.map +1 -1
  234. package/dist/function/tap.js +1 -7
  235. package/dist/function/tap.js.map +1 -1
  236. package/dist/function/tapper.cjs +2 -0
  237. package/dist/function/tapper.cjs.map +1 -0
  238. package/dist/function/tapper.d.ts +27 -0
  239. package/dist/function/tapper.d.ts.map +1 -0
  240. package/dist/function/tapper.js +2 -0
  241. package/dist/function/tapper.js.map +1 -0
  242. package/dist/function/throttle.cjs +1 -1
  243. package/dist/function/throttle.cjs.map +1 -1
  244. package/dist/function/throttle.js +1 -35
  245. package/dist/function/throttle.js.map +1 -1
  246. package/dist/guards/combinators.cjs +1 -1
  247. package/dist/guards/combinators.cjs.map +1 -1
  248. package/dist/guards/combinators.d.ts +1 -1
  249. package/dist/guards/combinators.js +1 -16
  250. package/dist/guards/combinators.js.map +1 -1
  251. package/dist/guards/index.js +1 -17
  252. package/dist/guards/isAbortError.cjs +1 -1
  253. package/dist/guards/isAbortError.cjs.map +1 -1
  254. package/dist/guards/isAbortError.d.ts +2 -2
  255. package/dist/guards/isAbortError.js +1 -7
  256. package/dist/guards/isAbortError.js.map +1 -1
  257. package/dist/guards/isDate.cjs +1 -1
  258. package/dist/guards/isDate.cjs.map +1 -1
  259. package/dist/guards/isDate.js +1 -7
  260. package/dist/guards/isDate.js.map +1 -1
  261. package/dist/guards/isDefined.cjs +1 -1
  262. package/dist/guards/isDefined.cjs.map +1 -1
  263. package/dist/guards/isDefined.js +1 -7
  264. package/dist/guards/isDefined.js.map +1 -1
  265. package/dist/guards/isEmpty.cjs +1 -1
  266. package/dist/guards/isEmpty.cjs.map +1 -1
  267. package/dist/guards/isEmpty.js +1 -8
  268. package/dist/guards/isEmpty.js.map +1 -1
  269. package/dist/guards/isEqual.cjs +1 -1
  270. package/dist/guards/isEqual.cjs.map +1 -1
  271. package/dist/guards/isEqual.d.ts +1 -1
  272. package/dist/guards/isEqual.js +1 -33
  273. package/dist/guards/isEqual.js.map +1 -1
  274. package/dist/guards/isError.cjs +1 -1
  275. package/dist/guards/isError.cjs.map +1 -1
  276. package/dist/guards/isError.js +1 -7
  277. package/dist/guards/isError.js.map +1 -1
  278. package/dist/guards/isFunction.cjs +1 -1
  279. package/dist/guards/isFunction.cjs.map +1 -1
  280. package/dist/guards/isFunction.js +1 -7
  281. package/dist/guards/isFunction.js.map +1 -1
  282. package/dist/guards/isMatch.cjs +1 -1
  283. package/dist/guards/isMatch.cjs.map +1 -1
  284. package/dist/guards/isMatch.js +1 -22
  285. package/dist/guards/isMatch.js.map +1 -1
  286. package/dist/guards/isNil.cjs +1 -1
  287. package/dist/guards/isNil.cjs.map +1 -1
  288. package/dist/guards/isNil.js +1 -7
  289. package/dist/guards/isNil.js.map +1 -1
  290. package/dist/guards/isNumber.cjs +1 -1
  291. package/dist/guards/isNumber.cjs.map +1 -1
  292. package/dist/guards/isNumber.js +1 -7
  293. package/dist/guards/isNumber.js.map +1 -1
  294. package/dist/guards/isPlainObject.cjs +1 -1
  295. package/dist/guards/isPlainObject.cjs.map +1 -1
  296. package/dist/guards/isPlainObject.d.ts +1 -1
  297. package/dist/guards/isPlainObject.js +1 -9
  298. package/dist/guards/isPlainObject.js.map +1 -1
  299. package/dist/guards/isPrimitive.cjs +1 -1
  300. package/dist/guards/isPrimitive.cjs.map +1 -1
  301. package/dist/guards/isPrimitive.js +1 -7
  302. package/dist/guards/isPrimitive.js.map +1 -1
  303. package/dist/guards/isPromise.cjs +1 -1
  304. package/dist/guards/isPromise.cjs.map +1 -1
  305. package/dist/guards/isPromise.js +1 -7
  306. package/dist/guards/isPromise.js.map +1 -1
  307. package/dist/guards/isRegex.cjs +1 -1
  308. package/dist/guards/isRegex.cjs.map +1 -1
  309. package/dist/guards/isRegex.js +1 -7
  310. package/dist/guards/isRegex.js.map +1 -1
  311. package/dist/guards/shallowEqual.cjs +1 -1
  312. package/dist/guards/shallowEqual.cjs.map +1 -1
  313. package/dist/guards/shallowEqual.d.ts +3 -3
  314. package/dist/guards/shallowEqual.js +1 -19
  315. package/dist/guards/shallowEqual.js.map +1 -1
  316. package/dist/index.cjs +1 -1
  317. package/dist/index.d.ts +7 -0
  318. package/dist/index.d.ts.map +1 -1
  319. package/dist/index.js +1 -35
  320. package/dist/math/allocate.cjs +1 -1
  321. package/dist/math/allocate.cjs.map +1 -1
  322. package/dist/math/allocate.js +1 -18
  323. package/dist/math/allocate.js.map +1 -1
  324. package/dist/math/average.cjs +1 -1
  325. package/dist/math/average.cjs.map +1 -1
  326. package/dist/math/average.js +1 -8
  327. package/dist/math/average.js.map +1 -1
  328. package/dist/math/clamp.cjs +1 -1
  329. package/dist/math/clamp.cjs.map +1 -1
  330. package/dist/math/clamp.d.ts +6 -6
  331. package/dist/math/clamp.js +1 -7
  332. package/dist/math/clamp.js.map +1 -1
  333. package/dist/math/gcd.cjs +1 -1
  334. package/dist/math/gcd.cjs.map +1 -1
  335. package/dist/math/gcd.d.ts +1 -1
  336. package/dist/math/gcd.js +1 -13
  337. package/dist/math/gcd.js.map +1 -1
  338. package/dist/math/index.js +1 -16
  339. package/dist/math/lcm.cjs +1 -1
  340. package/dist/math/lcm.cjs.map +1 -1
  341. package/dist/math/lcm.js +1 -12
  342. package/dist/math/lcm.js.map +1 -1
  343. package/dist/math/lerp.cjs +1 -1
  344. package/dist/math/lerp.cjs.map +1 -1
  345. package/dist/math/lerp.d.ts +1 -1
  346. package/dist/math/lerp.js +1 -7
  347. package/dist/math/lerp.js.map +1 -1
  348. package/dist/math/linspace.cjs +1 -1
  349. package/dist/math/linspace.cjs.map +1 -1
  350. package/dist/math/linspace.js +1 -11
  351. package/dist/math/linspace.js.map +1 -1
  352. package/dist/math/median.cjs +1 -1
  353. package/dist/math/median.cjs.map +1 -1
  354. package/dist/math/median.js +1 -11
  355. package/dist/math/median.js.map +1 -1
  356. package/dist/math/mod.cjs +1 -1
  357. package/dist/math/mod.cjs.map +1 -1
  358. package/dist/math/mod.d.ts +1 -1
  359. package/dist/math/mod.js +1 -8
  360. package/dist/math/mod.js.map +1 -1
  361. package/dist/math/normalize.cjs +1 -1
  362. package/dist/math/normalize.cjs.map +1 -1
  363. package/dist/math/normalize.js +1 -8
  364. package/dist/math/normalize.js.map +1 -1
  365. package/dist/math/range.cjs +1 -1
  366. package/dist/math/range.cjs.map +1 -1
  367. package/dist/math/range.js +1 -25
  368. package/dist/math/range.js.map +1 -1
  369. package/dist/math/round.cjs +1 -1
  370. package/dist/math/round.cjs.map +1 -1
  371. package/dist/math/round.js +1 -9
  372. package/dist/math/round.js.map +1 -1
  373. package/dist/math/standardDeviation.cjs +1 -1
  374. package/dist/math/standardDeviation.cjs.map +1 -1
  375. package/dist/math/standardDeviation.js +1 -8
  376. package/dist/math/standardDeviation.js.map +1 -1
  377. package/dist/math/sum.cjs +1 -1
  378. package/dist/math/sum.cjs.map +1 -1
  379. package/dist/math/sum.js +1 -11
  380. package/dist/math/sum.js.map +1 -1
  381. package/dist/math/variance.cjs +1 -1
  382. package/dist/math/variance.cjs.map +1 -1
  383. package/dist/math/variance.js +1 -10
  384. package/dist/math/variance.js.map +1 -1
  385. package/dist/object/defaults.cjs +1 -1
  386. package/dist/object/defaults.cjs.map +1 -1
  387. package/dist/object/defaults.d.ts +1 -1
  388. package/dist/object/defaults.js +1 -11
  389. package/dist/object/defaults.js.map +1 -1
  390. package/dist/object/diff.cjs +1 -1
  391. package/dist/object/diff.cjs.map +1 -1
  392. package/dist/object/diff.d.ts +1 -1
  393. package/dist/object/diff.js +1 -26
  394. package/dist/object/diff.js.map +1 -1
  395. package/dist/object/filterValues.cjs +1 -1
  396. package/dist/object/filterValues.cjs.map +1 -1
  397. package/dist/object/filterValues.js +1 -10
  398. package/dist/object/filterValues.js.map +1 -1
  399. package/dist/object/flattenPaths.cjs +1 -1
  400. package/dist/object/flattenPaths.cjs.map +1 -1
  401. package/dist/object/flattenPaths.js +1 -30
  402. package/dist/object/flattenPaths.js.map +1 -1
  403. package/dist/object/getPath.cjs +1 -1
  404. package/dist/object/getPath.cjs.map +1 -1
  405. package/dist/object/getPath.js +1 -25
  406. package/dist/object/getPath.js.map +1 -1
  407. package/dist/object/hash.cjs +1 -1
  408. package/dist/object/hash.cjs.map +1 -1
  409. package/dist/object/hash.d.ts +2 -2
  410. package/dist/object/hash.js +1 -27
  411. package/dist/object/hash.js.map +1 -1
  412. package/dist/object/index.js +1 -15
  413. package/dist/object/invert.cjs +1 -1
  414. package/dist/object/invert.cjs.map +1 -1
  415. package/dist/object/invert.js +1 -10
  416. package/dist/object/invert.js.map +1 -1
  417. package/dist/object/mapKeys.cjs +1 -1
  418. package/dist/object/mapKeys.cjs.map +1 -1
  419. package/dist/object/mapKeys.js +1 -14
  420. package/dist/object/mapKeys.js.map +1 -1
  421. package/dist/object/mapValues.cjs +1 -1
  422. package/dist/object/mapValues.cjs.map +1 -1
  423. package/dist/object/mapValues.js +1 -10
  424. package/dist/object/mapValues.js.map +1 -1
  425. package/dist/object/merge.cjs +1 -1
  426. package/dist/object/merge.cjs.map +1 -1
  427. package/dist/object/merge.js +1 -25
  428. package/dist/object/merge.js.map +1 -1
  429. package/dist/object/omit.cjs +1 -1
  430. package/dist/object/omit.cjs.map +1 -1
  431. package/dist/object/omit.js +1 -10
  432. package/dist/object/omit.js.map +1 -1
  433. package/dist/object/pick.cjs +1 -1
  434. package/dist/object/pick.cjs.map +1 -1
  435. package/dist/object/pick.d.ts +1 -1
  436. package/dist/object/pick.js +1 -10
  437. package/dist/object/pick.js.map +1 -1
  438. package/dist/object/prune.cjs +1 -1
  439. package/dist/object/prune.cjs.map +1 -1
  440. package/dist/object/prune.js +1 -33
  441. package/dist/object/prune.js.map +1 -1
  442. package/dist/object/tryParseJson.cjs +1 -1
  443. package/dist/object/tryParseJson.cjs.map +1 -1
  444. package/dist/object/tryParseJson.js +1 -17
  445. package/dist/object/tryParseJson.js.map +1 -1
  446. package/dist/random/_index.cjs +1 -1
  447. package/dist/random/_index.cjs.map +1 -1
  448. package/dist/random/_index.js +1 -8
  449. package/dist/random/_index.js.map +1 -1
  450. package/dist/random/draw.cjs +1 -1
  451. package/dist/random/draw.cjs.map +1 -1
  452. package/dist/random/draw.js +1 -20
  453. package/dist/random/draw.js.map +1 -1
  454. package/dist/random/index.js +1 -5
  455. package/dist/random/random.cjs +1 -1
  456. package/dist/random/random.cjs.map +1 -1
  457. package/dist/random/random.js +1 -9
  458. package/dist/random/random.js.map +1 -1
  459. package/dist/random/shuffle.cjs +1 -1
  460. package/dist/random/shuffle.cjs.map +1 -1
  461. package/dist/random/shuffle.js +1 -13
  462. package/dist/random/shuffle.js.map +1 -1
  463. package/dist/random/source.cjs +1 -1
  464. package/dist/random/source.cjs.map +1 -1
  465. package/dist/random/source.js +1 -9
  466. package/dist/random/source.js.map +1 -1
  467. package/dist/string/_caseUtils.cjs +1 -1
  468. package/dist/string/_caseUtils.cjs.map +1 -1
  469. package/dist/string/_caseUtils.js +1 -12
  470. package/dist/string/_caseUtils.js.map +1 -1
  471. package/dist/string/camelCase.cjs +1 -1
  472. package/dist/string/camelCase.cjs.map +1 -1
  473. package/dist/string/camelCase.js +1 -8
  474. package/dist/string/camelCase.js.map +1 -1
  475. package/dist/string/escape.cjs +1 -1
  476. package/dist/string/escape.cjs.map +1 -1
  477. package/dist/string/escape.js +1 -14
  478. package/dist/string/escape.js.map +1 -1
  479. package/dist/string/index.js +1 -12
  480. package/dist/string/kebabCase.cjs +1 -1
  481. package/dist/string/kebabCase.cjs.map +1 -1
  482. package/dist/string/kebabCase.js +1 -8
  483. package/dist/string/kebabCase.js.map +1 -1
  484. package/dist/string/padCenter.cjs +1 -1
  485. package/dist/string/padCenter.cjs.map +1 -1
  486. package/dist/string/padCenter.js +1 -9
  487. package/dist/string/padCenter.js.map +1 -1
  488. package/dist/string/pascalCase.cjs +1 -1
  489. package/dist/string/pascalCase.cjs.map +1 -1
  490. package/dist/string/pascalCase.js +1 -8
  491. package/dist/string/pascalCase.js.map +1 -1
  492. package/dist/string/similarity.cjs +1 -1
  493. package/dist/string/similarity.cjs.map +1 -1
  494. package/dist/string/similarity.js +1 -22
  495. package/dist/string/similarity.js.map +1 -1
  496. package/dist/string/snakeCase.cjs +1 -1
  497. package/dist/string/snakeCase.cjs.map +1 -1
  498. package/dist/string/snakeCase.js +1 -8
  499. package/dist/string/snakeCase.js.map +1 -1
  500. package/dist/string/titleCase.cjs +1 -1
  501. package/dist/string/titleCase.cjs.map +1 -1
  502. package/dist/string/titleCase.js +1 -8
  503. package/dist/string/titleCase.js.map +1 -1
  504. package/dist/string/truncate.cjs +1 -1
  505. package/dist/string/truncate.cjs.map +1 -1
  506. package/dist/string/truncate.js +1 -15
  507. package/dist/string/truncate.js.map +1 -1
  508. package/dist/string/unescape.cjs +1 -1
  509. package/dist/string/unescape.cjs.map +1 -1
  510. package/dist/string/unescape.js +1 -14
  511. package/dist/string/unescape.js.map +1 -1
  512. package/dist/string/words.cjs +1 -1
  513. package/dist/string/words.cjs.map +1 -1
  514. package/dist/string/words.js +1 -9
  515. package/dist/string/words.js.map +1 -1
  516. package/dist/types.d.ts +10 -0
  517. package/dist/types.d.ts.map +1 -1
  518. package/package.json +13 -5
@@ -1,2 +1,2 @@
1
- function e(e,t=3e4){return Math.min(1e3*2**Math.max(0,Number.isNaN(e)?0:Math.floor(e)),t)}exports.backoff=e;
1
+ function backoff(e,t=3e4){return Math.min(1e3*2**Math.max(0,Number.isNaN(e)?0:Math.floor(e)),t)}exports.backoff=backoff;
2
2
  //# sourceMappingURL=backoff.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"backoff.cjs","names":[],"sources":["../../src/async/backoff.ts"],"sourcesContent":["/**\n * Computes an exponential backoff delay cap for a given zero-based attempt number.\n * Returns `min(1000 × 2ⁿ, maxMs)` — the cap before optional jitter is applied.\n *\n * Multiply the result by `Math.random()` for full-jitter backoff.\n *\n * @example\n * ```ts\n * // Deterministic (sourcerer-style):\n * const delay = backoff(attempt); // 1s, 2s, 4s, … capped at 30s\n *\n * // Full-jitter (courier-style):\n * const delay = Math.random() * backoff(attempt);\n * ```\n *\n * @param attempt - Zero-based attempt index (0 = first retry wait).\n * @param maxMs - Maximum cap in milliseconds. Defaults to 30 000.\n */\nexport function backoff(attempt: number, maxMs = 30_000): number {\n const n = Math.max(0, Number.isNaN(attempt) ? 0 : Math.floor(attempt));\n\n return Math.min(1000 * 2 ** n, maxMs);\n}\n"],"mappings":"AAkBA,SAAgB,EAAQ,EAAiB,EAAQ,IAAgB,CAG/D,OAAO,KAAK,IAAI,IAAO,GAFb,KAAK,IAAI,EAAG,OAAO,MAAM,CAAO,EAAI,EAAI,KAAK,MAAM,CAAO,CAExC,EAAG,CAAK,CACtC"}
1
+ {"version":3,"file":"backoff.cjs","names":[],"sources":["../../src/async/backoff.ts"],"sourcesContent":["/**\n * Computes an exponential backoff delay cap for a given zero-based attempt number.\n * Returns `min(1000 × 2ⁿ, maxMs)`: the cap before optional jitter is applied.\n *\n * Multiply the result by `Math.random()` for full-jitter backoff.\n *\n * @example\n * ```ts\n * // Deterministic (sourcerer-style):\n * const delay = backoff(attempt); // 1s, 2s, 4s, … capped at 30s\n *\n * // Full-jitter (courier-style):\n * const delay = Math.random() * backoff(attempt);\n * ```\n *\n * @param attempt - Zero-based attempt index (0 = first retry wait).\n * @param maxMs - Maximum cap in milliseconds. Defaults to 30 000.\n */\nexport function backoff(attempt: number, maxMs = 30_000): number {\n const n = Math.max(0, Number.isNaN(attempt) ? 0 : Math.floor(attempt));\n\n return Math.min(1000 * 2 ** n, maxMs);\n}\n"],"mappings":"AAkBA,SAAgB,QAAQ,EAAiB,EAAQ,IAAgB,CAG/D,OAAO,KAAK,IAAI,IAAO,GAFb,KAAK,IAAI,EAAG,OAAO,MAAM,CAAO,EAAI,EAAI,KAAK,MAAM,CAAO,CAExC,EAAG,CAAK,CACtC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Computes an exponential backoff delay cap for a given zero-based attempt number.
3
- * Returns `min(1000 × 2ⁿ, maxMs)` — the cap before optional jitter is applied.
3
+ * Returns `min(1000 × 2ⁿ, maxMs)`: the cap before optional jitter is applied.
4
4
  *
5
5
  * Multiply the result by `Math.random()` for full-jitter backoff.
6
6
  *
@@ -1,8 +1,2 @@
1
- //#region src/async/backoff.ts
2
- function e(e, t = 3e4) {
3
- return Math.min(1e3 * 2 ** Math.max(0, Number.isNaN(e) ? 0 : Math.floor(e)), t);
4
- }
5
- //#endregion
6
- export { e as backoff };
7
-
1
+ function backoff(e,t=3e4){return Math.min(1e3*2**Math.max(0,Number.isNaN(e)?0:Math.floor(e)),t)}export{backoff};
8
2
  //# sourceMappingURL=backoff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backoff.js","names":[],"sources":["../../src/async/backoff.ts"],"sourcesContent":["/**\n * Computes an exponential backoff delay cap for a given zero-based attempt number.\n * Returns `min(1000 × 2ⁿ, maxMs)` — the cap before optional jitter is applied.\n *\n * Multiply the result by `Math.random()` for full-jitter backoff.\n *\n * @example\n * ```ts\n * // Deterministic (sourcerer-style):\n * const delay = backoff(attempt); // 1s, 2s, 4s, … capped at 30s\n *\n * // Full-jitter (courier-style):\n * const delay = Math.random() * backoff(attempt);\n * ```\n *\n * @param attempt - Zero-based attempt index (0 = first retry wait).\n * @param maxMs - Maximum cap in milliseconds. Defaults to 30 000.\n */\nexport function backoff(attempt: number, maxMs = 30_000): number {\n const n = Math.max(0, Number.isNaN(attempt) ? 0 : Math.floor(attempt));\n\n return Math.min(1000 * 2 ** n, maxMs);\n}\n"],"mappings":";AAkBA,SAAgB,EAAQ,GAAiB,IAAQ,KAAgB;CAG/D,OAAO,KAAK,IAAI,MAAO,KAFb,KAAK,IAAI,GAAG,OAAO,MAAM,CAAO,IAAI,IAAI,KAAK,MAAM,CAAO,CAExC,GAAG,CAAK;AACtC"}
1
+ {"version":3,"file":"backoff.js","names":[],"sources":["../../src/async/backoff.ts"],"sourcesContent":["/**\n * Computes an exponential backoff delay cap for a given zero-based attempt number.\n * Returns `min(1000 × 2ⁿ, maxMs)`: the cap before optional jitter is applied.\n *\n * Multiply the result by `Math.random()` for full-jitter backoff.\n *\n * @example\n * ```ts\n * // Deterministic (sourcerer-style):\n * const delay = backoff(attempt); // 1s, 2s, 4s, … capped at 30s\n *\n * // Full-jitter (courier-style):\n * const delay = Math.random() * backoff(attempt);\n * ```\n *\n * @param attempt - Zero-based attempt index (0 = first retry wait).\n * @param maxMs - Maximum cap in milliseconds. Defaults to 30 000.\n */\nexport function backoff(attempt: number, maxMs = 30_000): number {\n const n = Math.max(0, Number.isNaN(attempt) ? 0 : Math.floor(attempt));\n\n return Math.min(1000 * 2 ** n, maxMs);\n}\n"],"mappings":"AAkBA,SAAgB,QAAQ,EAAiB,EAAQ,IAAgB,CAG/D,OAAO,KAAK,IAAI,IAAO,GAFb,KAAK,IAAI,EAAG,OAAO,MAAM,CAAO,EAAI,EAAI,KAAK,MAAM,CAAO,CAExC,EAAG,CAAK,CACtC"}
@@ -1,10 +1 @@
1
- import { abortError as e } from "./abortError.js";
2
- import { abortable as t } from "./abortable.js";
3
- import { attempt as n, isFail as r, isOk as i } from "./attempt.js";
4
- import { backoff as a } from "./backoff.js";
5
- import { parallel as o } from "./parallel.js";
6
- import { sleep as s } from "./sleep.js";
7
- import { retry as c } from "./retry.js";
8
- import { taskPool as l } from "./taskPool.js";
9
- import { waitFor as u } from "./waitFor.js";
10
- export { e as abortError, t as abortable, n as attempt, a as backoff, r as isFail, i as isOk, o as parallel, c as retry, s as sleep, l as taskPool, u as waitFor };
1
+ import{abortError as e}from"./abortError.js";import{abortable as t}from"./abortable.js";import{attempt as n,isFail as r,isOk as i}from"./attempt.js";import{backoff as a}from"./backoff.js";import{parallel as o}from"./parallel.js";import{sleep as s}from"./sleep.js";import{retry as c}from"./retry.js";import{taskPool as l}from"./taskPool.js";import{waitFor as u}from"./waitFor.js";export{e as abortError,t as abortable,n as attempt,a as backoff,r as isFail,i as isOk,o as parallel,c as retry,s as sleep,l as taskPool,u as waitFor};
@@ -1,2 +1,2 @@
1
- const e=require("./abortError.cjs");async function t(t,n,r={}){let{abortOnError:i=!1,limit:a=1/0,signal:o}=r;if(a<1)throw RangeError(`parallel: limit must be at least 1, got ${a}`);if(o?.aborted)throw e.abortError(o);if(t.length===0)return[];let s=Array(t.length),c=0,l=i?new AbortController:void 0,u=async()=>{for(;;){if(o?.aborted)throw e.abortError(o);if(l?.signal.aborted||c>=t.length)return;let r=c++;try{s[r]=await n(t[r],r,t)}catch(e){throw l?.abort(),e}}},d=Math.min(a,t.length),f=Array.from({length:d},()=>u());return await Promise.all(f),s}exports.parallel=t;
1
+ const e=require("./abortError.cjs");async function parallel(t,n,r={}){let{abortOnError:i=!1,limit:a=1/0,signal:o}=r;if(a<1)throw RangeError(`parallel: limit must be at least 1, got ${a}`);if(o?.aborted)throw e.abortError(o);if(t.length===0)return[];let s=Array(t.length),c=0,l=i?new AbortController:void 0,worker=async()=>{for(;;){if(o?.aborted)throw e.abortError(o);if(l?.signal.aborted||c>=t.length)return;let r=c++;try{s[r]=await n(t[r],r,t)}catch(e){throw l?.abort(),e}}},u=Math.min(a,t.length),d=Array.from({length:u},()=>worker());return await Promise.all(d),s}exports.parallel=parallel;
2
2
  //# sourceMappingURL=parallel.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"parallel.cjs","names":[],"sources":["../../src/async/parallel.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel([1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * }, { limit: 3 });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(items, async (item) => {\n * return processItem(item);\n * }, { limit: 2, signal: controller.signal });\n *\n * // Stop other workers as soon as one item fails\n * await parallel(items, riskyOperation, { abortOnError: true, limit: 3 });\n * ```\n *\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param options - Optional options for concurrency and cancellation\n * @param [options.limit=Infinity] - Maximum number of concurrent operations. Defaults to unbounded.\n * @param [options.signal] - Optional AbortSignal to cancel processing\n * @param [options.abortOnError=false] - When `true`, stops other in-flight workers as soon as any\n * callback throws, instead of letting them keep running to completion unobserved. Default\n * preserves the existing best-effort-completion behavior.\n * @returns Promise resolving to an ordered array of results\n * @throws {RangeError} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n array: readonly T[],\n callback: (item: T, index: number, array: readonly T[]) => Promise<R> | R,\n options: { abortOnError?: boolean; limit?: number; signal?: AbortSignal } = {},\n): Promise<R[]> {\n const { abortOnError = false, limit = Infinity, signal } = options;\n\n if (limit < 1) {\n throw new RangeError(`parallel: limit must be at least 1, got ${limit}`);\n }\n\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (array.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n const failFastController = abortOnError ? new AbortController() : undefined;\n\n const worker = async (): Promise<void> => {\n while (true) {\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (failFastController?.signal.aborted) {\n return;\n }\n\n if (currentIndex >= array.length) {\n return;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index]!, index, array);\n } catch (err) {\n failFastController?.abort();\n throw err;\n }\n }\n };\n\n const workerCount = Math.min(limit, array.length);\n const workers = Array.from({ length: workerCount }, () => worker());\n\n await Promise.all(workers);\n\n return results;\n}\n"],"mappings":"oCAsCA,eAAsB,EACpB,EACA,EACA,EAA4E,CAAC,EAC/D,CACd,GAAM,CAAE,eAAe,GAAO,QAAQ,IAAU,UAAW,EAE3D,GAAI,EAAQ,EACV,MAAU,WAAW,2CAA2C,GAAO,EAGzE,GAAI,GAAQ,QACV,MAAM,EAAA,WAAW,CAAM,EAGzB,GAAI,EAAM,SAAW,EACnB,MAAO,CAAC,EAGV,IAAM,EAAmB,MAAM,EAAM,MAAM,EACvC,EAAe,EACb,EAAqB,EAAe,IAAI,gBAAoB,IAAA,GAE5D,EAAS,SAA2B,CACxC,OAAa,CACX,GAAI,GAAQ,QACV,MAAM,EAAA,WAAW,CAAM,EAOzB,GAJI,GAAoB,OAAO,SAI3B,GAAgB,EAAM,OACxB,OAGF,IAAM,EAAQ,IAEd,GAAI,CACF,EAAQ,GAAS,MAAM,EAAS,EAAM,GAAS,EAAO,CAAK,CAC7D,OAAS,EAAK,CAEZ,MADA,GAAoB,MAAM,EACpB,CACR,CACF,CACF,EAEM,EAAc,KAAK,IAAI,EAAO,EAAM,MAAM,EAC1C,EAAU,MAAM,KAAK,CAAE,OAAQ,CAAY,MAAS,EAAO,CAAC,EAIlE,OAFA,MAAM,QAAQ,IAAI,CAAO,EAElB,CACT"}
1
+ {"version":3,"file":"parallel.cjs","names":[],"sources":["../../src/async/parallel.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel([1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * }, { limit: 3 });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(items, async (item) => {\n * return processItem(item);\n * }, { limit: 2, signal: controller.signal });\n *\n * // Stop other workers as soon as one item fails\n * await parallel(items, riskyOperation, { abortOnError: true, limit: 3 });\n * ```\n *\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param options - Optional options for concurrency and cancellation\n * @param [options.limit=Infinity] - Maximum number of concurrent operations. Defaults to unbounded.\n * @param [options.signal] - Optional AbortSignal to cancel processing\n * @param [options.abortOnError=false] - When `true`, stops other in-flight workers as soon as any\n * callback throws, instead of letting them keep running to completion unobserved. Default\n * preserves the existing best-effort-completion behavior.\n * @returns Promise resolving to an ordered array of results\n * @throws {RangeError} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n array: readonly T[],\n callback: (item: T, index: number, array: readonly T[]) => Promise<R> | R,\n options: { abortOnError?: boolean; limit?: number; signal?: AbortSignal } = {},\n): Promise<R[]> {\n const { abortOnError = false, limit = Infinity, signal } = options;\n\n if (limit < 1) {\n throw new RangeError(`parallel: limit must be at least 1, got ${limit}`);\n }\n\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (array.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n const failFastController = abortOnError ? new AbortController() : undefined;\n\n const worker = async (): Promise<void> => {\n while (true) {\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (failFastController?.signal.aborted) {\n return;\n }\n\n if (currentIndex >= array.length) {\n return;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index]!, index, array);\n } catch (err) {\n failFastController?.abort();\n throw err;\n }\n }\n };\n\n const workerCount = Math.min(limit, array.length);\n const workers = Array.from({ length: workerCount }, () => worker());\n\n await Promise.all(workers);\n\n return results;\n}\n"],"mappings":"oCAsCA,eAAsB,SACpB,EACA,EACA,EAA4E,CAAC,EAC/D,CACd,GAAM,CAAE,eAAe,GAAO,QAAQ,IAAU,UAAW,EAE3D,GAAI,EAAQ,EACV,MAAU,WAAW,2CAA2C,GAAO,EAGzE,GAAI,GAAQ,QACV,MAAM,EAAA,WAAW,CAAM,EAGzB,GAAI,EAAM,SAAW,EACnB,MAAO,CAAC,EAGV,IAAM,EAAmB,MAAM,EAAM,MAAM,EACvC,EAAe,EACb,EAAqB,EAAe,IAAI,gBAAoB,IAAA,GAE5D,OAAS,SAA2B,CACxC,OAAa,CACX,GAAI,GAAQ,QACV,MAAM,EAAA,WAAW,CAAM,EAOzB,GAJI,GAAoB,OAAO,SAI3B,GAAgB,EAAM,OACxB,OAGF,IAAM,EAAQ,IAEd,GAAI,CACF,EAAQ,GAAS,MAAM,EAAS,EAAM,GAAS,EAAO,CAAK,CAC7D,OAAS,EAAK,CAEZ,MADA,GAAoB,MAAM,EACpB,CACR,CACF,CACF,EAEM,EAAc,KAAK,IAAI,EAAO,EAAM,MAAM,EAC1C,EAAU,MAAM,KAAK,CAAE,OAAQ,CAAY,MAAS,OAAO,CAAC,EAIlE,OAFA,MAAM,QAAQ,IAAI,CAAO,EAElB,CACT"}
@@ -1,25 +1,2 @@
1
- import { abortError as e } from "./abortError.js";
2
- //#region src/async/parallel.ts
3
- async function t(t, n, r = {}) {
4
- let { abortOnError: i = !1, limit: a = Infinity, signal: o } = r;
5
- if (a < 1) throw RangeError(`parallel: limit must be at least 1, got ${a}`);
6
- if (o?.aborted) throw e(o);
7
- if (t.length === 0) return [];
8
- let s = Array(t.length), c = 0, l = i ? new AbortController() : void 0, u = async () => {
9
- for (;;) {
10
- if (o?.aborted) throw e(o);
11
- if (l?.signal.aborted || c >= t.length) return;
12
- let r = c++;
13
- try {
14
- s[r] = await n(t[r], r, t);
15
- } catch (e) {
16
- throw l?.abort(), e;
17
- }
18
- }
19
- }, d = Math.min(a, t.length), f = Array.from({ length: d }, () => u());
20
- return await Promise.all(f), s;
21
- }
22
- //#endregion
23
- export { t as parallel };
24
-
1
+ import{abortError as e}from"./abortError.js";async function parallel(t,n,r={}){let{abortOnError:i=!1,limit:a=1/0,signal:o}=r;if(a<1)throw RangeError(`parallel: limit must be at least 1, got ${a}`);if(o?.aborted)throw e(o);if(t.length===0)return[];let s=Array(t.length),c=0,l=i?new AbortController:void 0,worker=async()=>{for(;;){if(o?.aborted)throw e(o);if(l?.signal.aborted||c>=t.length)return;let r=c++;try{s[r]=await n(t[r],r,t)}catch(e){throw l?.abort(),e}}},u=Math.min(a,t.length),d=Array.from({length:u},()=>worker());return await Promise.all(d),s}export{parallel};
25
2
  //# sourceMappingURL=parallel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parallel.js","names":[],"sources":["../../src/async/parallel.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel([1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * }, { limit: 3 });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(items, async (item) => {\n * return processItem(item);\n * }, { limit: 2, signal: controller.signal });\n *\n * // Stop other workers as soon as one item fails\n * await parallel(items, riskyOperation, { abortOnError: true, limit: 3 });\n * ```\n *\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param options - Optional options for concurrency and cancellation\n * @param [options.limit=Infinity] - Maximum number of concurrent operations. Defaults to unbounded.\n * @param [options.signal] - Optional AbortSignal to cancel processing\n * @param [options.abortOnError=false] - When `true`, stops other in-flight workers as soon as any\n * callback throws, instead of letting them keep running to completion unobserved. Default\n * preserves the existing best-effort-completion behavior.\n * @returns Promise resolving to an ordered array of results\n * @throws {RangeError} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n array: readonly T[],\n callback: (item: T, index: number, array: readonly T[]) => Promise<R> | R,\n options: { abortOnError?: boolean; limit?: number; signal?: AbortSignal } = {},\n): Promise<R[]> {\n const { abortOnError = false, limit = Infinity, signal } = options;\n\n if (limit < 1) {\n throw new RangeError(`parallel: limit must be at least 1, got ${limit}`);\n }\n\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (array.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n const failFastController = abortOnError ? new AbortController() : undefined;\n\n const worker = async (): Promise<void> => {\n while (true) {\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (failFastController?.signal.aborted) {\n return;\n }\n\n if (currentIndex >= array.length) {\n return;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index]!, index, array);\n } catch (err) {\n failFastController?.abort();\n throw err;\n }\n }\n };\n\n const workerCount = Math.min(limit, array.length);\n const workers = Array.from({ length: workerCount }, () => worker());\n\n await Promise.all(workers);\n\n return results;\n}\n"],"mappings":";;AAsCA,eAAsB,EACpB,GACA,GACA,IAA4E,CAAC,GAC/D;CACd,IAAM,EAAE,kBAAe,IAAO,WAAQ,UAAU,cAAW;CAE3D,IAAI,IAAQ,GACV,MAAU,WAAW,2CAA2C,GAAO;CAGzE,IAAI,GAAQ,SACV,MAAM,EAAW,CAAM;CAGzB,IAAI,EAAM,WAAW,GACnB,OAAO,CAAC;CAGV,IAAM,IAAmB,MAAM,EAAM,MAAM,GACvC,IAAe,GACb,IAAqB,IAAe,IAAI,gBAAgB,IAAI,KAAA,GAE5D,IAAS,YAA2B;EACxC,SAAa;GACX,IAAI,GAAQ,SACV,MAAM,EAAW,CAAM;GAOzB,IAJI,GAAoB,OAAO,WAI3B,KAAgB,EAAM,QACxB;GAGF,IAAM,IAAQ;GAEd,IAAI;IACF,EAAQ,KAAS,MAAM,EAAS,EAAM,IAAS,GAAO,CAAK;GAC7D,SAAS,GAAK;IAEZ,MADA,GAAoB,MAAM,GACpB;GACR;EACF;CACF,GAEM,IAAc,KAAK,IAAI,GAAO,EAAM,MAAM,GAC1C,IAAU,MAAM,KAAK,EAAE,QAAQ,EAAY,SAAS,EAAO,CAAC;CAIlE,OAFA,MAAM,QAAQ,IAAI,CAAO,GAElB;AACT"}
1
+ {"version":3,"file":"parallel.js","names":[],"sources":["../../src/async/parallel.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel([1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * }, { limit: 3 });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(items, async (item) => {\n * return processItem(item);\n * }, { limit: 2, signal: controller.signal });\n *\n * // Stop other workers as soon as one item fails\n * await parallel(items, riskyOperation, { abortOnError: true, limit: 3 });\n * ```\n *\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param options - Optional options for concurrency and cancellation\n * @param [options.limit=Infinity] - Maximum number of concurrent operations. Defaults to unbounded.\n * @param [options.signal] - Optional AbortSignal to cancel processing\n * @param [options.abortOnError=false] - When `true`, stops other in-flight workers as soon as any\n * callback throws, instead of letting them keep running to completion unobserved. Default\n * preserves the existing best-effort-completion behavior.\n * @returns Promise resolving to an ordered array of results\n * @throws {RangeError} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n array: readonly T[],\n callback: (item: T, index: number, array: readonly T[]) => Promise<R> | R,\n options: { abortOnError?: boolean; limit?: number; signal?: AbortSignal } = {},\n): Promise<R[]> {\n const { abortOnError = false, limit = Infinity, signal } = options;\n\n if (limit < 1) {\n throw new RangeError(`parallel: limit must be at least 1, got ${limit}`);\n }\n\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (array.length === 0) {\n return [];\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n const failFastController = abortOnError ? new AbortController() : undefined;\n\n const worker = async (): Promise<void> => {\n while (true) {\n if (signal?.aborted) {\n throw abortError(signal);\n }\n\n if (failFastController?.signal.aborted) {\n return;\n }\n\n if (currentIndex >= array.length) {\n return;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index]!, index, array);\n } catch (err) {\n failFastController?.abort();\n throw err;\n }\n }\n };\n\n const workerCount = Math.min(limit, array.length);\n const workers = Array.from({ length: workerCount }, () => worker());\n\n await Promise.all(workers);\n\n return results;\n}\n"],"mappings":"6CAsCA,eAAsB,SACpB,EACA,EACA,EAA4E,CAAC,EAC/D,CACd,GAAM,CAAE,eAAe,GAAO,QAAQ,IAAU,UAAW,EAE3D,GAAI,EAAQ,EACV,MAAU,WAAW,2CAA2C,GAAO,EAGzE,GAAI,GAAQ,QACV,MAAM,EAAW,CAAM,EAGzB,GAAI,EAAM,SAAW,EACnB,MAAO,CAAC,EAGV,IAAM,EAAmB,MAAM,EAAM,MAAM,EACvC,EAAe,EACb,EAAqB,EAAe,IAAI,gBAAoB,IAAA,GAE5D,OAAS,SAA2B,CACxC,OAAa,CACX,GAAI,GAAQ,QACV,MAAM,EAAW,CAAM,EAOzB,GAJI,GAAoB,OAAO,SAI3B,GAAgB,EAAM,OACxB,OAGF,IAAM,EAAQ,IAEd,GAAI,CACF,EAAQ,GAAS,MAAM,EAAS,EAAM,GAAS,EAAO,CAAK,CAC7D,OAAS,EAAK,CAEZ,MADA,GAAoB,MAAM,EACpB,CACR,CACF,CACF,EAEM,EAAc,KAAK,IAAI,EAAO,EAAM,MAAM,EAC1C,EAAU,MAAM,KAAK,CAAE,OAAQ,CAAY,MAAS,OAAO,CAAC,EAIlE,OAFA,MAAM,QAAQ,IAAI,CAAO,EAElB,CACT"}
@@ -1,2 +1,2 @@
1
- const e=require("./abortError.cjs"),t=require("./sleep.cjs");function n(e,t){let n=[e===void 0?void 0:AbortSignal.timeout(e),t].filter(e=>e!=null);if(n.length!==0)return n.length===1?n[0]:AbortSignal.any(n)}async function r(r,{delay:i=250,onError:a,shouldRetry:o,signal:s,timeout:c,times:l=3}={}){if(!Number.isInteger(l)||l<1)throw RangeError(`retry: times must be a positive integer, got ${l}`);for(let u=1;u<=l;u++){if(s?.aborted)throw e.abortError(s);let d=n(c,s);try{return await r(d)}catch(e){if(u===l||o&&!o(e,u-1))throw a?.(e),e;let n=typeof i==`function`?i(u-1):i;n>0&&await t.sleep(n,s)}}}exports.retry=r;
1
+ const e=require("./abortError.cjs"),t=require("./sleep.cjs");function buildSignal(e,t){let n=[e===void 0?void 0:AbortSignal.timeout(e),t].filter(e=>e!=null);if(n.length!==0)return n.length===1?n[0]:AbortSignal.any(n)}async function retry(n,{delay:r=250,shouldRetry:i,signal:a,timeout:o,times:s=3}={}){if(!Number.isInteger(s)||s<1)throw RangeError(`retry: times must be a positive integer, got ${s}`);for(let c=1;c<=s;c++){if(a?.aborted)throw e.abortError(a);let l=buildSignal(o,a);try{return await n(l)}catch(e){if(c===s||i&&!i(e,c-1))throw e;let n=typeof r==`function`?r(c-1):r;n>0&&await t.sleep(n,a)}}}exports.retry=retry;
2
2
  //# sourceMappingURL=retry.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.cjs","names":[],"sources":["../../src/async/retry.ts"],"sourcesContent":["import { abortError } from './abortError';\nimport { sleep } from './sleep';\n\nexport type RetryOptions = {\n delay?: number | ((attempt: number) => number);\n onError?: (error: unknown) => void;\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n signal?: AbortSignal;\n timeout?: number;\n times?: number;\n};\n\nfunction buildSignal(timeout: number | undefined, signal: AbortSignal | undefined): AbortSignal | undefined {\n const parts = [timeout !== undefined ? AbortSignal.timeout(timeout) : undefined, signal].filter(\n (s): s is AbortSignal => s != null,\n );\n\n if (parts.length === 0) return undefined;\n\n if (parts.length === 1) return parts[0];\n\n return AbortSignal.any(parts);\n}\n\n/**\n * Retries an async function with optional per-attempt timeout, delay strategy, and abort support.\n * The function receives a merged AbortSignal from the per-attempt timeout and any external signal.\n * On total failure, throws the last error (use `attempt()` to get an `AttemptResult` without throwing).\n *\n * @example\n * ```ts\n * // Basic retry\n * const data = await retry(() => fetch('/api').then(r => r.json()), { times: 3 });\n *\n * // With per-attempt timeout and cancellation\n * const data = await retry(\n * async (signal) => fetch('/api', { signal }).then(r => r.json()),\n * { times: 3, timeout: 5000 },\n * );\n *\n * // As AttemptResult (never throws) — combine with attempt()\n * const result = await attempt(() => retry(fn, { times: 3 }));\n * ```\n *\n * @param fn - Async function to retry. Receives a merged AbortSignal when timeout or signal is set.\n * @param options - Retry configuration.\n * @param [options.times=3] - Total attempts including the first.\n * @param [options.delay=250] - Delay between retries in ms, or a function of (attemptIndex).\n * @param [options.timeout] - Per-attempt timeout in milliseconds.\n * @param [options.signal] - External AbortSignal to cancel all retries.\n * @param [options.shouldRetry] - Predicate called after each non-final failure.\n * Receives the error and the number of failures so far (0-indexed: `0` on the first failure,\n * `1` on the second, etc.). Return `false` to abort immediately. **Not called on the final attempt**\n * (use `onError` to observe the final error unconditionally).\n * @param [options.onError] - Called with the last error before rethrowing — both on final attempt exhaustion\n * and when `shouldRetry` returns `false` to abort early.\n * @returns The resolved value.\n * @throws {RangeError} If `times` is not a positive integer.\n * @throws The last error if all attempts fail.\n */\nexport async function retry<T>(\n fn: (signal?: AbortSignal) => Promise<T>,\n { delay = 250, onError, shouldRetry, signal, timeout, times = 3 }: RetryOptions = {},\n): Promise<T> {\n if (!Number.isInteger(times) || times < 1) {\n throw new RangeError(`retry: times must be a positive integer, got ${times}`);\n }\n\n for (let tryCount = 1; tryCount <= times; tryCount++) {\n if (signal?.aborted) throw abortError(signal);\n\n const callSignal = buildSignal(timeout, signal);\n\n try {\n return await fn(callSignal);\n } catch (err) {\n if (tryCount === times) {\n onError?.(err);\n throw err;\n }\n\n if (shouldRetry && !shouldRetry(err, tryCount - 1)) {\n onError?.(err);\n throw err;\n }\n\n const ms = typeof delay === 'function' ? delay(tryCount - 1) : delay;\n\n if (ms > 0) await sleep(ms, signal);\n }\n }\n\n /* unreachable — the loop always returns or throws before exhausting all attempts */\n return undefined as never;\n}\n"],"mappings":"6DAYA,SAAS,EAAY,EAA6B,EAA0D,CAC1G,IAAM,EAAQ,CAAC,IAAY,IAAA,GAA2C,IAAA,GAA/B,YAAY,QAAQ,CAAO,EAAe,CAAM,CAAC,CAAC,OACtF,GAAwB,GAAK,IAChC,EAEI,KAAM,SAAW,EAIrB,OAFI,EAAM,SAAW,EAAU,EAAM,GAE9B,YAAY,IAAI,CAAK,CAC9B,CAsCA,eAAsB,EACpB,EACA,CAAE,QAAQ,IAAK,UAAS,cAAa,SAAQ,UAAS,QAAQ,GAAoB,CAAC,EACvE,CACZ,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,gDAAgD,GAAO,EAG9E,IAAK,IAAI,EAAW,EAAG,GAAY,EAAO,IAAY,CACpD,GAAI,GAAQ,QAAS,MAAM,EAAA,WAAW,CAAM,EAE5C,IAAM,EAAa,EAAY,EAAS,CAAM,EAE9C,GAAI,CACF,OAAO,MAAM,EAAG,CAAU,CAC5B,OAAS,EAAK,CAMZ,GALI,IAAa,GAKb,GAAe,CAAC,EAAY,EAAK,EAAW,CAAC,EAE/C,MADA,IAAU,CAAG,EACP,EAGR,IAAM,EAAK,OAAO,GAAU,WAAa,EAAM,EAAW,CAAC,EAAI,EAE3D,EAAK,GAAG,MAAM,EAAA,MAAM,EAAI,CAAM,CACpC,CACF,CAIF"}
1
+ {"version":3,"file":"retry.cjs","names":[],"sources":["../../src/async/retry.ts"],"sourcesContent":["import { abortError } from './abortError';\nimport { sleep } from './sleep';\n\nexport type RetryOptions = {\n delay?: number | ((attempt: number) => number);\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n signal?: AbortSignal;\n timeout?: number;\n times?: number;\n};\n\nfunction buildSignal(timeout: number | undefined, signal: AbortSignal | undefined): AbortSignal | undefined {\n const parts = [timeout !== undefined ? AbortSignal.timeout(timeout) : undefined, signal].filter(\n (s): s is AbortSignal => s != null,\n );\n\n if (parts.length === 0) return undefined;\n\n if (parts.length === 1) return parts[0];\n\n return AbortSignal.any(parts);\n}\n\n/**\n * Retries an async function with optional per-attempt timeout, delay strategy, and abort support.\n * The function receives a merged AbortSignal from the per-attempt timeout and any external signal.\n * On total failure, throws the last error (use `attempt()` to get an `AttemptResult` without throwing).\n *\n * @example\n * ```ts\n * // Basic retry\n * const data = await retry(() => fetch('/api').then(r => r.json()), { times: 3 });\n *\n * // With per-attempt timeout and cancellation\n * const data = await retry(\n * async (signal) => fetch('/api', { signal }).then(r => r.json()),\n * { times: 3, timeout: 5000 },\n * );\n *\n * // As AttemptResult (never throws): combine with attempt()\n * const result = await attempt(() => retry(fn, { times: 3 }));\n * ```\n *\n * @param fn - Async function to retry. Receives a merged AbortSignal when timeout or signal is set.\n * @param options - Retry configuration.\n * @param [options.times=3] - Total attempts including the first.\n * @param [options.delay=250] - Delay between retries in ms, or a function of (attemptIndex).\n * @param [options.timeout] - Per-attempt timeout in milliseconds.\n * @param [options.signal] - External AbortSignal to cancel all retries.\n * @param [options.shouldRetry] - Predicate called after each non-final failure.\n * Receives the error and the number of failures so far (0-indexed: `0` on the first failure,\n * `1` on the second, etc.). Return `false` to abort immediately. Not called on the final\n * attempt, because there is no retry left to decide about; observe the thrown error with\n * `attempt()` or `try/catch` instead.\n * @returns The resolved value.\n * @throws {RangeError} If `times` is not a positive integer.\n * @throws The last error if all attempts fail.\n */\nexport async function retry<T>(\n fn: (signal?: AbortSignal) => Promise<T>,\n { delay = 250, shouldRetry, signal, timeout, times = 3 }: RetryOptions = {},\n): Promise<T> {\n if (!Number.isInteger(times) || times < 1) {\n throw new RangeError(`retry: times must be a positive integer, got ${times}`);\n }\n\n for (let tryCount = 1; tryCount <= times; tryCount++) {\n if (signal?.aborted) throw abortError(signal);\n\n const callSignal = buildSignal(timeout, signal);\n\n try {\n return await fn(callSignal);\n } catch (err) {\n if (tryCount === times) throw err;\n\n if (shouldRetry && !shouldRetry(err, tryCount - 1)) throw err;\n\n const ms = typeof delay === 'function' ? delay(tryCount - 1) : delay;\n\n if (ms > 0) await sleep(ms, signal);\n }\n }\n\n /* unreachable: the loop always returns or throws before exhausting all attempts */\n return undefined as never;\n}\n"],"mappings":"6DAWA,SAAS,YAAY,EAA6B,EAA0D,CAC1G,IAAM,EAAQ,CAAC,IAAY,IAAA,GAA2C,IAAA,GAA/B,YAAY,QAAQ,CAAO,EAAe,CAAM,CAAC,CAAC,OACtF,GAAwB,GAAK,IAChC,EAEI,KAAM,SAAW,EAIrB,OAFI,EAAM,SAAW,EAAU,EAAM,GAE9B,YAAY,IAAI,CAAK,CAC9B,CAqCA,eAAsB,MACpB,EACA,CAAE,QAAQ,IAAK,cAAa,SAAQ,UAAS,QAAQ,GAAoB,CAAC,EAC9D,CACZ,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,gDAAgD,GAAO,EAG9E,IAAK,IAAI,EAAW,EAAG,GAAY,EAAO,IAAY,CACpD,GAAI,GAAQ,QAAS,MAAM,EAAA,WAAW,CAAM,EAE5C,IAAM,EAAa,YAAY,EAAS,CAAM,EAE9C,GAAI,CACF,OAAO,MAAM,EAAG,CAAU,CAC5B,OAAS,EAAK,CAGZ,GAFI,IAAa,GAEb,GAAe,CAAC,EAAY,EAAK,EAAW,CAAC,EAAG,MAAM,EAE1D,IAAM,EAAK,OAAO,GAAU,WAAa,EAAM,EAAW,CAAC,EAAI,EAE3D,EAAK,GAAG,MAAM,EAAA,MAAM,EAAI,CAAM,CACpC,CACF,CAIF"}
@@ -1,6 +1,5 @@
1
1
  export type RetryOptions = {
2
2
  delay?: number | ((attempt: number) => number);
3
- onError?: (error: unknown) => void;
4
3
  shouldRetry?: (error: unknown, attempt: number) => boolean;
5
4
  signal?: AbortSignal;
6
5
  timeout?: number;
@@ -22,7 +21,7 @@ export type RetryOptions = {
22
21
  * { times: 3, timeout: 5000 },
23
22
  * );
24
23
  *
25
- * // As AttemptResult (never throws) — combine with attempt()
24
+ * // As AttemptResult (never throws): combine with attempt()
26
25
  * const result = await attempt(() => retry(fn, { times: 3 }));
27
26
  * ```
28
27
  *
@@ -34,13 +33,12 @@ export type RetryOptions = {
34
33
  * @param [options.signal] - External AbortSignal to cancel all retries.
35
34
  * @param [options.shouldRetry] - Predicate called after each non-final failure.
36
35
  * Receives the error and the number of failures so far (0-indexed: `0` on the first failure,
37
- * `1` on the second, etc.). Return `false` to abort immediately. **Not called on the final attempt**
38
- * (use `onError` to observe the final error unconditionally).
39
- * @param [options.onError] - Called with the last error before rethrowing — both on final attempt exhaustion
40
- * and when `shouldRetry` returns `false` to abort early.
36
+ * `1` on the second, etc.). Return `false` to abort immediately. Not called on the final
37
+ * attempt, because there is no retry left to decide about; observe the thrown error with
38
+ * `attempt()` or `try/catch` instead.
41
39
  * @returns The resolved value.
42
40
  * @throws {RangeError} If `times` is not a positive integer.
43
41
  * @throws The last error if all attempts fail.
44
42
  */
45
- export declare function retry<T>(fn: (signal?: AbortSignal) => Promise<T>, { delay, onError, shouldRetry, signal, timeout, times }?: RetryOptions): Promise<T>;
43
+ export declare function retry<T>(fn: (signal?: AbortSignal) => Promise<T>, { delay, shouldRetry, signal, timeout, times }?: RetryOptions): Promise<T>;
46
44
  //# sourceMappingURL=retry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/async/retry.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAcF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,EAAE,KAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAS,EAAE,GAAE,YAAiB,GACnF,OAAO,CAAC,CAAC,CAAC,CA+BZ"}
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/async/retry.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAcF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,EAAE,KAAW,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAS,EAAE,GAAE,YAAiB,GAC1E,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
@@ -1,25 +1,2 @@
1
- import { abortError as e } from "./abortError.js";
2
- import { sleep as t } from "./sleep.js";
3
- //#region src/async/retry.ts
4
- function n(e, t) {
5
- let n = [e === void 0 ? void 0 : AbortSignal.timeout(e), t].filter((e) => e != null);
6
- if (n.length !== 0) return n.length === 1 ? n[0] : AbortSignal.any(n);
7
- }
8
- async function r(r, { delay: i = 250, onError: a, shouldRetry: o, signal: s, timeout: c, times: l = 3 } = {}) {
9
- if (!Number.isInteger(l) || l < 1) throw RangeError(`retry: times must be a positive integer, got ${l}`);
10
- for (let u = 1; u <= l; u++) {
11
- if (s?.aborted) throw e(s);
12
- let d = n(c, s);
13
- try {
14
- return await r(d);
15
- } catch (e) {
16
- if (u === l || o && !o(e, u - 1)) throw a?.(e), e;
17
- let n = typeof i == "function" ? i(u - 1) : i;
18
- n > 0 && await t(n, s);
19
- }
20
- }
21
- }
22
- //#endregion
23
- export { r as retry };
24
-
1
+ import{abortError as e}from"./abortError.js";import{sleep as t}from"./sleep.js";function buildSignal(e,t){let n=[e===void 0?void 0:AbortSignal.timeout(e),t].filter(e=>e!=null);if(n.length!==0)return n.length===1?n[0]:AbortSignal.any(n)}async function retry(n,{delay:r=250,shouldRetry:i,signal:a,timeout:o,times:s=3}={}){if(!Number.isInteger(s)||s<1)throw RangeError(`retry: times must be a positive integer, got ${s}`);for(let c=1;c<=s;c++){if(a?.aborted)throw e(a);let l=buildSignal(o,a);try{return await n(l)}catch(e){if(c===s||i&&!i(e,c-1))throw e;let n=typeof r==`function`?r(c-1):r;n>0&&await t(n,a)}}}export{retry};
25
2
  //# sourceMappingURL=retry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","names":[],"sources":["../../src/async/retry.ts"],"sourcesContent":["import { abortError } from './abortError';\nimport { sleep } from './sleep';\n\nexport type RetryOptions = {\n delay?: number | ((attempt: number) => number);\n onError?: (error: unknown) => void;\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n signal?: AbortSignal;\n timeout?: number;\n times?: number;\n};\n\nfunction buildSignal(timeout: number | undefined, signal: AbortSignal | undefined): AbortSignal | undefined {\n const parts = [timeout !== undefined ? AbortSignal.timeout(timeout) : undefined, signal].filter(\n (s): s is AbortSignal => s != null,\n );\n\n if (parts.length === 0) return undefined;\n\n if (parts.length === 1) return parts[0];\n\n return AbortSignal.any(parts);\n}\n\n/**\n * Retries an async function with optional per-attempt timeout, delay strategy, and abort support.\n * The function receives a merged AbortSignal from the per-attempt timeout and any external signal.\n * On total failure, throws the last error (use `attempt()` to get an `AttemptResult` without throwing).\n *\n * @example\n * ```ts\n * // Basic retry\n * const data = await retry(() => fetch('/api').then(r => r.json()), { times: 3 });\n *\n * // With per-attempt timeout and cancellation\n * const data = await retry(\n * async (signal) => fetch('/api', { signal }).then(r => r.json()),\n * { times: 3, timeout: 5000 },\n * );\n *\n * // As AttemptResult (never throws) — combine with attempt()\n * const result = await attempt(() => retry(fn, { times: 3 }));\n * ```\n *\n * @param fn - Async function to retry. Receives a merged AbortSignal when timeout or signal is set.\n * @param options - Retry configuration.\n * @param [options.times=3] - Total attempts including the first.\n * @param [options.delay=250] - Delay between retries in ms, or a function of (attemptIndex).\n * @param [options.timeout] - Per-attempt timeout in milliseconds.\n * @param [options.signal] - External AbortSignal to cancel all retries.\n * @param [options.shouldRetry] - Predicate called after each non-final failure.\n * Receives the error and the number of failures so far (0-indexed: `0` on the first failure,\n * `1` on the second, etc.). Return `false` to abort immediately. **Not called on the final attempt**\n * (use `onError` to observe the final error unconditionally).\n * @param [options.onError] - Called with the last error before rethrowing — both on final attempt exhaustion\n * and when `shouldRetry` returns `false` to abort early.\n * @returns The resolved value.\n * @throws {RangeError} If `times` is not a positive integer.\n * @throws The last error if all attempts fail.\n */\nexport async function retry<T>(\n fn: (signal?: AbortSignal) => Promise<T>,\n { delay = 250, onError, shouldRetry, signal, timeout, times = 3 }: RetryOptions = {},\n): Promise<T> {\n if (!Number.isInteger(times) || times < 1) {\n throw new RangeError(`retry: times must be a positive integer, got ${times}`);\n }\n\n for (let tryCount = 1; tryCount <= times; tryCount++) {\n if (signal?.aborted) throw abortError(signal);\n\n const callSignal = buildSignal(timeout, signal);\n\n try {\n return await fn(callSignal);\n } catch (err) {\n if (tryCount === times) {\n onError?.(err);\n throw err;\n }\n\n if (shouldRetry && !shouldRetry(err, tryCount - 1)) {\n onError?.(err);\n throw err;\n }\n\n const ms = typeof delay === 'function' ? delay(tryCount - 1) : delay;\n\n if (ms > 0) await sleep(ms, signal);\n }\n }\n\n /* unreachable — the loop always returns or throws before exhausting all attempts */\n return undefined as never;\n}\n"],"mappings":";;;AAYA,SAAS,EAAY,GAA6B,GAA0D;CAC1G,IAAM,IAAQ,CAAC,MAAY,KAAA,IAA2C,KAAA,IAA/B,YAAY,QAAQ,CAAO,GAAe,CAAM,CAAC,CAAC,QACtF,MAAwB,KAAK,IAChC;CAEI,MAAM,WAAW,GAIrB,OAFI,EAAM,WAAW,IAAU,EAAM,KAE9B,YAAY,IAAI,CAAK;AAC9B;AAsCA,eAAsB,EACpB,GACA,EAAE,WAAQ,KAAK,YAAS,gBAAa,WAAQ,YAAS,WAAQ,MAAoB,CAAC,GACvE;CACZ,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GACtC,MAAU,WAAW,gDAAgD,GAAO;CAG9E,KAAK,IAAI,IAAW,GAAG,KAAY,GAAO,KAAY;EACpD,IAAI,GAAQ,SAAS,MAAM,EAAW,CAAM;EAE5C,IAAM,IAAa,EAAY,GAAS,CAAM;EAE9C,IAAI;GACF,OAAO,MAAM,EAAG,CAAU;EAC5B,SAAS,GAAK;GAMZ,IALI,MAAa,KAKb,KAAe,CAAC,EAAY,GAAK,IAAW,CAAC,GAE/C,MADA,IAAU,CAAG,GACP;GAGR,IAAM,IAAK,OAAO,KAAU,aAAa,EAAM,IAAW,CAAC,IAAI;GAE/D,AAAI,IAAK,KAAG,MAAM,EAAM,GAAI,CAAM;EACpC;CACF;AAIF"}
1
+ {"version":3,"file":"retry.js","names":[],"sources":["../../src/async/retry.ts"],"sourcesContent":["import { abortError } from './abortError';\nimport { sleep } from './sleep';\n\nexport type RetryOptions = {\n delay?: number | ((attempt: number) => number);\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n signal?: AbortSignal;\n timeout?: number;\n times?: number;\n};\n\nfunction buildSignal(timeout: number | undefined, signal: AbortSignal | undefined): AbortSignal | undefined {\n const parts = [timeout !== undefined ? AbortSignal.timeout(timeout) : undefined, signal].filter(\n (s): s is AbortSignal => s != null,\n );\n\n if (parts.length === 0) return undefined;\n\n if (parts.length === 1) return parts[0];\n\n return AbortSignal.any(parts);\n}\n\n/**\n * Retries an async function with optional per-attempt timeout, delay strategy, and abort support.\n * The function receives a merged AbortSignal from the per-attempt timeout and any external signal.\n * On total failure, throws the last error (use `attempt()` to get an `AttemptResult` without throwing).\n *\n * @example\n * ```ts\n * // Basic retry\n * const data = await retry(() => fetch('/api').then(r => r.json()), { times: 3 });\n *\n * // With per-attempt timeout and cancellation\n * const data = await retry(\n * async (signal) => fetch('/api', { signal }).then(r => r.json()),\n * { times: 3, timeout: 5000 },\n * );\n *\n * // As AttemptResult (never throws): combine with attempt()\n * const result = await attempt(() => retry(fn, { times: 3 }));\n * ```\n *\n * @param fn - Async function to retry. Receives a merged AbortSignal when timeout or signal is set.\n * @param options - Retry configuration.\n * @param [options.times=3] - Total attempts including the first.\n * @param [options.delay=250] - Delay between retries in ms, or a function of (attemptIndex).\n * @param [options.timeout] - Per-attempt timeout in milliseconds.\n * @param [options.signal] - External AbortSignal to cancel all retries.\n * @param [options.shouldRetry] - Predicate called after each non-final failure.\n * Receives the error and the number of failures so far (0-indexed: `0` on the first failure,\n * `1` on the second, etc.). Return `false` to abort immediately. Not called on the final\n * attempt, because there is no retry left to decide about; observe the thrown error with\n * `attempt()` or `try/catch` instead.\n * @returns The resolved value.\n * @throws {RangeError} If `times` is not a positive integer.\n * @throws The last error if all attempts fail.\n */\nexport async function retry<T>(\n fn: (signal?: AbortSignal) => Promise<T>,\n { delay = 250, shouldRetry, signal, timeout, times = 3 }: RetryOptions = {},\n): Promise<T> {\n if (!Number.isInteger(times) || times < 1) {\n throw new RangeError(`retry: times must be a positive integer, got ${times}`);\n }\n\n for (let tryCount = 1; tryCount <= times; tryCount++) {\n if (signal?.aborted) throw abortError(signal);\n\n const callSignal = buildSignal(timeout, signal);\n\n try {\n return await fn(callSignal);\n } catch (err) {\n if (tryCount === times) throw err;\n\n if (shouldRetry && !shouldRetry(err, tryCount - 1)) throw err;\n\n const ms = typeof delay === 'function' ? delay(tryCount - 1) : delay;\n\n if (ms > 0) await sleep(ms, signal);\n }\n }\n\n /* unreachable: the loop always returns or throws before exhausting all attempts */\n return undefined as never;\n}\n"],"mappings":"gFAWA,SAAS,YAAY,EAA6B,EAA0D,CAC1G,IAAM,EAAQ,CAAC,IAAY,IAAA,GAA2C,IAAA,GAA/B,YAAY,QAAQ,CAAO,EAAe,CAAM,CAAC,CAAC,OACtF,GAAwB,GAAK,IAChC,EAEI,KAAM,SAAW,EAIrB,OAFI,EAAM,SAAW,EAAU,EAAM,GAE9B,YAAY,IAAI,CAAK,CAC9B,CAqCA,eAAsB,MACpB,EACA,CAAE,QAAQ,IAAK,cAAa,SAAQ,UAAS,QAAQ,GAAoB,CAAC,EAC9D,CACZ,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,gDAAgD,GAAO,EAG9E,IAAK,IAAI,EAAW,EAAG,GAAY,EAAO,IAAY,CACpD,GAAI,GAAQ,QAAS,MAAM,EAAW,CAAM,EAE5C,IAAM,EAAa,YAAY,EAAS,CAAM,EAE9C,GAAI,CACF,OAAO,MAAM,EAAG,CAAU,CAC5B,OAAS,EAAK,CAGZ,GAFI,IAAa,GAEb,GAAe,CAAC,EAAY,EAAK,EAAW,CAAC,EAAG,MAAM,EAE1D,IAAM,EAAK,OAAO,GAAU,WAAa,EAAM,EAAW,CAAC,EAAI,EAE3D,EAAK,GAAG,MAAM,EAAM,EAAI,CAAM,CACpC,CACF,CAIF"}
@@ -1,2 +1,2 @@
1
- const e=require("./abortError.cjs");async function t(t,n){return n?n.aborted?Promise.reject(e.abortError(n)):new Promise((r,i)=>{let a=setTimeout(()=>{n.removeEventListener(`abort`,o),r()},t),o=()=>{clearTimeout(a),n.removeEventListener(`abort`,o),i(e.abortError(n))};n.addEventListener(`abort`,o)}):new Promise(e=>setTimeout(e,t))}exports.sleep=t;
1
+ const e=require("./abortError.cjs");async function sleep(t,n){return n?n.aborted?Promise.reject(e.abortError(n)):new Promise((r,i)=>{let a=setTimeout(()=>{n.removeEventListener(`abort`,onAbort),r()},t),onAbort=()=>{clearTimeout(a),n.removeEventListener(`abort`,onAbort),i(e.abortError(n))};n.addEventListener(`abort`,onAbort)}):new Promise(e=>setTimeout(e,t))}exports.sleep=sleep;
2
2
  //# sourceMappingURL=sleep.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.cjs","names":[],"sources":["../../src/async/sleep.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n * If an `AbortSignal` is provided and fires before the delay elapses, the promise rejects with\n * the signal's reason (or a generic `DOMException('Aborted', 'AbortError')`).\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs after 1 second\n *\n * // With abort support\n * const controller = new AbortController();\n * await sleep(5000, controller.signal); // rejects immediately when aborted\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n * @param signal - Optional AbortSignal to cancel the sleep early.\n *\n * @returns A Promise that resolves after the specified time.\n */\nexport async function sleep(timeout: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n if (signal.aborted) {\n return Promise.reject(abortError(signal));\n }\n\n return new Promise<void>((resolve, reject) => {\n const id = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, timeout);\n\n const onAbort = () => {\n clearTimeout(id);\n signal.removeEventListener('abort', onAbort);\n reject(abortError(signal));\n };\n\n signal.addEventListener('abort', onAbort);\n });\n}\n"],"mappings":"oCAqBA,eAAsB,EAAM,EAAiB,EAAqC,CAShF,OARK,EAID,EAAO,QACF,QAAQ,OAAO,EAAA,WAAW,CAAM,CAAC,EAGnC,IAAI,SAAe,EAAS,IAAW,CAC5C,IAAM,EAAK,eAAiB,CAC1B,EAAO,oBAAoB,QAAS,CAAO,EAC3C,EAAQ,CACV,EAAG,CAAO,EAEJ,MAAgB,CACpB,aAAa,CAAE,EACf,EAAO,oBAAoB,QAAS,CAAO,EAC3C,EAAO,EAAA,WAAW,CAAM,CAAC,CAC3B,EAEA,EAAO,iBAAiB,QAAS,CAAO,CAC1C,CAAC,EApBQ,IAAI,QAAS,GAAY,WAAW,EAAS,CAAO,CAAC,CAqBhE"}
1
+ {"version":3,"file":"sleep.cjs","names":[],"sources":["../../src/async/sleep.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n * If an `AbortSignal` is provided and fires before the delay elapses, the promise rejects with\n * the signal's reason (or a generic `DOMException('Aborted', 'AbortError')`).\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs after 1 second\n *\n * // With abort support\n * const controller = new AbortController();\n * await sleep(5000, controller.signal); // rejects immediately when aborted\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n * @param signal - Optional AbortSignal to cancel the sleep early.\n *\n * @returns A Promise that resolves after the specified time.\n */\nexport async function sleep(timeout: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n if (signal.aborted) {\n return Promise.reject(abortError(signal));\n }\n\n return new Promise<void>((resolve, reject) => {\n const id = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, timeout);\n\n const onAbort = () => {\n clearTimeout(id);\n signal.removeEventListener('abort', onAbort);\n reject(abortError(signal));\n };\n\n signal.addEventListener('abort', onAbort);\n });\n}\n"],"mappings":"oCAqBA,eAAsB,MAAM,EAAiB,EAAqC,CAShF,OARK,EAID,EAAO,QACF,QAAQ,OAAO,EAAA,WAAW,CAAM,CAAC,EAGnC,IAAI,SAAe,EAAS,IAAW,CAC5C,IAAM,EAAK,eAAiB,CAC1B,EAAO,oBAAoB,QAAS,OAAO,EAC3C,EAAQ,CACV,EAAG,CAAO,EAEJ,YAAgB,CACpB,aAAa,CAAE,EACf,EAAO,oBAAoB,QAAS,OAAO,EAC3C,EAAO,EAAA,WAAW,CAAM,CAAC,CAC3B,EAEA,EAAO,iBAAiB,QAAS,OAAO,CAC1C,CAAC,EApBQ,IAAI,QAAS,GAAY,WAAW,EAAS,CAAO,CAAC,CAqBhE"}
@@ -1,16 +1,2 @@
1
- import { abortError as e } from "./abortError.js";
2
- //#region src/async/sleep.ts
3
- async function t(t, n) {
4
- return n ? n.aborted ? Promise.reject(e(n)) : new Promise((r, i) => {
5
- let a = setTimeout(() => {
6
- n.removeEventListener("abort", o), r();
7
- }, t), o = () => {
8
- clearTimeout(a), n.removeEventListener("abort", o), i(e(n));
9
- };
10
- n.addEventListener("abort", o);
11
- }) : new Promise((e) => setTimeout(e, t));
12
- }
13
- //#endregion
14
- export { t as sleep };
15
-
1
+ import{abortError as e}from"./abortError.js";async function sleep(t,n){return n?n.aborted?Promise.reject(e(n)):new Promise((r,i)=>{let a=setTimeout(()=>{n.removeEventListener(`abort`,onAbort),r()},t),onAbort=()=>{clearTimeout(a),n.removeEventListener(`abort`,onAbort),i(e(n))};n.addEventListener(`abort`,onAbort)}):new Promise(e=>setTimeout(e,t))}export{sleep};
16
2
  //# sourceMappingURL=sleep.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.js","names":[],"sources":["../../src/async/sleep.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n * If an `AbortSignal` is provided and fires before the delay elapses, the promise rejects with\n * the signal's reason (or a generic `DOMException('Aborted', 'AbortError')`).\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs after 1 second\n *\n * // With abort support\n * const controller = new AbortController();\n * await sleep(5000, controller.signal); // rejects immediately when aborted\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n * @param signal - Optional AbortSignal to cancel the sleep early.\n *\n * @returns A Promise that resolves after the specified time.\n */\nexport async function sleep(timeout: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n if (signal.aborted) {\n return Promise.reject(abortError(signal));\n }\n\n return new Promise<void>((resolve, reject) => {\n const id = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, timeout);\n\n const onAbort = () => {\n clearTimeout(id);\n signal.removeEventListener('abort', onAbort);\n reject(abortError(signal));\n };\n\n signal.addEventListener('abort', onAbort);\n });\n}\n"],"mappings":";;AAqBA,eAAsB,EAAM,GAAiB,GAAqC;CAShF,OARK,IAID,EAAO,UACF,QAAQ,OAAO,EAAW,CAAM,CAAC,IAGnC,IAAI,SAAe,GAAS,MAAW;EAC5C,IAAM,IAAK,iBAAiB;GAE1B,AADA,EAAO,oBAAoB,SAAS,CAAO,GAC3C,EAAQ;EACV,GAAG,CAAO,GAEJ,UAAgB;GAGpB,AAFA,aAAa,CAAE,GACf,EAAO,oBAAoB,SAAS,CAAO,GAC3C,EAAO,EAAW,CAAM,CAAC;EAC3B;EAEA,EAAO,iBAAiB,SAAS,CAAO;CAC1C,CAAC,IApBQ,IAAI,SAAS,MAAY,WAAW,GAAS,CAAO,CAAC;AAqBhE"}
1
+ {"version":3,"file":"sleep.js","names":[],"sources":["../../src/async/sleep.ts"],"sourcesContent":["import { abortError } from './abortError';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n * If an `AbortSignal` is provided and fires before the delay elapses, the promise rejects with\n * the signal's reason (or a generic `DOMException('Aborted', 'AbortError')`).\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs after 1 second\n *\n * // With abort support\n * const controller = new AbortController();\n * await sleep(5000, controller.signal); // rejects immediately when aborted\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n * @param signal - Optional AbortSignal to cancel the sleep early.\n *\n * @returns A Promise that resolves after the specified time.\n */\nexport async function sleep(timeout: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n if (signal.aborted) {\n return Promise.reject(abortError(signal));\n }\n\n return new Promise<void>((resolve, reject) => {\n const id = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, timeout);\n\n const onAbort = () => {\n clearTimeout(id);\n signal.removeEventListener('abort', onAbort);\n reject(abortError(signal));\n };\n\n signal.addEventListener('abort', onAbort);\n });\n}\n"],"mappings":"6CAqBA,eAAsB,MAAM,EAAiB,EAAqC,CAShF,OARK,EAID,EAAO,QACF,QAAQ,OAAO,EAAW,CAAM,CAAC,EAGnC,IAAI,SAAe,EAAS,IAAW,CAC5C,IAAM,EAAK,eAAiB,CAC1B,EAAO,oBAAoB,QAAS,OAAO,EAC3C,EAAQ,CACV,EAAG,CAAO,EAEJ,YAAgB,CACpB,aAAa,CAAE,EACf,EAAO,oBAAoB,QAAS,OAAO,EAC3C,EAAO,EAAW,CAAM,CAAC,CAC3B,EAEA,EAAO,iBAAiB,QAAS,OAAO,CAC1C,CAAC,EApBQ,IAAI,QAAS,GAAY,WAAW,EAAS,CAAO,CAAC,CAqBhE"}
@@ -1,2 +1,2 @@
1
- function e({concurrency:e=1}={}){if(!Number.isInteger(e)||e<1)throw RangeError(`taskPool: concurrency must be a positive integer`);let t=new AbortController,n=[],r=0,i=!1,a,o=()=>{r===0&&n.length===0&&(a?.resolve(),a=void 0)},s=()=>{for(;r<e&&n.length>0;){let e=n.shift();r++,Promise.resolve().then(()=>e.run(t.signal)).then(e.resolve,e.reject).finally(()=>{r--,s(),o()})}};return{get active(){return r},get disposalSignal(){return t.signal},dispose:(e=new DOMException(`Task pool disposed`,`AbortError`))=>{if(!i){i=!0,t.abort(e);for(let t of n.splice(0))t.reject(e);o()}},get disposed(){return i},idle:()=>r===0&&n.length===0?Promise.resolve():(a??=Promise.withResolvers(),a.promise),get pending(){return n.length},run:e=>{let r=Promise.withResolvers();return i?(r.reject(t.signal.reason),r.promise):(n.push({reject:r.reject,resolve:r.resolve,run:e}),s(),r.promise)},[Symbol.dispose](){this.dispose()}}}exports.taskPool=e;
1
+ function taskPool({concurrency:e=1}={}){if(!Number.isInteger(e)||e<1)throw RangeError(`taskPool: concurrency must be a positive integer`);let t=new AbortController,n=[],r=0,i=!1,a,resolveIdle=()=>{r===0&&n.length===0&&(a?.resolve(),a=void 0)},start=()=>{for(;r<e&&n.length>0;){let e=n.shift();r++,Promise.resolve().then(()=>e.run(t.signal)).then(e.resolve,e.reject).finally(()=>{r--,start(),resolveIdle()})}};return{get active(){return r},get disposalSignal(){return t.signal},dispose:(e=new DOMException(`Task pool disposed`,`AbortError`))=>{if(!i){i=!0,t.abort(e);for(let t of n.splice(0))t.reject(e);resolveIdle()}},get disposed(){return i},idle:()=>r===0&&n.length===0?Promise.resolve():(a??=Promise.withResolvers(),a.promise),get pending(){return n.length},run:e=>{let r=Promise.withResolvers();return i?(r.reject(t.signal.reason),r.promise):(n.push({reject:r.reject,resolve:r.resolve,run:e}),start(),r.promise)},[Symbol.dispose](){this.dispose()}}}exports.taskPool=taskPool;
2
2
  //# sourceMappingURL=taskPool.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskPool.cjs","names":[],"sources":["../../src/async/taskPool.ts"],"sourcesContent":["export interface TaskPool {\n readonly active: number;\n readonly disposalSignal: AbortSignal;\n dispose(reason?: unknown): void;\n readonly disposed: boolean;\n idle(): Promise<void>;\n readonly pending: number;\n run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n [Symbol.dispose](): void;\n}\n\ntype PendingTask = {\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n run: (signal: AbortSignal) => Promise<unknown>;\n};\n\nexport function taskPool({ concurrency = 1 }: { concurrency?: number } = {}): TaskPool {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('taskPool: concurrency must be a positive integer');\n }\n\n const controller = new AbortController();\n const pending: PendingTask[] = [];\n let active = 0;\n let disposed = false;\n let idleDeferred: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n\n const resolveIdle = (): void => {\n if (active === 0 && pending.length === 0) {\n idleDeferred?.resolve();\n idleDeferred = undefined;\n }\n };\n\n const start = (): void => {\n while (active < concurrency && pending.length > 0) {\n const next = pending.shift()!;\n\n active++;\n void Promise.resolve()\n .then(() => next.run(controller.signal))\n .then(next.resolve, next.reject)\n .finally(() => {\n active--;\n start();\n resolveIdle();\n });\n }\n };\n\n return {\n get active(): number {\n return active;\n },\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose: (reason: unknown = new DOMException('Task pool disposed', 'AbortError')): void => {\n if (disposed) return;\n\n disposed = true;\n controller.abort(reason);\n\n for (const task of pending.splice(0)) task.reject(reason);\n\n resolveIdle();\n },\n get disposed(): boolean {\n return disposed;\n },\n idle: (): Promise<void> => {\n if (active === 0 && pending.length === 0) return Promise.resolve();\n\n idleDeferred ??= Promise.withResolvers<void>();\n\n return idleDeferred.promise;\n },\n get pending(): number {\n return pending.length;\n },\n run: <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n const deferred = Promise.withResolvers<T>();\n\n if (disposed) {\n deferred.reject(controller.signal.reason);\n\n return deferred.promise;\n }\n\n pending.push({\n reject: deferred.reject,\n resolve: deferred.resolve as (value: unknown) => void,\n run: task as (signal: AbortSignal) => Promise<unknown>,\n });\n start();\n\n return deferred.promise;\n },\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":"AAiBA,SAAgB,EAAS,CAAE,cAAc,GAAgC,CAAC,EAAa,CACrF,GAAI,CAAC,OAAO,UAAU,CAAW,GAAK,EAAc,EAClD,MAAU,WAAW,kDAAkD,EAGzE,IAAM,EAAa,IAAI,gBACjB,EAAyB,CAAC,EAC5B,EAAS,EACT,EAAW,GACX,EAEE,MAA0B,CAC1B,IAAW,GAAK,EAAQ,SAAW,IACrC,GAAc,QAAQ,EACtB,EAAe,IAAA,GAEnB,EAEM,MAAoB,CACxB,KAAO,EAAS,GAAe,EAAQ,OAAS,GAAG,CACjD,IAAM,EAAO,EAAQ,MAAM,EAE3B,IACA,QAAa,QAAQ,CAAC,CACnB,SAAW,EAAK,IAAI,EAAW,MAAM,CAAC,CAAC,CACvC,KAAK,EAAK,QAAS,EAAK,MAAM,CAAC,CAC/B,YAAc,CACb,IACA,EAAM,EACN,EAAY,CACd,CAAC,CACL,CACF,EAEA,MAAO,CACL,IAAI,QAAiB,CACnB,OAAO,CACT,EACA,IAAI,gBAA8B,CAChC,OAAO,EAAW,MACpB,EACA,SAAU,EAAkB,IAAI,aAAa,qBAAsB,YAAY,IAAY,CACrF,MAGJ,CADA,EAAW,GACX,EAAW,MAAM,CAAM,EAEvB,IAAK,IAAM,KAAQ,EAAQ,OAAO,CAAC,EAAG,EAAK,OAAO,CAAM,EAExD,EAAY,CAJW,CAKzB,EACA,IAAI,UAAoB,CACtB,OAAO,CACT,EACA,SACM,IAAW,GAAK,EAAQ,SAAW,EAAU,QAAQ,QAAQ,GAEjE,IAAiB,QAAQ,cAAoB,EAEtC,EAAa,SAEtB,IAAI,SAAkB,CACpB,OAAO,EAAQ,MACjB,EACA,IAAS,GAA0D,CACjE,IAAM,EAAW,QAAQ,cAAiB,EAe1C,OAbI,GACF,EAAS,OAAO,EAAW,OAAO,MAAM,EAEjC,EAAS,UAGlB,EAAQ,KAAK,CACX,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,IAAK,CACP,CAAC,EACD,EAAM,EAEC,EAAS,QAClB,EACA,CAAC,OAAO,UAAiB,CACvB,KAAK,QAAQ,CACf,CACF,CACF"}
1
+ {"version":3,"file":"taskPool.cjs","names":[],"sources":["../../src/async/taskPool.ts"],"sourcesContent":["export interface TaskPool {\n readonly active: number;\n readonly disposalSignal: AbortSignal;\n dispose(reason?: unknown): void;\n readonly disposed: boolean;\n idle(): Promise<void>;\n readonly pending: number;\n run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n [Symbol.dispose](): void;\n}\n\ntype PendingTask = {\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n run: (signal: AbortSignal) => Promise<unknown>;\n};\n\nexport function taskPool({ concurrency = 1 }: { concurrency?: number } = {}): TaskPool {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('taskPool: concurrency must be a positive integer');\n }\n\n const controller = new AbortController();\n const pending: PendingTask[] = [];\n let active = 0;\n let disposed = false;\n let idleDeferred: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n\n const resolveIdle = (): void => {\n if (active === 0 && pending.length === 0) {\n idleDeferred?.resolve();\n idleDeferred = undefined;\n }\n };\n\n const start = (): void => {\n while (active < concurrency && pending.length > 0) {\n const next = pending.shift()!;\n\n active++;\n void Promise.resolve()\n .then(() => next.run(controller.signal))\n .then(next.resolve, next.reject)\n .finally(() => {\n active--;\n start();\n resolveIdle();\n });\n }\n };\n\n return {\n get active(): number {\n return active;\n },\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose: (reason: unknown = new DOMException('Task pool disposed', 'AbortError')): void => {\n if (disposed) return;\n\n disposed = true;\n controller.abort(reason);\n\n for (const task of pending.splice(0)) task.reject(reason);\n\n resolveIdle();\n },\n get disposed(): boolean {\n return disposed;\n },\n idle: (): Promise<void> => {\n if (active === 0 && pending.length === 0) return Promise.resolve();\n\n idleDeferred ??= Promise.withResolvers<void>();\n\n return idleDeferred.promise;\n },\n get pending(): number {\n return pending.length;\n },\n run: <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n const deferred = Promise.withResolvers<T>();\n\n if (disposed) {\n deferred.reject(controller.signal.reason);\n\n return deferred.promise;\n }\n\n pending.push({\n reject: deferred.reject,\n resolve: deferred.resolve as (value: unknown) => void,\n run: task as (signal: AbortSignal) => Promise<unknown>,\n });\n start();\n\n return deferred.promise;\n },\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":"AAiBA,SAAgB,SAAS,CAAE,cAAc,GAAgC,CAAC,EAAa,CACrF,GAAI,CAAC,OAAO,UAAU,CAAW,GAAK,EAAc,EAClD,MAAU,WAAW,kDAAkD,EAGzE,IAAM,EAAa,IAAI,gBACjB,EAAyB,CAAC,EAC5B,EAAS,EACT,EAAW,GACX,EAEE,gBAA0B,CAC1B,IAAW,GAAK,EAAQ,SAAW,IACrC,GAAc,QAAQ,EACtB,EAAe,IAAA,GAEnB,EAEM,UAAoB,CACxB,KAAO,EAAS,GAAe,EAAQ,OAAS,GAAG,CACjD,IAAM,EAAO,EAAQ,MAAM,EAE3B,IACA,QAAa,QAAQ,CAAC,CACnB,SAAW,EAAK,IAAI,EAAW,MAAM,CAAC,CAAC,CACvC,KAAK,EAAK,QAAS,EAAK,MAAM,CAAC,CAC/B,YAAc,CACb,IACA,MAAM,EACN,YAAY,CACd,CAAC,CACL,CACF,EAEA,MAAO,CACL,IAAI,QAAiB,CACnB,OAAO,CACT,EACA,IAAI,gBAA8B,CAChC,OAAO,EAAW,MACpB,EACA,SAAU,EAAkB,IAAI,aAAa,qBAAsB,YAAY,IAAY,CACrF,MAGJ,CADA,EAAW,GACX,EAAW,MAAM,CAAM,EAEvB,IAAK,IAAM,KAAQ,EAAQ,OAAO,CAAC,EAAG,EAAK,OAAO,CAAM,EAExD,YAAY,CAJW,CAKzB,EACA,IAAI,UAAoB,CACtB,OAAO,CACT,EACA,SACM,IAAW,GAAK,EAAQ,SAAW,EAAU,QAAQ,QAAQ,GAEjE,IAAiB,QAAQ,cAAoB,EAEtC,EAAa,SAEtB,IAAI,SAAkB,CACpB,OAAO,EAAQ,MACjB,EACA,IAAS,GAA0D,CACjE,IAAM,EAAW,QAAQ,cAAiB,EAe1C,OAbI,GACF,EAAS,OAAO,EAAW,OAAO,MAAM,EAEjC,EAAS,UAGlB,EAAQ,KAAK,CACX,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,IAAK,CACP,CAAC,EACD,MAAM,EAEC,EAAS,QAClB,EACA,CAAC,OAAO,UAAiB,CACvB,KAAK,QAAQ,CACf,CACF,CACF"}
@@ -1,51 +1,2 @@
1
- //#region src/async/taskPool.ts
2
- function e({ concurrency: e = 1 } = {}) {
3
- if (!Number.isInteger(e) || e < 1) throw RangeError("taskPool: concurrency must be a positive integer");
4
- let t = new AbortController(), n = [], r = 0, i = !1, a, o = () => {
5
- r === 0 && n.length === 0 && (a?.resolve(), a = void 0);
6
- }, s = () => {
7
- for (; r < e && n.length > 0;) {
8
- let e = n.shift();
9
- r++, Promise.resolve().then(() => e.run(t.signal)).then(e.resolve, e.reject).finally(() => {
10
- r--, s(), o();
11
- });
12
- }
13
- };
14
- return {
15
- get active() {
16
- return r;
17
- },
18
- get disposalSignal() {
19
- return t.signal;
20
- },
21
- dispose: (e = new DOMException("Task pool disposed", "AbortError")) => {
22
- if (!i) {
23
- i = !0, t.abort(e);
24
- for (let t of n.splice(0)) t.reject(e);
25
- o();
26
- }
27
- },
28
- get disposed() {
29
- return i;
30
- },
31
- idle: () => r === 0 && n.length === 0 ? Promise.resolve() : (a ??= Promise.withResolvers(), a.promise),
32
- get pending() {
33
- return n.length;
34
- },
35
- run: (e) => {
36
- let r = Promise.withResolvers();
37
- return i ? (r.reject(t.signal.reason), r.promise) : (n.push({
38
- reject: r.reject,
39
- resolve: r.resolve,
40
- run: e
41
- }), s(), r.promise);
42
- },
43
- [Symbol.dispose]() {
44
- this.dispose();
45
- }
46
- };
47
- }
48
- //#endregion
49
- export { e as taskPool };
50
-
1
+ function taskPool({concurrency:e=1}={}){if(!Number.isInteger(e)||e<1)throw RangeError(`taskPool: concurrency must be a positive integer`);let t=new AbortController,n=[],r=0,i=!1,a,resolveIdle=()=>{r===0&&n.length===0&&(a?.resolve(),a=void 0)},start=()=>{for(;r<e&&n.length>0;){let e=n.shift();r++,Promise.resolve().then(()=>e.run(t.signal)).then(e.resolve,e.reject).finally(()=>{r--,start(),resolveIdle()})}};return{get active(){return r},get disposalSignal(){return t.signal},dispose:(e=new DOMException(`Task pool disposed`,`AbortError`))=>{if(!i){i=!0,t.abort(e);for(let t of n.splice(0))t.reject(e);resolveIdle()}},get disposed(){return i},idle:()=>r===0&&n.length===0?Promise.resolve():(a??=Promise.withResolvers(),a.promise),get pending(){return n.length},run:e=>{let r=Promise.withResolvers();return i?(r.reject(t.signal.reason),r.promise):(n.push({reject:r.reject,resolve:r.resolve,run:e}),start(),r.promise)},[Symbol.dispose](){this.dispose()}}}export{taskPool};
51
2
  //# sourceMappingURL=taskPool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskPool.js","names":[],"sources":["../../src/async/taskPool.ts"],"sourcesContent":["export interface TaskPool {\n readonly active: number;\n readonly disposalSignal: AbortSignal;\n dispose(reason?: unknown): void;\n readonly disposed: boolean;\n idle(): Promise<void>;\n readonly pending: number;\n run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n [Symbol.dispose](): void;\n}\n\ntype PendingTask = {\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n run: (signal: AbortSignal) => Promise<unknown>;\n};\n\nexport function taskPool({ concurrency = 1 }: { concurrency?: number } = {}): TaskPool {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('taskPool: concurrency must be a positive integer');\n }\n\n const controller = new AbortController();\n const pending: PendingTask[] = [];\n let active = 0;\n let disposed = false;\n let idleDeferred: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n\n const resolveIdle = (): void => {\n if (active === 0 && pending.length === 0) {\n idleDeferred?.resolve();\n idleDeferred = undefined;\n }\n };\n\n const start = (): void => {\n while (active < concurrency && pending.length > 0) {\n const next = pending.shift()!;\n\n active++;\n void Promise.resolve()\n .then(() => next.run(controller.signal))\n .then(next.resolve, next.reject)\n .finally(() => {\n active--;\n start();\n resolveIdle();\n });\n }\n };\n\n return {\n get active(): number {\n return active;\n },\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose: (reason: unknown = new DOMException('Task pool disposed', 'AbortError')): void => {\n if (disposed) return;\n\n disposed = true;\n controller.abort(reason);\n\n for (const task of pending.splice(0)) task.reject(reason);\n\n resolveIdle();\n },\n get disposed(): boolean {\n return disposed;\n },\n idle: (): Promise<void> => {\n if (active === 0 && pending.length === 0) return Promise.resolve();\n\n idleDeferred ??= Promise.withResolvers<void>();\n\n return idleDeferred.promise;\n },\n get pending(): number {\n return pending.length;\n },\n run: <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n const deferred = Promise.withResolvers<T>();\n\n if (disposed) {\n deferred.reject(controller.signal.reason);\n\n return deferred.promise;\n }\n\n pending.push({\n reject: deferred.reject,\n resolve: deferred.resolve as (value: unknown) => void,\n run: task as (signal: AbortSignal) => Promise<unknown>,\n });\n start();\n\n return deferred.promise;\n },\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":";AAiBA,SAAgB,EAAS,EAAE,iBAAc,MAAgC,CAAC,GAAa;CACrF,IAAI,CAAC,OAAO,UAAU,CAAW,KAAK,IAAc,GAClD,MAAU,WAAW,kDAAkD;CAGzE,IAAM,IAAa,IAAI,gBAAgB,GACjC,IAAyB,CAAC,GAC5B,IAAS,GACT,IAAW,IACX,GAEE,UAA0B;EAC9B,AAAI,MAAW,KAAK,EAAQ,WAAW,MACrC,GAAc,QAAQ,GACtB,IAAe,KAAA;CAEnB,GAEM,UAAoB;EACxB,OAAO,IAAS,KAAe,EAAQ,SAAS,IAAG;GACjD,IAAM,IAAO,EAAQ,MAAM;GAG3B,AADA,KACA,QAAa,QAAQ,CAAC,CACnB,WAAW,EAAK,IAAI,EAAW,MAAM,CAAC,CAAC,CACvC,KAAK,EAAK,SAAS,EAAK,MAAM,CAAC,CAC/B,cAAc;IAGb,AAFA,KACA,EAAM,GACN,EAAY;GACd,CAAC;EACL;CACF;CAEA,OAAO;EACL,IAAI,SAAiB;GACnB,OAAO;EACT;EACA,IAAI,iBAA8B;GAChC,OAAO,EAAW;EACpB;EACA,UAAU,IAAkB,IAAI,aAAa,sBAAsB,YAAY,MAAY;GACrF,QAGJ;IADA,IAAW,IACX,EAAW,MAAM,CAAM;IAEvB,KAAK,IAAM,KAAQ,EAAQ,OAAO,CAAC,GAAG,EAAK,OAAO,CAAM;IAExD,EAAY;GAJW;EAKzB;EACA,IAAI,WAAoB;GACtB,OAAO;EACT;EACA,YACM,MAAW,KAAK,EAAQ,WAAW,IAAU,QAAQ,QAAQ,KAEjE,MAAiB,QAAQ,cAAoB,GAEtC,EAAa;EAEtB,IAAI,UAAkB;GACpB,OAAO,EAAQ;EACjB;EACA,MAAS,MAA0D;GACjE,IAAM,IAAW,QAAQ,cAAiB;GAe1C,OAbI,KACF,EAAS,OAAO,EAAW,OAAO,MAAM,GAEjC,EAAS,YAGlB,EAAQ,KAAK;IACX,QAAQ,EAAS;IACjB,SAAS,EAAS;IAClB,KAAK;GACP,CAAC,GACD,EAAM,GAEC,EAAS;EAClB;EACA,CAAC,OAAO,WAAiB;GACvB,KAAK,QAAQ;EACf;CACF;AACF"}
1
+ {"version":3,"file":"taskPool.js","names":[],"sources":["../../src/async/taskPool.ts"],"sourcesContent":["export interface TaskPool {\n readonly active: number;\n readonly disposalSignal: AbortSignal;\n dispose(reason?: unknown): void;\n readonly disposed: boolean;\n idle(): Promise<void>;\n readonly pending: number;\n run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n [Symbol.dispose](): void;\n}\n\ntype PendingTask = {\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n run: (signal: AbortSignal) => Promise<unknown>;\n};\n\nexport function taskPool({ concurrency = 1 }: { concurrency?: number } = {}): TaskPool {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('taskPool: concurrency must be a positive integer');\n }\n\n const controller = new AbortController();\n const pending: PendingTask[] = [];\n let active = 0;\n let disposed = false;\n let idleDeferred: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n\n const resolveIdle = (): void => {\n if (active === 0 && pending.length === 0) {\n idleDeferred?.resolve();\n idleDeferred = undefined;\n }\n };\n\n const start = (): void => {\n while (active < concurrency && pending.length > 0) {\n const next = pending.shift()!;\n\n active++;\n void Promise.resolve()\n .then(() => next.run(controller.signal))\n .then(next.resolve, next.reject)\n .finally(() => {\n active--;\n start();\n resolveIdle();\n });\n }\n };\n\n return {\n get active(): number {\n return active;\n },\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose: (reason: unknown = new DOMException('Task pool disposed', 'AbortError')): void => {\n if (disposed) return;\n\n disposed = true;\n controller.abort(reason);\n\n for (const task of pending.splice(0)) task.reject(reason);\n\n resolveIdle();\n },\n get disposed(): boolean {\n return disposed;\n },\n idle: (): Promise<void> => {\n if (active === 0 && pending.length === 0) return Promise.resolve();\n\n idleDeferred ??= Promise.withResolvers<void>();\n\n return idleDeferred.promise;\n },\n get pending(): number {\n return pending.length;\n },\n run: <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n const deferred = Promise.withResolvers<T>();\n\n if (disposed) {\n deferred.reject(controller.signal.reason);\n\n return deferred.promise;\n }\n\n pending.push({\n reject: deferred.reject,\n resolve: deferred.resolve as (value: unknown) => void,\n run: task as (signal: AbortSignal) => Promise<unknown>,\n });\n start();\n\n return deferred.promise;\n },\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":"AAiBA,SAAgB,SAAS,CAAE,cAAc,GAAgC,CAAC,EAAa,CACrF,GAAI,CAAC,OAAO,UAAU,CAAW,GAAK,EAAc,EAClD,MAAU,WAAW,kDAAkD,EAGzE,IAAM,EAAa,IAAI,gBACjB,EAAyB,CAAC,EAC5B,EAAS,EACT,EAAW,GACX,EAEE,gBAA0B,CAC1B,IAAW,GAAK,EAAQ,SAAW,IACrC,GAAc,QAAQ,EACtB,EAAe,IAAA,GAEnB,EAEM,UAAoB,CACxB,KAAO,EAAS,GAAe,EAAQ,OAAS,GAAG,CACjD,IAAM,EAAO,EAAQ,MAAM,EAE3B,IACA,QAAa,QAAQ,CAAC,CACnB,SAAW,EAAK,IAAI,EAAW,MAAM,CAAC,CAAC,CACvC,KAAK,EAAK,QAAS,EAAK,MAAM,CAAC,CAC/B,YAAc,CACb,IACA,MAAM,EACN,YAAY,CACd,CAAC,CACL,CACF,EAEA,MAAO,CACL,IAAI,QAAiB,CACnB,OAAO,CACT,EACA,IAAI,gBAA8B,CAChC,OAAO,EAAW,MACpB,EACA,SAAU,EAAkB,IAAI,aAAa,qBAAsB,YAAY,IAAY,CACrF,MAGJ,CADA,EAAW,GACX,EAAW,MAAM,CAAM,EAEvB,IAAK,IAAM,KAAQ,EAAQ,OAAO,CAAC,EAAG,EAAK,OAAO,CAAM,EAExD,YAAY,CAJW,CAKzB,EACA,IAAI,UAAoB,CACtB,OAAO,CACT,EACA,SACM,IAAW,GAAK,EAAQ,SAAW,EAAU,QAAQ,QAAQ,GAEjE,IAAiB,QAAQ,cAAoB,EAEtC,EAAa,SAEtB,IAAI,SAAkB,CACpB,OAAO,EAAQ,MACjB,EACA,IAAS,GAA0D,CACjE,IAAM,EAAW,QAAQ,cAAiB,EAe1C,OAbI,GACF,EAAS,OAAO,EAAW,OAAO,MAAM,EAEjC,EAAS,UAGlB,EAAQ,KAAK,CACX,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,IAAK,CACP,CAAC,EACD,MAAM,EAEC,EAAS,QAClB,EACA,CAAC,OAAO,UAAiB,CACvB,KAAK,QAAQ,CACf,CACF,CACF"}
@@ -1,2 +1,2 @@
1
- const e=require("./sleep.cjs");async function t(t,{interval:n=100,signal:r,timeout:i=5e3}={}){let a=AbortSignal.timeout(i),o=r?AbortSignal.any([r,a]):a;for(o.throwIfAborted();;){if(o.throwIfAborted(),await t(o))return;await e.sleep(n,o)}}exports.waitFor=t;
1
+ const e=require("./sleep.cjs");async function waitFor(t,{interval:n=100,signal:r,timeout:i=5e3}={}){let a=AbortSignal.timeout(i),o=r?AbortSignal.any([r,a]):a;for(o.throwIfAborted();;){if(o.throwIfAborted(),await t(o))return;await e.sleep(n,o)}}exports.waitFor=waitFor;
2
2
  //# sourceMappingURL=waitFor.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"waitFor.cjs","names":[],"sources":["../../src/async/waitFor.ts"],"sourcesContent":["import { sleep } from './sleep';\n\nexport type WaitForOptions = {\n interval?: number;\n signal?: AbortSignal;\n timeout?: number;\n};\n\n/**\n * Waits for a condition to become true by polling.\n * Useful for waiting for DOM elements, API states, or other conditions.\n *\n * @example\n * ```ts\n * // Wait for an element to appear\n * await waitFor(() => document.querySelector('#myElement') !== null);\n *\n * // Wait for API to be ready with cancellation support\n * await waitFor(\n * async (signal) => {\n * const res = await fetch('/api/health', { signal });\n * return res.ok;\n * },\n * { timeout: 30000, interval: 1000 },\n * );\n * ```\n *\n * @param condition - Polling function that receives the merged AbortSignal and returns true when the condition is met\n * @param options - Configuration options\n * @param [options.timeout=5000] - Maximum time to wait in ms\n * @param [options.interval=100] - Polling interval in ms\n * @param [options.signal] - AbortSignal to cancel waiting\n * @returns Promise that resolves when condition becomes true\n * @throws Rejects with the abort reason when timed out or cancelled\n */\nexport async function waitFor(\n condition: (signal: AbortSignal) => boolean | Promise<boolean>,\n { interval = 100, signal, timeout: ms = 5000 }: WaitForOptions = {},\n): Promise<void> {\n const deadline = AbortSignal.timeout(ms);\n const merged = signal ? AbortSignal.any([signal, deadline]) : deadline;\n\n merged.throwIfAborted();\n\n while (true) {\n merged.throwIfAborted();\n\n if (await condition(merged)) return;\n\n await sleep(interval, merged);\n }\n}\n"],"mappings":"+BAmCA,eAAsB,EACpB,EACA,CAAE,WAAW,IAAK,SAAQ,QAAS,EAAK,KAAyB,CAAC,EACnD,CACf,IAAM,EAAW,YAAY,QAAQ,CAAE,EACjC,EAAS,EAAS,YAAY,IAAI,CAAC,EAAQ,CAAQ,CAAC,EAAI,EAI9D,IAFA,EAAO,eAAe,IAET,CAGX,GAFA,EAAO,eAAe,EAElB,MAAM,EAAU,CAAM,EAAG,OAE7B,MAAM,EAAA,MAAM,EAAU,CAAM,CAC9B,CACF"}
1
+ {"version":3,"file":"waitFor.cjs","names":[],"sources":["../../src/async/waitFor.ts"],"sourcesContent":["import { sleep } from './sleep';\n\nexport type WaitForOptions = {\n interval?: number;\n signal?: AbortSignal;\n timeout?: number;\n};\n\n/**\n * Waits for a condition to become true by polling.\n * Useful for waiting for DOM elements, API states, or other conditions.\n *\n * @example\n * ```ts\n * // Wait for an element to appear\n * await waitFor(() => document.querySelector('#myElement') !== null);\n *\n * // Wait for API to be ready with cancellation support\n * await waitFor(\n * async (signal) => {\n * const res = await fetch('/api/health', { signal });\n * return res.ok;\n * },\n * { timeout: 30000, interval: 1000 },\n * );\n * ```\n *\n * @param condition - Polling function that receives the merged AbortSignal and returns true when the condition is met\n * @param options - Configuration options\n * @param [options.timeout=5000] - Maximum time to wait in ms\n * @param [options.interval=100] - Polling interval in ms\n * @param [options.signal] - AbortSignal to cancel waiting\n * @returns Promise that resolves when condition becomes true\n * @throws Rejects with the abort reason when timed out or cancelled\n */\nexport async function waitFor(\n condition: (signal: AbortSignal) => boolean | Promise<boolean>,\n { interval = 100, signal, timeout: ms = 5000 }: WaitForOptions = {},\n): Promise<void> {\n const deadline = AbortSignal.timeout(ms);\n const merged = signal ? AbortSignal.any([signal, deadline]) : deadline;\n\n merged.throwIfAborted();\n\n while (true) {\n merged.throwIfAborted();\n\n if (await condition(merged)) return;\n\n await sleep(interval, merged);\n }\n}\n"],"mappings":"+BAmCA,eAAsB,QACpB,EACA,CAAE,WAAW,IAAK,SAAQ,QAAS,EAAK,KAAyB,CAAC,EACnD,CACf,IAAM,EAAW,YAAY,QAAQ,CAAE,EACjC,EAAS,EAAS,YAAY,IAAI,CAAC,EAAQ,CAAQ,CAAC,EAAI,EAI9D,IAFA,EAAO,eAAe,IAET,CAGX,GAFA,EAAO,eAAe,EAElB,MAAM,EAAU,CAAM,EAAG,OAE7B,MAAM,EAAA,MAAM,EAAU,CAAM,CAC9B,CACF"}
@@ -1,13 +1,2 @@
1
- import { sleep as e } from "./sleep.js";
2
- //#region src/async/waitFor.ts
3
- async function t(t, { interval: n = 100, signal: r, timeout: i = 5e3 } = {}) {
4
- let a = AbortSignal.timeout(i), o = r ? AbortSignal.any([r, a]) : a;
5
- for (o.throwIfAborted();;) {
6
- if (o.throwIfAborted(), await t(o)) return;
7
- await e(n, o);
8
- }
9
- }
10
- //#endregion
11
- export { t as waitFor };
12
-
1
+ import{sleep as e}from"./sleep.js";async function waitFor(t,{interval:n=100,signal:r,timeout:i=5e3}={}){let a=AbortSignal.timeout(i),o=r?AbortSignal.any([r,a]):a;for(o.throwIfAborted();;){if(o.throwIfAborted(),await t(o))return;await e(n,o)}}export{waitFor};
13
2
  //# sourceMappingURL=waitFor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"waitFor.js","names":[],"sources":["../../src/async/waitFor.ts"],"sourcesContent":["import { sleep } from './sleep';\n\nexport type WaitForOptions = {\n interval?: number;\n signal?: AbortSignal;\n timeout?: number;\n};\n\n/**\n * Waits for a condition to become true by polling.\n * Useful for waiting for DOM elements, API states, or other conditions.\n *\n * @example\n * ```ts\n * // Wait for an element to appear\n * await waitFor(() => document.querySelector('#myElement') !== null);\n *\n * // Wait for API to be ready with cancellation support\n * await waitFor(\n * async (signal) => {\n * const res = await fetch('/api/health', { signal });\n * return res.ok;\n * },\n * { timeout: 30000, interval: 1000 },\n * );\n * ```\n *\n * @param condition - Polling function that receives the merged AbortSignal and returns true when the condition is met\n * @param options - Configuration options\n * @param [options.timeout=5000] - Maximum time to wait in ms\n * @param [options.interval=100] - Polling interval in ms\n * @param [options.signal] - AbortSignal to cancel waiting\n * @returns Promise that resolves when condition becomes true\n * @throws Rejects with the abort reason when timed out or cancelled\n */\nexport async function waitFor(\n condition: (signal: AbortSignal) => boolean | Promise<boolean>,\n { interval = 100, signal, timeout: ms = 5000 }: WaitForOptions = {},\n): Promise<void> {\n const deadline = AbortSignal.timeout(ms);\n const merged = signal ? AbortSignal.any([signal, deadline]) : deadline;\n\n merged.throwIfAborted();\n\n while (true) {\n merged.throwIfAborted();\n\n if (await condition(merged)) return;\n\n await sleep(interval, merged);\n }\n}\n"],"mappings":";;AAmCA,eAAsB,EACpB,GACA,EAAE,cAAW,KAAK,WAAQ,SAAS,IAAK,QAAyB,CAAC,GACnD;CACf,IAAM,IAAW,YAAY,QAAQ,CAAE,GACjC,IAAS,IAAS,YAAY,IAAI,CAAC,GAAQ,CAAQ,CAAC,IAAI;CAI9D,KAFA,EAAO,eAAe,KAET;EAGX,IAFA,EAAO,eAAe,GAElB,MAAM,EAAU,CAAM,GAAG;EAE7B,MAAM,EAAM,GAAU,CAAM;CAC9B;AACF"}
1
+ {"version":3,"file":"waitFor.js","names":[],"sources":["../../src/async/waitFor.ts"],"sourcesContent":["import { sleep } from './sleep';\n\nexport type WaitForOptions = {\n interval?: number;\n signal?: AbortSignal;\n timeout?: number;\n};\n\n/**\n * Waits for a condition to become true by polling.\n * Useful for waiting for DOM elements, API states, or other conditions.\n *\n * @example\n * ```ts\n * // Wait for an element to appear\n * await waitFor(() => document.querySelector('#myElement') !== null);\n *\n * // Wait for API to be ready with cancellation support\n * await waitFor(\n * async (signal) => {\n * const res = await fetch('/api/health', { signal });\n * return res.ok;\n * },\n * { timeout: 30000, interval: 1000 },\n * );\n * ```\n *\n * @param condition - Polling function that receives the merged AbortSignal and returns true when the condition is met\n * @param options - Configuration options\n * @param [options.timeout=5000] - Maximum time to wait in ms\n * @param [options.interval=100] - Polling interval in ms\n * @param [options.signal] - AbortSignal to cancel waiting\n * @returns Promise that resolves when condition becomes true\n * @throws Rejects with the abort reason when timed out or cancelled\n */\nexport async function waitFor(\n condition: (signal: AbortSignal) => boolean | Promise<boolean>,\n { interval = 100, signal, timeout: ms = 5000 }: WaitForOptions = {},\n): Promise<void> {\n const deadline = AbortSignal.timeout(ms);\n const merged = signal ? AbortSignal.any([signal, deadline]) : deadline;\n\n merged.throwIfAborted();\n\n while (true) {\n merged.throwIfAborted();\n\n if (await condition(merged)) return;\n\n await sleep(interval, merged);\n }\n}\n"],"mappings":"mCAmCA,eAAsB,QACpB,EACA,CAAE,WAAW,IAAK,SAAQ,QAAS,EAAK,KAAyB,CAAC,EACnD,CACf,IAAM,EAAW,YAAY,QAAQ,CAAE,EACjC,EAAS,EAAS,YAAY,IAAI,CAAC,EAAQ,CAAQ,CAAC,EAAI,EAI9D,IAFA,EAAO,eAAe,IAET,CAGX,GAFA,EAAO,eAAe,EAElB,MAAM,EAAU,CAAM,EAAG,OAE7B,MAAM,EAAM,EAAU,CAAM,CAC9B,CACF"}
@@ -1,2 +1,2 @@
1
- function e({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,s=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},c=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},l=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},u=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},d=(e,t,i={})=>{s(e),r.delete(e),r.set(e,{expiresAt:c(i.ttlMs??n),value:t}),u()};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),s(e),r.delete(e)),entries:()=>(u(),[...r].map(([e,t])=>[e,t.value])),get:l,getOrLoad:(e,t)=>{let n=l(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let c=i.get(e);if(c)return c;let u=o,f=s(e),p=t().then(t=>(i.get(e)===p&&i.delete(e),o===u&&a.get(e)===f&&d(e,t),t),t=>{throw i.get(e)===p&&i.delete(e),t});return i.set(e,p),p},set:d,get size(){return r.size}}}exports.cache=e;
1
+ function cache({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,advanceRevision=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},expiresAt=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},read=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},trim=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},set=(e,t,i={})=>{advanceRevision(e),r.delete(e),r.set(e,{expiresAt:expiresAt(i.ttlMs??n),value:t}),trim()},getOrLoad=(e,t)=>{let n=read(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let s=i.get(e);if(s)return s;let c=o,l=advanceRevision(e),u=t().then(t=>(i.get(e)===u&&i.delete(e),o===c&&a.get(e)===l&&set(e,t),t),t=>{throw i.get(e)===u&&i.delete(e),t});return i.set(e,u),u};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),advanceRevision(e),r.delete(e)),entries:()=>(trim(),[...r].map(([e,t])=>[e,t.value])),get:read,getOrLoad,set,get size(){return r.size}}}exports.cache=cache;
2
2
  //# sourceMappingURL=cache.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.cjs","names":[],"sources":["../../src/cache/cache.ts"],"sourcesContent":["export type CacheOptions = {\n capacity?: number;\n now?: () => number;\n ttlMs?: number;\n};\n\ntype Entry<T> = {\n expiresAt: number | undefined;\n value: T;\n};\n\nexport interface Cache<K, T> {\n clear(): void;\n delete(key: K): boolean;\n entries(): ReadonlyArray<readonly [K, T]>;\n get(key: K): T | undefined;\n getOrLoad(key: K, load: () => Promise<T>): Promise<T>;\n set(key: K, value: T, options?: { ttlMs?: number }): void;\n readonly size: number;\n}\n\nexport function cache<K, T>({ capacity = Infinity, now = Date.now, ttlMs }: CacheOptions = {}): Cache<K, T> {\n if (capacity !== Infinity && (!Number.isInteger(capacity) || capacity < 1)) {\n throw new RangeError(`cache: capacity must be a positive integer or Infinity, got ${capacity}`);\n }\n\n const entries = new Map<K, Entry<T>>();\n const pending = new Map<K, Promise<T>>();\n const revisions = new Map<K, number>();\n let generation = 0;\n\n const advanceRevision = (key: K): number => {\n const revision = (revisions.get(key) ?? 0) + 1;\n\n revisions.set(key, revision);\n\n return revision;\n };\n\n const expiresAt = (duration: number | undefined): number | undefined => {\n if (duration === undefined || duration === Infinity) return undefined;\n\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${duration}`);\n }\n\n return now() + duration;\n };\n\n const read = (key: K): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) return undefined;\n\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) {\n entries.delete(key);\n\n return undefined;\n }\n\n return entry.value;\n };\n\n const trim = (): void => {\n for (const [key, entry] of entries) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) entries.delete(key);\n }\n\n while (entries.size > capacity) {\n const oldest = entries.keys().next().value;\n\n if (oldest === undefined) return;\n\n entries.delete(oldest);\n }\n };\n\n const set = (key: K, value: T, options: { ttlMs?: number } = {}): void => {\n advanceRevision(key);\n entries.delete(key);\n entries.set(key, { expiresAt: expiresAt(options.ttlMs ?? ttlMs), value });\n trim();\n };\n\n const getOrLoad = (key: K, load: () => Promise<T>): Promise<T> => {\n const cached = read(key);\n\n if (cached !== undefined || entries.has(key)) return Promise.resolve(cached as T);\n\n const existing = pending.get(key);\n\n if (existing) return existing;\n\n const capturedGeneration = generation;\n const capturedRevision = advanceRevision(key);\n const result = load().then(\n (value) => {\n if (pending.get(key) === result) pending.delete(key);\n\n if (generation === capturedGeneration && revisions.get(key) === capturedRevision) {\n set(key, value);\n }\n\n return value;\n },\n (error: unknown) => {\n if (pending.get(key) === result) pending.delete(key);\n\n throw error;\n },\n );\n\n pending.set(key, result);\n\n return result;\n };\n\n return {\n clear: () => {\n generation++;\n entries.clear();\n pending.clear();\n revisions.clear();\n },\n delete: (key) => {\n pending.delete(key);\n advanceRevision(key);\n\n return entries.delete(key);\n },\n entries: () => {\n trim();\n return [...entries].map(([key, entry]) => [key, entry.value] as const);\n },\n get: read,\n getOrLoad,\n set,\n get size() {\n return entries.size;\n },\n };\n}\n"],"mappings":"AAqBA,SAAgB,EAAY,CAAE,WAAW,IAAU,MAAM,KAAK,IAAK,SAAwB,CAAC,EAAgB,CAC1G,GAAI,IAAa,MAAa,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,GACtE,MAAU,WAAW,+DAA+D,GAAU,EAGhG,IAAM,EAAU,IAAI,IACd,EAAU,IAAI,IACd,EAAY,IAAI,IAClB,EAAa,EAEX,EAAmB,GAAmB,CAC1C,IAAM,GAAY,EAAU,IAAI,CAAG,GAAK,GAAK,EAI7C,OAFA,EAAU,IAAI,EAAK,CAAQ,EAEpB,CACT,EAEM,EAAa,GAAqD,CAClE,OAAa,IAAA,IAAa,IAAa,IAE3C,IAAI,CAAC,OAAO,SAAS,CAAQ,GAAK,EAAW,EAC3C,MAAU,WAAW,sEAAsE,GAAU,EAGvG,OAAO,EAAI,EAAI,CAHwF,CAIzG,EAEM,EAAQ,GAA0B,CACtC,IAAM,EAAQ,EAAQ,IAAI,CAAG,EAExB,KAEL,IAAI,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,EAAG,CAC7D,EAAQ,OAAO,CAAG,EAElB,MACF,CAEA,OAAO,EAAM,KAFb,CAGF,EAEM,MAAmB,CACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACrB,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,GAAG,EAAQ,OAAO,CAAG,EAGnF,KAAO,EAAQ,KAAO,GAAU,CAC9B,IAAM,EAAS,EAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAErC,GAAI,IAAW,IAAA,GAAW,OAE1B,EAAQ,OAAO,CAAM,CACvB,CACF,EAEM,GAAO,EAAQ,EAAU,EAA8B,CAAC,IAAY,CACxE,EAAgB,CAAG,EACnB,EAAQ,OAAO,CAAG,EAClB,EAAQ,IAAI,EAAK,CAAE,UAAW,EAAU,EAAQ,OAAS,CAAK,EAAG,OAAM,CAAC,EACxE,EAAK,CACP,EAmCA,MAAO,CACL,UAAa,CACX,IACA,EAAQ,MAAM,EACd,EAAQ,MAAM,EACd,EAAU,MAAM,CAClB,EACA,OAAS,IACP,EAAQ,OAAO,CAAG,EAClB,EAAgB,CAAG,EAEZ,EAAQ,OAAO,CAAG,GAE3B,aACE,EAAK,EACE,CAAC,GAAG,CAAO,CAAC,CAAC,KAAK,CAAC,EAAK,KAAW,CAAC,EAAK,EAAM,KAAK,CAAU,GAEvE,IAAK,EACL,WAnDiB,EAAQ,IAAuC,CAChE,IAAM,EAAS,EAAK,CAAG,EAEvB,GAAI,IAAW,IAAA,IAAa,EAAQ,IAAI,CAAG,EAAG,OAAO,QAAQ,QAAQ,CAAW,EAEhF,IAAM,EAAW,EAAQ,IAAI,CAAG,EAEhC,GAAI,EAAU,OAAO,EAErB,IAAM,EAAqB,EACrB,EAAmB,EAAgB,CAAG,EACtC,EAAS,EAAK,CAAC,CAAC,KACnB,IACK,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE/C,IAAe,GAAsB,EAAU,IAAI,CAAG,IAAM,GAC9D,EAAI,EAAK,CAAK,EAGT,GAER,GAAmB,CAGlB,MAFI,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE7C,CACR,CACF,EAIA,OAFA,EAAQ,IAAI,EAAK,CAAM,EAEhB,CACT,EAqBE,MACA,IAAI,MAAO,CACT,OAAO,EAAQ,IACjB,CACF,CACF"}
1
+ {"version":3,"file":"cache.cjs","names":[],"sources":["../../src/cache/cache.ts"],"sourcesContent":["export type CacheOptions = {\n capacity?: number;\n now?: () => number;\n ttlMs?: number;\n};\n\ntype Entry<T> = {\n expiresAt: number | undefined;\n value: T;\n};\n\nexport interface Cache<K, T> {\n clear(): void;\n delete(key: K): boolean;\n entries(): ReadonlyArray<readonly [K, T]>;\n get(key: K): T | undefined;\n getOrLoad(key: K, load: () => Promise<T>): Promise<T>;\n set(key: K, value: T, options?: { ttlMs?: number }): void;\n readonly size: number;\n}\n\nexport function cache<K, T>({ capacity = Infinity, now = Date.now, ttlMs }: CacheOptions = {}): Cache<K, T> {\n if (capacity !== Infinity && (!Number.isInteger(capacity) || capacity < 1)) {\n throw new RangeError(`cache: capacity must be a positive integer or Infinity, got ${capacity}`);\n }\n\n const entries = new Map<K, Entry<T>>();\n const pending = new Map<K, Promise<T>>();\n const revisions = new Map<K, number>();\n let generation = 0;\n\n const advanceRevision = (key: K): number => {\n const revision = (revisions.get(key) ?? 0) + 1;\n\n revisions.set(key, revision);\n\n return revision;\n };\n\n const expiresAt = (duration: number | undefined): number | undefined => {\n if (duration === undefined || duration === Infinity) return undefined;\n\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${duration}`);\n }\n\n return now() + duration;\n };\n\n const read = (key: K): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) return undefined;\n\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) {\n entries.delete(key);\n\n return undefined;\n }\n\n return entry.value;\n };\n\n const trim = (): void => {\n for (const [key, entry] of entries) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) entries.delete(key);\n }\n\n while (entries.size > capacity) {\n const oldest = entries.keys().next().value;\n\n if (oldest === undefined) return;\n\n entries.delete(oldest);\n }\n };\n\n const set = (key: K, value: T, options: { ttlMs?: number } = {}): void => {\n advanceRevision(key);\n entries.delete(key);\n entries.set(key, { expiresAt: expiresAt(options.ttlMs ?? ttlMs), value });\n trim();\n };\n\n const getOrLoad = (key: K, load: () => Promise<T>): Promise<T> => {\n const cached = read(key);\n\n if (cached !== undefined || entries.has(key)) return Promise.resolve(cached as T);\n\n const existing = pending.get(key);\n\n if (existing) return existing;\n\n const capturedGeneration = generation;\n const capturedRevision = advanceRevision(key);\n const result = load().then(\n (value) => {\n if (pending.get(key) === result) pending.delete(key);\n\n if (generation === capturedGeneration && revisions.get(key) === capturedRevision) {\n set(key, value);\n }\n\n return value;\n },\n (error: unknown) => {\n if (pending.get(key) === result) pending.delete(key);\n\n throw error;\n },\n );\n\n pending.set(key, result);\n\n return result;\n };\n\n return {\n clear: () => {\n generation++;\n entries.clear();\n pending.clear();\n revisions.clear();\n },\n delete: (key) => {\n pending.delete(key);\n advanceRevision(key);\n\n return entries.delete(key);\n },\n entries: () => {\n trim();\n return [...entries].map(([key, entry]) => [key, entry.value] as const);\n },\n get: read,\n getOrLoad,\n set,\n get size() {\n return entries.size;\n },\n };\n}\n"],"mappings":"AAqBA,SAAgB,MAAY,CAAE,WAAW,IAAU,MAAM,KAAK,IAAK,SAAwB,CAAC,EAAgB,CAC1G,GAAI,IAAa,MAAa,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,GACtE,MAAU,WAAW,+DAA+D,GAAU,EAGhG,IAAM,EAAU,IAAI,IACd,EAAU,IAAI,IACd,EAAY,IAAI,IAClB,EAAa,EAEX,gBAAmB,GAAmB,CAC1C,IAAM,GAAY,EAAU,IAAI,CAAG,GAAK,GAAK,EAI7C,OAFA,EAAU,IAAI,EAAK,CAAQ,EAEpB,CACT,EAEM,UAAa,GAAqD,CAClE,OAAa,IAAA,IAAa,IAAa,IAE3C,IAAI,CAAC,OAAO,SAAS,CAAQ,GAAK,EAAW,EAC3C,MAAU,WAAW,sEAAsE,GAAU,EAGvG,OAAO,EAAI,EAAI,CAHwF,CAIzG,EAEM,KAAQ,GAA0B,CACtC,IAAM,EAAQ,EAAQ,IAAI,CAAG,EAExB,KAEL,IAAI,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,EAAG,CAC7D,EAAQ,OAAO,CAAG,EAElB,MACF,CAEA,OAAO,EAAM,KAFb,CAGF,EAEM,SAAmB,CACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACrB,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,GAAG,EAAQ,OAAO,CAAG,EAGnF,KAAO,EAAQ,KAAO,GAAU,CAC9B,IAAM,EAAS,EAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAErC,GAAI,IAAW,IAAA,GAAW,OAE1B,EAAQ,OAAO,CAAM,CACvB,CACF,EAEM,KAAO,EAAQ,EAAU,EAA8B,CAAC,IAAY,CACxE,gBAAgB,CAAG,EACnB,EAAQ,OAAO,CAAG,EAClB,EAAQ,IAAI,EAAK,CAAE,UAAW,UAAU,EAAQ,OAAS,CAAK,EAAG,OAAM,CAAC,EACxE,KAAK,CACP,EAEM,WAAa,EAAQ,IAAuC,CAChE,IAAM,EAAS,KAAK,CAAG,EAEvB,GAAI,IAAW,IAAA,IAAa,EAAQ,IAAI,CAAG,EAAG,OAAO,QAAQ,QAAQ,CAAW,EAEhF,IAAM,EAAW,EAAQ,IAAI,CAAG,EAEhC,GAAI,EAAU,OAAO,EAErB,IAAM,EAAqB,EACrB,EAAmB,gBAAgB,CAAG,EACtC,EAAS,EAAK,CAAC,CAAC,KACnB,IACK,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE/C,IAAe,GAAsB,EAAU,IAAI,CAAG,IAAM,GAC9D,IAAI,EAAK,CAAK,EAGT,GAER,GAAmB,CAGlB,MAFI,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE7C,CACR,CACF,EAIA,OAFA,EAAQ,IAAI,EAAK,CAAM,EAEhB,CACT,EAEA,MAAO,CACL,UAAa,CACX,IACA,EAAQ,MAAM,EACd,EAAQ,MAAM,EACd,EAAU,MAAM,CAClB,EACA,OAAS,IACP,EAAQ,OAAO,CAAG,EAClB,gBAAgB,CAAG,EAEZ,EAAQ,OAAO,CAAG,GAE3B,aACE,KAAK,EACE,CAAC,GAAG,CAAO,CAAC,CAAC,KAAK,CAAC,EAAK,KAAW,CAAC,EAAK,EAAM,KAAK,CAAU,GAEvE,IAAK,KACL,UACA,IACA,IAAI,MAAO,CACT,OAAO,EAAQ,IACjB,CACF,CACF"}
@@ -1,60 +1,2 @@
1
- //#region src/cache/cache.ts
2
- function e({ capacity: e = Infinity, now: t = Date.now, ttlMs: n } = {}) {
3
- if (e !== Infinity && (!Number.isInteger(e) || e < 1)) throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);
4
- let r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = 0, s = (e) => {
5
- let t = (a.get(e) ?? 0) + 1;
6
- return a.set(e, t), t;
7
- }, c = (e) => {
8
- if (e !== void 0 && e !== Infinity) {
9
- if (!Number.isFinite(e) || e < 0) throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);
10
- return t() + e;
11
- }
12
- }, l = (e) => {
13
- let n = r.get(e);
14
- if (n) {
15
- if (n.expiresAt !== void 0 && n.expiresAt <= t()) {
16
- r.delete(e);
17
- return;
18
- }
19
- return n.value;
20
- }
21
- }, u = () => {
22
- for (let [e, n] of r) n.expiresAt !== void 0 && n.expiresAt <= t() && r.delete(e);
23
- for (; r.size > e;) {
24
- let e = r.keys().next().value;
25
- if (e === void 0) return;
26
- r.delete(e);
27
- }
28
- }, d = (e, t, i = {}) => {
29
- s(e), r.delete(e), r.set(e, {
30
- expiresAt: c(i.ttlMs ?? n),
31
- value: t
32
- }), u();
33
- };
34
- return {
35
- clear: () => {
36
- o++, r.clear(), i.clear(), a.clear();
37
- },
38
- delete: (e) => (i.delete(e), s(e), r.delete(e)),
39
- entries: () => (u(), [...r].map(([e, t]) => [e, t.value])),
40
- get: l,
41
- getOrLoad: (e, t) => {
42
- let n = l(e);
43
- if (n !== void 0 || r.has(e)) return Promise.resolve(n);
44
- let c = i.get(e);
45
- if (c) return c;
46
- let u = o, f = s(e), p = t().then((t) => (i.get(e) === p && i.delete(e), o === u && a.get(e) === f && d(e, t), t), (t) => {
47
- throw i.get(e) === p && i.delete(e), t;
48
- });
49
- return i.set(e, p), p;
50
- },
51
- set: d,
52
- get size() {
53
- return r.size;
54
- }
55
- };
56
- }
57
- //#endregion
58
- export { e as cache };
59
-
1
+ function cache({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,advanceRevision=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},expiresAt=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},read=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},trim=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},set=(e,t,i={})=>{advanceRevision(e),r.delete(e),r.set(e,{expiresAt:expiresAt(i.ttlMs??n),value:t}),trim()},getOrLoad=(e,t)=>{let n=read(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let s=i.get(e);if(s)return s;let c=o,l=advanceRevision(e),u=t().then(t=>(i.get(e)===u&&i.delete(e),o===c&&a.get(e)===l&&set(e,t),t),t=>{throw i.get(e)===u&&i.delete(e),t});return i.set(e,u),u};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),advanceRevision(e),r.delete(e)),entries:()=>(trim(),[...r].map(([e,t])=>[e,t.value])),get:read,getOrLoad,set,get size(){return r.size}}}export{cache};
60
2
  //# sourceMappingURL=cache.js.map