zeed 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. package/AGENTS.md +50 -211
  2. package/README.md +16 -0
  3. package/dist/_experiments/bitcask.cjs +243 -1
  4. package/dist/_experiments/bitcask.cjs.map +1 -1
  5. package/dist/_experiments/bitcask.mjs +230 -1
  6. package/dist/_experiments/bitcask.mjs.map +1 -1
  7. package/dist/bin-BAoS4qtm.mjs +593 -0
  8. package/dist/{bin-SPdenYkw.mjs.map → bin-BAoS4qtm.mjs.map} +1 -1
  9. package/dist/bin-Ddaz2lxM.cjs +862 -0
  10. package/dist/{bin-Ce3i6ABn.cjs.map → bin-Ddaz2lxM.cjs.map} +1 -1
  11. package/dist/browser/base64.cjs +14 -1
  12. package/dist/browser/base64.cjs.map +1 -1
  13. package/dist/browser/base64.mjs +12 -1
  14. package/dist/browser/base64.mjs.map +1 -1
  15. package/dist/browser/gravatar.cjs +186 -1
  16. package/dist/browser/gravatar.cjs.map +1 -1
  17. package/dist/browser/gravatar.mjs +184 -1
  18. package/dist/browser/gravatar.mjs.map +1 -1
  19. package/dist/browser/index.cjs +14 -1
  20. package/dist/browser/index.mjs +8 -1
  21. package/dist/browser/localstorage.cjs +46 -1
  22. package/dist/browser/localstorage.cjs.map +1 -1
  23. package/dist/browser/localstorage.mjs +45 -1
  24. package/dist/browser/localstorage.mjs.map +1 -1
  25. package/dist/browser/log/index.cjs +8 -1
  26. package/dist/browser/log/index.mjs +5 -1
  27. package/dist/browser/log/log-browser-factory.cjs +65 -1
  28. package/dist/browser/log/log-browser-factory.cjs.map +1 -1
  29. package/dist/browser/log/log-browser-factory.mjs +64 -1
  30. package/dist/browser/log/log-browser-factory.mjs.map +1 -1
  31. package/dist/browser/log/log-browser.cjs +72 -1
  32. package/dist/browser/log/log-browser.cjs.map +1 -1
  33. package/dist/browser/log/log-browser.mjs +71 -1
  34. package/dist/browser/log/log-browser.mjs.map +1 -1
  35. package/dist/browser/log/log-colors.cjs +11 -1
  36. package/dist/browser/log/log-colors.cjs.map +1 -1
  37. package/dist/browser/log/log-colors.mjs +9 -1
  38. package/dist/browser/log/log-colors.mjs.map +1 -1
  39. package/dist/browser/log/log-context-browser.cjs +25 -1
  40. package/dist/browser/log/log-context-browser.cjs.map +1 -1
  41. package/dist/browser/log/log-context-browser.mjs +23 -1
  42. package/dist/browser/log/log-context-browser.mjs.map +1 -1
  43. package/dist/chunk-DQk6qfdC.mjs +18 -0
  44. package/dist/chunk-uaV2rQ02.cjs +53 -0
  45. package/dist/common/assert.cjs +22 -1
  46. package/dist/common/assert.cjs.map +1 -1
  47. package/dist/common/assert.mjs +19 -1
  48. package/dist/common/assert.mjs.map +1 -1
  49. package/dist/common/bin/index.cjs +106 -1
  50. package/dist/common/bin/index.cjs.map +1 -1
  51. package/dist/common/bin/index.mjs +98 -1
  52. package/dist/common/bin/index.mjs.map +1 -1
  53. package/dist/common/bin/lib0/binary.cjs +146 -1
  54. package/dist/common/bin/lib0/binary.cjs.map +1 -1
  55. package/dist/common/bin/lib0/binary.mjs +80 -1
  56. package/dist/common/bin/lib0/binary.mjs.map +1 -1
  57. package/dist/common/bin/lib0/buffer.cjs +42 -1
  58. package/dist/common/bin/lib0/buffer.cjs.map +1 -1
  59. package/dist/common/bin/lib0/buffer.mjs +38 -1
  60. package/dist/common/bin/lib0/buffer.mjs.map +1 -1
  61. package/dist/common/bin/lib0/create.cjs +24 -1
  62. package/dist/common/bin/lib0/create.cjs.map +1 -1
  63. package/dist/common/bin/lib0/create.mjs +21 -1
  64. package/dist/common/bin/lib0/create.mjs.map +1 -1
  65. package/dist/common/bin/lib0/decoding.cjs +325 -1
  66. package/dist/common/bin/lib0/decoding.cjs.map +1 -1
  67. package/dist/common/bin/lib0/decoding.mjs +298 -1
  68. package/dist/common/bin/lib0/decoding.mjs.map +1 -1
  69. package/dist/common/bin/lib0/encoding.cjs +404 -1
  70. package/dist/common/bin/lib0/encoding.cjs.map +1 -1
  71. package/dist/common/bin/lib0/encoding.mjs +377 -1
  72. package/dist/common/bin/lib0/encoding.mjs.map +1 -1
  73. package/dist/common/bin/lib0/string.cjs +81 -1
  74. package/dist/common/bin/lib0/string.cjs.map +1 -1
  75. package/dist/common/bin/lib0/string.mjs +71 -1
  76. package/dist/common/bin/lib0/string.mjs.map +1 -1
  77. package/dist/common/crypto/aes-sealed.cjs +34 -1
  78. package/dist/common/crypto/aes-sealed.cjs.map +1 -1
  79. package/dist/common/crypto/aes-sealed.mjs +32 -1
  80. package/dist/common/crypto/aes-sealed.mjs.map +1 -1
  81. package/dist/common/crypto/crypto.cjs +91 -1
  82. package/dist/common/crypto/crypto.cjs.map +1 -1
  83. package/dist/common/crypto/crypto.mjs +80 -1
  84. package/dist/common/crypto/crypto.mjs.map +1 -1
  85. package/dist/common/crypto/index.cjs +23 -1
  86. package/dist/common/crypto/index.mjs +5 -1
  87. package/dist/common/crypto/xaes.cjs +128 -1
  88. package/dist/common/crypto/xaes.cjs.map +1 -1
  89. package/dist/common/crypto/xaes.mjs +123 -1
  90. package/dist/common/crypto/xaes.mjs.map +1 -1
  91. package/dist/common/csv.cjs +49 -4
  92. package/dist/common/csv.cjs.map +1 -1
  93. package/dist/common/csv.mjs +46 -4
  94. package/dist/common/csv.mjs.map +1 -1
  95. package/dist/common/data/array.cjs +299 -1
  96. package/dist/common/data/array.cjs.map +1 -1
  97. package/dist/common/data/array.mjs +274 -1
  98. package/dist/common/data/array.mjs.map +1 -1
  99. package/dist/common/data/basex-secure.cjs +30 -1
  100. package/dist/common/data/basex-secure.mjs +3 -1
  101. package/dist/common/data/basex.cjs +163 -1
  102. package/dist/common/data/basex.cjs.map +1 -1
  103. package/dist/common/data/basex.mjs +152 -1
  104. package/dist/common/data/basex.mjs.map +1 -1
  105. package/dist/common/data/bin-types.mjs +1 -1
  106. package/dist/common/data/bin.cjs +21 -1
  107. package/dist/common/data/bin.mjs +3 -1
  108. package/dist/common/data/camelcase.cjs +27 -1
  109. package/dist/common/data/camelcase.cjs.map +1 -1
  110. package/dist/common/data/camelcase.mjs +22 -1
  111. package/dist/common/data/camelcase.mjs.map +1 -1
  112. package/dist/common/data/convert.cjs +104 -1
  113. package/dist/common/data/convert.cjs.map +1 -1
  114. package/dist/common/data/convert.mjs +88 -1
  115. package/dist/common/data/convert.mjs.map +1 -1
  116. package/dist/common/data/datauri.cjs +32 -1
  117. package/dist/common/data/datauri.cjs.map +1 -1
  118. package/dist/common/data/datauri.mjs +27 -1
  119. package/dist/common/data/datauri.mjs.map +1 -1
  120. package/dist/common/data/day-legacy.cjs +148 -1
  121. package/dist/common/data/day-legacy.cjs.map +1 -1
  122. package/dist/common/data/day-legacy.mjs +143 -1
  123. package/dist/common/data/day-legacy.mjs.map +1 -1
  124. package/dist/common/data/day.cjs +335 -1
  125. package/dist/common/data/day.cjs.map +1 -1
  126. package/dist/common/data/day.mjs +305 -1
  127. package/dist/common/data/day.mjs.map +1 -1
  128. package/dist/common/data/decimal.cjs +28 -1
  129. package/dist/common/data/decimal.cjs.map +1 -1
  130. package/dist/common/data/decimal.mjs +23 -1
  131. package/dist/common/data/decimal.mjs.map +1 -1
  132. package/dist/common/data/deep.cjs +57 -1
  133. package/dist/common/data/deep.cjs.map +1 -1
  134. package/dist/common/data/deep.mjs +54 -1
  135. package/dist/common/data/deep.mjs.map +1 -1
  136. package/dist/common/data/diff.cjs +62 -1
  137. package/dist/common/data/diff.cjs.map +1 -1
  138. package/dist/common/data/diff.mjs +60 -1
  139. package/dist/common/data/diff.mjs.map +1 -1
  140. package/dist/common/data/distributed.cjs +24 -1
  141. package/dist/common/data/distributed.cjs.map +1 -1
  142. package/dist/common/data/distributed.mjs +22 -1
  143. package/dist/common/data/distributed.mjs.map +1 -1
  144. package/dist/common/data/format.cjs +63 -1
  145. package/dist/common/data/format.cjs.map +1 -1
  146. package/dist/common/data/format.mjs +59 -1
  147. package/dist/common/data/format.mjs.map +1 -1
  148. package/dist/common/data/html.cjs +13 -1
  149. package/dist/common/data/html.cjs.map +1 -1
  150. package/dist/common/data/html.mjs +10 -1
  151. package/dist/common/data/html.mjs.map +1 -1
  152. package/dist/common/data/index.cjs +296 -1
  153. package/dist/common/data/index.mjs +37 -1
  154. package/dist/common/data/is.cjs +106 -1
  155. package/dist/common/data/is.cjs.map +1 -1
  156. package/dist/common/data/is.mjs +85 -1
  157. package/dist/common/data/is.mjs.map +1 -1
  158. package/dist/common/data/json.cjs +70 -1
  159. package/dist/common/data/json.cjs.map +1 -1
  160. package/dist/common/data/json.mjs +65 -1
  161. package/dist/common/data/json.mjs.map +1 -1
  162. package/dist/common/data/list.cjs +32 -1
  163. package/dist/common/data/list.cjs.map +1 -1
  164. package/dist/common/data/list.mjs +27 -1
  165. package/dist/common/data/list.mjs.map +1 -1
  166. package/dist/common/data/lru.mjs +1 -1
  167. package/dist/common/data/math.cjs +79 -1
  168. package/dist/common/data/math.cjs.map +1 -1
  169. package/dist/common/data/math.mjs +65 -1
  170. package/dist/common/data/math.mjs.map +1 -1
  171. package/dist/common/data/message.cjs +30 -1
  172. package/dist/common/data/message.cjs.map +1 -1
  173. package/dist/common/data/message.mjs +28 -1
  174. package/dist/common/data/message.mjs.map +1 -1
  175. package/dist/common/data/object-changes.cjs +66 -1
  176. package/dist/common/data/object-changes.cjs.map +1 -1
  177. package/dist/common/data/object-changes.mjs +63 -1
  178. package/dist/common/data/object-changes.mjs.map +1 -1
  179. package/dist/common/data/object.cjs +112 -1
  180. package/dist/common/data/object.cjs.map +1 -1
  181. package/dist/common/data/object.mjs +104 -1
  182. package/dist/common/data/object.mjs.map +1 -1
  183. package/dist/common/data/orderby.cjs +42 -1
  184. package/dist/common/data/orderby.cjs.map +1 -1
  185. package/dist/common/data/orderby.mjs +37 -1
  186. package/dist/common/data/orderby.mjs.map +1 -1
  187. package/dist/common/data/path.cjs +26 -1
  188. package/dist/common/data/path.cjs.map +1 -1
  189. package/dist/common/data/path.mjs +25 -1
  190. package/dist/common/data/path.mjs.map +1 -1
  191. package/dist/common/data/regexp.cjs +12 -1
  192. package/dist/common/data/regexp.cjs.map +1 -1
  193. package/dist/common/data/regexp.mjs +10 -1
  194. package/dist/common/data/regexp.mjs.map +1 -1
  195. package/dist/common/data/rounding.cjs +107 -1
  196. package/dist/common/data/rounding.cjs.map +1 -1
  197. package/dist/common/data/rounding.mjs +95 -1
  198. package/dist/common/data/rounding.mjs.map +1 -1
  199. package/dist/common/data/signal.cjs +39 -1
  200. package/dist/common/data/signal.cjs.map +1 -1
  201. package/dist/common/data/signal.mjs +38 -1
  202. package/dist/common/data/signal.mjs.map +1 -1
  203. package/dist/common/data/sortable.cjs +35 -1
  204. package/dist/common/data/sortable.cjs.map +1 -1
  205. package/dist/common/data/sortable.mjs +31 -1
  206. package/dist/common/data/sortable.mjs.map +1 -1
  207. package/dist/common/data/sorted.cjs +54 -1
  208. package/dist/common/data/sorted.cjs.map +1 -1
  209. package/dist/common/data/sorted.mjs +53 -1
  210. package/dist/common/data/sorted.mjs.map +1 -1
  211. package/dist/common/data/string-deburr.cjs +240 -1
  212. package/dist/common/data/string-deburr.cjs.map +1 -1
  213. package/dist/common/data/string-deburr.mjs +238 -1
  214. package/dist/common/data/string-deburr.mjs.map +1 -1
  215. package/dist/common/data/string-hash-fnv.cjs +69 -1
  216. package/dist/common/data/string-hash-fnv.cjs.map +1 -1
  217. package/dist/common/data/string-hash-fnv.mjs +67 -1
  218. package/dist/common/data/string-hash-fnv.mjs.map +1 -1
  219. package/dist/common/data/string-hash-pool.cjs +28 -1
  220. package/dist/common/data/string-hash-pool.cjs.map +1 -1
  221. package/dist/common/data/string-hash-pool.mjs +27 -1
  222. package/dist/common/data/string-hash-pool.mjs.map +1 -1
  223. package/dist/common/data/url.cjs +98 -2
  224. package/dist/common/data/url.cjs.map +1 -1
  225. package/dist/common/data/url.mjs +91 -2
  226. package/dist/common/data/url.mjs.map +1 -1
  227. package/dist/common/data/utils.cjs +118 -1
  228. package/dist/common/data/utils.cjs.map +1 -1
  229. package/dist/common/data/utils.mjs +107 -1
  230. package/dist/common/data/utils.mjs.map +1 -1
  231. package/dist/common/data/wordlist.cjs +531 -1
  232. package/dist/common/data/wordlist.cjs.map +1 -1
  233. package/dist/common/data/wordlist.mjs +529 -1
  234. package/dist/common/data/wordlist.mjs.map +1 -1
  235. package/dist/common/data/xrx.cjs +96 -1
  236. package/dist/common/data/xrx.cjs.map +1 -1
  237. package/dist/common/data/xrx.mjs +92 -1
  238. package/dist/common/data/xrx.mjs.map +1 -1
  239. package/dist/common/dispose-defer.cjs +133 -1
  240. package/dist/common/dispose-defer.cjs.map +1 -1
  241. package/dist/common/dispose-defer.mjs +130 -1
  242. package/dist/common/dispose-defer.mjs.map +1 -1
  243. package/dist/common/dispose-types.mjs +1 -1
  244. package/dist/common/dispose-utils.cjs +113 -1
  245. package/dist/common/dispose-utils.cjs.map +1 -1
  246. package/dist/common/dispose-utils.mjs +106 -1
  247. package/dist/common/dispose-utils.mjs.map +1 -1
  248. package/dist/common/exec/index.cjs +24 -1
  249. package/dist/common/exec/index.d.cts +1 -1
  250. package/dist/common/exec/index.d.mts +1 -1
  251. package/dist/common/exec/index.mjs +8 -1
  252. package/dist/common/exec/mutex.cjs +44 -1
  253. package/dist/common/exec/mutex.cjs.map +1 -1
  254. package/dist/common/exec/mutex.mjs +42 -1
  255. package/dist/common/exec/mutex.mjs.map +1 -1
  256. package/dist/common/exec/pool.cjs +181 -1
  257. package/dist/common/exec/pool.cjs.map +1 -1
  258. package/dist/common/exec/pool.d.cts +1 -1
  259. package/dist/common/exec/pool.d.mts +1 -1
  260. package/dist/common/exec/pool.mjs +180 -1
  261. package/dist/common/exec/pool.mjs.map +1 -1
  262. package/dist/common/exec/progress.cjs +149 -1
  263. package/dist/common/exec/progress.cjs.map +1 -1
  264. package/dist/common/exec/progress.d.cts +1 -1
  265. package/dist/common/exec/progress.d.mts +1 -1
  266. package/dist/common/exec/progress.mjs +148 -1
  267. package/dist/common/exec/progress.mjs.map +1 -1
  268. package/dist/common/exec/promise.cjs +113 -1
  269. package/dist/common/exec/promise.cjs.map +1 -1
  270. package/dist/common/exec/promise.mjs +103 -1
  271. package/dist/common/exec/promise.mjs.map +1 -1
  272. package/dist/common/exec/queue.cjs +125 -1
  273. package/dist/common/exec/queue.cjs.map +1 -1
  274. package/dist/common/exec/queue.d.cts +1 -1
  275. package/dist/common/exec/queue.d.mts +1 -1
  276. package/dist/common/exec/queue.mjs +124 -1
  277. package/dist/common/exec/queue.mjs.map +1 -1
  278. package/dist/common/exec/throttle-debounce.cjs +114 -1
  279. package/dist/common/exec/throttle-debounce.cjs.map +1 -1
  280. package/dist/common/exec/throttle-debounce.mjs +112 -1
  281. package/dist/common/exec/throttle-debounce.mjs.map +1 -1
  282. package/dist/common/global.cjs +22 -1
  283. package/dist/common/global.cjs.map +1 -1
  284. package/dist/common/global.mjs +19 -1
  285. package/dist/common/global.mjs.map +1 -1
  286. package/dist/common/index.cjs +559 -1
  287. package/dist/common/index.d.cts +1 -1
  288. package/dist/common/index.d.mts +1 -1
  289. package/dist/common/index.mjs +89 -1
  290. package/dist/common/localhost.cjs +16 -1
  291. package/dist/common/localhost.cjs.map +1 -1
  292. package/dist/common/localhost.mjs +14 -1
  293. package/dist/common/localhost.mjs.map +1 -1
  294. package/dist/common/log/index.cjs +34 -1
  295. package/dist/common/log/index.mjs +11 -1
  296. package/dist/common/log/log-base.cjs +40 -1
  297. package/dist/common/log/log-base.cjs.map +1 -1
  298. package/dist/common/log/log-base.mjs +31 -1
  299. package/dist/common/log/log-base.mjs.map +1 -1
  300. package/dist/common/log/log-colors.cjs +92 -1
  301. package/dist/common/log/log-colors.cjs.map +1 -1
  302. package/dist/common/log/log-colors.mjs +90 -1
  303. package/dist/common/log/log-colors.mjs.map +1 -1
  304. package/dist/common/log/log-config.cjs +15 -1
  305. package/dist/common/log/log-config.cjs.map +1 -1
  306. package/dist/common/log/log-config.mjs +14 -1
  307. package/dist/common/log/log-config.mjs.map +1 -1
  308. package/dist/common/log/log-console-capture.cjs +33 -1
  309. package/dist/common/log/log-console-capture.cjs.map +1 -1
  310. package/dist/common/log/log-console-capture.mjs +32 -1
  311. package/dist/common/log/log-console-capture.mjs.map +1 -1
  312. package/dist/common/log/log-console-original.cjs +27 -1
  313. package/dist/common/log/log-console-original.cjs.map +1 -1
  314. package/dist/common/log/log-console-original.mjs +26 -1
  315. package/dist/common/log/log-console-original.mjs.map +1 -1
  316. package/dist/common/log/log-console.cjs +39 -1
  317. package/dist/common/log/log-console.cjs.map +1 -1
  318. package/dist/common/log/log-console.mjs +38 -1
  319. package/dist/common/log/log-console.mjs.map +1 -1
  320. package/dist/common/log/log-context.cjs +109 -1
  321. package/dist/common/log/log-context.cjs.map +1 -1
  322. package/dist/common/log/log-context.mjs +108 -1
  323. package/dist/common/log/log-context.mjs.map +1 -1
  324. package/dist/common/log/log-filter.cjs +80 -1
  325. package/dist/common/log/log-filter.cjs.map +1 -1
  326. package/dist/common/log/log-filter.mjs +75 -1
  327. package/dist/common/log/log-filter.mjs.map +1 -1
  328. package/dist/common/log/log-memory.cjs +45 -1
  329. package/dist/common/log/log-memory.cjs.map +1 -1
  330. package/dist/common/log/log-memory.mjs +43 -1
  331. package/dist/common/log/log-memory.mjs.map +1 -1
  332. package/dist/common/log/log-noop.cjs +17 -1
  333. package/dist/common/log/log-noop.cjs.map +1 -1
  334. package/dist/common/log/log-noop.mjs +15 -1
  335. package/dist/common/log/log-noop.mjs.map +1 -1
  336. package/dist/common/log/log.cjs +46 -1
  337. package/dist/common/log/log.cjs.map +1 -1
  338. package/dist/common/log/log.mjs +43 -1
  339. package/dist/common/log/log.mjs.map +1 -1
  340. package/dist/common/msg/channel-debug.cjs +17 -1
  341. package/dist/common/msg/channel-debug.cjs.map +1 -1
  342. package/dist/common/msg/channel-debug.d.cts +1 -1
  343. package/dist/common/msg/channel-debug.d.mts +1 -1
  344. package/dist/common/msg/channel-debug.mjs +16 -1
  345. package/dist/common/msg/channel-debug.mjs.map +1 -1
  346. package/dist/common/msg/channel-local.cjs +28 -1
  347. package/dist/common/msg/channel-local.cjs.map +1 -1
  348. package/dist/common/msg/channel-local.d.cts +1 -1
  349. package/dist/common/msg/channel-local.d.mts +1 -1
  350. package/dist/common/msg/channel-local.mjs +26 -1
  351. package/dist/common/msg/channel-local.mjs.map +1 -1
  352. package/dist/common/msg/channel-resilient.cjs +63 -1
  353. package/dist/common/msg/channel-resilient.cjs.map +1 -1
  354. package/dist/common/msg/channel-resilient.d.cts +1 -1
  355. package/dist/common/msg/channel-resilient.d.mts +1 -1
  356. package/dist/common/msg/channel-resilient.mjs +62 -1
  357. package/dist/common/msg/channel-resilient.mjs.map +1 -1
  358. package/dist/common/msg/channel-wkwebview.cjs +35 -1
  359. package/dist/common/msg/channel-wkwebview.cjs.map +1 -1
  360. package/dist/common/msg/channel-wkwebview.d.cts +2 -1
  361. package/dist/common/msg/channel-wkwebview.d.mts +2 -1
  362. package/dist/common/msg/channel-wkwebview.mjs +34 -1
  363. package/dist/common/msg/channel-wkwebview.mjs.map +1 -1
  364. package/dist/common/msg/channel.cjs +23 -1
  365. package/dist/common/msg/channel.cjs.map +1 -1
  366. package/dist/common/msg/channel.d.cts +1 -1
  367. package/dist/common/msg/channel.d.mts +1 -1
  368. package/dist/common/msg/channel.mjs +22 -1
  369. package/dist/common/msg/channel.mjs.map +1 -1
  370. package/dist/common/msg/emitter.cjs +141 -1
  371. package/dist/common/msg/emitter.cjs.map +1 -1
  372. package/dist/common/msg/emitter.d.cts +1 -1
  373. package/dist/common/msg/emitter.d.mts +1 -1
  374. package/dist/common/msg/emitter.mjs +139 -1
  375. package/dist/common/msg/emitter.mjs.map +1 -1
  376. package/dist/common/msg/encoder.cjs +38 -1
  377. package/dist/common/msg/encoder.cjs.map +1 -1
  378. package/dist/common/msg/encoder.mjs +35 -1
  379. package/dist/common/msg/encoder.mjs.map +1 -1
  380. package/dist/common/msg/index.cjs +28 -1
  381. package/dist/common/msg/index.d.cts +1 -1
  382. package/dist/common/msg/index.d.mts +1 -1
  383. package/dist/common/msg/index.mjs +11 -1
  384. package/dist/common/msg/messages.cjs +135 -1
  385. package/dist/common/msg/messages.cjs.map +1 -1
  386. package/dist/common/msg/messages.d.cts +1 -1
  387. package/dist/common/msg/messages.d.mts +1 -1
  388. package/dist/common/msg/messages.mjs +133 -1
  389. package/dist/common/msg/messages.mjs.map +1 -1
  390. package/dist/common/msg/pipe.mjs +1 -1
  391. package/dist/common/msg/pubsub.cjs +78 -1
  392. package/dist/common/msg/pubsub.cjs.map +1 -1
  393. package/dist/common/msg/pubsub.d.cts +1 -1
  394. package/dist/common/msg/pubsub.d.mts +1 -1
  395. package/dist/common/msg/pubsub.mjs +76 -1
  396. package/dist/common/msg/pubsub.mjs.map +1 -1
  397. package/dist/common/msg/rpc.cjs +142 -1
  398. package/dist/common/msg/rpc.cjs.map +1 -1
  399. package/dist/common/msg/rpc.mjs +139 -1
  400. package/dist/common/msg/rpc.mjs.map +1 -1
  401. package/dist/common/network.cjs +129 -1
  402. package/dist/common/network.cjs.map +1 -1
  403. package/dist/common/network.mjs +122 -1
  404. package/dist/common/network.mjs.map +1 -1
  405. package/dist/common/platform.cjs +92 -1
  406. package/dist/common/platform.cjs.map +1 -1
  407. package/dist/common/platform.mjs +84 -1
  408. package/dist/common/platform.mjs.map +1 -1
  409. package/dist/common/schema/_sandbox/sandbox-inherit.mjs +1 -1
  410. package/dist/common/schema/_sandbox/sandbox.mjs +1 -1
  411. package/dist/common/schema/_sandbox/sandbox.xspec.mjs +1 -1
  412. package/dist/common/schema/export-json-schema.cjs +54 -1
  413. package/dist/common/schema/export-json-schema.cjs.map +1 -1
  414. package/dist/common/schema/export-json-schema.mjs +52 -1
  415. package/dist/common/schema/export-json-schema.mjs.map +1 -1
  416. package/dist/common/schema/export-swift.cjs +30 -2
  417. package/dist/common/schema/export-swift.cjs.map +1 -1
  418. package/dist/common/schema/export-swift.mjs +29 -2
  419. package/dist/common/schema/export-swift.mjs.map +1 -1
  420. package/dist/common/schema/export-typescript.cjs +20 -2
  421. package/dist/common/schema/export-typescript.cjs.map +1 -1
  422. package/dist/common/schema/export-typescript.mjs +19 -2
  423. package/dist/common/schema/export-typescript.mjs.map +1 -1
  424. package/dist/common/schema/index.cjs +55 -1
  425. package/dist/common/schema/index.mjs +12 -1
  426. package/dist/common/schema/parse-args.cjs +62 -2
  427. package/dist/common/schema/parse-args.cjs.map +1 -1
  428. package/dist/common/schema/parse-args.mjs +60 -2
  429. package/dist/common/schema/parse-args.mjs.map +1 -1
  430. package/dist/common/schema/parse-env.cjs +48 -3
  431. package/dist/common/schema/parse-env.cjs.map +1 -1
  432. package/dist/common/schema/parse-env.mjs +46 -3
  433. package/dist/common/schema/parse-env.mjs.map +1 -1
  434. package/dist/common/schema/parse-object.cjs +122 -1
  435. package/dist/common/schema/parse-object.cjs.map +1 -1
  436. package/dist/common/schema/parse-object.mjs +119 -1
  437. package/dist/common/schema/parse-object.mjs.map +1 -1
  438. package/dist/common/schema/schema-standard.mjs +1 -1
  439. package/dist/common/schema/schema.cjs +423 -1
  440. package/dist/common/schema/schema.cjs.map +1 -1
  441. package/dist/common/schema/schema.mjs +404 -1
  442. package/dist/common/schema/schema.mjs.map +1 -1
  443. package/dist/common/schema/serialize.cjs +109 -1
  444. package/dist/common/schema/serialize.cjs.map +1 -1
  445. package/dist/common/schema/serialize.mjs +107 -1
  446. package/dist/common/schema/serialize.mjs.map +1 -1
  447. package/dist/common/schema/type-test.mjs +1 -1
  448. package/dist/common/schema/utils.cjs +25 -1
  449. package/dist/common/schema/utils.cjs.map +1 -1
  450. package/dist/common/schema/utils.mjs +19 -1
  451. package/dist/common/schema/utils.mjs.map +1 -1
  452. package/dist/common/schema/z-collection.cjs +51 -1
  453. package/dist/common/schema/z-collection.mjs +27 -1
  454. package/dist/common/schema/z.cjs +9 -1
  455. package/dist/common/schema/z.mjs +3 -1
  456. package/dist/common/storage/index.cjs +4 -1
  457. package/dist/common/storage/index.mjs +3 -1
  458. package/dist/common/storage/memstorage.cjs +26 -1
  459. package/dist/common/storage/memstorage.cjs.map +1 -1
  460. package/dist/common/storage/memstorage.mjs +25 -1
  461. package/dist/common/storage/memstorage.mjs.map +1 -1
  462. package/dist/common/test.cjs +14 -1
  463. package/dist/common/test.cjs.map +1 -1
  464. package/dist/common/test.mjs +13 -1
  465. package/dist/common/test.mjs.map +1 -1
  466. package/dist/common/time.cjs +220 -1
  467. package/dist/common/time.cjs.map +1 -1
  468. package/dist/common/time.mjs +194 -1
  469. package/dist/common/time.mjs.map +1 -1
  470. package/dist/common/timeout.cjs +27 -1
  471. package/dist/common/timeout.cjs.map +1 -1
  472. package/dist/common/timeout.mjs +25 -1
  473. package/dist/common/timeout.mjs.map +1 -1
  474. package/dist/common/types.mjs +1 -1
  475. package/dist/common/utils.cjs +7 -1
  476. package/dist/common/utils.cjs.map +1 -1
  477. package/dist/common/utils.mjs +5 -1
  478. package/dist/common/utils.mjs.map +1 -1
  479. package/dist/common/uuid.cjs +307 -1
  480. package/dist/common/uuid.cjs.map +1 -1
  481. package/dist/common/uuid.mjs +284 -1
  482. package/dist/common/uuid.mjs.map +1 -1
  483. package/dist/{index-DHXVOH8h.d.cts → index-CFkMqHvX.d.cts} +1 -2
  484. package/dist/{index-DMaPyx9O.d.mts → index-C_3Y_s6f.d.mts} +1 -2
  485. package/dist/index.all.cjs +641 -1
  486. package/dist/index.all.d.cts +1 -1
  487. package/dist/index.all.d.mts +1 -1
  488. package/dist/index.all.mjs +113 -1
  489. package/dist/index.browser.cjs +576 -1
  490. package/dist/index.browser.d.cts +1 -1
  491. package/dist/index.browser.d.mts +1 -1
  492. package/dist/index.browser.mjs +98 -1
  493. package/dist/index.jsr.cjs +57 -1
  494. package/dist/index.jsr.mjs +6 -1
  495. package/dist/index.node.cjs +628 -1
  496. package/dist/index.node.d.cts +1 -1
  497. package/dist/index.node.d.mts +1 -1
  498. package/dist/index.node.mjs +106 -1
  499. package/dist/node/args.cjs +56 -1
  500. package/dist/node/args.cjs.map +1 -1
  501. package/dist/node/args.mjs +53 -1
  502. package/dist/node/args.mjs.map +1 -1
  503. package/dist/node/clipboard.cjs +18 -1
  504. package/dist/node/clipboard.cjs.map +1 -1
  505. package/dist/node/clipboard.mjs +16 -1
  506. package/dist/node/clipboard.mjs.map +1 -1
  507. package/dist/node/crypto.cjs +28 -1
  508. package/dist/node/crypto.cjs.map +1 -1
  509. package/dist/node/crypto.mjs +24 -1
  510. package/dist/node/crypto.mjs.map +1 -1
  511. package/dist/node/env.cjs +100 -4
  512. package/dist/node/env.cjs.map +1 -1
  513. package/dist/node/env.mjs +90 -4
  514. package/dist/node/env.mjs.map +1 -1
  515. package/dist/node/files-async.cjs +66 -1
  516. package/dist/node/files-async.cjs.map +1 -1
  517. package/dist/node/files-async.mjs +60 -1
  518. package/dist/node/files-async.mjs.map +1 -1
  519. package/dist/node/files.cjs +52 -1
  520. package/dist/node/files.cjs.map +1 -1
  521. package/dist/node/files.mjs +46 -1
  522. package/dist/node/files.mjs.map +1 -1
  523. package/dist/node/filestorage.cjs +100 -1
  524. package/dist/node/filestorage.cjs.map +1 -1
  525. package/dist/node/filestorage.mjs +97 -1
  526. package/dist/node/filestorage.mjs.map +1 -1
  527. package/dist/node/fs.cjs +119 -1
  528. package/dist/node/fs.cjs.map +1 -1
  529. package/dist/node/fs.mjs +101 -1
  530. package/dist/node/fs.mjs.map +1 -1
  531. package/dist/node/glob.cjs +75 -1
  532. package/dist/node/glob.cjs.map +1 -1
  533. package/dist/node/glob.mjs +73 -1
  534. package/dist/node/glob.mjs.map +1 -1
  535. package/dist/node/index.cjs +66 -1
  536. package/dist/node/index.mjs +16 -1
  537. package/dist/node/log/index.cjs +20 -1
  538. package/dist/node/log/index.mjs +7 -1
  539. package/dist/node/log/log-context-node.cjs +39 -1
  540. package/dist/node/log/log-context-node.cjs.map +1 -1
  541. package/dist/node/log/log-context-node.mjs +35 -1
  542. package/dist/node/log/log-context-node.mjs.map +1 -1
  543. package/dist/node/log/log-file-rotation.cjs +71 -1
  544. package/dist/node/log/log-file-rotation.cjs.map +1 -1
  545. package/dist/node/log/log-file-rotation.mjs +68 -1
  546. package/dist/node/log/log-file-rotation.mjs.map +1 -1
  547. package/dist/node/log/log-file.cjs +57 -1
  548. package/dist/node/log/log-file.cjs.map +1 -1
  549. package/dist/node/log/log-file.mjs +54 -1
  550. package/dist/node/log/log-file.mjs.map +1 -1
  551. package/dist/node/log/log-node.cjs +162 -1
  552. package/dist/node/log/log-node.cjs.map +1 -1
  553. package/dist/node/log/log-node.mjs +155 -1
  554. package/dist/node/log/log-node.mjs.map +1 -1
  555. package/dist/node/log/log-rotation.cjs +543 -3
  556. package/dist/node/log/log-rotation.cjs.map +1 -1
  557. package/dist/node/log/log-rotation.mjs +538 -3
  558. package/dist/node/log/log-rotation.mjs.map +1 -1
  559. package/dist/node/log/log-util.cjs +69 -3
  560. package/dist/node/log/log-util.cjs.map +1 -1
  561. package/dist/node/log/log-util.mjs +63 -3
  562. package/dist/node/log/log-util.mjs.map +1 -1
  563. package/dist/node/open-browser.cjs +20 -1
  564. package/dist/node/open-browser.cjs.map +1 -1
  565. package/dist/node/open-browser.mjs +18 -1
  566. package/dist/node/open-browser.mjs.map +1 -1
  567. package/package.json +15 -15
  568. package/src/common/schema/README.md +247 -66
  569. package/src/eslint-defaults.js +4 -0
  570. package/src/index.spec.ts +6 -6
  571. package/dist/bin-Ce3i6ABn.cjs +0 -3
  572. package/dist/bin-SPdenYkw.mjs +0 -3
  573. package/dist/chunk-0Lt9GpW0.mjs +0 -1
  574. package/dist/chunk-D-qHiVGv.cjs +0 -1
  575. package/src/common/schema/README-SCHEMA.md +0 -0
@@ -1,2 +1,126 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../log/log-base.cjs`);const e=require(`../log/log.cjs`),t=require(`../msg/emitter.cjs`),n=require(`../uuid.cjs`);var r=class extends t.Emitter{queue=[];waitToFinish=[];currentTask;log;countMax=0;countResolved=0;paused=!1;name;constructor(t={}){super();let{name:r=n.uname(`queue`),logLevel:i}=t;this.name=r,this.log=e.DefaultLogger(`zeed:queue:${r}`,i??9007199254740991)}async performNext(){if(this.log(`performNext, queue.length =`,this.queue.length),this.currentTask!=null){this.log(`performNext => skip while another task is running`);return}if(this.paused){this.log(`performNext => skip while is paused`);return}for(;this.currentTask==null&&!this.paused;){let e=this.queue.shift();if(this.log(`performNext => ${e?.name}`),e==null)break;this.countResolved===0&&this.emit(`didStart`,this.countMax);let{name:t,task:n,resolve:r}=e;this.currentTask=n();let i;try{this.log.info(`start task ${t}`),i=await this.currentTask,this.log(`finished task ${t} with result =`,i)}catch(e){this.log.warn(`Error performing task`,e)}r(i),this.currentTask=void 0,this.countResolved+=1,this.emit(`didUpdate`,this.countMax,this.countResolved)}for(this.queue.length===0&&(this.emit(`didFinish`),this.countMax=0,this.countResolved=0);this.waitToFinish.length>0;)this.waitToFinish.shift()()}async enqueue(e,t={}){let{immediate:r=!1,name:i=n.uname(this.name)}=t;return r?(this.log.info(`immediate execution ${i}`),await e()):(this.log(`enqueue ${i}`),new Promise(t=>{this.queue.push({name:i,task:e,resolve:t}),this.countMax+=1,this.emit(`didUpdate`,this.countMax,this.countResolved),this.performNext()}))}async enqueueReentrant(e,t={}){return this.enqueue(e,{immediate:this.currentTask!=null,name:t.name})}async cancelAll(e=!0){this.log(`cancelAll`),this.emit(`didCancel`);let t=this.queue.map(e=>e.resolve);this.queue=[],t.forEach(e=>e(void 0)),await this.wait()}async pause(){this.log(`pause`),this.paused=!0,await this.wait()}resume(){this.log(`resume`),this.paused=!1,this.performNext()}async wait(){if(this.log(`wait`),!(this.currentTask==null&&(this.queue.length===0||this.paused)))return new Promise(e=>{this.waitToFinish.push(e)})}get isPaused(){return this.paused}get hasTasks(){return this.queue.length!==0}};exports.SerialQueue=r;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_common_log_log_base = require('../log/log-base.cjs');
3
+ const require_common_log_log = require('../log/log.cjs');
4
+ const require_common_msg_emitter = require('../msg/emitter.cjs');
5
+ const require_common_uuid = require('../uuid.cjs');
6
+
7
+ //#region src/common/exec/queue.ts
8
+ /** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */
9
+ var SerialQueue = class extends require_common_msg_emitter.Emitter {
10
+ queue = [];
11
+ waitToFinish = [];
12
+ currentTask;
13
+ log;
14
+ countMax = 0;
15
+ countResolved = 0;
16
+ paused = false;
17
+ name;
18
+ constructor(opt = {}) {
19
+ super();
20
+ const { name = require_common_uuid.uname("queue"), logLevel } = opt;
21
+ this.name = name;
22
+ this.log = require_common_log_log.DefaultLogger(`zeed:queue:${name}`, logLevel ?? 9007199254740991);
23
+ }
24
+ async performNext() {
25
+ this.log("performNext, queue.length =", this.queue.length);
26
+ if (this.currentTask != null) {
27
+ this.log("performNext => skip while another task is running");
28
+ return;
29
+ }
30
+ if (this.paused) {
31
+ this.log("performNext => skip while is paused");
32
+ return;
33
+ }
34
+ while (this.currentTask == null && !this.paused) {
35
+ const info = this.queue.shift();
36
+ this.log(`performNext => ${info?.name}`);
37
+ if (info == null) break;
38
+ if (this.countResolved === 0) this.emit("didStart", this.countMax);
39
+ const { name, task, resolve } = info;
40
+ this.currentTask = task();
41
+ let result;
42
+ try {
43
+ this.log.info(`start task ${name}`);
44
+ result = await this.currentTask;
45
+ this.log(`finished task ${name} with result =`, result);
46
+ } catch (err) {
47
+ this.log.warn("Error performing task", err);
48
+ }
49
+ resolve(result);
50
+ this.currentTask = void 0;
51
+ this.countResolved += 1;
52
+ this.emit("didUpdate", this.countMax, this.countResolved);
53
+ }
54
+ if (this.queue.length === 0) {
55
+ this.emit("didFinish");
56
+ this.countMax = 0;
57
+ this.countResolved = 0;
58
+ }
59
+ while (this.waitToFinish.length > 0) this.waitToFinish.shift()();
60
+ }
61
+ /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */
62
+ async enqueue(task, opt = {}) {
63
+ const { immediate = false, name = require_common_uuid.uname(this.name) } = opt;
64
+ if (immediate) {
65
+ this.log.info(`immediate execution ${name}`);
66
+ return await task();
67
+ }
68
+ this.log(`enqueue ${name}`);
69
+ return new Promise((resolve) => {
70
+ this.queue.push({
71
+ name,
72
+ task,
73
+ resolve
74
+ });
75
+ this.countMax += 1;
76
+ this.emit("didUpdate", this.countMax, this.countResolved);
77
+ this.performNext();
78
+ });
79
+ }
80
+ /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */
81
+ async enqueueReentrant(task, opt = {}) {
82
+ return this.enqueue(task, {
83
+ immediate: this.currentTask != null,
84
+ name: opt.name
85
+ });
86
+ }
87
+ /** Remove all tasks from queue that are not yet executing. */
88
+ async cancelAll(_unblock = true) {
89
+ this.log("cancelAll");
90
+ this.emit("didCancel");
91
+ const resolver = this.queue.map((task) => task.resolve);
92
+ this.queue = [];
93
+ resolver.forEach((r) => r(void 0));
94
+ await this.wait();
95
+ }
96
+ /** Pause execution after current task is finished. */
97
+ async pause() {
98
+ this.log("pause");
99
+ this.paused = true;
100
+ await this.wait();
101
+ }
102
+ /** Resume paused queue. */
103
+ resume() {
104
+ this.log("resume");
105
+ this.paused = false;
106
+ this.performNext();
107
+ }
108
+ /** Wait for all tasks to finish */
109
+ async wait() {
110
+ this.log("wait");
111
+ if (this.currentTask == null && (this.queue.length === 0 || this.paused)) return;
112
+ return new Promise((resolve) => {
113
+ this.waitToFinish.push(resolve);
114
+ });
115
+ }
116
+ get isPaused() {
117
+ return this.paused;
118
+ }
119
+ get hasTasks() {
120
+ return this.queue.length !== 0;
121
+ }
122
+ };
123
+
124
+ //#endregion
125
+ exports.SerialQueue = SerialQueue;
2
126
  //# sourceMappingURL=queue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"queue.cjs","names":["Emitter","uname","DefaultLogger"],"sources":["../../../src/common/exec/queue.ts"],"sourcesContent":["// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport type { LoggerInterface, LogLevel } from '../log/log-base'\nimport { DefaultLogger } from '../log/log'\nimport { LogLevelOff } from '../log/log-base'\nimport { Emitter } from '../msg/emitter'\nimport { uname } from '../uuid'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate: (max: number, resolved: number) => void\n didStart: (max: number) => void\n didCancel: () => void\n didFinish: () => void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string, logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = DefaultLogger(`zeed:queue:${name}`, logLevel ?? LogLevelOff)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean, name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"queue.cjs","names":["Emitter","uname","DefaultLogger"],"sources":["../../../src/common/exec/queue.ts"],"sourcesContent":["// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport type { LoggerInterface, LogLevel } from '../log/log-base'\nimport { DefaultLogger } from '../log/log'\nimport { LogLevelOff } from '../log/log-base'\nimport { Emitter } from '../msg/emitter'\nimport { uname } from '../uuid'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate: (max: number, resolved: number) => void\n didStart: (max: number) => void\n didCancel: () => void\n didFinish: () => void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string, logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = DefaultLogger(`zeed:queue:${name}`, logLevel ?? LogLevelOff)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean, name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { n as TaskEvents, r as TaskFn, t as SerialQueue } from "../../index-DHXVOH8h.cjs";
1
+ import { n as TaskEvents, r as TaskFn, t as SerialQueue } from "../../index-CFkMqHvX.cjs";
2
2
  export { SerialQueue, TaskEvents, TaskFn };
@@ -1,2 +1,2 @@
1
- import { n as TaskEvents, r as TaskFn, t as SerialQueue } from "../../index-DMaPyx9O.mjs";
1
+ import { n as TaskEvents, r as TaskFn, t as SerialQueue } from "../../index-C_3Y_s6f.mjs";
2
2
  export { SerialQueue, TaskEvents, TaskFn };
@@ -1,2 +1,125 @@
1
- import"../log/log-base.mjs";import{DefaultLogger as e}from"../log/log.mjs";import{Emitter as t}from"../msg/emitter.mjs";import{uname as n}from"../uuid.mjs";var r=class extends t{queue=[];waitToFinish=[];currentTask;log;countMax=0;countResolved=0;paused=!1;name;constructor(t={}){super();let{name:r=n(`queue`),logLevel:i}=t;this.name=r,this.log=e(`zeed:queue:${r}`,i??9007199254740991)}async performNext(){if(this.log(`performNext, queue.length =`,this.queue.length),this.currentTask!=null){this.log(`performNext => skip while another task is running`);return}if(this.paused){this.log(`performNext => skip while is paused`);return}for(;this.currentTask==null&&!this.paused;){let e=this.queue.shift();if(this.log(`performNext => ${e?.name}`),e==null)break;this.countResolved===0&&this.emit(`didStart`,this.countMax);let{name:t,task:n,resolve:r}=e;this.currentTask=n();let i;try{this.log.info(`start task ${t}`),i=await this.currentTask,this.log(`finished task ${t} with result =`,i)}catch(e){this.log.warn(`Error performing task`,e)}r(i),this.currentTask=void 0,this.countResolved+=1,this.emit(`didUpdate`,this.countMax,this.countResolved)}for(this.queue.length===0&&(this.emit(`didFinish`),this.countMax=0,this.countResolved=0);this.waitToFinish.length>0;)this.waitToFinish.shift()()}async enqueue(e,t={}){let{immediate:r=!1,name:i=n(this.name)}=t;return r?(this.log.info(`immediate execution ${i}`),await e()):(this.log(`enqueue ${i}`),new Promise(t=>{this.queue.push({name:i,task:e,resolve:t}),this.countMax+=1,this.emit(`didUpdate`,this.countMax,this.countResolved),this.performNext()}))}async enqueueReentrant(e,t={}){return this.enqueue(e,{immediate:this.currentTask!=null,name:t.name})}async cancelAll(e=!0){this.log(`cancelAll`),this.emit(`didCancel`);let t=this.queue.map(e=>e.resolve);this.queue=[],t.forEach(e=>e(void 0)),await this.wait()}async pause(){this.log(`pause`),this.paused=!0,await this.wait()}resume(){this.log(`resume`),this.paused=!1,this.performNext()}async wait(){if(this.log(`wait`),!(this.currentTask==null&&(this.queue.length===0||this.paused)))return new Promise(e=>{this.waitToFinish.push(e)})}get isPaused(){return this.paused}get hasTasks(){return this.queue.length!==0}};export{r as SerialQueue};
1
+ import { LogLevelOff } from "../log/log-base.mjs";
2
+ import { DefaultLogger } from "../log/log.mjs";
3
+ import { Emitter } from "../msg/emitter.mjs";
4
+ import { uname } from "../uuid.mjs";
5
+
6
+ //#region src/common/exec/queue.ts
7
+ /** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */
8
+ var SerialQueue = class extends Emitter {
9
+ queue = [];
10
+ waitToFinish = [];
11
+ currentTask;
12
+ log;
13
+ countMax = 0;
14
+ countResolved = 0;
15
+ paused = false;
16
+ name;
17
+ constructor(opt = {}) {
18
+ super();
19
+ const { name = uname("queue"), logLevel } = opt;
20
+ this.name = name;
21
+ this.log = DefaultLogger(`zeed:queue:${name}`, logLevel ?? 9007199254740991);
22
+ }
23
+ async performNext() {
24
+ this.log("performNext, queue.length =", this.queue.length);
25
+ if (this.currentTask != null) {
26
+ this.log("performNext => skip while another task is running");
27
+ return;
28
+ }
29
+ if (this.paused) {
30
+ this.log("performNext => skip while is paused");
31
+ return;
32
+ }
33
+ while (this.currentTask == null && !this.paused) {
34
+ const info = this.queue.shift();
35
+ this.log(`performNext => ${info?.name}`);
36
+ if (info == null) break;
37
+ if (this.countResolved === 0) this.emit("didStart", this.countMax);
38
+ const { name, task, resolve } = info;
39
+ this.currentTask = task();
40
+ let result;
41
+ try {
42
+ this.log.info(`start task ${name}`);
43
+ result = await this.currentTask;
44
+ this.log(`finished task ${name} with result =`, result);
45
+ } catch (err) {
46
+ this.log.warn("Error performing task", err);
47
+ }
48
+ resolve(result);
49
+ this.currentTask = void 0;
50
+ this.countResolved += 1;
51
+ this.emit("didUpdate", this.countMax, this.countResolved);
52
+ }
53
+ if (this.queue.length === 0) {
54
+ this.emit("didFinish");
55
+ this.countMax = 0;
56
+ this.countResolved = 0;
57
+ }
58
+ while (this.waitToFinish.length > 0) this.waitToFinish.shift()();
59
+ }
60
+ /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */
61
+ async enqueue(task, opt = {}) {
62
+ const { immediate = false, name = uname(this.name) } = opt;
63
+ if (immediate) {
64
+ this.log.info(`immediate execution ${name}`);
65
+ return await task();
66
+ }
67
+ this.log(`enqueue ${name}`);
68
+ return new Promise((resolve) => {
69
+ this.queue.push({
70
+ name,
71
+ task,
72
+ resolve
73
+ });
74
+ this.countMax += 1;
75
+ this.emit("didUpdate", this.countMax, this.countResolved);
76
+ this.performNext();
77
+ });
78
+ }
79
+ /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */
80
+ async enqueueReentrant(task, opt = {}) {
81
+ return this.enqueue(task, {
82
+ immediate: this.currentTask != null,
83
+ name: opt.name
84
+ });
85
+ }
86
+ /** Remove all tasks from queue that are not yet executing. */
87
+ async cancelAll(_unblock = true) {
88
+ this.log("cancelAll");
89
+ this.emit("didCancel");
90
+ const resolver = this.queue.map((task) => task.resolve);
91
+ this.queue = [];
92
+ resolver.forEach((r) => r(void 0));
93
+ await this.wait();
94
+ }
95
+ /** Pause execution after current task is finished. */
96
+ async pause() {
97
+ this.log("pause");
98
+ this.paused = true;
99
+ await this.wait();
100
+ }
101
+ /** Resume paused queue. */
102
+ resume() {
103
+ this.log("resume");
104
+ this.paused = false;
105
+ this.performNext();
106
+ }
107
+ /** Wait for all tasks to finish */
108
+ async wait() {
109
+ this.log("wait");
110
+ if (this.currentTask == null && (this.queue.length === 0 || this.paused)) return;
111
+ return new Promise((resolve) => {
112
+ this.waitToFinish.push(resolve);
113
+ });
114
+ }
115
+ get isPaused() {
116
+ return this.paused;
117
+ }
118
+ get hasTasks() {
119
+ return this.queue.length !== 0;
120
+ }
121
+ };
122
+
123
+ //#endregion
124
+ export { SerialQueue };
2
125
  //# sourceMappingURL=queue.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"queue.mjs","names":[],"sources":["../../../src/common/exec/queue.ts"],"sourcesContent":["// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport type { LoggerInterface, LogLevel } from '../log/log-base'\nimport { DefaultLogger } from '../log/log'\nimport { LogLevelOff } from '../log/log-base'\nimport { Emitter } from '../msg/emitter'\nimport { uname } from '../uuid'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate: (max: number, resolved: number) => void\n didStart: (max: number) => void\n didCancel: () => void\n didFinish: () => void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string, logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = DefaultLogger(`zeed:queue:${name}`, logLevel ?? LogLevelOff)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean, name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n"],"mappings":"4JA6BA,IAAa,EAAb,cAAiC,CAAoB,CACnD,MAA4B,EAAE,CAC9B,aAAuC,EAAE,CACzC,YACA,IACA,SAAmB,EACnB,cAAwB,EAExB,OAAiB,GAEjB,KAEA,YAAY,EAA8C,EAAE,CAAE,CAC5D,OAAO,CACP,GAAM,CAAE,OAAO,EAAM,QAAQ,CAAE,YAAa,EAC5C,KAAK,KAAO,EACZ,KAAK,IAAM,EAAc,cAAc,IAAQ,GAAA,iBAAwB,CAGzE,MAAc,aAAc,CAG1B,GAFA,KAAK,IAAI,8BAA+B,KAAK,MAAM,OAAO,CAEtD,KAAK,aAAe,KAAM,CAC5B,KAAK,IAAI,oDAAoD,CAC7D,OAGF,GAAI,KAAK,OAAQ,CACf,KAAK,IAAI,sCAAsC,CAC/C,OAGF,KAAO,KAAK,aAAe,MAAQ,CAAC,KAAK,QAAQ,CAC/C,IAAM,EAAO,KAAK,MAAM,OAAO,CAG/B,GAFA,KAAK,IAAI,kBAAkB,GAAM,OAAO,CAEpC,GAAQ,KACV,MAEE,KAAK,gBAAkB,GACpB,KAAK,KAAK,WAAY,KAAK,SAAS,CAE3C,GAAM,CAAE,OAAM,OAAM,WAAY,EAChC,KAAK,YAAc,GAAM,CACzB,IAAI,EACJ,GAAI,CACF,KAAK,IAAI,KAAK,cAAc,IAAO,CACnC,EAAS,MAAM,KAAK,YACpB,KAAK,IAAI,iBAAiB,EAAK,gBAAiB,EAAO,OAElD,EAAK,CACV,KAAK,IAAI,KAAK,wBAAyB,EAAI,CAG7C,EAAQ,EAAO,CACf,KAAK,YAAc,IAAA,GAEnB,KAAK,eAAiB,EACjB,KAAK,KAAK,YAAa,KAAK,SAAU,KAAK,cAAc,CAShE,IANI,KAAK,MAAM,SAAW,IACnB,KAAK,KAAK,YAAY,CAC3B,KAAK,SAAW,EAChB,KAAK,cAAgB,GAGhB,KAAK,aAAa,OAAS,GAChC,KAAK,aAAa,OAAO,EAAE,CAI/B,MAAM,QACJ,EACA,EAA8C,EAAE,CACpC,CACZ,GAAM,CAAE,YAAY,GAAO,OAAO,EAAM,KAAK,KAAK,EAAK,EAOvD,OANI,GACF,KAAK,IAAI,KAAK,uBAAuB,IAAO,CACrC,MAAM,GAAM,GAGrB,KAAK,IAAI,WAAW,IAAO,CACpB,IAAI,QAAS,GAAY,CAC9B,KAAK,MAAM,KAAK,CACd,OACA,OACA,UACD,CAAC,CAEF,KAAK,UAAY,EACZ,KAAK,KAAK,YAAa,KAAK,SAAU,KAAK,cAAc,CAEzD,KAAK,aAAa,EACvB,EAIJ,MAAM,iBACJ,EACA,EAAyB,EAAE,CACf,CACZ,OAAO,KAAK,QAAQ,EAAM,CACxB,UAAW,KAAK,aAAe,KAC/B,KAAM,EAAI,KACX,CAAC,CAIJ,MAAM,UAAU,EAAW,GAAM,CAC/B,KAAK,IAAI,YAAY,CAChB,KAAK,KAAK,YAAY,CAC3B,IAAM,EAAW,KAAK,MAAM,IAAI,GAAQ,EAAK,QAAQ,CACrD,KAAK,MAAQ,EAAE,CACf,EAAS,QAAQ,GAAK,EAAE,IAAA,GAAU,CAAC,CACnC,MAAM,KAAK,MAAM,CAInB,MAAM,OAAQ,CACZ,KAAK,IAAI,QAAQ,CACjB,KAAK,OAAS,GACd,MAAM,KAAK,MAAM,CAInB,QAAS,CACP,KAAK,IAAI,SAAS,CAClB,KAAK,OAAS,GACT,KAAK,aAAa,CAIzB,MAAM,MAAO,CACX,QAAK,IAAI,OAAO,CACZ,OAAK,aAAe,OAAS,KAAK,MAAM,SAAW,GAAK,KAAK,SAGjE,OAAO,IAAI,QAAS,GAAY,CAC9B,KAAK,aAAa,KAAK,EAAQ,EAC/B,CAGJ,IAAW,UAAoB,CAC7B,OAAO,KAAK,OAGd,IAAW,UAAoB,CAC7B,OAAO,KAAK,MAAM,SAAW"}
1
+ {"version":3,"file":"queue.mjs","names":[],"sources":["../../../src/common/exec/queue.ts"],"sourcesContent":["// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport type { LoggerInterface, LogLevel } from '../log/log-base'\nimport { DefaultLogger } from '../log/log'\nimport { LogLevelOff } from '../log/log-base'\nimport { Emitter } from '../msg/emitter'\nimport { uname } from '../uuid'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate: (max: number, resolved: number) => void\n didStart: (max: number) => void\n didCancel: () => void\n didFinish: () => void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string, logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = DefaultLogger(`zeed:queue:${name}`, logLevel ?? LogLevelOff)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean, name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,115 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./promise.cjs`);function t(e,t={}){let{delay:n=100,trailing:r=!0,leading:i=!0}=t,a,o=0,s=0,c;function l(){return a?(clearTimeout(a),a=void 0,!0):!1}function u(...t){let u=Date.now(),d=u-o,f=()=>{s=0,o=Date.now(),e.apply(this,t)};if(c=f,d>n||!a){i&&(d>n?f():++s);let e=d>n?n:n-d;l(),o=u,a=setTimeout(()=>{l(),r&&(!i||s>0)&&c?.()},e)}else ++s}return u.cancel=l,u.stop=()=>{l()&&c&&c()},u.immediate=async function(...t){l(),o=Date.now(),e.apply(this,t)},u.dispose=()=>u.stop(),u}function n(t,n={}){let{delay:r=100}=n,i,a=!1,o;function s(){i&&=(clearTimeout(i),void 0)}async function c(){try{if(s(),o!=null){let n=[...o];o=void 0,a=!0,await e.promisify(t(...n)),a=!1,o!=null&&(s(),i=setTimeout(c,r))}}catch{}}function l(...e){o=[...e],s(),a===!1&&(i=setTimeout(c,r))}async function u(...e){s(),o=[...e],await c()}return l.cancel=s,l.dispose=s,l.immediate=u,l}exports.debounce=n,exports.throttle=t;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_common_exec_promise = require('./promise.cjs');
3
+
4
+ //#region src/common/exec/throttle-debounce.ts
5
+ /**
6
+ * A special throttle implementation that tries to distribute execution
7
+ * in an optimal way.
8
+ *
9
+ * **Functionality:** For UI usage the function is executed on first occasion (`leading`).
10
+ * If more calls follow it will again be executed at end (`trailing`).
11
+ * If the next call is inside the timeframe, it is delayed until `trailing`.
12
+ * This avoids timewise too close calls.
13
+ * It is possible to `cancel` the timeout and to `flush` a call, e.g. if
14
+ * leaving UI situation where a final call is required to write data or similar.
15
+ */
16
+ function throttle(callback, opt = {}) {
17
+ const { delay = 100, trailing = true, leading = true } = opt;
18
+ let timeoutID;
19
+ let checkpoint = 0;
20
+ let visited = 0;
21
+ let trailingExec;
22
+ function clearExistingTimeout() {
23
+ if (timeoutID) {
24
+ clearTimeout(timeoutID);
25
+ timeoutID = void 0;
26
+ return true;
27
+ }
28
+ return false;
29
+ }
30
+ function wrapper(...args) {
31
+ const now = Date.now();
32
+ const elapsed = now - checkpoint;
33
+ const exec = () => {
34
+ visited = 0;
35
+ checkpoint = Date.now();
36
+ callback.apply(this, args);
37
+ };
38
+ trailingExec = exec;
39
+ if (elapsed > delay || !timeoutID) {
40
+ if (leading) if (elapsed > delay) exec();
41
+ else ++visited;
42
+ const timeout = elapsed > delay ? delay : delay - elapsed;
43
+ clearExistingTimeout();
44
+ checkpoint = now;
45
+ timeoutID = setTimeout(() => {
46
+ clearExistingTimeout();
47
+ if (trailing && (!leading || visited > 0)) trailingExec?.();
48
+ }, timeout);
49
+ } else ++visited;
50
+ }
51
+ wrapper.cancel = clearExistingTimeout;
52
+ wrapper.stop = () => {
53
+ if (clearExistingTimeout() && trailingExec) trailingExec();
54
+ };
55
+ wrapper.immediate = async function immediate(...args) {
56
+ clearExistingTimeout();
57
+ checkpoint = Date.now();
58
+ callback.apply(this, args);
59
+ };
60
+ wrapper.dispose = () => wrapper.stop();
61
+ return wrapper;
62
+ }
63
+ /**
64
+ * Debounce fits best for filtering a large peak of events.
65
+ * For UI event filtering throttle is probably a better choice.
66
+ *
67
+ * **Functionality:** It only fires after triggers pause for `delay` ms.
68
+ */
69
+ function debounce(callback, opt = {}) {
70
+ const { delay = 100 } = opt;
71
+ let timeoutID;
72
+ let running = false;
73
+ let lastArguments;
74
+ function clearExistingTimeout() {
75
+ if (timeoutID) {
76
+ clearTimeout(timeoutID);
77
+ timeoutID = void 0;
78
+ }
79
+ }
80
+ async function exec() {
81
+ try {
82
+ clearExistingTimeout();
83
+ if (lastArguments != null) {
84
+ const args = [...lastArguments];
85
+ lastArguments = void 0;
86
+ running = true;
87
+ await require_common_exec_promise.promisify(callback(...args));
88
+ running = false;
89
+ if (lastArguments != null) {
90
+ clearExistingTimeout();
91
+ timeoutID = setTimeout(exec, delay);
92
+ }
93
+ }
94
+ } catch (err) {}
95
+ }
96
+ function wrapper(...args) {
97
+ lastArguments = [...args];
98
+ clearExistingTimeout();
99
+ if (running === false) timeoutID = setTimeout(exec, delay);
100
+ }
101
+ async function immediate(...args) {
102
+ clearExistingTimeout();
103
+ lastArguments = [...args];
104
+ await exec();
105
+ }
106
+ wrapper.cancel = clearExistingTimeout;
107
+ wrapper.dispose = clearExistingTimeout;
108
+ wrapper.immediate = immediate;
109
+ return wrapper;
110
+ }
111
+
112
+ //#endregion
113
+ exports.debounce = debounce;
114
+ exports.throttle = throttle;
2
115
  //# sourceMappingURL=throttle-debounce.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"throttle-debounce.cjs","names":["promisify"],"sources":["../../../src/common/exec/throttle-debounce.ts"],"sourcesContent":["// General explaination https://css-tricks.com/debouncing-throttling-explained-examples/\n// From https://github.com/cowboy/jquery-throttle-debounce\n// And https://github.com/wuct/raf-throttle/blob/master/rafThrottle.js\n\nimport { promisify } from './promise'\n\n// const DEBUG = false\n// const log = DEBUG ? LoggerLazy('zeed:throttle', 'error') : () => {}\n\n/**\n * A special throttle implementation that tries to distribute execution\n * in an optimal way.\n *\n * **Functionality:** For UI usage the function is executed on first occasion (`leading`).\n * If more calls follow it will again be executed at end (`trailing`).\n * If the next call is inside the timeframe, it is delayed until `trailing`.\n * This avoids timewise too close calls.\n * It is possible to `cancel` the timeout and to `flush` a call, e.g. if\n * leaving UI situation where a final call is required to write data or similar.\n */\nexport function throttle<F extends (...args: any[]) => any>(\n callback: F,\n opt: {\n delay?: number\n trailing?: boolean\n leading?: boolean\n } = {},\n): F & {\n /** Stop all timers, do not exec nothing */\n cancel: () => void\n\n /** Stop all timers and execute right now. */\n immediate: (...args: Parameters<F>) => Promise<void>\n\n /** Stop all timers and execute trailing call, if exists. */\n stop: () => void\n\n dispose: () => void\n} {\n const { delay = 100, trailing = true, leading = true } = opt\n\n let timeoutID: any\n let checkpoint = 0\n let visited = 0\n let trailingExec: () => void | undefined\n\n // const debugCheckpoint = Date.now()\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n timeoutID = undefined\n return true\n }\n return false\n }\n\n function wrapper(this: any, ...args: any[]) {\n const now = Date.now()\n const elapsed = now - checkpoint\n\n // function debugElapsed() {\n // const dnow = Date.now()\n // return `total ${(dnow - debugCheckpoint).toFixed(1)}ms - elapsed ${(\n // dnow - checkpoint\n // ).toFixed(1)}ms - visited ${visited}x`\n // }\n\n const exec = () => {\n visited = 0\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n trailingExec = exec\n\n // Make sure enough time has passed since last call\n if (elapsed > delay || !timeoutID) {\n // DEBUG && log('elapsed', debugElapsed())\n\n // Leading execute once immediately\n if (leading) {\n if (elapsed > delay) {\n // DEBUG && log('🚀 leading', debugElapsed())\n exec()\n }\n else {\n ++visited // at least trigger trailing this way\n }\n }\n\n const timeout = elapsed > delay ? delay : delay - elapsed\n // log(`⏱ start timeout with ${timeout.toFixed(1)}ms`, debugElapsed())\n\n // Prepare for next round\n clearExistingTimeout()\n checkpoint = now\n\n // Delay. We should not get here if timeout has not been reached before\n timeoutID = setTimeout(() => {\n // DEBUG && log('⏱ reached timeout', debugElapsed())\n clearExistingTimeout()\n // Only execute on trailing or when visited again, but do not twice if leading\n if (trailing && (!leading || visited > 0)) {\n // DEBUG && log('🚀 trailing', debugElapsed())\n trailingExec?.()\n }\n }, timeout)\n }\n else {\n // Count visits\n ++visited\n // DEBUG && log('visited', debugElapsed())\n }\n }\n\n wrapper.cancel = clearExistingTimeout\n\n wrapper.stop = () => {\n if (clearExistingTimeout() && trailingExec)\n trailingExec()\n }\n\n wrapper.immediate = async function immediate(this: any, ...args: Parameters<F>[]) {\n clearExistingTimeout()\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n wrapper.dispose = () => wrapper.stop()\n\n return wrapper as any\n}\n\n/**\n * Debounce fits best for filtering a large peak of events.\n * For UI event filtering throttle is probably a better choice.\n *\n * **Functionality:** It only fires after triggers pause for `delay` ms.\n */\nexport function debounce<F extends (...args: any[]) => any | Promise<any>>(\n callback: F,\n opt: {\n delay?: number\n } = {},\n): F & {\n cancel: () => void\n immediate: (...args: Parameters<F>) => Promise<void>\n dispose: () => void\n} {\n const { delay = 100 } = opt\n let timeoutID: any\n let running = false\n let lastArguments: any[] | undefined\n\n function clearExistingTimeout() {\n if (timeoutID) {\n // log('clear')\n clearTimeout(timeoutID)\n timeoutID = undefined\n }\n }\n\n async function exec() {\n try {\n clearExistingTimeout()\n if (lastArguments != null) {\n // log('exec')\n const args = [...lastArguments]\n lastArguments = undefined\n running = true\n await promisify(callback(...args))\n running = false\n // log('exec done')\n if (lastArguments != null) {\n clearExistingTimeout()\n // log('exec trigger next')\n timeoutID = setTimeout(exec, delay)\n }\n }\n }\n catch (err) { }\n }\n\n function wrapper(this: any, ...args: any[]) {\n lastArguments = [...args]\n clearExistingTimeout()\n // log('trigger')\n if (running === false)\n timeoutID = setTimeout(exec, delay)\n }\n\n async function immediate(this: any, ...args: any[]) {\n clearExistingTimeout()\n lastArguments = [...args]\n await exec()\n }\n\n wrapper.cancel = clearExistingTimeout\n wrapper.dispose = clearExistingTimeout\n wrapper.immediate = immediate\n\n return wrapper as any\n}\n"],"mappings":"oGAoBA,SAAgB,EACd,EACA,EAII,EAAE,CAYN,CACA,GAAM,CAAE,QAAQ,IAAK,WAAW,GAAM,UAAU,IAAS,EAErD,EACA,EAAa,EACb,EAAU,EACV,EAIJ,SAAS,GAAuB,CAM9B,OALI,GACF,aAAa,EAAU,CACvB,EAAY,IAAA,GACL,IAEF,GAGT,SAAS,EAAmB,GAAG,EAAa,CAC1C,IAAM,EAAM,KAAK,KAAK,CAChB,EAAU,EAAM,EAShB,MAAa,CACjB,EAAU,EACV,EAAa,KAAK,KAAK,CACvB,EAAS,MAAM,KAAM,EAAK,EAM5B,GAHA,EAAe,EAGX,EAAU,GAAS,CAAC,EAAW,CAI7B,IACE,EAAU,EAEZ,GAAM,CAGN,EAAE,GAIN,IAAM,EAAU,EAAU,EAAQ,EAAQ,EAAQ,EAIlD,GAAsB,CACtB,EAAa,EAGb,EAAY,eAAiB,CAE3B,GAAsB,CAElB,IAAa,CAAC,GAAW,EAAU,IAErC,KAAgB,EAEjB,EAAQ,MAIX,EAAE,EAoBN,MAfA,GAAQ,OAAS,EAEjB,EAAQ,SAAa,CACf,GAAsB,EAAI,GAC5B,GAAc,EAGlB,EAAQ,UAAY,eAAoC,GAAG,EAAuB,CAChF,GAAsB,CACtB,EAAa,KAAK,KAAK,CACvB,EAAS,MAAM,KAAM,EAAK,EAG5B,EAAQ,YAAgB,EAAQ,MAAM,CAE/B,EAST,SAAgB,EACd,EACA,EAEI,EAAE,CAKN,CACA,GAAM,CAAE,QAAQ,KAAQ,EACpB,EACA,EAAU,GACV,EAEJ,SAAS,GAAuB,CAC9B,AAGE,KADA,aAAa,EAAU,CACX,IAAA,IAIhB,eAAe,GAAO,CACpB,GAAI,CAEF,GADA,GAAsB,CAClB,GAAiB,KAAM,CAEzB,IAAM,EAAO,CAAC,GAAG,EAAc,CAC/B,EAAgB,IAAA,GAChB,EAAU,GACV,MAAMA,EAAAA,UAAU,EAAS,GAAG,EAAK,CAAC,CAClC,EAAU,GAEN,GAAiB,OACnB,GAAsB,CAEtB,EAAY,WAAW,EAAM,EAAM,QAI7B,GAGd,SAAS,EAAmB,GAAG,EAAa,CAC1C,EAAgB,CAAC,GAAG,EAAK,CACzB,GAAsB,CAElB,IAAY,KACd,EAAY,WAAW,EAAM,EAAM,EAGvC,eAAe,EAAqB,GAAG,EAAa,CAClD,GAAsB,CACtB,EAAgB,CAAC,GAAG,EAAK,CACzB,MAAM,GAAM,CAOd,MAJA,GAAQ,OAAS,EACjB,EAAQ,QAAU,EAClB,EAAQ,UAAY,EAEb"}
1
+ {"version":3,"file":"throttle-debounce.cjs","names":["promisify"],"sources":["../../../src/common/exec/throttle-debounce.ts"],"sourcesContent":["// General explaination https://css-tricks.com/debouncing-throttling-explained-examples/\n// From https://github.com/cowboy/jquery-throttle-debounce\n// And https://github.com/wuct/raf-throttle/blob/master/rafThrottle.js\n\nimport { promisify } from './promise'\n\n// const DEBUG = false\n// const log = DEBUG ? LoggerLazy('zeed:throttle', 'error') : () => {}\n\n/**\n * A special throttle implementation that tries to distribute execution\n * in an optimal way.\n *\n * **Functionality:** For UI usage the function is executed on first occasion (`leading`).\n * If more calls follow it will again be executed at end (`trailing`).\n * If the next call is inside the timeframe, it is delayed until `trailing`.\n * This avoids timewise too close calls.\n * It is possible to `cancel` the timeout and to `flush` a call, e.g. if\n * leaving UI situation where a final call is required to write data or similar.\n */\nexport function throttle<F extends (...args: any[]) => any>(\n callback: F,\n opt: {\n delay?: number\n trailing?: boolean\n leading?: boolean\n } = {},\n): F & {\n /** Stop all timers, do not exec nothing */\n cancel: () => void\n\n /** Stop all timers and execute right now. */\n immediate: (...args: Parameters<F>) => Promise<void>\n\n /** Stop all timers and execute trailing call, if exists. */\n stop: () => void\n\n dispose: () => void\n} {\n const { delay = 100, trailing = true, leading = true } = opt\n\n let timeoutID: any\n let checkpoint = 0\n let visited = 0\n let trailingExec: () => void | undefined\n\n // const debugCheckpoint = Date.now()\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n timeoutID = undefined\n return true\n }\n return false\n }\n\n function wrapper(this: any, ...args: any[]) {\n const now = Date.now()\n const elapsed = now - checkpoint\n\n // function debugElapsed() {\n // const dnow = Date.now()\n // return `total ${(dnow - debugCheckpoint).toFixed(1)}ms - elapsed ${(\n // dnow - checkpoint\n // ).toFixed(1)}ms - visited ${visited}x`\n // }\n\n const exec = () => {\n visited = 0\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n trailingExec = exec\n\n // Make sure enough time has passed since last call\n if (elapsed > delay || !timeoutID) {\n // DEBUG && log('elapsed', debugElapsed())\n\n // Leading execute once immediately\n if (leading) {\n if (elapsed > delay) {\n // DEBUG && log('🚀 leading', debugElapsed())\n exec()\n }\n else {\n ++visited // at least trigger trailing this way\n }\n }\n\n const timeout = elapsed > delay ? delay : delay - elapsed\n // log(`⏱ start timeout with ${timeout.toFixed(1)}ms`, debugElapsed())\n\n // Prepare for next round\n clearExistingTimeout()\n checkpoint = now\n\n // Delay. We should not get here if timeout has not been reached before\n timeoutID = setTimeout(() => {\n // DEBUG && log('⏱ reached timeout', debugElapsed())\n clearExistingTimeout()\n // Only execute on trailing or when visited again, but do not twice if leading\n if (trailing && (!leading || visited > 0)) {\n // DEBUG && log('🚀 trailing', debugElapsed())\n trailingExec?.()\n }\n }, timeout)\n }\n else {\n // Count visits\n ++visited\n // DEBUG && log('visited', debugElapsed())\n }\n }\n\n wrapper.cancel = clearExistingTimeout\n\n wrapper.stop = () => {\n if (clearExistingTimeout() && trailingExec)\n trailingExec()\n }\n\n wrapper.immediate = async function immediate(this: any, ...args: Parameters<F>[]) {\n clearExistingTimeout()\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n wrapper.dispose = () => wrapper.stop()\n\n return wrapper as any\n}\n\n/**\n * Debounce fits best for filtering a large peak of events.\n * For UI event filtering throttle is probably a better choice.\n *\n * **Functionality:** It only fires after triggers pause for `delay` ms.\n */\nexport function debounce<F extends (...args: any[]) => any | Promise<any>>(\n callback: F,\n opt: {\n delay?: number\n } = {},\n): F & {\n cancel: () => void\n immediate: (...args: Parameters<F>) => Promise<void>\n dispose: () => void\n} {\n const { delay = 100 } = opt\n let timeoutID: any\n let running = false\n let lastArguments: any[] | undefined\n\n function clearExistingTimeout() {\n if (timeoutID) {\n // log('clear')\n clearTimeout(timeoutID)\n timeoutID = undefined\n }\n }\n\n async function exec() {\n try {\n clearExistingTimeout()\n if (lastArguments != null) {\n // log('exec')\n const args = [...lastArguments]\n lastArguments = undefined\n running = true\n await promisify(callback(...args))\n running = false\n // log('exec done')\n if (lastArguments != null) {\n clearExistingTimeout()\n // log('exec trigger next')\n timeoutID = setTimeout(exec, delay)\n }\n }\n }\n catch (err) { }\n }\n\n function wrapper(this: any, ...args: any[]) {\n lastArguments = [...args]\n clearExistingTimeout()\n // log('trigger')\n if (running === false)\n timeoutID = setTimeout(exec, delay)\n }\n\n async function immediate(this: any, ...args: any[]) {\n clearExistingTimeout()\n lastArguments = [...args]\n await exec()\n }\n\n wrapper.cancel = clearExistingTimeout\n wrapper.dispose = clearExistingTimeout\n wrapper.immediate = immediate\n\n return wrapper as any\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,SAAgB,SACd,UACA,MAII,EAAE,EAYN;CACA,MAAM,EAAE,QAAQ,KAAK,WAAW,MAAM,UAAU,SAAS;CAEzD,IAAI;CACJ,IAAI,aAAa;CACjB,IAAI,UAAU;CACd,IAAI;CAIJ,SAAS,uBAAuB;AAC9B,MAAI,WAAW;AACb,gBAAa,UAAU;AACvB,eAAY;AACZ,UAAO;;AAET,SAAO;;CAGT,SAAS,QAAmB,GAAG,MAAa;EAC1C,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,UAAU,MAAM;EAStB,MAAM,aAAa;AACjB,aAAU;AACV,gBAAa,KAAK,KAAK;AACvB,YAAS,MAAM,MAAM,KAAK;;AAG5B,iBAAe;AAGf,MAAI,UAAU,SAAS,CAAC,WAAW;AAIjC,OAAI,QACF,KAAI,UAAU,MAEZ,OAAM;OAGN,GAAE;GAIN,MAAM,UAAU,UAAU,QAAQ,QAAQ,QAAQ;AAIlD,yBAAsB;AACtB,gBAAa;AAGb,eAAY,iBAAiB;AAE3B,0BAAsB;AAEtB,QAAI,aAAa,CAAC,WAAW,UAAU,GAErC,iBAAgB;MAEjB,QAAQ;QAIX,GAAE;;AAKN,SAAQ,SAAS;AAEjB,SAAQ,aAAa;AACnB,MAAI,sBAAsB,IAAI,aAC5B,eAAc;;AAGlB,SAAQ,YAAY,eAAe,UAAqB,GAAG,MAAuB;AAChF,wBAAsB;AACtB,eAAa,KAAK,KAAK;AACvB,WAAS,MAAM,MAAM,KAAK;;AAG5B,SAAQ,gBAAgB,QAAQ,MAAM;AAEtC,QAAO;;;;;;;;AAST,SAAgB,SACd,UACA,MAEI,EAAE,EAKN;CACA,MAAM,EAAE,QAAQ,QAAQ;CACxB,IAAI;CACJ,IAAI,UAAU;CACd,IAAI;CAEJ,SAAS,uBAAuB;AAC9B,MAAI,WAAW;AAEb,gBAAa,UAAU;AACvB,eAAY;;;CAIhB,eAAe,OAAO;AACpB,MAAI;AACF,yBAAsB;AACtB,OAAI,iBAAiB,MAAM;IAEzB,MAAM,OAAO,CAAC,GAAG,cAAc;AAC/B,oBAAgB;AAChB,cAAU;AACV,UAAMA,sCAAU,SAAS,GAAG,KAAK,CAAC;AAClC,cAAU;AAEV,QAAI,iBAAiB,MAAM;AACzB,2BAAsB;AAEtB,iBAAY,WAAW,MAAM,MAAM;;;WAIlC,KAAK;;CAGd,SAAS,QAAmB,GAAG,MAAa;AAC1C,kBAAgB,CAAC,GAAG,KAAK;AACzB,wBAAsB;AAEtB,MAAI,YAAY,MACd,aAAY,WAAW,MAAM,MAAM;;CAGvC,eAAe,UAAqB,GAAG,MAAa;AAClD,wBAAsB;AACtB,kBAAgB,CAAC,GAAG,KAAK;AACzB,QAAM,MAAM;;AAGd,SAAQ,SAAS;AACjB,SAAQ,UAAU;AAClB,SAAQ,YAAY;AAEpB,QAAO"}
@@ -1,2 +1,113 @@
1
- import{promisify as e}from"./promise.mjs";function t(e,t={}){let{delay:n=100,trailing:r=!0,leading:i=!0}=t,a,o=0,s=0,c;function l(){return a?(clearTimeout(a),a=void 0,!0):!1}function u(...t){let u=Date.now(),d=u-o,f=()=>{s=0,o=Date.now(),e.apply(this,t)};if(c=f,d>n||!a){i&&(d>n?f():++s);let e=d>n?n:n-d;l(),o=u,a=setTimeout(()=>{l(),r&&(!i||s>0)&&c?.()},e)}else ++s}return u.cancel=l,u.stop=()=>{l()&&c&&c()},u.immediate=async function(...t){l(),o=Date.now(),e.apply(this,t)},u.dispose=()=>u.stop(),u}function n(t,n={}){let{delay:r=100}=n,i,a=!1,o;function s(){i&&=(clearTimeout(i),void 0)}async function c(){try{if(s(),o!=null){let n=[...o];o=void 0,a=!0,await e(t(...n)),a=!1,o!=null&&(s(),i=setTimeout(c,r))}}catch{}}function l(...e){o=[...e],s(),a===!1&&(i=setTimeout(c,r))}async function u(...e){s(),o=[...e],await c()}return l.cancel=s,l.dispose=s,l.immediate=u,l}export{n as debounce,t as throttle};
1
+ import { promisify } from "./promise.mjs";
2
+
3
+ //#region src/common/exec/throttle-debounce.ts
4
+ /**
5
+ * A special throttle implementation that tries to distribute execution
6
+ * in an optimal way.
7
+ *
8
+ * **Functionality:** For UI usage the function is executed on first occasion (`leading`).
9
+ * If more calls follow it will again be executed at end (`trailing`).
10
+ * If the next call is inside the timeframe, it is delayed until `trailing`.
11
+ * This avoids timewise too close calls.
12
+ * It is possible to `cancel` the timeout and to `flush` a call, e.g. if
13
+ * leaving UI situation where a final call is required to write data or similar.
14
+ */
15
+ function throttle(callback, opt = {}) {
16
+ const { delay = 100, trailing = true, leading = true } = opt;
17
+ let timeoutID;
18
+ let checkpoint = 0;
19
+ let visited = 0;
20
+ let trailingExec;
21
+ function clearExistingTimeout() {
22
+ if (timeoutID) {
23
+ clearTimeout(timeoutID);
24
+ timeoutID = void 0;
25
+ return true;
26
+ }
27
+ return false;
28
+ }
29
+ function wrapper(...args) {
30
+ const now = Date.now();
31
+ const elapsed = now - checkpoint;
32
+ const exec = () => {
33
+ visited = 0;
34
+ checkpoint = Date.now();
35
+ callback.apply(this, args);
36
+ };
37
+ trailingExec = exec;
38
+ if (elapsed > delay || !timeoutID) {
39
+ if (leading) if (elapsed > delay) exec();
40
+ else ++visited;
41
+ const timeout = elapsed > delay ? delay : delay - elapsed;
42
+ clearExistingTimeout();
43
+ checkpoint = now;
44
+ timeoutID = setTimeout(() => {
45
+ clearExistingTimeout();
46
+ if (trailing && (!leading || visited > 0)) trailingExec?.();
47
+ }, timeout);
48
+ } else ++visited;
49
+ }
50
+ wrapper.cancel = clearExistingTimeout;
51
+ wrapper.stop = () => {
52
+ if (clearExistingTimeout() && trailingExec) trailingExec();
53
+ };
54
+ wrapper.immediate = async function immediate(...args) {
55
+ clearExistingTimeout();
56
+ checkpoint = Date.now();
57
+ callback.apply(this, args);
58
+ };
59
+ wrapper.dispose = () => wrapper.stop();
60
+ return wrapper;
61
+ }
62
+ /**
63
+ * Debounce fits best for filtering a large peak of events.
64
+ * For UI event filtering throttle is probably a better choice.
65
+ *
66
+ * **Functionality:** It only fires after triggers pause for `delay` ms.
67
+ */
68
+ function debounce(callback, opt = {}) {
69
+ const { delay = 100 } = opt;
70
+ let timeoutID;
71
+ let running = false;
72
+ let lastArguments;
73
+ function clearExistingTimeout() {
74
+ if (timeoutID) {
75
+ clearTimeout(timeoutID);
76
+ timeoutID = void 0;
77
+ }
78
+ }
79
+ async function exec() {
80
+ try {
81
+ clearExistingTimeout();
82
+ if (lastArguments != null) {
83
+ const args = [...lastArguments];
84
+ lastArguments = void 0;
85
+ running = true;
86
+ await promisify(callback(...args));
87
+ running = false;
88
+ if (lastArguments != null) {
89
+ clearExistingTimeout();
90
+ timeoutID = setTimeout(exec, delay);
91
+ }
92
+ }
93
+ } catch (err) {}
94
+ }
95
+ function wrapper(...args) {
96
+ lastArguments = [...args];
97
+ clearExistingTimeout();
98
+ if (running === false) timeoutID = setTimeout(exec, delay);
99
+ }
100
+ async function immediate(...args) {
101
+ clearExistingTimeout();
102
+ lastArguments = [...args];
103
+ await exec();
104
+ }
105
+ wrapper.cancel = clearExistingTimeout;
106
+ wrapper.dispose = clearExistingTimeout;
107
+ wrapper.immediate = immediate;
108
+ return wrapper;
109
+ }
110
+
111
+ //#endregion
112
+ export { debounce, throttle };
2
113
  //# sourceMappingURL=throttle-debounce.mjs.map