@adviser/cement 0.5.2 → 0.5.4

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 (447) hide show
  1. package/cjs/base-basic-sys-abstraction.test.cjs +12 -13
  2. package/cjs/base-basic-sys-abstraction.test.cjs.map +1 -1
  3. package/cjs/bin2text.test.cjs +15 -14
  4. package/cjs/bin2text.test.cjs.map +1 -1
  5. package/cjs/coerce-binary.test.cjs +16 -15
  6. package/cjs/coerce-binary.test.cjs.map +1 -1
  7. package/cjs/crypto.test.cjs +9 -8
  8. package/cjs/crypto.test.cjs.map +1 -1
  9. package/cjs/future.test.cjs +12 -11
  10. package/cjs/future.test.cjs.map +1 -1
  11. package/cjs/http_header.test.cjs +13 -13
  12. package/cjs/http_header.test.cjs.map +1 -1
  13. package/cjs/index.cjs +3 -0
  14. package/cjs/index.cjs.map +1 -1
  15. package/cjs/index.d.ts +3 -0
  16. package/cjs/index.d.ts.map +1 -1
  17. package/cjs/is-json.test.cjs +59 -58
  18. package/cjs/is-json.test.cjs.map +1 -1
  19. package/cjs/is-promise.test.cjs +19 -19
  20. package/cjs/is-promise.test.cjs.map +1 -1
  21. package/cjs/json-en-decoder.test.cjs +13 -12
  22. package/cjs/json-en-decoder.test.cjs.map +1 -1
  23. package/cjs/keyed-ng.test.cjs +27 -26
  24. package/cjs/keyed-ng.test.cjs.map +1 -1
  25. package/cjs/logger.test.cjs +178 -179
  26. package/cjs/logger.test.cjs.map +1 -1
  27. package/cjs/lru-map-set.test.cjs +67 -66
  28. package/cjs/lru-map-set.test.cjs.map +1 -1
  29. package/cjs/mutable-url.test.cjs +44 -44
  30. package/cjs/mutable-url.test.cjs.map +1 -1
  31. package/cjs/node-fs/mock-file-service.test.cjs +7 -6
  32. package/cjs/node-fs/mock-file-service.test.cjs.map +1 -1
  33. package/cjs/node-fs/node-sys-abstraction.test.cjs +13 -12
  34. package/cjs/node-fs/node-sys-abstraction.test.cjs.map +1 -1
  35. package/cjs/on-func.cjs +15 -1
  36. package/cjs/on-func.cjs.map +1 -1
  37. package/cjs/on-func.d.ts +1 -0
  38. package/cjs/on-func.d.ts.map +1 -1
  39. package/cjs/on-func.test.cjs +62 -29
  40. package/cjs/on-func.test.cjs.map +1 -1
  41. package/cjs/on-func.test.d.ts.map +1 -1
  42. package/cjs/option.cjs +2 -2
  43. package/cjs/option.cjs.map +1 -1
  44. package/cjs/option.d.ts +1 -1
  45. package/cjs/option.d.ts.map +1 -1
  46. package/cjs/path-ops.test.cjs +40 -39
  47. package/cjs/path-ops.test.cjs.map +1 -1
  48. package/cjs/poller.test.cjs +51 -51
  49. package/cjs/poller.test.cjs.map +1 -1
  50. package/cjs/promise-sleep.test.cjs +35 -34
  51. package/cjs/promise-sleep.test.cjs.map +1 -1
  52. package/cjs/resolve-once.cjs +58 -39
  53. package/cjs/resolve-once.cjs.map +1 -1
  54. package/cjs/resolve-once.d.ts +32 -25
  55. package/cjs/resolve-once.d.ts.map +1 -1
  56. package/cjs/resolve-once.test.cjs +337 -309
  57. package/cjs/resolve-once.test.cjs.map +1 -1
  58. package/cjs/result.cjs +6 -0
  59. package/cjs/result.cjs.map +1 -1
  60. package/cjs/result.d.ts +2 -0
  61. package/cjs/result.d.ts.map +1 -1
  62. package/cjs/result.test.cjs +68 -44
  63. package/cjs/result.test.cjs.map +1 -1
  64. package/cjs/sys-env.test.cjs +67 -66
  65. package/cjs/sys-env.test.cjs.map +1 -1
  66. package/cjs/test/mock-logger.test.cjs +14 -13
  67. package/cjs/test/mock-logger.test.cjs.map +1 -1
  68. package/cjs/timeouted.cjs +13 -18
  69. package/cjs/timeouted.cjs.map +1 -1
  70. package/cjs/timeouted.d.ts +23 -27
  71. package/cjs/timeouted.d.ts.map +1 -1
  72. package/cjs/timeouted.test.cjs +337 -307
  73. package/cjs/timeouted.test.cjs.map +1 -1
  74. package/cjs/tracer.test.cjs +32 -31
  75. package/cjs/tracer.test.cjs.map +1 -1
  76. package/cjs/txt-en-decoder.test.cjs +31 -31
  77. package/cjs/txt-en-decoder.test.cjs.map +1 -1
  78. package/cjs/uri.test.cjs +239 -239
  79. package/cjs/uri.test.cjs.map +1 -1
  80. package/cjs/utils/consume.test.cjs +22 -22
  81. package/cjs/utils/consume.test.cjs.map +1 -1
  82. package/cjs/utils/rebuffer.test.cjs +40 -39
  83. package/cjs/utils/rebuffer.test.cjs.map +1 -1
  84. package/cjs/utils/relative-path.test.cjs +125 -124
  85. package/cjs/utils/relative-path.test.cjs.map +1 -1
  86. package/cjs/utils/sorted-object.test.cjs +8 -7
  87. package/cjs/utils/sorted-object.test.cjs.map +1 -1
  88. package/cjs/utils/stream-map.test.cjs +32 -31
  89. package/cjs/utils/stream-map.test.cjs.map +1 -1
  90. package/cjs/utils/stream2string.test.cjs +5 -5
  91. package/cjs/utils/stream2string.test.cjs.map +1 -1
  92. package/cjs/utils/string2stream.test.cjs +5 -5
  93. package/cjs/utils/string2stream.test.cjs.map +1 -1
  94. package/cjs/utils/stripper.test.cjs +21 -20
  95. package/cjs/utils/stripper.test.cjs.map +1 -1
  96. package/cjs/utils/to-sorted.d.ts +1 -1
  97. package/cjs/utils/to-sorted.d.ts.map +1 -1
  98. package/cjs/utils/to-sorted.test.cjs +27 -27
  99. package/cjs/utils/to-sorted.test.cjs.map +1 -1
  100. package/cjs/version.cjs +1 -1
  101. package/cjs/wait-for-value.cjs +49 -0
  102. package/cjs/wait-for-value.cjs.map +1 -0
  103. package/cjs/wait-for-value.d.ts +13 -0
  104. package/cjs/wait-for-value.d.ts.map +1 -0
  105. package/cjs/wait-for-value.test.cjs +86 -0
  106. package/cjs/wait-for-value.test.cjs.map +1 -0
  107. package/cjs/wait-for-value.test.d.ts +2 -0
  108. package/cjs/wait-for-value.test.d.ts.map +1 -0
  109. package/deno.json +1 -1
  110. package/esm/base-basic-sys-abstraction.test.js +1 -2
  111. package/esm/base-basic-sys-abstraction.test.js.map +1 -1
  112. package/esm/bin2text.test.js +2 -1
  113. package/esm/bin2text.test.js.map +1 -1
  114. package/esm/coerce-binary.test.js +1 -0
  115. package/esm/coerce-binary.test.js.map +1 -1
  116. package/esm/crypto.test.js +2 -1
  117. package/esm/crypto.test.js.map +1 -1
  118. package/esm/future.test.js +1 -0
  119. package/esm/future.test.js.map +1 -1
  120. package/esm/http_header.test.js +1 -1
  121. package/esm/http_header.test.js.map +1 -1
  122. package/esm/index.d.ts +3 -0
  123. package/esm/index.d.ts.map +1 -1
  124. package/esm/index.js +3 -0
  125. package/esm/index.js.map +1 -1
  126. package/esm/is-json.test.js +2 -1
  127. package/esm/is-json.test.js.map +1 -1
  128. package/esm/is-promise.test.js +2 -2
  129. package/esm/is-promise.test.js.map +1 -1
  130. package/esm/json-en-decoder.test.js +2 -1
  131. package/esm/json-en-decoder.test.js.map +1 -1
  132. package/esm/keyed-ng.test.js +8 -7
  133. package/esm/keyed-ng.test.js.map +1 -1
  134. package/esm/load-asset.test.js +2 -3
  135. package/esm/load-asset.test.js.map +1 -1
  136. package/esm/logger.test.js +2 -3
  137. package/esm/logger.test.js.map +1 -1
  138. package/esm/lru-map-set.test.js +1 -0
  139. package/esm/lru-map-set.test.js.map +1 -1
  140. package/esm/mutable-url.test.js +1 -1
  141. package/esm/mutable-url.test.js.map +1 -1
  142. package/esm/node-fs/mock-file-service.test.js +1 -0
  143. package/esm/node-fs/mock-file-service.test.js.map +1 -1
  144. package/esm/node-fs/node-sys-abstraction.test.js +1 -0
  145. package/esm/node-fs/node-sys-abstraction.test.js.map +1 -1
  146. package/esm/on-func.d.ts +1 -0
  147. package/esm/on-func.d.ts.map +1 -1
  148. package/esm/on-func.js +15 -1
  149. package/esm/on-func.js.map +1 -1
  150. package/esm/on-func.test.d.ts.map +1 -1
  151. package/esm/on-func.test.js +36 -3
  152. package/esm/on-func.test.js.map +1 -1
  153. package/esm/option.d.ts +1 -1
  154. package/esm/option.d.ts.map +1 -1
  155. package/esm/option.js +2 -2
  156. package/esm/option.js.map +1 -1
  157. package/esm/path-ops.test.js +2 -1
  158. package/esm/path-ops.test.js.map +1 -1
  159. package/esm/poller.test.js +2 -2
  160. package/esm/poller.test.js.map +1 -1
  161. package/esm/promise-sleep.test.js +2 -1
  162. package/esm/promise-sleep.test.js.map +1 -1
  163. package/esm/resolve-once.d.ts +32 -25
  164. package/esm/resolve-once.d.ts.map +1 -1
  165. package/esm/resolve-once.js +58 -39
  166. package/esm/resolve-once.js.map +1 -1
  167. package/esm/resolve-once.test.js +59 -31
  168. package/esm/resolve-once.test.js.map +1 -1
  169. package/esm/result.d.ts +2 -0
  170. package/esm/result.d.ts.map +1 -1
  171. package/esm/result.js +6 -0
  172. package/esm/result.js.map +1 -1
  173. package/esm/result.test.js +25 -1
  174. package/esm/result.test.js.map +1 -1
  175. package/esm/sys-env.test.js +1 -0
  176. package/esm/sys-env.test.js.map +1 -1
  177. package/esm/test/mock-logger.test.js +1 -0
  178. package/esm/test/mock-logger.test.js.map +1 -1
  179. package/esm/timeouted.d.ts +23 -27
  180. package/esm/timeouted.d.ts.map +1 -1
  181. package/esm/timeouted.js +13 -18
  182. package/esm/timeouted.js.map +1 -1
  183. package/esm/timeouted.test.js +33 -3
  184. package/esm/timeouted.test.js.map +1 -1
  185. package/esm/tracer.test.js +1 -0
  186. package/esm/tracer.test.js.map +1 -1
  187. package/esm/txt-en-decoder.test.js +2 -2
  188. package/esm/txt-en-decoder.test.js.map +1 -1
  189. package/esm/uri.test.js +2 -2
  190. package/esm/uri.test.js.map +1 -1
  191. package/esm/utils/consume.test.js +2 -2
  192. package/esm/utils/consume.test.js.map +1 -1
  193. package/esm/utils/rebuffer.test.js +2 -1
  194. package/esm/utils/rebuffer.test.js.map +1 -1
  195. package/esm/utils/relative-path.test.js +2 -1
  196. package/esm/utils/relative-path.test.js.map +1 -1
  197. package/esm/utils/sorted-object.test.js +2 -1
  198. package/esm/utils/sorted-object.test.js.map +1 -1
  199. package/esm/utils/stream-map.test.js +2 -1
  200. package/esm/utils/stream-map.test.js.map +1 -1
  201. package/esm/utils/stream2string.test.js +2 -2
  202. package/esm/utils/stream2string.test.js.map +1 -1
  203. package/esm/utils/string2stream.test.js +2 -2
  204. package/esm/utils/string2stream.test.js.map +1 -1
  205. package/esm/utils/stripper.test.js +2 -1
  206. package/esm/utils/stripper.test.js.map +1 -1
  207. package/esm/utils/to-sorted.d.ts +1 -1
  208. package/esm/utils/to-sorted.d.ts.map +1 -1
  209. package/esm/utils/to-sorted.test.js +2 -2
  210. package/esm/utils/to-sorted.test.js.map +1 -1
  211. package/esm/version.js +1 -1
  212. package/esm/wait-for-value.d.ts +13 -0
  213. package/esm/wait-for-value.d.ts.map +1 -0
  214. package/esm/wait-for-value.js +45 -0
  215. package/esm/wait-for-value.js.map +1 -0
  216. package/esm/wait-for-value.test.d.ts +2 -0
  217. package/esm/wait-for-value.test.d.ts.map +1 -0
  218. package/esm/wait-for-value.test.js +84 -0
  219. package/esm/wait-for-value.test.js.map +1 -0
  220. package/package.json +2 -2
  221. package/src/index.ts +3 -0
  222. package/src/on-func.ts +39 -1
  223. package/src/option.ts +2 -2
  224. package/src/resolve-once.ts +166 -139
  225. package/src/result.ts +7 -0
  226. package/src/timeouted.ts +39 -65
  227. package/src/utils/to-sorted.ts +1 -1
  228. package/src/wait-for-value.ts +111 -0
  229. package/ts/cjs/base-basic-sys-abstraction.test.js +12 -13
  230. package/ts/cjs/base-basic-sys-abstraction.test.js.map +1 -1
  231. package/ts/cjs/bin2text.test.js +15 -14
  232. package/ts/cjs/bin2text.test.js.map +1 -1
  233. package/ts/cjs/coerce-binary.test.js +16 -15
  234. package/ts/cjs/coerce-binary.test.js.map +1 -1
  235. package/ts/cjs/crypto.test.js +9 -8
  236. package/ts/cjs/crypto.test.js.map +1 -1
  237. package/ts/cjs/future.test.js +12 -11
  238. package/ts/cjs/future.test.js.map +1 -1
  239. package/ts/cjs/http_header.test.js +13 -13
  240. package/ts/cjs/http_header.test.js.map +1 -1
  241. package/ts/cjs/index.d.ts +3 -0
  242. package/ts/cjs/index.d.ts.map +1 -1
  243. package/ts/cjs/index.js +3 -0
  244. package/ts/cjs/index.js.map +1 -1
  245. package/ts/cjs/is-json.test.js +59 -58
  246. package/ts/cjs/is-json.test.js.map +1 -1
  247. package/ts/cjs/is-promise.test.js +19 -19
  248. package/ts/cjs/is-promise.test.js.map +1 -1
  249. package/ts/cjs/json-en-decoder.test.js +13 -12
  250. package/ts/cjs/json-en-decoder.test.js.map +1 -1
  251. package/ts/cjs/keyed-ng.test.js +27 -26
  252. package/ts/cjs/keyed-ng.test.js.map +1 -1
  253. package/ts/cjs/logger.test.js +178 -179
  254. package/ts/cjs/logger.test.js.map +1 -1
  255. package/ts/cjs/lru-map-set.test.js +67 -66
  256. package/ts/cjs/lru-map-set.test.js.map +1 -1
  257. package/ts/cjs/mutable-url.test.js +44 -44
  258. package/ts/cjs/mutable-url.test.js.map +1 -1
  259. package/ts/cjs/node-fs/mock-file-service.test.js +7 -6
  260. package/ts/cjs/node-fs/mock-file-service.test.js.map +1 -1
  261. package/ts/cjs/node-fs/node-sys-abstraction.test.js +13 -12
  262. package/ts/cjs/node-fs/node-sys-abstraction.test.js.map +1 -1
  263. package/ts/cjs/on-func.d.ts +1 -0
  264. package/ts/cjs/on-func.d.ts.map +1 -1
  265. package/ts/cjs/on-func.js +15 -1
  266. package/ts/cjs/on-func.js.map +1 -1
  267. package/ts/cjs/on-func.test.d.ts.map +1 -1
  268. package/ts/cjs/on-func.test.js +62 -29
  269. package/ts/cjs/on-func.test.js.map +1 -1
  270. package/ts/cjs/option.d.ts +1 -1
  271. package/ts/cjs/option.d.ts.map +1 -1
  272. package/ts/cjs/option.js +2 -2
  273. package/ts/cjs/option.js.map +1 -1
  274. package/ts/cjs/path-ops.test.js +40 -39
  275. package/ts/cjs/path-ops.test.js.map +1 -1
  276. package/ts/cjs/poller.test.js +51 -51
  277. package/ts/cjs/poller.test.js.map +1 -1
  278. package/ts/cjs/promise-sleep.test.js +35 -34
  279. package/ts/cjs/promise-sleep.test.js.map +1 -1
  280. package/ts/cjs/resolve-once.d.ts +32 -25
  281. package/ts/cjs/resolve-once.d.ts.map +1 -1
  282. package/ts/cjs/resolve-once.js +58 -39
  283. package/ts/cjs/resolve-once.js.map +1 -1
  284. package/ts/cjs/resolve-once.test.js +337 -309
  285. package/ts/cjs/resolve-once.test.js.map +1 -1
  286. package/ts/cjs/result.d.ts +2 -0
  287. package/ts/cjs/result.d.ts.map +1 -1
  288. package/ts/cjs/result.js +6 -0
  289. package/ts/cjs/result.js.map +1 -1
  290. package/ts/cjs/result.test.js +68 -44
  291. package/ts/cjs/result.test.js.map +1 -1
  292. package/ts/cjs/sys-env.test.js +67 -66
  293. package/ts/cjs/sys-env.test.js.map +1 -1
  294. package/ts/cjs/test/mock-logger.test.js +14 -13
  295. package/ts/cjs/test/mock-logger.test.js.map +1 -1
  296. package/ts/cjs/timeouted.d.ts +23 -27
  297. package/ts/cjs/timeouted.d.ts.map +1 -1
  298. package/ts/cjs/timeouted.js +13 -18
  299. package/ts/cjs/timeouted.js.map +1 -1
  300. package/ts/cjs/timeouted.test.js +337 -307
  301. package/ts/cjs/timeouted.test.js.map +1 -1
  302. package/ts/cjs/tracer.test.js +32 -31
  303. package/ts/cjs/tracer.test.js.map +1 -1
  304. package/ts/cjs/txt-en-decoder.test.js +31 -31
  305. package/ts/cjs/txt-en-decoder.test.js.map +1 -1
  306. package/ts/cjs/uri.test.js +239 -239
  307. package/ts/cjs/uri.test.js.map +1 -1
  308. package/ts/cjs/utils/consume.test.js +22 -22
  309. package/ts/cjs/utils/consume.test.js.map +1 -1
  310. package/ts/cjs/utils/rebuffer.test.js +40 -39
  311. package/ts/cjs/utils/rebuffer.test.js.map +1 -1
  312. package/ts/cjs/utils/relative-path.test.js +125 -124
  313. package/ts/cjs/utils/relative-path.test.js.map +1 -1
  314. package/ts/cjs/utils/sorted-object.test.js +8 -7
  315. package/ts/cjs/utils/sorted-object.test.js.map +1 -1
  316. package/ts/cjs/utils/stream-map.test.js +32 -31
  317. package/ts/cjs/utils/stream-map.test.js.map +1 -1
  318. package/ts/cjs/utils/stream2string.test.js +5 -5
  319. package/ts/cjs/utils/stream2string.test.js.map +1 -1
  320. package/ts/cjs/utils/string2stream.test.js +5 -5
  321. package/ts/cjs/utils/string2stream.test.js.map +1 -1
  322. package/ts/cjs/utils/stripper.test.js +21 -20
  323. package/ts/cjs/utils/stripper.test.js.map +1 -1
  324. package/ts/cjs/utils/to-sorted.d.ts +1 -1
  325. package/ts/cjs/utils/to-sorted.d.ts.map +1 -1
  326. package/ts/cjs/utils/to-sorted.test.js +27 -27
  327. package/ts/cjs/utils/to-sorted.test.js.map +1 -1
  328. package/ts/cjs/version.js +1 -1
  329. package/ts/cjs/wait-for-value.d.ts +13 -0
  330. package/ts/cjs/wait-for-value.d.ts.map +1 -0
  331. package/ts/cjs/wait-for-value.js +49 -0
  332. package/ts/cjs/wait-for-value.js.map +1 -0
  333. package/ts/cjs/wait-for-value.test.d.ts +2 -0
  334. package/ts/cjs/wait-for-value.test.d.ts.map +1 -0
  335. package/ts/cjs/wait-for-value.test.js +86 -0
  336. package/ts/cjs/wait-for-value.test.js.map +1 -0
  337. package/ts/esm/base-basic-sys-abstraction.test.js +1 -2
  338. package/ts/esm/base-basic-sys-abstraction.test.js.map +1 -1
  339. package/ts/esm/bin2text.test.js +2 -1
  340. package/ts/esm/bin2text.test.js.map +1 -1
  341. package/ts/esm/coerce-binary.test.js +1 -0
  342. package/ts/esm/coerce-binary.test.js.map +1 -1
  343. package/ts/esm/crypto.test.js +2 -1
  344. package/ts/esm/crypto.test.js.map +1 -1
  345. package/ts/esm/future.test.js +1 -0
  346. package/ts/esm/future.test.js.map +1 -1
  347. package/ts/esm/http_header.test.js +1 -1
  348. package/ts/esm/http_header.test.js.map +1 -1
  349. package/ts/esm/index.d.ts +3 -0
  350. package/ts/esm/index.d.ts.map +1 -1
  351. package/ts/esm/index.js +3 -0
  352. package/ts/esm/index.js.map +1 -1
  353. package/ts/esm/is-json.test.js +2 -1
  354. package/ts/esm/is-json.test.js.map +1 -1
  355. package/ts/esm/is-promise.test.js +2 -2
  356. package/ts/esm/is-promise.test.js.map +1 -1
  357. package/ts/esm/json-en-decoder.test.js +2 -1
  358. package/ts/esm/json-en-decoder.test.js.map +1 -1
  359. package/ts/esm/keyed-ng.test.js +8 -7
  360. package/ts/esm/keyed-ng.test.js.map +1 -1
  361. package/ts/esm/load-asset.test.js +2 -3
  362. package/ts/esm/load-asset.test.js.map +1 -1
  363. package/ts/esm/logger.test.js +2 -3
  364. package/ts/esm/logger.test.js.map +1 -1
  365. package/ts/esm/lru-map-set.test.js +1 -0
  366. package/ts/esm/lru-map-set.test.js.map +1 -1
  367. package/ts/esm/mutable-url.test.js +1 -1
  368. package/ts/esm/mutable-url.test.js.map +1 -1
  369. package/ts/esm/node-fs/mock-file-service.test.js +1 -0
  370. package/ts/esm/node-fs/mock-file-service.test.js.map +1 -1
  371. package/ts/esm/node-fs/node-sys-abstraction.test.js +1 -0
  372. package/ts/esm/node-fs/node-sys-abstraction.test.js.map +1 -1
  373. package/ts/esm/on-func.d.ts +1 -0
  374. package/ts/esm/on-func.d.ts.map +1 -1
  375. package/ts/esm/on-func.js +15 -1
  376. package/ts/esm/on-func.js.map +1 -1
  377. package/ts/esm/on-func.test.d.ts.map +1 -1
  378. package/ts/esm/on-func.test.js +36 -3
  379. package/ts/esm/on-func.test.js.map +1 -1
  380. package/ts/esm/option.d.ts +1 -1
  381. package/ts/esm/option.d.ts.map +1 -1
  382. package/ts/esm/option.js +2 -2
  383. package/ts/esm/option.js.map +1 -1
  384. package/ts/esm/path-ops.test.js +2 -1
  385. package/ts/esm/path-ops.test.js.map +1 -1
  386. package/ts/esm/poller.test.js +2 -2
  387. package/ts/esm/poller.test.js.map +1 -1
  388. package/ts/esm/promise-sleep.test.js +2 -1
  389. package/ts/esm/promise-sleep.test.js.map +1 -1
  390. package/ts/esm/resolve-once.d.ts +32 -25
  391. package/ts/esm/resolve-once.d.ts.map +1 -1
  392. package/ts/esm/resolve-once.js +58 -39
  393. package/ts/esm/resolve-once.js.map +1 -1
  394. package/ts/esm/resolve-once.test.js +59 -31
  395. package/ts/esm/resolve-once.test.js.map +1 -1
  396. package/ts/esm/result.d.ts +2 -0
  397. package/ts/esm/result.d.ts.map +1 -1
  398. package/ts/esm/result.js +6 -0
  399. package/ts/esm/result.js.map +1 -1
  400. package/ts/esm/result.test.js +25 -1
  401. package/ts/esm/result.test.js.map +1 -1
  402. package/ts/esm/sys-env.test.js +1 -0
  403. package/ts/esm/sys-env.test.js.map +1 -1
  404. package/ts/esm/test/mock-logger.test.js +1 -0
  405. package/ts/esm/test/mock-logger.test.js.map +1 -1
  406. package/ts/esm/timeouted.d.ts +23 -27
  407. package/ts/esm/timeouted.d.ts.map +1 -1
  408. package/ts/esm/timeouted.js +13 -18
  409. package/ts/esm/timeouted.js.map +1 -1
  410. package/ts/esm/timeouted.test.js +33 -3
  411. package/ts/esm/timeouted.test.js.map +1 -1
  412. package/ts/esm/tracer.test.js +1 -0
  413. package/ts/esm/tracer.test.js.map +1 -1
  414. package/ts/esm/txt-en-decoder.test.js +2 -2
  415. package/ts/esm/txt-en-decoder.test.js.map +1 -1
  416. package/ts/esm/uri.test.js +2 -2
  417. package/ts/esm/uri.test.js.map +1 -1
  418. package/ts/esm/utils/consume.test.js +2 -2
  419. package/ts/esm/utils/consume.test.js.map +1 -1
  420. package/ts/esm/utils/rebuffer.test.js +2 -1
  421. package/ts/esm/utils/rebuffer.test.js.map +1 -1
  422. package/ts/esm/utils/relative-path.test.js +2 -1
  423. package/ts/esm/utils/relative-path.test.js.map +1 -1
  424. package/ts/esm/utils/sorted-object.test.js +2 -1
  425. package/ts/esm/utils/sorted-object.test.js.map +1 -1
  426. package/ts/esm/utils/stream-map.test.js +2 -1
  427. package/ts/esm/utils/stream-map.test.js.map +1 -1
  428. package/ts/esm/utils/stream2string.test.js +2 -2
  429. package/ts/esm/utils/stream2string.test.js.map +1 -1
  430. package/ts/esm/utils/string2stream.test.js +2 -2
  431. package/ts/esm/utils/string2stream.test.js.map +1 -1
  432. package/ts/esm/utils/stripper.test.js +2 -1
  433. package/ts/esm/utils/stripper.test.js.map +1 -1
  434. package/ts/esm/utils/to-sorted.d.ts +1 -1
  435. package/ts/esm/utils/to-sorted.d.ts.map +1 -1
  436. package/ts/esm/utils/to-sorted.test.js +2 -2
  437. package/ts/esm/utils/to-sorted.test.js.map +1 -1
  438. package/ts/esm/version.js +1 -1
  439. package/ts/esm/wait-for-value.d.ts +13 -0
  440. package/ts/esm/wait-for-value.d.ts.map +1 -0
  441. package/ts/esm/wait-for-value.js +45 -0
  442. package/ts/esm/wait-for-value.js.map +1 -0
  443. package/ts/esm/wait-for-value.test.d.ts +2 -0
  444. package/ts/esm/wait-for-value.test.d.ts.map +1 -0
  445. package/ts/esm/wait-for-value.test.js +84 -0
  446. package/ts/esm/wait-for-value.test.js.map +1 -0
  447. package/tsconfig.json +1 -1
@@ -15,11 +15,13 @@
15
15
  */
16
16
 
17
17
  import { Future } from "./future.js";
18
- import { UnPromisify, isPromise } from "./is-promise.js";
18
+ import { isPromise } from "./is-promise.js";
19
19
  import { UnregFn } from "./lru-map-set.js";
20
20
  import { Result } from "./result.js";
21
21
  import { Option } from "./option.js";
22
22
  import { KeyedIf, KeyedNg, KeyedNgItem, KeyedNgItemWithoutValue, KeyedNgOptions } from "./keyed-ng.js";
23
+ import { runtimeFn } from "./runtime.js";
24
+ import { Writable } from "ts-essentials";
23
25
 
24
26
  /**
25
27
  * Internal item representing a queued function in a ResolveSeq sequence.
@@ -143,32 +145,57 @@ export class ResolveSeq<T, CTX extends NonNullable<object> = object> {
143
145
  type ResolveState = "initial" | "processed" | "waiting" | "processing";
144
146
 
145
147
  /**
146
- * Type helper that unwraps Promise types to their resolved value type.
148
+ * Type helper that awaits Promise types and passes through non-Promise types.
149
+ * This ensures that if a function returns a Promise<T>, the once method also returns Promise<T>,
150
+ * and if the function returns T (non-Promise), once returns T directly.
147
151
  *
148
- * @template R - The type to unwrap
152
+ * Uses the built-in Awaited utility type to properly handle nested Promises and thenable objects.
153
+ *
154
+ * @template R - The type to process
149
155
  *
150
156
  * @example
151
157
  * ```typescript
152
158
  * type A = ResultOnce<Promise<number>>; // Promise<number>
153
159
  * type B = ResultOnce<string>; // string
160
+ * type C = ResultOnce<number>; // number
161
+ * type D = ResultOnce<Promise<Promise<number>>>; // Promise<number>
154
162
  * ```
155
163
  */
156
- export type ResultOnce<R> = R extends Promise<infer T> ? Promise<T> : R;
164
+ export type ResultOnce<R> = R extends Promise<unknown> ? Promise<Awaited<R>> : R;
165
+
166
+ export interface OnceActionArg<R, CTX> {
167
+ readonly ctx: CTX;
168
+ readonly self: ResolveOnceIf<R, CTX>;
169
+ }
157
170
 
171
+ // export type OnceAction<R, CTX, RET> = (arg: OnceActionArg<R, CTX>) => RET extends Promise<R> ? Promise<R> : R;
158
172
  /**
159
173
  * Interface defining the contract for ResolveOnce-like objects.
160
174
  * @template R - The return type
161
175
  * @template CTX - Optional context type
162
176
  */
163
- export interface ResolveOnceIf<R, CTX = void> {
177
+ export interface ResolveOnceIf<R, CTX> {
164
178
  get ready(): boolean;
165
- get value(): UnPromisify<R> | undefined;
179
+ get value(): R | undefined;
166
180
  get error(): Error | undefined;
167
181
  get state(): ResolveState;
168
182
 
169
- once<R>(fn: (c?: CTX) => R): ResultOnce<R>;
170
- reset<R>(fn?: (c?: CTX) => R): ResultOnce<R>;
183
+ setResetAfter(ms?: number): void;
184
+
185
+ once<RET extends R | Promise<R>>(fn: (arg: OnceActionArg<R, CTX>) => RET): ResultOnce<RET>;
186
+ reset<RET extends R | Promise<R>>(fn?: (arg: OnceActionArg<R, CTX>) => RET): ResultOnce<RET>;
187
+
188
+ setProcessed(state: StateInstance): void;
189
+ }
190
+
191
+ export interface SyncOrAsyncIf<T> {
192
+ get value(): T | undefined;
193
+ get error(): Error | undefined;
194
+ get queueLength(): number;
195
+
196
+ resolve<RET extends T | Promise<T>>(fn: () => RET): ResultOnce<RET>;
171
197
  }
198
+ export type SyncOrAsync<T> = Option<SyncOrAsyncIf<T>>;
172
199
 
173
200
  /**
174
201
  * Synchronous version of ResolveOnce for functions that return non-promise values.
@@ -180,7 +207,7 @@ export interface ResolveOnceIf<R, CTX = void> {
180
207
  * @template CTX - Optional context type
181
208
  * @internal
182
209
  */
183
- export class SyncResolveOnce<T, CTX = void> {
210
+ export class SyncResolveOnce<T, CTX> implements SyncOrAsyncIf<T> {
184
211
  #value?: T;
185
212
  #error?: Error;
186
213
 
@@ -223,10 +250,10 @@ export class SyncResolveOnce<T, CTX = void> {
223
250
  * @returns The result of the function
224
251
  * @throws Error if the function returned a promise (use AsyncResolveOnce instead)
225
252
  */
226
- resolve(fn: (ctx?: CTX) => T): T {
253
+ resolve<RET extends T | Promise<T>>(fn: () => RET): ResultOnce<RET> {
227
254
  if (this.#state.isProcessing()) {
228
255
  try {
229
- this.#value = fn(this.#rOnce._ctx);
256
+ this.#value = fn() as unknown as T;
230
257
  } catch (e) {
231
258
  this.#error = e as Error;
232
259
  } finally {
@@ -240,23 +267,7 @@ export class SyncResolveOnce<T, CTX = void> {
240
267
  if (this.#error) {
241
268
  throw this.#error;
242
269
  }
243
- return this.#value as T;
244
- }
245
-
246
- /**
247
- * Resets the cached state, allowing the function to be executed again.
248
- *
249
- * @param fn - Optional function to execute immediately after reset
250
- * @returns The result if fn provided, undefined otherwise
251
- */
252
- reset(fn?: (c?: CTX) => T): T | undefined {
253
- this.#value = undefined;
254
- this.#error = undefined;
255
- if (fn) {
256
- this.#state.setProcessing();
257
- return this.resolve(fn);
258
- }
259
- return undefined as T;
270
+ return this.#value as ResultOnce<RET>;
260
271
  }
261
272
  }
262
273
 
@@ -267,19 +278,19 @@ export class SyncResolveOnce<T, CTX = void> {
267
278
  */
268
279
  class AsyncResolveItem<T, CTX> {
269
280
  readonly id: number = Math.random();
270
- readonly #toResolve: Promise<UnPromisify<T>>;
271
- #value: Option<UnPromisify<T>> = Option.None();
281
+ readonly #toResolve: Promise<T>;
282
+ #value: Option<T> = Option.None();
272
283
  #error?: Error;
273
284
  readonly #state: StateInstance;
274
- readonly #rOnce: ResolveOnce<T, CTX>;
285
+ readonly #rOnce: ResolveOnceIf<T, CTX>;
275
286
 
276
- constructor(fn: Promise<UnPromisify<T>>, rOnce: ResolveOnce<T, CTX>, state: StateInstance) {
287
+ constructor(fn: Promise<T>, rOnce: ResolveOnceIf<T, CTX>, state: StateInstance) {
277
288
  this.#toResolve = fn;
278
289
  this.#state = state;
279
290
  this.#rOnce = rOnce;
280
291
  }
281
292
 
282
- get value(): UnPromisify<T> | undefined {
293
+ get value(): T | undefined {
283
294
  return this.#value.IsSome() ? this.#value.unwrap() : undefined;
284
295
  }
285
296
 
@@ -287,7 +298,7 @@ class AsyncResolveItem<T, CTX> {
287
298
  return this.#error;
288
299
  }
289
300
 
290
- readonly #queue: Future<UnPromisify<T>>[] = [];
301
+ readonly #queue: Future<T>[] = [];
291
302
 
292
303
  get queuelength(): number {
293
304
  return this.#queue.length;
@@ -300,7 +311,7 @@ class AsyncResolveItem<T, CTX> {
300
311
  return this.#state.isProcessed() && this.#queue.length === 0;
301
312
  }
302
313
 
303
- #resolveFuture(future?: Future<UnPromisify<T>>): void {
314
+ #resolveFuture(future?: Future<T>): void {
304
315
  if (!future) {
305
316
  return;
306
317
  }
@@ -313,7 +324,7 @@ class AsyncResolveItem<T, CTX> {
313
324
  }
314
325
  }
315
326
 
316
- #promiseResult(): Promise<UnPromisify<T>> {
327
+ #promiseResult(): Promise<T> {
317
328
  if (this.#error) {
318
329
  return Promise.reject(this.#error);
319
330
  }
@@ -326,9 +337,9 @@ class AsyncResolveItem<T, CTX> {
326
337
  /**
327
338
  * Resolves the async operation, queuing the request if already in progress.
328
339
  */
329
- resolve(): T {
340
+ resolve<RET extends T | Promise<T>>(_fn: () => RET): ResultOnce<RET> {
330
341
  if (this.#state.isWaiting()) {
331
- const future = new Future<UnPromisify<T>>();
342
+ const future = new Future<T>();
332
343
  this.#queue.push(future);
333
344
  this.#toResolve
334
345
  .then((value) => {
@@ -344,11 +355,11 @@ class AsyncResolveItem<T, CTX> {
344
355
  this.#resolveFuture(this.#queue.shift());
345
356
  }
346
357
  });
347
- return future.asPromise() as T;
358
+ return future.asPromise() as ResultOnce<RET>;
348
359
  }
349
360
 
350
361
  if (this.#state.isProcessed()) {
351
- return this.#promiseResult() as T;
362
+ return this.#promiseResult() as ResultOnce<RET>;
352
363
  }
353
364
  // if (this.#state.isWaiting()) {
354
365
  // const future = new Future<UnPromisify<T>>();
@@ -371,23 +382,23 @@ class AsyncResolveItem<T, CTX> {
371
382
  * @internal
372
383
  */
373
384
 
374
- function isAsyncResolveOnce<T, CTX>(obj: SyncOrAsync<T, CTX>): obj is Option<AsyncResolveOnce<T, CTX>> {
385
+ function isAsyncResolveOnce<T, CTX>(obj: SyncOrAsync<T>): obj is Option<AsyncResolveOnce<T, CTX>> {
375
386
  return obj.IsSome() && obj.Unwrap() instanceof AsyncResolveOnce;
376
387
  }
377
388
 
378
- export class AsyncResolveOnce<T, CTX = void> {
389
+ export class AsyncResolveOnce<T, CTX> implements SyncOrAsyncIf<T> {
379
390
  // #state: ResolveState = "initial";
380
391
  readonly #state: StateInstance;
381
392
 
382
393
  readonly #queue: AsyncResolveItem<T, CTX>[];
383
394
 
384
- readonly #rOnce: ResolveOnce<T, CTX>;
385
- //readonly #ctx?: CTX;
386
- constructor(rOnce: ResolveOnce<T, CTX>, state: StateInstance, prev: SyncOrAsync<T, CTX>) {
395
+ readonly #rOnce: ResolveOnceIf<T, CTX>;
396
+ //readonly #ctx?: RET;
397
+ constructor(rOnce: ResolveOnceIf<T, CTX>, state: StateInstance, prev: SyncOrAsync<T>) {
387
398
  this.#state = state;
388
399
  this.#rOnce = rOnce;
389
400
  if (isAsyncResolveOnce(prev)) {
390
- this.#queue = [...prev.unwrap().#queue];
401
+ this.#queue = [...(prev.unwrap().#queue as AsyncResolveItem<T, CTX>[])];
391
402
  } else {
392
403
  this.#queue = [];
393
404
  }
@@ -411,7 +422,7 @@ export class AsyncResolveOnce<T, CTX = void> {
411
422
  /**
412
423
  * Gets the cached resolved value if available.
413
424
  */
414
- get value(): UnPromisify<T> | undefined {
425
+ get value(): T | undefined {
415
426
  if (this.#state.isInitial()) {
416
427
  return undefined;
417
428
  }
@@ -435,16 +446,16 @@ export class AsyncResolveOnce<T, CTX = void> {
435
446
  * @param fn - The async function to execute
436
447
  * @returns A promise that resolves to the function's result
437
448
  */
438
- resolve(fn: (ctx?: CTX) => T): T {
449
+ resolve<RET extends T | Promise<T>>(fn: () => RET): ResultOnce<RET> {
439
450
  if (this.#state.isProcessing()) {
440
451
  this.#state.setWaiting();
441
- let promiseResult: Promise<UnPromisify<T>>;
452
+ let promiseResult: Promise<T>;
442
453
  try {
443
- const couldBePromise = fn(this.#rOnce._ctx);
454
+ const couldBePromise = fn();
444
455
  if (!isPromise(couldBePromise)) {
445
- promiseResult = Promise.resolve(couldBePromise as UnPromisify<T>);
456
+ promiseResult = Promise.resolve(couldBePromise) as Promise<T>;
446
457
  } else {
447
- promiseResult = couldBePromise as Promise<UnPromisify<T>>;
458
+ promiseResult = couldBePromise as Promise<T>;
448
459
  }
449
460
  } catch (e) {
450
461
  promiseResult = Promise.reject(e as Error);
@@ -459,21 +470,7 @@ export class AsyncResolveOnce<T, CTX = void> {
459
470
  .reverse()
460
471
  .forEach((idx) => this.#queue.splice(idx, 1));
461
472
 
462
- return this.#active().resolve();
463
- }
464
-
465
- /**
466
- * Resets the cached state, allowing the function to be executed again.
467
- *
468
- * @param fn - Optional function to execute immediately after reset
469
- * @returns The result if fn provided, undefined otherwise
470
- */
471
- reset(fn?: (c?: CTX) => T): T {
472
- this.#state.setProcessing();
473
- if (fn) {
474
- return this.resolve(fn);
475
- }
476
- return undefined as T;
473
+ return this.#active().resolve(fn);
477
474
  }
478
475
  }
479
476
 
@@ -549,20 +546,24 @@ class StateInstance {
549
546
  }
550
547
  }
551
548
 
552
- type SyncOrAsync<T, CTX> = Option<SyncResolveOnce<T, CTX> | AsyncResolveOnce<T, CTX>>;
549
+ // type SyncOrAsync<T, CTX> = Option<SyncResolveOnce<T, CTX> | AsyncResolveOnce<T, CTX>>;
553
550
 
554
551
  export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
555
552
  #state = new StateInstance();
556
553
 
557
- #syncOrAsync: SyncOrAsync<T, CTX> = Option.None();
554
+ #syncOrAsync: SyncOrAsync<T> = Option.None();
558
555
 
559
- readonly #opts: ResolveOnceOpts;
556
+ readonly #opts: Writable<ResolveOnceOpts>;
560
557
  resetAfterTimer?: ReturnType<typeof setTimeout>;
561
558
 
562
- readonly _ctx?: CTX;
559
+ readonly _onceArg: OnceActionArg<T, CTX>;
560
+
563
561
  constructor(ctx?: CTX, opts?: ResolveOnceOpts) {
564
- this._ctx = ctx;
565
- this.#opts = opts ?? {};
562
+ this.#opts = { ...(opts ?? {}) };
563
+ this._onceArg = {
564
+ ctx: ctx as CTX,
565
+ self: this,
566
+ };
566
567
  }
567
568
 
568
569
  get state(): ResolveState {
@@ -584,15 +585,47 @@ export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
584
585
  this.#state.setProcessed();
585
586
  if (typeof this.#opts.resetAfter === "number" && this.#opts.resetAfter > 0) {
586
587
  this.resetAfterTimer = setTimeout(() => {
587
- this.reset();
588
+ void this.reset();
588
589
  }, this.#opts.resetAfter);
589
- if (!this.#opts.skipUnref) {
590
- const hasUnref = this.resetAfterTimer as unknown as { unref?: () => void };
591
- if (typeof hasUnref === "object" && typeof hasUnref.unref === "function") {
592
- hasUnref.unref();
593
- } else if (typeof globalThis.Deno === "object") {
594
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
595
- globalThis.Deno.unrefTimer(this.resetAfterTimer as any);
590
+ if (!this.#opts.skipUnref && this.resetAfterTimer) {
591
+ // node solution
592
+ const runtime = runtimeFn();
593
+ switch (true) {
594
+ case runtime.isDeno:
595
+ {
596
+ let id = this.resetAfterTimer as unknown as number;
597
+ if (typeof Deno.unrefTimer === "function") {
598
+ if (typeof this.resetAfterTimer === "number") {
599
+ id = this.resetAfterTimer;
600
+ } else {
601
+ try {
602
+ const ret = Reflect.ownKeys(this.resetAfterTimer).find((key) => {
603
+ return key.toString().includes("timerId");
604
+ });
605
+ if (ret) {
606
+ id = this.resetAfterTimer[ret as keyof typeof this.resetAfterTimer] as unknown as number;
607
+ // eslint-disable-next-line no-console
608
+ console.warn("Deno.unrefTimer timerId from struct:", id, "version:", globalThis.Deno?.version);
609
+ }
610
+ } catch (e) {
611
+ // eslint-disable-next-line no-console
612
+ console.warn(
613
+ "Deno.unrefTimer failed to get timerId",
614
+ e,
615
+ "id:",
616
+ this.resetAfterTimer,
617
+ "version:",
618
+ globalThis.Deno?.version,
619
+ );
620
+ }
621
+ }
622
+ Deno.unrefTimer(id);
623
+ }
624
+ }
625
+ break;
626
+ case runtime.isNodeIsh:
627
+ (this.resetAfterTimer as unknown as { unref: () => void }).unref();
628
+ break;
596
629
  }
597
630
  }
598
631
  }
@@ -603,11 +636,11 @@ export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
603
636
  return !this.#state.isInitial();
604
637
  }
605
638
 
606
- get value(): UnPromisify<T> | undefined {
639
+ get value(): T | undefined {
607
640
  if (this.#state.isInitial()) {
608
641
  return undefined;
609
642
  }
610
- return this.#syncOrAsync.Unwrap().value as UnPromisify<T>;
643
+ return this.#syncOrAsync.Unwrap().value;
611
644
  }
612
645
 
613
646
  get queueLength(): number {
@@ -624,78 +657,65 @@ export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
624
657
  return this.#syncOrAsync.Unwrap().error;
625
658
  }
626
659
 
627
- // get state(): ResolveState {
628
- // return this.#state;
629
- // }
630
- // set state(value: ResolveState) {
631
- // console.log(`ResolveOnce.state ${this.#state} -> ${value}`);
632
- // if (value === "processed") {
633
- // if (this.resetAfterTimer) {
634
- // clearTimeout(this.resetAfterTimer);
635
- // }
636
- // if (typeof this.#opts.resetAfter === "number" && this.#opts.resetAfter > 0) {
637
- // console.log("setting reset timer for", this.#opts.resetAfter);
638
- // this.resetAfterTimer = setTimeout(() => {
639
- // console.log("resetting after", this.#opts.resetAfter);
640
- // this.reset();
641
- // }, this.#opts.resetAfter);
642
- // }
643
- // }
644
- // this.#state = value;
645
- // }
646
-
647
- once<R>(fn: (c: CTX, prev?: T) => R): ResultOnce<R> {
648
- let resultFn: (ctx: CTX) => R;
660
+ once<RET extends T | Promise<T>>(fn: (arg: OnceActionArg<T, CTX>) => RET): ResultOnce<RET> {
661
+ let resultFn: () => RET;
649
662
  if (this.#state.isInitial()) {
650
663
  const state = this.#state;
651
664
  try {
652
665
  state.setProcessing();
653
- let prev: T | undefined = undefined;
654
- if (this.#syncOrAsync.IsSome()) {
655
- prev = this.#syncOrAsync.Unwrap().value as T;
656
- }
657
- const isSyncOrAsync = fn(this._ctx ?? ({} as CTX), prev);
666
+ const isSyncOrAsync = fn(this._onceArg);
658
667
  if (isPromise(isSyncOrAsync)) {
659
668
  this.#syncOrAsync = Option.Some(new AsyncResolveOnce<T, CTX>(this, state, this.#syncOrAsync));
660
669
  } else {
661
670
  this.#syncOrAsync = Option.Some(new SyncResolveOnce<T, CTX>(this, state));
662
671
  }
663
- resultFn = (): R => isSyncOrAsync;
672
+ resultFn = (): RET => isSyncOrAsync;
664
673
  } catch (e) {
665
674
  this.#syncOrAsync = Option.Some(new SyncResolveOnce<T, CTX>(this, state));
666
- resultFn = (): R => {
675
+ resultFn = (): RET => {
667
676
  throw e;
668
677
  };
669
678
  }
670
679
  } else {
671
- resultFn = fn;
680
+ resultFn = (): RET => fn(this._onceArg);
672
681
  }
673
682
  if (!this.#syncOrAsync) {
674
683
  throw new Error(`ResolveOnce.once impossible: state=${this.#state.getResolveState()}`);
675
684
  }
676
- return this.#syncOrAsync.Unwrap().resolve(resultFn as (c?: CTX) => never) as ResultOnce<R>;
685
+ return this.#syncOrAsync.Unwrap().resolve(resultFn);
677
686
  }
678
687
 
679
- reset<R>(fn?: (c: CTX) => R): ResultOnce<R> {
688
+ reset<RET extends T | Promise<T>>(fn?: (arg: OnceActionArg<T, CTX>) => RET): ResultOnce<RET> {
680
689
  if (this.#state.isInitial()) {
681
690
  if (!fn) {
682
- return undefined as ResultOnce<R>;
691
+ return undefined as ResultOnce<RET>;
683
692
  }
684
- return this.once(fn as (c: CTX) => R);
693
+ return this.once(fn);
685
694
  }
686
695
  if (this.#state.isProcessing()) {
687
696
  // eslint-disable-next-line no-console
688
697
  console.warn("ResolveOnce.reset dropped was called while processing");
689
- return undefined as ResultOnce<R>;
698
+ return undefined as ResultOnce<RET>;
690
699
  }
691
- let ret = undefined as ResultOnce<R>;
700
+ let ret = undefined as ResultOnce<RET>;
692
701
  this.#state = new StateInstance();
693
702
  if (fn) {
694
- ret = this.once(fn as (c: CTX) => R);
703
+ ret = this.once(fn);
695
704
  // ret = this.#syncOrAsync.Unwrap().reset(fn as (c?: CTX) => never) as ResultOnce<R>
696
705
  }
697
706
  return ret;
698
707
  }
708
+
709
+ setResetAfter(ms?: number): void {
710
+ if (this.resetAfterTimer) {
711
+ clearTimeout(this.resetAfterTimer);
712
+ }
713
+ if (typeof ms === "number" && ms > 0) {
714
+ this.#opts.resetAfter = ms;
715
+ } else {
716
+ this.#opts.resetAfter = undefined;
717
+ }
718
+ }
699
719
  }
700
720
 
701
721
  // /**
@@ -732,11 +752,14 @@ export type AddKeyedParam<K, V, CTX extends NonNullable<object>> = Omit<KeyedNgO
732
752
  */
733
753
  export type WithKey<X extends NonNullable<object>, K> = X & { readonly key: K };
734
754
 
755
+ // interface ResetFunc {
756
+ // reset(): void;
757
+ // }
735
758
  /**
736
759
  * Type helper that adds an optional reset method to a value type.
737
760
  * @template V - The value type
738
761
  */
739
- export type WithOptionalReset<V> = V & { readonly reset?: () => void };
762
+ // export type WithOptionalReset<V> = V extends ResetFunc ? V & ResetFunc : V;
740
763
 
741
764
  /**
742
765
  * Represents an item in a KeyedResolvOnce collection with its resolved result.
@@ -750,7 +773,7 @@ export interface KeyedResolveOnceItem<K, T, CTX extends NonNullable<object>> {
750
773
  /** The resolved value wrapped in a Result (Ok or Err) */
751
774
  readonly value: Result<T>;
752
775
  /** The complete KeyedNgItem containing metadata */
753
- readonly item: KeyedNgItem<K, ResolveOnce<WithOptionalReset<T>, KeyedNgItemWithoutValue<K, CTX>>, CTX>;
776
+ readonly item: KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>;
754
777
  }
755
778
 
756
779
  /**
@@ -798,21 +821,25 @@ export interface KeyedResolveOnceItem<K, T, CTX extends NonNullable<object>> {
798
821
  * .once(({ givenKey, ctx }) => fetchUser(givenKey, ctx));
799
822
  * ```
800
823
  */
801
- export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX extends NonNullable<object> = object, PT = T>
802
- implements
803
- Omit<
804
- // KeyedIf<ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, WithOptionalReset<T>, K>
805
- KeyedIf<
806
- KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>,
807
- ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>,
808
- K,
809
- CTX
810
- >,
811
- "entries" | "forEach" | "onSet" | "onDelete" | "values" | "setParam"
812
- >
813
- {
824
+ export class KeyedResolvOnce<
825
+ T,
826
+ //export type WithOptionalReset<V> = V extends ResetFunc ? V & ResetFunc : V;
827
+ // WithOptionalReset<PT>,
828
+ K = string,
829
+ CTX extends NonNullable<object> = object,
830
+ // PT = unknown,
831
+ > implements Omit<
832
+ // KeyedIf<ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, WithOptionalReset<T>, K>
833
+ KeyedIf<
834
+ KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>,
835
+ ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>,
836
+ K,
837
+ CTX
838
+ >,
839
+ "entries" | "forEach" | "onSet" | "onDelete" | "values" | "setParam"
840
+ > {
814
841
  /** @internal */
815
- readonly _keyed: KeyedNg<K, ResolveOnce<WithOptionalReset<T>, KeyedNgItemWithoutValue<K, CTX>>, CTX>;
842
+ readonly _keyed: KeyedNg<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>;
816
843
 
817
844
  /**
818
845
  * Creates a new KeyedResolvOnce instance.
@@ -820,7 +847,7 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
820
847
  * @param kp - Configuration options (key2string, ctx, lru)
821
848
  */
822
849
  constructor(kp: Partial<AddKeyedParam<K, T, CTX>> = {}) {
823
- this._keyed = new KeyedNg({
850
+ this._keyed = new KeyedNg<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>({
824
851
  createValue: (
825
852
  item: KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>,
826
853
  ): ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>> => {
@@ -991,7 +1018,7 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
991
1018
  */
992
1019
  unget(key: K): void {
993
1020
  const item = this._keyed.getItem(key);
994
- item.value.reset?.();
1021
+ void item.value.reset?.();
995
1022
  return this._keyed.delete(item.givenKey);
996
1023
  }
997
1024
 
@@ -1003,7 +1030,7 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
1003
1030
  */
1004
1031
  reset(): void {
1005
1032
  for (const v of this._keyed.values()) {
1006
- v.value.reset?.();
1033
+ void v.value.reset?.();
1007
1034
  }
1008
1035
  }
1009
1036
 
package/src/result.ts CHANGED
@@ -57,6 +57,13 @@ export abstract class Result<T, E = Error> {
57
57
  return false;
58
58
  }
59
59
 
60
+ static AsyncOk<T = void, E = Error>(...args: T[]): Promise<Result<T, E>> {
61
+ return Promise.resolve(Result.Ok<T, E>(...args));
62
+ }
63
+ static AsyncErr<T, E extends Error = Error>(t: E | string | Result<unknown, E>): Promise<Result<T, E>> {
64
+ return Promise.resolve(Result.Err<T, E>(t));
65
+ }
66
+
60
67
  isOk(): boolean {
61
68
  return this.is_ok();
62
69
  }