@idlebox/common 1.4.19 → 1.4.21

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 (476) hide show
  1. package/lib/array/{arrayDiff.d.ts → diff.d.ts} +1 -1
  2. package/lib/array/diff.d.ts.map +1 -0
  3. package/lib/array/{arrayDiff.js → diff.js} +1 -1
  4. package/lib/array/diff.js.map +1 -0
  5. package/lib/array/{arraySame.d.ts → is-same.d.ts} +1 -1
  6. package/lib/array/is-same.d.ts.map +1 -0
  7. package/lib/array/{arraySame.js → is-same.js} +1 -1
  8. package/lib/array/is-same.js.map +1 -0
  9. package/lib/array/{normalizeArray.d.ts → normalize.d.ts} +1 -1
  10. package/lib/array/normalize.d.ts.map +1 -0
  11. package/lib/array/{normalizeArray.js → normalize.js} +1 -1
  12. package/lib/array/normalize.js.map +1 -0
  13. package/lib/array/{sortAlpha.d.ts → sort-alpha.d.ts} +1 -1
  14. package/lib/array/sort-alpha.d.ts.map +1 -0
  15. package/lib/array/{sortAlpha.js → sort-alpha.js} +1 -1
  16. package/lib/array/sort-alpha.js.map +1 -0
  17. package/lib/array/{arrayUnique.d.ts → unique.d.ts} +1 -1
  18. package/lib/array/unique.d.ts.map +1 -0
  19. package/lib/array/{arrayUnique.js → unique.js} +1 -1
  20. package/lib/array/unique.js.map +1 -0
  21. package/lib/autoindex.d.ts +148 -135
  22. package/lib/autoindex.d.ts.map +1 -1
  23. package/lib/autoindex.js +177 -153
  24. package/lib/autoindex.js.map +1 -1
  25. package/lib/date/{isInvalid.d.ts → is-invalid.d.ts} +1 -1
  26. package/lib/date/is-invalid.d.ts.map +1 -0
  27. package/lib/date/{isInvalid.js → is-invalid.js} +1 -1
  28. package/lib/date/is-invalid.js.map +1 -0
  29. package/lib/date/{timeString.d.ts → to-string.d.ts} +5 -5
  30. package/lib/date/to-string.d.ts.map +1 -0
  31. package/lib/date/{timeString.js → to-string.js} +24 -25
  32. package/lib/date/to-string.js.map +1 -0
  33. package/lib/debugging/{tryInspect.d.ts → inspect.d.ts} +2 -2
  34. package/lib/debugging/inspect.d.ts.map +1 -0
  35. package/lib/debugging/{tryInspect.js → inspect.js} +1 -1
  36. package/lib/debugging/inspect.js.map +1 -0
  37. package/lib/debugging/object-with-name.d.ts +38 -0
  38. package/lib/debugging/object-with-name.d.ts.map +1 -0
  39. package/lib/debugging/object-with-name.js +41 -0
  40. package/lib/debugging/object-with-name.js.map +1 -0
  41. package/lib/debugging/serializable.js +1 -1
  42. package/lib/debugging/serializable.js.map +1 -1
  43. package/lib/error/convert-unknown.d.ts +2 -0
  44. package/lib/error/convert-unknown.d.ts.map +1 -0
  45. package/lib/error/convert-unknown.js +9 -0
  46. package/lib/error/convert-unknown.js.map +1 -0
  47. package/lib/error/{getFrame.d.ts → get-frame.d.ts} +2 -2
  48. package/lib/error/get-frame.d.ts.map +1 -0
  49. package/lib/error/{getFrame.js → get-frame.js} +1 -1
  50. package/lib/error/get-frame.js.map +1 -0
  51. package/lib/error/{pretty.d.ts → pretty.nodejs.d.ts} +2 -1
  52. package/lib/error/pretty.nodejs.d.ts.map +1 -0
  53. package/lib/error/{pretty.js → pretty.nodejs.js} +3 -3
  54. package/lib/error/pretty.nodejs.js.map +1 -0
  55. package/lib/error/{stackTrace.d.ts → stack-trace.d.ts} +1 -1
  56. package/lib/error/stack-trace.d.ts.map +1 -0
  57. package/lib/error/{stackTrace.js → stack-trace.js} +1 -1
  58. package/lib/error/stack-trace.js.map +1 -0
  59. package/lib/function/{asyncCallbackList.d.ts → callback-list.async.d.ts} +3 -3
  60. package/lib/function/callback-list.async.d.ts.map +1 -0
  61. package/lib/function/{asyncCallbackList.js → callback-list.async.js} +3 -7
  62. package/lib/function/callback-list.async.js.map +1 -0
  63. package/lib/function/{callbackList.d.ts → callback-list.d.ts} +1 -1
  64. package/lib/function/callback-list.d.ts.map +1 -0
  65. package/lib/function/callback-list.delay.d.ts +15 -0
  66. package/lib/function/callback-list.delay.d.ts.map +1 -0
  67. package/lib/function/callback-list.delay.js +22 -0
  68. package/lib/function/callback-list.delay.js.map +1 -0
  69. package/lib/function/{callbackList.js → callback-list.js} +2 -2
  70. package/lib/function/callback-list.js.map +1 -0
  71. package/lib/function/noop.d.ts +2 -0
  72. package/lib/function/noop.d.ts.map +1 -0
  73. package/lib/function/noop.js +2 -0
  74. package/lib/function/noop.js.map +1 -0
  75. package/lib/legacy/rename.d.ts +13 -0
  76. package/lib/legacy/rename.d.ts.map +1 -0
  77. package/lib/legacy/rename.js +13 -0
  78. package/lib/legacy/rename.js.map +1 -0
  79. package/lib/lifecycle/cancellation/driver.browser.d.ts.map +1 -0
  80. package/lib/lifecycle/cancellation/driver.browser.js.map +1 -0
  81. package/lib/lifecycle/cancellation/driver.common.d.ts.map +1 -0
  82. package/lib/lifecycle/{promise/cancellationToken → cancellation}/driver.common.js +1 -1
  83. package/lib/lifecycle/cancellation/driver.common.js.map +1 -0
  84. package/lib/lifecycle/{promise/cancellationToken → cancellation}/source.d.ts +3 -3
  85. package/lib/lifecycle/cancellation/source.d.ts.map +1 -0
  86. package/lib/lifecycle/{promise/cancellationToken → cancellation}/source.js +2 -2
  87. package/lib/lifecycle/cancellation/source.js.map +1 -0
  88. package/lib/lifecycle/dispose/async-disposable.d.ts +17 -0
  89. package/lib/lifecycle/dispose/async-disposable.d.ts.map +1 -0
  90. package/lib/lifecycle/dispose/async-disposable.js +42 -0
  91. package/lib/lifecycle/dispose/async-disposable.js.map +1 -0
  92. package/lib/lifecycle/dispose/bridges/function.d.ts +17 -0
  93. package/lib/lifecycle/dispose/bridges/function.d.ts.map +1 -0
  94. package/lib/lifecycle/dispose/bridges/function.js +29 -0
  95. package/lib/lifecycle/dispose/bridges/function.js.map +1 -0
  96. package/lib/lifecycle/dispose/bridges/native.d.ts +10 -0
  97. package/lib/lifecycle/dispose/bridges/native.d.ts.map +1 -0
  98. package/lib/lifecycle/dispose/bridges/native.js +13 -0
  99. package/lib/lifecycle/dispose/bridges/native.js.map +1 -0
  100. package/lib/lifecycle/dispose/bridges/streams.d.ts +21 -0
  101. package/lib/lifecycle/dispose/bridges/streams.d.ts.map +1 -0
  102. package/lib/lifecycle/dispose/bridges/streams.js +60 -0
  103. package/lib/lifecycle/dispose/bridges/streams.js.map +1 -0
  104. package/lib/lifecycle/dispose/debug.js +17 -3
  105. package/lib/lifecycle/dispose/debug.js.map +1 -1
  106. package/lib/lifecycle/dispose/disposable.d.ts +22 -0
  107. package/lib/lifecycle/dispose/disposable.d.ts.map +1 -0
  108. package/lib/lifecycle/dispose/disposable.js +120 -0
  109. package/lib/lifecycle/dispose/disposable.js.map +1 -0
  110. package/lib/lifecycle/dispose/disposableEvent.d.ts +9 -14
  111. package/lib/lifecycle/dispose/disposableEvent.d.ts.map +1 -1
  112. package/lib/lifecycle/dispose/disposableEvent.js +14 -64
  113. package/lib/lifecycle/dispose/disposableEvent.js.map +1 -1
  114. package/lib/lifecycle/dispose/disposedError.d.ts +9 -4
  115. package/lib/lifecycle/dispose/disposedError.d.ts.map +1 -1
  116. package/lib/lifecycle/dispose/disposedError.js +28 -13
  117. package/lib/lifecycle/dispose/disposedError.js.map +1 -1
  118. package/lib/lifecycle/dispose/sync-disposable.d.ts +21 -0
  119. package/lib/lifecycle/dispose/sync-disposable.d.ts.map +1 -0
  120. package/lib/lifecycle/dispose/sync-disposable.js +52 -0
  121. package/lib/lifecycle/dispose/sync-disposable.js.map +1 -0
  122. package/lib/lifecycle/event/event.d.ts +18 -33
  123. package/lib/lifecycle/event/event.d.ts.map +1 -1
  124. package/lib/lifecycle/event/event.js +75 -64
  125. package/lib/lifecycle/event/event.js.map +1 -1
  126. package/lib/lifecycle/event/memorized.d.ts +4 -3
  127. package/lib/lifecycle/event/memorized.d.ts.map +1 -1
  128. package/lib/lifecycle/event/memorized.js +9 -10
  129. package/lib/lifecycle/event/memorized.js.map +1 -1
  130. package/lib/lifecycle/event/type.d.ts +47 -0
  131. package/lib/lifecycle/event/type.d.ts.map +1 -0
  132. package/lib/lifecycle/event/type.js +2 -0
  133. package/lib/lifecycle/event/type.js.map +1 -0
  134. package/lib/lifecycle/{dispose/lifecycle.global.d.ts → global/global-lifecycle.d.ts} +3 -15
  135. package/lib/lifecycle/global/global-lifecycle.d.ts.map +1 -0
  136. package/lib/lifecycle/{dispose/lifecycle.global.js → global/global-lifecycle.js} +8 -21
  137. package/lib/lifecycle/global/global-lifecycle.js.map +1 -0
  138. package/lib/log/logger.js +1 -1
  139. package/lib/log/logger.js.map +1 -1
  140. package/lib/{mapSet/customSet.d.ts → map-and-set/custom-set.d.ts} +4 -8
  141. package/lib/map-and-set/custom-set.d.ts.map +1 -0
  142. package/lib/{mapSet/customSet.js → map-and-set/custom-set.js} +6 -20
  143. package/lib/map-and-set/custom-set.js.map +1 -0
  144. package/lib/map-and-set/required-map.d.ts +28 -0
  145. package/lib/map-and-set/required-map.d.ts.map +1 -0
  146. package/lib/map-and-set/required-map.js +42 -0
  147. package/lib/map-and-set/required-map.js.map +1 -0
  148. package/lib/object/objectSame.js +1 -1
  149. package/lib/object/objectSame.js.map +1 -1
  150. package/lib/path/pathArray.js +1 -1
  151. package/lib/path/pathArray.js.map +1 -1
  152. package/lib/path/pathCalc.d.ts +10 -0
  153. package/lib/path/pathCalc.d.ts.map +1 -0
  154. package/lib/path/pathCalc.js +17 -0
  155. package/lib/path/pathCalc.js.map +1 -0
  156. package/lib/platform/compile.d.ts +7 -0
  157. package/lib/platform/compile.d.ts.map +1 -0
  158. package/lib/platform/compile.js +2 -0
  159. package/lib/platform/compile.js.map +1 -0
  160. package/lib/platform/globalSingleton.js +1 -1
  161. package/lib/platform/globalSingleton.js.map +1 -1
  162. package/lib/platform/os.d.ts.map +1 -1
  163. package/lib/platform/os.js +1 -1
  164. package/lib/platform/os.js.map +1 -1
  165. package/lib/promise/{awaitIterator.d.ts → await-iterator.d.ts} +1 -1
  166. package/lib/promise/await-iterator.d.ts.map +1 -0
  167. package/lib/promise/{awaitIterator.js → await-iterator.js} +1 -1
  168. package/lib/promise/await-iterator.js.map +1 -0
  169. package/lib/{lifecycle/promise/deferredPromise.d.ts → promise/deferred-promise.d.ts} +14 -6
  170. package/lib/promise/deferred-promise.d.ts.map +1 -0
  171. package/lib/{lifecycle/promise/deferredPromise.js → promise/deferred-promise.js} +57 -16
  172. package/lib/promise/deferred-promise.js.map +1 -0
  173. package/lib/promise/{promiseBool.d.ts → promise-bool.d.ts} +1 -1
  174. package/lib/promise/promise-bool.d.ts.map +1 -0
  175. package/lib/promise/{promiseBool.js → promise-bool.js} +1 -1
  176. package/lib/promise/promise-bool.js.map +1 -0
  177. package/lib/promise/{promiseCollection.d.ts → promise-list.d.ts} +3 -3
  178. package/lib/promise/promise-list.d.ts.map +1 -0
  179. package/lib/promise/{promiseCollection.js → promise-list.js} +3 -3
  180. package/lib/promise/promise-list.js.map +1 -0
  181. package/lib/re-export.d.ts +2 -0
  182. package/lib/re-export.d.ts.map +1 -0
  183. package/lib/re-export.js +2 -0
  184. package/lib/re-export.js.map +1 -0
  185. package/lib/reflection/classes/pointer.d.ts +5 -0
  186. package/lib/reflection/classes/pointer.d.ts.map +1 -0
  187. package/lib/reflection/classes/pointer.js +49 -0
  188. package/lib/reflection/classes/pointer.js.map +1 -0
  189. package/lib/reflection/classes/singleton.d.ts +10 -2
  190. package/lib/reflection/classes/singleton.d.ts.map +1 -1
  191. package/lib/reflection/classes/singleton.js +29 -21
  192. package/lib/reflection/classes/singleton.js.map +1 -1
  193. package/lib/reflection/methods/bind.d.ts +1 -4
  194. package/lib/reflection/methods/bind.d.ts.map +1 -1
  195. package/lib/reflection/methods/bind.js +17 -23
  196. package/lib/reflection/methods/bind.js.map +1 -1
  197. package/lib/reflection/methods/memorize.d.ts +7 -4
  198. package/lib/reflection/methods/memorize.d.ts.map +1 -1
  199. package/lib/reflection/methods/memorize.js +27 -23
  200. package/lib/reflection/methods/memorize.js.map +1 -1
  201. package/lib/schedule/extendable-timer.d.ts +16 -0
  202. package/lib/schedule/extendable-timer.d.ts.map +1 -0
  203. package/lib/schedule/extendable-timer.js +45 -0
  204. package/lib/schedule/extendable-timer.js.map +1 -0
  205. package/lib/{lifecycle/timeout → schedule}/interval.d.ts +3 -3
  206. package/lib/schedule/interval.d.ts.map +1 -0
  207. package/lib/{lifecycle/timeout → schedule}/interval.js +3 -3
  208. package/lib/schedule/interval.js.map +1 -0
  209. package/lib/schedule/local-type.d.ts +3 -0
  210. package/lib/schedule/local-type.d.ts.map +1 -0
  211. package/lib/schedule/local-type.js +2 -0
  212. package/lib/schedule/local-type.js.map +1 -0
  213. package/lib/schedule/scheduler.d.ts +4 -0
  214. package/lib/schedule/scheduler.d.ts.map +1 -0
  215. package/lib/schedule/scheduler.js +3 -0
  216. package/lib/schedule/scheduler.js.map +1 -0
  217. package/lib/{lifecycle/timeout → schedule}/timeout.d.ts +2 -3
  218. package/lib/schedule/timeout.d.ts.map +1 -0
  219. package/lib/{lifecycle/timeout → schedule}/timeout.js +5 -11
  220. package/lib/schedule/timeout.js.map +1 -0
  221. package/lib/state/{StateMachine.d.ts → simple-state-machine.d.ts} +1 -1
  222. package/lib/state/simple-state-machine.d.ts.map +1 -0
  223. package/lib/state/{StateMachine.js → simple-state-machine.js} +1 -1
  224. package/lib/state/simple-state-machine.js.map +1 -0
  225. package/lib/string/{castCase.d.ts → case-cast.d.ts} +1 -1
  226. package/lib/string/case-cast.d.ts.map +1 -0
  227. package/lib/string/{castCase.js → case-cast.js} +1 -1
  228. package/lib/string/case-cast.js.map +1 -0
  229. package/lib/string/{escapeRegexp.d.ts → escape-regexp.d.ts} +1 -1
  230. package/lib/string/escape-regexp.d.ts.map +1 -0
  231. package/lib/string/{escapeRegexp.js → escape-regexp.js} +1 -1
  232. package/lib/string/escape-regexp.js.map +1 -0
  233. package/lib/string/{sizeString.d.ts → human-bytes.d.ts} +1 -1
  234. package/lib/string/human-bytes.d.ts.map +1 -0
  235. package/lib/string/{sizeString.js → human-bytes.js} +1 -1
  236. package/lib/string/human-bytes.js.map +1 -0
  237. package/lib/tsconfig.tsbuildinfo +1 -1
  238. package/lib/typing-helper/callback.d.ts +5 -0
  239. package/lib/typing-helper/callback.d.ts.map +1 -0
  240. package/lib/typing-helper/callback.js +2 -0
  241. package/lib/typing-helper/callback.js.map +1 -0
  242. package/lib/typing-helper/deep.partial.d.ts.map +1 -0
  243. package/lib/typing-helper/deep.partial.js.map +1 -0
  244. package/lib/typing-helper/deep.readonly.d.ts.map +1 -0
  245. package/lib/typing-helper/deep.readonly.js.map +1 -0
  246. package/lib/typing-helper/deep.required.d.ts.map +1 -0
  247. package/lib/typing-helper/deep.required.js.map +1 -0
  248. package/lib/typing-helper/deep.writable.d.ts.map +1 -0
  249. package/lib/typing-helper/deep.writable.js.map +1 -0
  250. package/lib/typing-helper/literal.d.ts.map +1 -0
  251. package/lib/{typingHelper → typing-helper}/literal.js.map +1 -1
  252. package/package.json +8 -7
  253. package/src/autoindex.ts +239 -213
  254. package/src/date/{timeString.ts → to-string.ts} +28 -29
  255. package/src/debugging/{tryInspect.ts → inspect.ts} +1 -1
  256. package/src/debugging/object-with-name.ts +64 -0
  257. package/src/debugging/serializable.ts +1 -1
  258. package/src/error/convert-unknown.ts +9 -0
  259. package/src/error/{getFrame.ts → get-frame.ts} +1 -1
  260. package/src/error/{pretty.ts → pretty.nodejs.ts} +3 -2
  261. package/src/function/{asyncCallbackList.ts → callback-list.async.ts} +2 -7
  262. package/src/function/callback-list.delay.ts +29 -0
  263. package/src/function/{callbackList.ts → callback-list.ts} +1 -1
  264. package/src/function/noop.ts +1 -0
  265. package/src/global.d.ts +10 -0
  266. package/src/legacy/rename.ts +15 -0
  267. package/src/lifecycle/{promise/cancellationToken → cancellation}/driver.browser.ts +3 -4
  268. package/src/lifecycle/{promise/cancellationToken → cancellation}/driver.common.ts +3 -2
  269. package/src/lifecycle/{promise/cancellationToken → cancellation}/source.ts +4 -4
  270. package/src/lifecycle/dispose/async-disposable.ts +41 -0
  271. package/src/lifecycle/dispose/bridges/function.ts +31 -0
  272. package/src/lifecycle/dispose/bridges/native.ts +23 -0
  273. package/src/lifecycle/dispose/bridges/streams.ts +70 -0
  274. package/src/lifecycle/dispose/debug.ts +22 -4
  275. package/src/lifecycle/dispose/disposable.ts +162 -0
  276. package/src/lifecycle/dispose/disposableEvent.ts +20 -86
  277. package/src/lifecycle/dispose/disposedError.ts +36 -19
  278. package/src/lifecycle/dispose/sync-disposable.ts +53 -0
  279. package/src/lifecycle/event/event.ts +83 -76
  280. package/src/lifecycle/event/memorized.ts +13 -12
  281. package/src/lifecycle/event/type.ts +55 -0
  282. package/src/lifecycle/global/global-lifecycle.ts +49 -0
  283. package/src/log/logger.ts +1 -1
  284. package/src/{mapSet/customSet.ts → map-and-set/custom-set.ts} +7 -26
  285. package/src/{mapSet/extendMap.ts → map-and-set/required-map.ts} +21 -6
  286. package/src/object/objectSame.ts +1 -1
  287. package/src/path/pathArray.ts +1 -1
  288. package/src/path/pathCalc.ts +18 -0
  289. package/src/platform/compile.ts +6 -0
  290. package/src/platform/globalSingleton.ts +1 -1
  291. package/src/platform/os.ts +1 -1
  292. package/src/{lifecycle/promise/deferredPromise.ts → promise/deferred-promise.ts} +68 -27
  293. package/src/promise/{promiseCollection.ts → promise-list.ts} +2 -2
  294. package/src/re-export.ts +1 -0
  295. package/src/reflection/classes/pointer.ts +54 -0
  296. package/src/reflection/classes/singleton.ts +30 -21
  297. package/src/reflection/methods/bind.ts +15 -23
  298. package/src/reflection/methods/memorize.ts +30 -23
  299. package/src/schedule/extendable-timer.ts +49 -0
  300. package/src/{lifecycle/timeout → schedule}/interval.ts +4 -4
  301. package/src/schedule/local-type.ts +2 -0
  302. package/src/schedule/scheduler.ts +8 -0
  303. package/src/{lifecycle/timeout → schedule}/timeout.ts +7 -13
  304. package/src/state/{StateMachine.ts → simple-state-machine.ts} +3 -4
  305. package/src/tsconfig.json +3 -1
  306. package/src/typing-helper/callback.ts +4 -0
  307. package/lib/array/arrayDiff.d.ts.map +0 -1
  308. package/lib/array/arrayDiff.js.map +0 -1
  309. package/lib/array/arraySame.d.ts.map +0 -1
  310. package/lib/array/arraySame.js.map +0 -1
  311. package/lib/array/arrayUnique.d.ts.map +0 -1
  312. package/lib/array/arrayUnique.js.map +0 -1
  313. package/lib/array/normalizeArray.d.ts.map +0 -1
  314. package/lib/array/normalizeArray.js.map +0 -1
  315. package/lib/array/sortAlpha.d.ts.map +0 -1
  316. package/lib/array/sortAlpha.js.map +0 -1
  317. package/lib/date/isInvalid.d.ts.map +0 -1
  318. package/lib/date/isInvalid.js.map +0 -1
  319. package/lib/date/timeString.d.ts.map +0 -1
  320. package/lib/date/timeString.js.map +0 -1
  321. package/lib/debugging/tryInspect.d.ts.map +0 -1
  322. package/lib/debugging/tryInspect.js.map +0 -1
  323. package/lib/error/convertUnknown.d.ts +0 -2
  324. package/lib/error/convertUnknown.d.ts.map +0 -1
  325. package/lib/error/convertUnknown.js +0 -9
  326. package/lib/error/convertUnknown.js.map +0 -1
  327. package/lib/error/getFrame.d.ts.map +0 -1
  328. package/lib/error/getFrame.js.map +0 -1
  329. package/lib/error/pretty.d.ts.map +0 -1
  330. package/lib/error/pretty.js.map +0 -1
  331. package/lib/error/stackTrace.d.ts.map +0 -1
  332. package/lib/error/stackTrace.js.map +0 -1
  333. package/lib/error-wellknown/exit.error.d.ts +0 -13
  334. package/lib/error-wellknown/exit.error.d.ts.map +0 -1
  335. package/lib/error-wellknown/exit.error.js +0 -20
  336. package/lib/error-wellknown/exit.error.js.map +0 -1
  337. package/lib/function/asyncCallbackList.d.ts.map +0 -1
  338. package/lib/function/asyncCallbackList.js.map +0 -1
  339. package/lib/function/callbackList.d.ts.map +0 -1
  340. package/lib/function/callbackList.js.map +0 -1
  341. package/lib/function/delayCallbackList.d.ts +0 -17
  342. package/lib/function/delayCallbackList.d.ts.map +0 -1
  343. package/lib/function/delayCallbackList.js +0 -36
  344. package/lib/function/delayCallbackList.js.map +0 -1
  345. package/lib/function/functionName.d.ts +0 -26
  346. package/lib/function/functionName.d.ts.map +0 -1
  347. package/lib/function/functionName.js +0 -27
  348. package/lib/function/functionName.js.map +0 -1
  349. package/lib/lifecycle/dispose/bridges/rxjs.d.ts +0 -8
  350. package/lib/lifecycle/dispose/bridges/rxjs.d.ts.map +0 -1
  351. package/lib/lifecycle/dispose/bridges/rxjs.js +0 -4
  352. package/lib/lifecycle/dispose/bridges/rxjs.js.map +0 -1
  353. package/lib/lifecycle/dispose/lifecycle.async.d.ts +0 -37
  354. package/lib/lifecycle/dispose/lifecycle.async.d.ts.map +0 -1
  355. package/lib/lifecycle/dispose/lifecycle.async.js +0 -111
  356. package/lib/lifecycle/dispose/lifecycle.async.js.map +0 -1
  357. package/lib/lifecycle/dispose/lifecycle.d.ts +0 -32
  358. package/lib/lifecycle/dispose/lifecycle.d.ts.map +0 -1
  359. package/lib/lifecycle/dispose/lifecycle.global.d.ts.map +0 -1
  360. package/lib/lifecycle/dispose/lifecycle.global.js.map +0 -1
  361. package/lib/lifecycle/dispose/lifecycle.js +0 -67
  362. package/lib/lifecycle/dispose/lifecycle.js.map +0 -1
  363. package/lib/lifecycle/dispose/lifecycle.sync.d.ts +0 -45
  364. package/lib/lifecycle/dispose/lifecycle.sync.d.ts.map +0 -1
  365. package/lib/lifecycle/dispose/lifecycle.sync.js +0 -115
  366. package/lib/lifecycle/dispose/lifecycle.sync.js.map +0 -1
  367. package/lib/lifecycle/promise/cancel.d.ts +0 -10
  368. package/lib/lifecycle/promise/cancel.d.ts.map +0 -1
  369. package/lib/lifecycle/promise/cancel.js +0 -15
  370. package/lib/lifecycle/promise/cancel.js.map +0 -1
  371. package/lib/lifecycle/promise/cancellationToken/driver.browser.d.ts.map +0 -1
  372. package/lib/lifecycle/promise/cancellationToken/driver.browser.js.map +0 -1
  373. package/lib/lifecycle/promise/cancellationToken/driver.common.d.ts.map +0 -1
  374. package/lib/lifecycle/promise/cancellationToken/driver.common.js.map +0 -1
  375. package/lib/lifecycle/promise/cancellationToken/source.d.ts.map +0 -1
  376. package/lib/lifecycle/promise/cancellationToken/source.js.map +0 -1
  377. package/lib/lifecycle/promise/deferredPromise.d.ts.map +0 -1
  378. package/lib/lifecycle/promise/deferredPromise.js.map +0 -1
  379. package/lib/lifecycle/timeout/interval.d.ts.map +0 -1
  380. package/lib/lifecycle/timeout/interval.js.map +0 -1
  381. package/lib/lifecycle/timeout/timeout.d.ts.map +0 -1
  382. package/lib/lifecycle/timeout/timeout.js.map +0 -1
  383. package/lib/lifecycle/timeout/timeoutError.d.ts +0 -11
  384. package/lib/lifecycle/timeout/timeoutError.d.ts.map +0 -1
  385. package/lib/lifecycle/timeout/timeoutError.js +0 -16
  386. package/lib/lifecycle/timeout/timeoutError.js.map +0 -1
  387. package/lib/mapSet/customSet.d.ts.map +0 -1
  388. package/lib/mapSet/customSet.js.map +0 -1
  389. package/lib/mapSet/extendMap.d.ts +0 -21
  390. package/lib/mapSet/extendMap.d.ts.map +0 -1
  391. package/lib/mapSet/extendMap.js +0 -26
  392. package/lib/mapSet/extendMap.js.map +0 -1
  393. package/lib/promise/awaitIterator.d.ts.map +0 -1
  394. package/lib/promise/awaitIterator.js.map +0 -1
  395. package/lib/promise/finishAllPromise.d.ts +0 -13
  396. package/lib/promise/finishAllPromise.d.ts.map +0 -1
  397. package/lib/promise/finishAllPromise.js +0 -37
  398. package/lib/promise/finishAllPromise.js.map +0 -1
  399. package/lib/promise/promiseBool.d.ts.map +0 -1
  400. package/lib/promise/promiseBool.js.map +0 -1
  401. package/lib/promise/promiseCollection.d.ts.map +0 -1
  402. package/lib/promise/promiseCollection.js.map +0 -1
  403. package/lib/promise/timeoutPromiseCollection.d.ts +0 -7
  404. package/lib/promise/timeoutPromiseCollection.d.ts.map +0 -1
  405. package/lib/promise/timeoutPromiseCollection.js +0 -20
  406. package/lib/promise/timeoutPromiseCollection.js.map +0 -1
  407. package/lib/reflection/classes/hookClass.d.ts +0 -11
  408. package/lib/reflection/classes/hookClass.d.ts.map +0 -1
  409. package/lib/reflection/classes/hookClass.js +0 -34
  410. package/lib/reflection/classes/hookClass.js.map +0 -1
  411. package/lib/reflection/methods/initOnRead.d.ts +0 -7
  412. package/lib/reflection/methods/initOnRead.d.ts.map +0 -1
  413. package/lib/reflection/methods/initOnRead.js +0 -11
  414. package/lib/reflection/methods/initOnRead.js.map +0 -1
  415. package/lib/state/StateMachine.d.ts.map +0 -1
  416. package/lib/state/StateMachine.js.map +0 -1
  417. package/lib/string/castCase.d.ts.map +0 -1
  418. package/lib/string/castCase.js.map +0 -1
  419. package/lib/string/escapeRegexp.d.ts.map +0 -1
  420. package/lib/string/escapeRegexp.js.map +0 -1
  421. package/lib/string/sizeString.d.ts.map +0 -1
  422. package/lib/string/sizeString.js.map +0 -1
  423. package/lib/typingHelper/deep.partial.d.ts.map +0 -1
  424. package/lib/typingHelper/deep.partial.js.map +0 -1
  425. package/lib/typingHelper/deep.readonly.d.ts.map +0 -1
  426. package/lib/typingHelper/deep.readonly.js.map +0 -1
  427. package/lib/typingHelper/deep.required.d.ts.map +0 -1
  428. package/lib/typingHelper/deep.required.js.map +0 -1
  429. package/lib/typingHelper/deep.writable.d.ts.map +0 -1
  430. package/lib/typingHelper/deep.writable.js.map +0 -1
  431. package/lib/typingHelper/literal.d.ts.map +0 -1
  432. package/src/error/convertUnknown.ts +0 -9
  433. package/src/error-wellknown/exit.error.ts +0 -21
  434. package/src/function/delayCallbackList.ts +0 -45
  435. package/src/function/functionName.ts +0 -44
  436. package/src/lifecycle/dispose/bridges/rxjs.ts +0 -6
  437. package/src/lifecycle/dispose/lifecycle.async.ts +0 -134
  438. package/src/lifecycle/dispose/lifecycle.global.ts +0 -66
  439. package/src/lifecycle/dispose/lifecycle.sync.ts +0 -133
  440. package/src/lifecycle/dispose/lifecycle.ts +0 -94
  441. package/src/lifecycle/promise/cancel.ts +0 -16
  442. package/src/lifecycle/timeout/timeoutError.ts +0 -18
  443. package/src/promise/finishAllPromise.ts +0 -50
  444. package/src/promise/timeoutPromiseCollection.ts +0 -22
  445. package/src/reflection/classes/hookClass.ts +0 -47
  446. package/src/reflection/methods/initOnRead.ts +0 -11
  447. /package/lib/lifecycle/{promise/cancellationToken → cancellation}/driver.browser.d.ts +0 -0
  448. /package/lib/lifecycle/{promise/cancellationToken → cancellation}/driver.browser.js +0 -0
  449. /package/lib/lifecycle/{promise/cancellationToken → cancellation}/driver.common.d.ts +0 -0
  450. /package/lib/{typingHelper → typing-helper}/deep.partial.d.ts +0 -0
  451. /package/lib/{typingHelper → typing-helper}/deep.partial.js +0 -0
  452. /package/lib/{typingHelper → typing-helper}/deep.readonly.d.ts +0 -0
  453. /package/lib/{typingHelper → typing-helper}/deep.readonly.js +0 -0
  454. /package/lib/{typingHelper → typing-helper}/deep.required.d.ts +0 -0
  455. /package/lib/{typingHelper → typing-helper}/deep.required.js +0 -0
  456. /package/lib/{typingHelper → typing-helper}/deep.writable.d.ts +0 -0
  457. /package/lib/{typingHelper → typing-helper}/deep.writable.js +0 -0
  458. /package/lib/{typingHelper → typing-helper}/literal.d.ts +0 -0
  459. /package/lib/{typingHelper → typing-helper}/literal.js +0 -0
  460. /package/src/array/{arrayDiff.ts → diff.ts} +0 -0
  461. /package/src/array/{arraySame.ts → is-same.ts} +0 -0
  462. /package/src/array/{normalizeArray.ts → normalize.ts} +0 -0
  463. /package/src/array/{sortAlpha.ts → sort-alpha.ts} +0 -0
  464. /package/src/array/{arrayUnique.ts → unique.ts} +0 -0
  465. /package/src/date/{isInvalid.ts → is-invalid.ts} +0 -0
  466. /package/src/error/{stackTrace.ts → stack-trace.ts} +0 -0
  467. /package/src/promise/{awaitIterator.ts → await-iterator.ts} +0 -0
  468. /package/src/promise/{promiseBool.ts → promise-bool.ts} +0 -0
  469. /package/src/string/{castCase.ts → case-cast.ts} +0 -0
  470. /package/src/string/{escapeRegexp.ts → escape-regexp.ts} +0 -0
  471. /package/src/string/{sizeString.ts → human-bytes.ts} +0 -0
  472. /package/src/{typingHelper → typing-helper}/deep.partial.ts +0 -0
  473. /package/src/{typingHelper → typing-helper}/deep.readonly.ts +0 -0
  474. /package/src/{typingHelper → typing-helper}/deep.required.ts +0 -0
  475. /package/src/{typingHelper → typing-helper}/deep.writable.ts +0 -0
  476. /package/src/{typingHelper → typing-helper}/literal.ts +0 -0
@@ -0,0 +1,162 @@
1
+ import type { MaybeNamed } from '../../debugging/object-with-name.js';
2
+ import { createStackTraceHolder, type StackTraceHolder } from '../../error/stack-trace.js';
3
+ import { Emitter } from '../event/event.js';
4
+ import type { EventRegister } from '../event/type.js';
5
+ import { fromNativeDisposable } from './bridges/native.js';
6
+ import { _debug_dispose, dispose_name } from './debug.js';
7
+ import { DuplicateDisposed } from './disposedError.js';
8
+
9
+ export enum DuplicateDisposeAction {
10
+ Disable = 0,
11
+ Warning = 1,
12
+ Allow = 2,
13
+ }
14
+
15
+ /** @public */
16
+ export interface IDisposableEvents {
17
+ onDisposeError: EventRegister<Error>;
18
+ onBeforeDispose: EventRegister<void>;
19
+ readonly hasDisposed: boolean;
20
+ }
21
+
22
+ /** @public */
23
+ export interface IDisposable extends MaybeNamed {
24
+ dispose(): void;
25
+ }
26
+
27
+ /** @public */
28
+ export interface IAsyncDisposable extends MaybeNamed {
29
+ dispose(): void | Promise<void>;
30
+ }
31
+
32
+ type _Type<Async extends boolean> = Async extends true ? IAsyncDisposable : IDisposable;
33
+ type _RType<Async extends boolean> = Async extends true ? Promise<void> : void;
34
+
35
+ /**
36
+ * 增强型Disposable
37
+ * @internal
38
+ */
39
+ export abstract class AbstractEnhancedDisposable<Async extends boolean> implements IDisposableEvents {
40
+ protected readonly _onDisposeError = new Emitter<Error>();
41
+ public readonly onDisposeError: EventRegister<Error> = this._onDisposeError.register;
42
+
43
+ protected readonly _onBeforeDispose = new Emitter<void>();
44
+ public readonly onBeforeDispose: EventRegister<void> = this._onBeforeDispose.register;
45
+
46
+ protected readonly _onPostDispose = new Emitter<void>();
47
+ public readonly onPostDispose: EventRegister<void> = this._onPostDispose.register;
48
+
49
+ /** for debug */
50
+ public readonly displayName?: string;
51
+ protected readonly _logger;
52
+
53
+ constructor(displayName?: string) {
54
+ if (displayName !== undefined) {
55
+ this.displayName = displayName;
56
+ } else if (!this.displayName) {
57
+ displayName = dispose_name(this, 'AsyncDisposable');
58
+ this.displayName = displayName;
59
+ }
60
+
61
+ this._logger = _debug_dispose.extend(this.displayName || 'disposable');
62
+
63
+ this._onPostDispose.handle(() => {
64
+ this._onPostDispose.dispose();
65
+ });
66
+ this._disposables.push(this._onBeforeDispose);
67
+ this._disposables.push(this._onDisposeError);
68
+ }
69
+
70
+ /**
71
+ * @throws if already disposed
72
+ */
73
+ public assertNotDisposed() {
74
+ if (this._disposed) {
75
+ throw new DuplicateDisposed(this, this._disposed.trace);
76
+ }
77
+ }
78
+
79
+ /**
80
+ * the "DisposableStack"
81
+ */
82
+ protected readonly _disposables: _Type<Async>[] = [];
83
+
84
+ /**
85
+ * register a disposable object
86
+ */
87
+ public _register<T extends _Type<Async>>(d: T): T;
88
+ public _register<T extends _Type<Async> & IDisposableEvents>(d: T, autoDereference?: boolean): T;
89
+ public _register(d: any, autoDereference?: boolean): any {
90
+ if (this._logger.enabled) this._logger(`register ${dispose_name(d)}`);
91
+ this.assertNotDisposed();
92
+ this._disposables.unshift(fromNativeDisposable(d));
93
+ if (autoDereference) {
94
+ (d as IDisposableEvents).onBeforeDispose(() => {
95
+ this._unregister(d);
96
+ });
97
+ }
98
+ return d;
99
+ }
100
+
101
+ public _unregister(d: _Type<Async>) {
102
+ if (this._logger.enabled) this._logger(`unregister ${dispose_name(d)}`);
103
+ this.assertNotDisposed();
104
+ return this._disposables.splice(this._disposables.indexOf(d), 1).length > 0;
105
+ }
106
+
107
+ protected readonly duplicateDispose: DuplicateDisposeAction = DuplicateDisposeAction.Warning;
108
+ private _disposed?: {
109
+ trace: StackTraceHolder;
110
+ result: _RType<Async>;
111
+ };
112
+ public get disposed() {
113
+ return !!this._disposed;
114
+ }
115
+ /**
116
+ * @deprecated use disposed
117
+ */
118
+ public get hasDisposed() {
119
+ return !!this._disposed;
120
+ }
121
+ /**
122
+ * 释放相关资源
123
+ */
124
+ public dispose(): _RType<Async> {
125
+ if (this._disposed) {
126
+ if (this.duplicateDispose === DuplicateDisposeAction.Allow) return this._disposed.result;
127
+
128
+ const dupErr = new DuplicateDisposed(this, this._disposed.trace);
129
+ if (this.duplicateDispose === DuplicateDisposeAction.Disable) {
130
+ throw dupErr;
131
+ } else {
132
+ console.warn(dupErr);
133
+ return this._disposed.result;
134
+ }
135
+ }
136
+ this._onBeforeDispose.fireNoError();
137
+
138
+ let r: any;
139
+ try {
140
+ r = this._dispose(this._disposables);
141
+ } finally {
142
+ this._disposables.length = 0;
143
+ Object.freeze(this._disposables);
144
+
145
+ this._disposed = {
146
+ trace: createStackTraceHolder('disposed', this.dispose),
147
+ result: r,
148
+ };
149
+ }
150
+
151
+ if (r && 'then' in r) {
152
+ r.then(() => {});
153
+ }
154
+ return r;
155
+ }
156
+
157
+ get [Symbol.toStringTag](): string {
158
+ return this.displayName || 'unknown disposable';
159
+ }
160
+
161
+ protected abstract _dispose(disposables: readonly _Type<Async>[]): _RType<Async>;
162
+ }
@@ -1,102 +1,36 @@
1
- import type { IDisposable } from './lifecycle.js';
1
+ import type { IDisposable } from './disposable.js';
2
2
 
3
- declare const AbortController: new () => any;
4
-
5
- export interface IEventListenerOptions {
6
- capture?: boolean;
7
- once?: boolean;
8
- passive?: boolean;
3
+ export function addAnyKindOfListener(host: IEventEmitterObject | IShorthandEmitterObject, name: string, handler: Function) {
4
+ if ('on' in host) {
5
+ host.on(name, handler);
6
+ } else if ('addListener' in host) {
7
+ host.addListener(name, handler);
8
+ }
9
9
  }
10
10
 
11
- export interface IEventHostObject<T extends Function> {
12
- addEventListener(type: string, handler: T, options?: IEventListenerOptions): any;
13
- removeEventListener(type: string, handler: T, options?: IEventListenerOptions): any;
11
+ export interface IShorthandEmitterObject {
12
+ on(type: string, handler: Function): void;
13
+ off(type: string, handler: Function): void;
14
14
  }
15
15
 
16
- export interface IEventEmitterObject<T extends Function> {
17
- addListener(type: string, handler: T): any;
18
- removeListener(type: string, handler: T): any;
16
+ export interface IEventEmitterObject {
17
+ addListener(type: string, handler: Function): void;
18
+ removeListener(type: string, handler: Function): void;
19
19
  }
20
20
 
21
- export function addDisposableEventListener<T extends Function>(target: IEventHostObject<T> | IEventEmitterObject<T>, type: string, options: IEventListenerOptions, handler: T): IDisposable;
22
-
23
- export function addDisposableEventListener<T extends Function>(target: IEventHostObject<T> | IEventEmitterObject<T>, type: string, handler: T): IDisposable;
24
-
25
- export function addDisposableEventListener<T extends Function>(target: IEventHostObject<T> | IEventEmitterObject<T>, type: string, _options: IEventListenerOptions | T | undefined, _handler?: T): IDisposable {
26
- if (!_handler) {
27
- if (typeof _options === 'function') {
28
- _handler = _options;
29
- _options = undefined;
30
- } else {
31
- throw new Error('missing handler');
32
- }
33
- }
34
-
35
- const handler = _handler as T;
36
- const options = _options as IEventListenerOptions;
37
-
21
+ export function addDisposableEventListener(target: IEventEmitterObject | IShorthandEmitterObject, type: string, handler: Function): IDisposable {
38
22
  let remove: IDisposable['dispose'];
39
23
 
40
- if ('addEventListener' in target) {
41
- if (passiveSupported === undefined || abortSupported === undefined) {
42
- checkAllSupport(target);
43
- }
44
- const [abort, xOptions] = check(options);
45
- target.addEventListener(type, handler, xOptions);
46
- if (abort) {
47
- remove = () => {
48
- abort;
49
- };
50
- } else {
51
- remove = () => {
52
- target.removeEventListener(type, handler, xOptions);
53
- };
54
- }
55
- } else {
24
+ if ('addListener' in target) {
56
25
  target.addListener(type, handler);
57
26
  remove = () => {
58
27
  target.removeListener(type, handler);
59
28
  };
60
- }
61
- return { dispose: remove };
62
- }
63
-
64
- let passiveSupported: boolean;
65
- let abortSupported: boolean;
66
- function check(options: IEventListenerOptions = {}): [{ abort(): void } | undefined, IEventListenerOptions] {
67
- if (!passiveSupported) {
68
- return [undefined, (options.capture || false) as any];
69
- }
70
-
71
- if (abortSupported) {
72
- const controller = new AbortController();
73
- (options as any).signal = controller.signal;
74
- return [controller, options];
75
- }
76
- return [undefined, options];
77
- }
78
-
79
- function checkAllSupport(ele: IEventHostObject<any>) {
80
- passiveSupported = checkSupport('passive', ele);
81
- abortSupported = typeof AbortController !== 'undefined' && checkSupport('signal', ele);
82
- }
83
-
84
- function checkSupport(field: string, ele: IEventHostObject<any>) {
85
- let supported = false;
86
- try {
87
- const options = {
88
- get [field]() {
89
- // This function will be called when the browser
90
- // attempts to access the passive property.
91
- supported = true;
92
- return undefined;
93
- },
29
+ } else {
30
+ target.on(type, handler);
31
+ remove = () => {
32
+ target.off(type, handler);
94
33
  };
95
-
96
- ele.addEventListener('_test_', null, options);
97
- ele.removeEventListener('_test_', null, options);
98
- } catch (_err) {
99
- supported = false;
100
34
  }
101
- return supported;
35
+ return { dispose: remove };
102
36
  }
@@ -1,40 +1,57 @@
1
- import { tryInspect } from '../../debugging/tryInspect.js';
2
- import { getErrorFrame } from '../../error/getFrame.js';
3
- import { prettyFormatError } from '../../error/pretty.js';
4
- import type { StackTraceHolder } from '../../error/stackTrace.js';
1
+ import { isNodeJs } from '../../autoindex.js';
2
+ import { tryInspect } from '../../debugging/inspect.js';
3
+ import { getErrorFrame } from '../../error/get-frame.js';
4
+ import { prettyFormatError } from '../../error/pretty.nodejs.js';
5
+ import type { StackTraceHolder } from '../../error/stack-trace.js';
6
+ import { dispose_name } from './debug.js';
7
+
8
+ export class Disposed extends Error {
9
+ constructor(
10
+ message = 'Object has been disposed',
11
+ private readonly previous: StackTraceHolder,
12
+ ) {
13
+ super(message);
14
+ this.name = 'DisposedError';
15
+ }
16
+
17
+ override get stack() {
18
+ return `${super.stack}\nDisposed at:\n${this.previous.stack}`;
19
+ }
20
+ }
5
21
 
6
22
  /**
7
23
  * Error when call dispose() twice
8
24
  */
9
- export class DisposedError extends Error {
25
+ export class DuplicateDisposed extends Error {
10
26
  public readonly inspectString: string;
11
27
  constructor(
12
28
  object: any,
13
- public readonly previous: StackTraceHolder,
29
+ private readonly previous: StackTraceHolder,
14
30
  ) {
15
- const insp = tryInspect(object);
16
-
17
- const old = (Error as any).stackTraceLimit;
18
- (Error as any).stackTraceLimit = Number.MAX_SAFE_INTEGER;
31
+ const old = Error.stackTraceLimit;
32
+ Error.stackTraceLimit = Number.MAX_SAFE_INTEGER;
33
+ const stacks = getErrorFrame(previous, 2);
19
34
 
20
- super(`Object [${insp}] has already disposed ${getErrorFrame(previous, 2)}.`);
35
+ const inspectString = tryInspect(object);
36
+ const name = dispose_name(object, inspectString);
21
37
 
22
- (Error as any).stackTraceLimit = old;
38
+ super(`Object [${name}] has already disposed ${stacks}.`);
39
+ this.name = 'DuplicateDisposedError';
40
+ this.inspectString = inspectString;
23
41
 
24
- this.inspectString = insp;
25
- this.name = 'Warning';
42
+ Error.stackTraceLimit = old;
26
43
 
27
44
  this.tryCreateConsoleWarning().catch(() => {});
28
45
  }
29
46
 
30
47
  public async tryCreateConsoleWarning() {
31
48
  console.error('DisposedWarning: duplicate dispose.');
32
- console.error(' * first dispose:\n%s', prettyFormatError(this.previous, false));
33
- console.error(' * current dispose:\n%s', prettyFormatError(this, false));
49
+ console.error(' * first dispose:\n ', isNodeJs ? prettyFormatError(this.previous, false) : this.previous);
50
+ console.error(' * current dispose:\n ', isNodeJs ? prettyFormatError(this, false) : this);
34
51
  console.error(' * Object: %s', this.inspectString);
35
52
  }
36
- }
37
53
 
38
- export function isDisposedError(error: any): boolean {
39
- return error instanceof DisposedError;
54
+ is(other: unknown): other is DuplicateDisposed {
55
+ return other instanceof DuplicateDisposed;
56
+ }
40
57
  }
@@ -0,0 +1,53 @@
1
+ import { createStackTraceHolder, type StackTraceHolder } from '../../error/stack-trace.js';
2
+ import { dispose_name } from './debug.js';
3
+ import { AbstractEnhancedDisposable, type IDisposable } from './disposable.js';
4
+ import { DuplicateDisposed } from './disposedError.js';
5
+
6
+ /**
7
+ * 简单版手动disposable
8
+ */
9
+ export abstract class DisposableOnce implements IDisposable {
10
+ private _disposed?: StackTraceHolder;
11
+
12
+ public get hasDisposed() {
13
+ return !!this._disposed;
14
+ }
15
+ public dispose(): void {
16
+ if (this._disposed) {
17
+ console.warn(new DuplicateDisposed(this, this._disposed).message);
18
+ return;
19
+ }
20
+ this._disposed = createStackTraceHolder('disposed', this.dispose);
21
+ this._dispose();
22
+ }
23
+ [Symbol.dispose]() {
24
+ this.dispose();
25
+ }
26
+ protected abstract _dispose(): void;
27
+ }
28
+
29
+ /**
30
+ * 完整版disposable类
31
+ * 可以继承
32
+ * 也可以直接用(相当于一个DisposableStack)
33
+ */
34
+ export class EnhancedDisposable extends AbstractEnhancedDisposable<false> implements IDisposable {
35
+ protected override _dispose(disposables: readonly IDisposable[]): void {
36
+ for (const item of disposables.values()) {
37
+ try {
38
+ if (this._logger.enabled) this._logger(`dispose ${dispose_name(item)}`);
39
+ item.dispose();
40
+ } catch (e) {
41
+ if (e instanceof Error) {
42
+ this._onDisposeError.fire(e);
43
+ } else {
44
+ console.error('error during dispose, throw:', e);
45
+ this._onDisposeError.fire(new Error(`${e}`));
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ /// compitable with stack
52
+ public [Symbol.dispose] = this.dispose;
53
+ }
@@ -1,116 +1,100 @@
1
- import { createStackTraceHolder } from '../../autoindex.js';
2
- import { AppExit } from '../../error-wellknown/exit.error.js';
3
- import type { IDisposable } from '../dispose/lifecycle.js';
4
-
5
- export type EventHandler<T> = (data: T) => void;
6
-
7
- export interface EventRegister<T> {
8
- (callback: EventHandler<T>): IDisposable;
9
- once(callback: EventHandler<T>): IDisposable;
10
- }
11
-
12
- type DeferFn = () => void;
1
+ import { Exit } from '@idlebox/errors';
2
+ import { nameObject, objectName } from '../../debugging/object-with-name.js';
3
+ import { createStackTraceHolder } from '../../error/stack-trace.js';
4
+ import { functionToDisposable } from '../dispose/bridges/function.js';
5
+ import { DuplicateDisposed } from '../dispose/disposedError.js';
6
+ import type { IDisposable } from '../dispose/disposable.js';
7
+ import type { EventHandler, EventRegister, IEventEmitter } from './type.js';
13
8
 
14
9
  /**
15
- * 事件注册对象
16
10
  * @public
17
11
  */
18
- export class Emitter<T> implements IDisposable {
19
- protected readonly _callbacks: EventHandler<T>[] = [];
12
+ export class Emitter<T = unknown> implements IEventEmitter<T> {
13
+ protected _callbacks?: (EventHandler<T> | undefined)[];
20
14
  private executing = false;
15
+ private _something_change_during_call = false;
21
16
 
22
17
  constructor(public readonly displayName?: string) {}
23
18
 
24
- /**
25
- * @returns 当前注册回调数量
26
- */
27
19
  public listenerCount() {
28
- return this._callbacks.length;
20
+ return this._callbacks?.length ?? 0;
29
21
  }
30
22
 
31
- /**
32
- * 触发本事件
33
- * @param data 回调数据
34
- */
35
23
  public fire(data: T) {
36
24
  this.requireNotExecuting();
25
+ if (!this._callbacks) return;
26
+
37
27
  this.executing = true;
38
28
  try {
39
29
  for (const callback of this._callbacks) {
40
- callback(data);
30
+ callback?.(data);
41
31
  }
42
32
  } finally {
43
- this.doDefer();
44
33
  this.executing = false;
34
+ if (this._something_change_during_call) {
35
+ this.checkDeleted();
36
+ }
45
37
  }
46
38
  }
47
39
 
48
- /**
49
- * 与 `fire()`相同,但是忽略任何错误,并且即便出错也继续执行全部callback
50
- */
51
40
  public fireNoError(data: T) {
52
41
  this.requireNotExecuting();
42
+ if (!this._callbacks) return;
43
+
53
44
  this.executing = true;
54
45
  for (const callback of this._callbacks) {
55
46
  try {
56
- callback(data);
47
+ callback?.(data);
57
48
  } catch (e) {
58
- if (e instanceof AppExit) {
59
- continue;
49
+ if (e instanceof Exit) {
50
+ break;
60
51
  }
61
52
  console.error('Emitter.fireNoError: error ignored: %s', e instanceof Error ? e.stack : e);
62
53
  }
63
54
  }
64
- this.doDefer();
65
55
  this.executing = false;
56
+ if (this._something_change_during_call) {
57
+ this.checkDeleted();
58
+ }
66
59
  }
67
60
 
68
61
  get register(): EventRegister<T> {
69
62
  return Object.assign(this.handle.bind(this), {
70
63
  once: this.once.bind(this),
64
+ wait: this.wait.bind(this),
71
65
  });
72
66
  }
73
67
 
74
- /**
75
- * AI喜欢用event()
76
- * @alias register
77
- */
78
68
  get event(): EventRegister<T> {
79
69
  return this.register;
80
70
  }
81
71
 
82
72
  /**
83
- * 注册本事件的新回调
84
- * @param callback 回调函数
73
+ * 添加监听器
85
74
  */
86
75
  handle(callback: EventHandler<T>): IDisposable {
87
76
  this.requireNotExecuting();
88
- let disposed = false;
89
- this._callbacks.unshift((e) => {
90
- if (!disposed) callback(e);
91
- });
92
- const realDispose = () => {
93
- const index = this._callbacks.indexOf(callback);
94
- if (index !== -1) {
95
- this._callbacks.splice(index, 1);
96
- }
97
- };
98
-
99
- const dispose = () => {
100
- disposed = true;
101
- if (this.executing) {
102
- this.defer(realDispose);
103
- } else {
104
- realDispose();
105
- }
106
- };
107
77
 
108
- return { dispose };
78
+ if (!this._callbacks) this._callbacks = [];
79
+
80
+ const callbacks = this._callbacks;
81
+ callbacks.unshift(callback);
82
+
83
+ return functionToDisposable(
84
+ nameObject(`removeListener(${objectName(callback)})`, () => {
85
+ const index = callbacks.indexOf(callback);
86
+ if (index === -1) return;
87
+ if (this.executing) {
88
+ callbacks[index] = undefined;
89
+ } else {
90
+ callbacks.splice(index, 1);
91
+ }
92
+ }),
93
+ );
109
94
  }
110
95
 
111
96
  /**
112
- * 注册一次性回调
113
- * @param callback 回调函数
97
+ * 添加一次性监听器
114
98
  */
115
99
  once(callback: EventHandler<T>): IDisposable {
116
100
  this.requireNotExecuting();
@@ -121,19 +105,28 @@ export class Emitter<T> implements IDisposable {
121
105
  return disposable;
122
106
  }
123
107
 
124
- private defers: DeferFn[] = [];
125
- public defer(fn: DeferFn) {
126
- this.defers.push(fn);
127
- }
128
- private doDefer() {
129
- for (const fn of this.defers) {
130
- fn();
131
- }
132
- this.defers.length = 0;
108
+ /**
109
+ * 创建一个等待下次触发的promise
110
+ */
111
+ private _waittings?: Set<Function>;
112
+ wait(): Promise<T> {
113
+ return new Promise((resolve, reject) => {
114
+ if (!this._waittings) this._waittings = new Set<Function>();
115
+ this._waittings.add(reject);
116
+ this.once((data) => {
117
+ resolve(data);
118
+ });
119
+ });
133
120
  }
134
121
 
135
- [Symbol.dispose]() {
136
- this.dispose();
122
+ private checkDeleted() {
123
+ if (!this._callbacks) return;
124
+
125
+ for (let i = this._callbacks.length - 1; i >= 0; i--) {
126
+ if (this._callbacks[i] === undefined) {
127
+ this._callbacks.splice(i, 1);
128
+ }
129
+ }
137
130
  }
138
131
 
139
132
  private _disposed = false;
@@ -141,22 +134,36 @@ export class Emitter<T> implements IDisposable {
141
134
  return this._disposed;
142
135
  }
143
136
 
137
+ /**
138
+ * 运行过程中可以dispose,本次运行仍然会继续到最后
139
+ * 但立即不能再次调用类似handle的方法
140
+ */
144
141
  dispose() {
145
142
  if (this._disposed) return;
146
143
  this._disposed = true;
147
- this.requireNotExecuting();
148
- this._callbacks.length = 0;
149
144
 
150
- const trace = createStackTraceHolder('disposed');
145
+ this._callbacks = undefined;
146
+
147
+ if (this._waittings) {
148
+ for (const rej of this._waittings) {
149
+ rej(new Error('disposed'));
150
+ }
151
+ }
152
+
153
+ this._waittings = undefined;
151
154
 
152
- this.fireNoError =
155
+ const trace = createStackTraceHolder('disposed');
156
+ this.requireNotExecuting =
157
+ this.fireNoError =
153
158
  this.fire =
154
159
  this.handle =
155
160
  () => {
156
- throw new Error('Event is disposed', { cause: trace });
161
+ throw new DuplicateDisposed(this, trace);
157
162
  };
158
163
  }
159
164
 
165
+ readonly [Symbol.dispose] = this.dispose;
166
+
160
167
  private requireNotExecuting() {
161
168
  if (this.executing) {
162
169
  throw new Error('conflict state, emitter is firing');