@zk-tech/bedrock 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/README.md +24 -0
  2. package/dist/array/index.cjs +22 -0
  3. package/dist/array/index.cjs.map +1 -0
  4. package/dist/array/index.d.cts +13 -0
  5. package/dist/array/index.d.ts +13 -0
  6. package/dist/array/index.js +19 -0
  7. package/dist/array/index.js.map +1 -0
  8. package/dist/assert/index.cjs +29 -0
  9. package/dist/assert/index.cjs.map +1 -0
  10. package/dist/assert/index.d.cts +25 -0
  11. package/dist/assert/index.d.ts +25 -0
  12. package/dist/assert/index.js +24 -0
  13. package/dist/assert/index.js.map +1 -0
  14. package/dist/async/index.cjs +746 -0
  15. package/dist/async/index.cjs.map +1 -0
  16. package/dist/async/index.d.cts +47 -0
  17. package/dist/async/index.d.ts +47 -0
  18. package/dist/async/index.js +738 -0
  19. package/dist/async/index.js.map +1 -0
  20. package/dist/barrier-316Xonfd.d.cts +18 -0
  21. package/dist/barrier-316Xonfd.d.ts +18 -0
  22. package/dist/byte/index.cjs +59 -0
  23. package/dist/byte/index.cjs.map +1 -0
  24. package/dist/byte/index.d.cts +12 -0
  25. package/dist/byte/index.d.ts +12 -0
  26. package/dist/byte/index.js +49 -0
  27. package/dist/byte/index.js.map +1 -0
  28. package/dist/cache/index.cjs +418 -0
  29. package/dist/cache/index.cjs.map +1 -0
  30. package/dist/cache/index.d.cts +40 -0
  31. package/dist/cache/index.d.ts +40 -0
  32. package/dist/cache/index.js +415 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cancellation-BIIv2UJm.d.cts +25 -0
  35. package/dist/cancellation-ClqPPsV1.d.ts +25 -0
  36. package/dist/context/index.cjs +59 -0
  37. package/dist/context/index.cjs.map +1 -0
  38. package/dist/context/index.d.cts +33 -0
  39. package/dist/context/index.d.ts +33 -0
  40. package/dist/context/index.js +51 -0
  41. package/dist/context/index.js.map +1 -0
  42. package/dist/di/index.cjs +1965 -0
  43. package/dist/di/index.cjs.map +1 -0
  44. package/dist/di/index.d.cts +140 -0
  45. package/dist/di/index.d.ts +140 -0
  46. package/dist/di/index.js +1949 -0
  47. package/dist/di/index.js.map +1 -0
  48. package/dist/disposable-t-B15Nu57y.d.ts +93 -0
  49. package/dist/disposable-t-CVsiyHPL.d.cts +93 -0
  50. package/dist/dispose/index.cjs +356 -0
  51. package/dist/dispose/index.cjs.map +1 -0
  52. package/dist/dispose/index.d.cts +26 -0
  53. package/dist/dispose/index.d.ts +26 -0
  54. package/dist/dispose/index.js +340 -0
  55. package/dist/dispose/index.js.map +1 -0
  56. package/dist/dispose-base-CAeXDpjg.d.cts +6 -0
  57. package/dist/dispose-base-CAeXDpjg.d.ts +6 -0
  58. package/dist/emitter-CAfCtSTg.d.cts +35 -0
  59. package/dist/emitter-DeM5mlEm.d.ts +35 -0
  60. package/dist/error/index.cjs +145 -0
  61. package/dist/error/index.cjs.map +1 -0
  62. package/dist/error/index.d.cts +45 -0
  63. package/dist/error/index.d.ts +45 -0
  64. package/dist/error/index.js +126 -0
  65. package/dist/error/index.js.map +1 -0
  66. package/dist/error-base-B4zaiJ5m.d.cts +32 -0
  67. package/dist/error-base-B4zaiJ5m.d.ts +32 -0
  68. package/dist/event/index.cjs +550 -0
  69. package/dist/event/index.cjs.map +1 -0
  70. package/dist/event/index.d.cts +139 -0
  71. package/dist/event/index.d.ts +139 -0
  72. package/dist/event/index.js +538 -0
  73. package/dist/event/index.js.map +1 -0
  74. package/dist/function/index.cjs +132 -0
  75. package/dist/function/index.cjs.map +1 -0
  76. package/dist/function/index.d.cts +26 -0
  77. package/dist/function/index.d.ts +26 -0
  78. package/dist/function/index.js +129 -0
  79. package/dist/function/index.js.map +1 -0
  80. package/dist/graph-BGbNOniY.d.cts +23 -0
  81. package/dist/graph-BGbNOniY.d.ts +23 -0
  82. package/dist/hash/index.cjs +54 -0
  83. package/dist/hash/index.cjs.map +1 -0
  84. package/dist/hash/index.d.cts +5 -0
  85. package/dist/hash/index.d.ts +5 -0
  86. package/dist/hash/index.js +50 -0
  87. package/dist/hash/index.js.map +1 -0
  88. package/dist/instantiation-service.interface-CVFMBUUD.d.cts +78 -0
  89. package/dist/instantiation-service.interface-CVFMBUUD.d.ts +78 -0
  90. package/dist/json/index.cjs +28 -0
  91. package/dist/json/index.cjs.map +1 -0
  92. package/dist/json/index.d.cts +8 -0
  93. package/dist/json/index.d.ts +8 -0
  94. package/dist/json/index.js +26 -0
  95. package/dist/json/index.js.map +1 -0
  96. package/dist/launch/index.cjs +213 -0
  97. package/dist/launch/index.cjs.map +1 -0
  98. package/dist/launch/index.d.cts +46 -0
  99. package/dist/launch/index.d.ts +46 -0
  100. package/dist/launch/index.js +211 -0
  101. package/dist/launch/index.js.map +1 -0
  102. package/dist/linked-list-CUkue5DZ.d.cts +24 -0
  103. package/dist/linked-list-CUkue5DZ.d.ts +24 -0
  104. package/dist/lock/index.cjs +662 -0
  105. package/dist/lock/index.cjs.map +1 -0
  106. package/dist/lock/index.d.cts +145 -0
  107. package/dist/lock/index.d.ts +145 -0
  108. package/dist/lock/index.js +656 -0
  109. package/dist/lock/index.js.map +1 -0
  110. package/dist/lodash-es/index.cjs +14 -0
  111. package/dist/lodash-es/index.cjs.map +1 -0
  112. package/dist/lodash-es/index.d.cts +1 -0
  113. package/dist/lodash-es/index.d.ts +1 -0
  114. package/dist/lodash-es/index.js +3 -0
  115. package/dist/lodash-es/index.js.map +1 -0
  116. package/dist/math/index.cjs +161 -0
  117. package/dist/math/index.cjs.map +1 -0
  118. package/dist/math/index.d.cts +76 -0
  119. package/dist/math/index.d.ts +76 -0
  120. package/dist/math/index.js +156 -0
  121. package/dist/math/index.js.map +1 -0
  122. package/dist/network/index.cjs +91 -0
  123. package/dist/network/index.cjs.map +1 -0
  124. package/dist/network/index.d.cts +62 -0
  125. package/dist/network/index.d.ts +62 -0
  126. package/dist/network/index.js +82 -0
  127. package/dist/network/index.js.map +1 -0
  128. package/dist/objects/index.cjs +80 -0
  129. package/dist/objects/index.cjs.map +1 -0
  130. package/dist/objects/index.d.cts +11 -0
  131. package/dist/objects/index.d.ts +11 -0
  132. package/dist/objects/index.js +77 -0
  133. package/dist/objects/index.js.map +1 -0
  134. package/dist/platform/index.cjs +62 -0
  135. package/dist/platform/index.cjs.map +1 -0
  136. package/dist/platform/index.d.cts +21 -0
  137. package/dist/platform/index.d.ts +21 -0
  138. package/dist/platform/index.js +48 -0
  139. package/dist/platform/index.js.map +1 -0
  140. package/dist/promise/index.cjs +639 -0
  141. package/dist/promise/index.cjs.map +1 -0
  142. package/dist/promise/index.d.cts +63 -0
  143. package/dist/promise/index.d.ts +63 -0
  144. package/dist/promise/index.js +633 -0
  145. package/dist/promise/index.js.map +1 -0
  146. package/dist/scheduler/index.cjs +599 -0
  147. package/dist/scheduler/index.cjs.map +1 -0
  148. package/dist/scheduler/index.d.cts +57 -0
  149. package/dist/scheduler/index.d.ts +57 -0
  150. package/dist/scheduler/index.js +594 -0
  151. package/dist/scheduler/index.js.map +1 -0
  152. package/dist/sprintf/index.cjs +101 -0
  153. package/dist/sprintf/index.cjs.map +1 -0
  154. package/dist/sprintf/index.d.cts +3 -0
  155. package/dist/sprintf/index.d.ts +3 -0
  156. package/dist/sprintf/index.js +99 -0
  157. package/dist/sprintf/index.js.map +1 -0
  158. package/dist/structure/index.cjs +300 -0
  159. package/dist/structure/index.cjs.map +1 -0
  160. package/dist/structure/index.d.cts +21 -0
  161. package/dist/structure/index.d.ts +21 -0
  162. package/dist/structure/index.js +296 -0
  163. package/dist/structure/index.js.map +1 -0
  164. package/dist/type/index.cjs +4 -0
  165. package/dist/type/index.cjs.map +1 -0
  166. package/dist/type/index.d.cts +20 -0
  167. package/dist/type/index.d.ts +20 -0
  168. package/dist/type/index.js +3 -0
  169. package/dist/type/index.js.map +1 -0
  170. package/dist/undo-redo-stack/index.cjs +545 -0
  171. package/dist/undo-redo-stack/index.cjs.map +1 -0
  172. package/dist/undo-redo-stack/index.d.cts +130 -0
  173. package/dist/undo-redo-stack/index.d.ts +130 -0
  174. package/dist/undo-redo-stack/index.js +542 -0
  175. package/dist/undo-redo-stack/index.js.map +1 -0
  176. package/dist/uuid/index.cjs +67 -0
  177. package/dist/uuid/index.cjs.map +1 -0
  178. package/dist/uuid/index.d.cts +17 -0
  179. package/dist/uuid/index.d.ts +17 -0
  180. package/dist/uuid/index.js +61 -0
  181. package/dist/uuid/index.js.map +1 -0
  182. package/dist/worker/index.cjs +271 -0
  183. package/dist/worker/index.cjs.map +1 -0
  184. package/dist/worker/index.d.cts +66 -0
  185. package/dist/worker/index.d.ts +66 -0
  186. package/dist/worker/index.js +267 -0
  187. package/dist/worker/index.js.map +1 -0
  188. package/package.json +285 -0
  189. package/src/_internal/logger.ts +59 -0
  190. package/src/array/array.test.ts +35 -0
  191. package/src/array/array.ts +25 -0
  192. package/src/array/index.ts +1 -0
  193. package/src/assert/assert.test.ts +86 -0
  194. package/src/assert/assert.ts +42 -0
  195. package/src/assert/index.ts +2 -0
  196. package/src/async/barrier.test.ts +90 -0
  197. package/src/async/barrier.ts +58 -0
  198. package/src/async/cancellation.test.ts +85 -0
  199. package/src/async/cancellation.ts +193 -0
  200. package/src/async/index.ts +18 -0
  201. package/src/async/queue/queue.test.ts +70 -0
  202. package/src/async/queue/queue.ts +56 -0
  203. package/src/async/queue/task.test.ts +155 -0
  204. package/src/async/queue/task.ts +67 -0
  205. package/src/async/utils.test.ts +28 -0
  206. package/src/async/utils.ts +8 -0
  207. package/src/async/wait.ts +9 -0
  208. package/src/byte/format.test.ts +64 -0
  209. package/src/byte/format.ts +44 -0
  210. package/src/byte/index.ts +2 -0
  211. package/src/byte/node_modules/.vitest/results.json +1 -0
  212. package/src/byte/var.ts +11 -0
  213. package/src/cache/index.ts +2 -0
  214. package/src/cache/lru-with-timeout.test.ts +88 -0
  215. package/src/cache/lru-with-timeout.ts +85 -0
  216. package/src/cache/lru.test.ts +56 -0
  217. package/src/cache/lru.ts +59 -0
  218. package/src/context/context.test.ts +17 -0
  219. package/src/context/context.ts +60 -0
  220. package/src/context/index.ts +8 -0
  221. package/src/di/base.ts +73 -0
  222. package/src/di/container-service.test.ts +179 -0
  223. package/src/di/context.web.tsx +41 -0
  224. package/src/di/descriptor.ts +31 -0
  225. package/src/di/idle-value.test.ts +73 -0
  226. package/src/di/idle-value.ts +63 -0
  227. package/src/di/index.common.ts +32 -0
  228. package/src/di/index.ts +2 -0
  229. package/src/di/instantiation-service.interface.ts +46 -0
  230. package/src/di/instantiation-service.test.ts +337 -0
  231. package/src/di/instantiation-service.ts +468 -0
  232. package/src/di/lazy/foo.mock.ts +28 -0
  233. package/src/di/lazy/idle-load.ts +39 -0
  234. package/src/di/lazy/index.ts +4 -0
  235. package/src/di/lazy/lazy-service.test.ts +65 -0
  236. package/src/di/lazy/lazy-service.ts +71 -0
  237. package/src/di/lazy/type.ts +5 -0
  238. package/src/di/node_modules/.vitest/results.json +1 -0
  239. package/src/di/proxy-builder.test.ts +45 -0
  240. package/src/di/proxy-builder.ts +38 -0
  241. package/src/di/service-collection.test.ts +27 -0
  242. package/src/di/service-collection.ts +46 -0
  243. package/src/di/service-ownership-collection.test.ts +39 -0
  244. package/src/di/service-ownership-collection.ts +38 -0
  245. package/src/di/service-registry.test.ts +66 -0
  246. package/src/di/service-registry.ts +99 -0
  247. package/src/di/trace.ts +85 -0
  248. package/src/dispose/disposable-store.test.ts +57 -0
  249. package/src/dispose/disposable-store.ts +80 -0
  250. package/src/dispose/disposable-t.test.ts +123 -0
  251. package/src/dispose/disposable-t.ts +238 -0
  252. package/src/dispose/disposable-utils.test.ts +15 -0
  253. package/src/dispose/disposable-utils.ts +28 -0
  254. package/src/dispose/dispose-base.ts +9 -0
  255. package/src/dispose/index.ts +34 -0
  256. package/src/dispose/logger.test.ts +65 -0
  257. package/src/dispose/logger.ts +39 -0
  258. package/src/dispose/timer.test.ts +30 -0
  259. package/src/dispose/timer.ts +16 -0
  260. package/src/dispose/tracker.test.ts +51 -0
  261. package/src/dispose/tracker.ts +105 -0
  262. package/src/error/error-base.ts +45 -0
  263. package/src/error/error-code.ts +39 -0
  264. package/src/error/error-const.test.ts +30 -0
  265. package/src/error/error-const.ts +16 -0
  266. package/src/error/error-or.test.ts +44 -0
  267. package/src/error/error-or.ts +2 -0
  268. package/src/error/error-t.test.ts +116 -0
  269. package/src/error/error-t.ts +100 -0
  270. package/src/error/index.ts +24 -0
  271. package/src/error/node_modules/.vitest/results.json +1 -0
  272. package/src/event/disposable-linked-list.ts +29 -0
  273. package/src/event/emitter.test.ts +191 -0
  274. package/src/event/emitter.ts +162 -0
  275. package/src/event/error-handler.ts +22 -0
  276. package/src/event/index.ts +34 -0
  277. package/src/event/once.ts +29 -0
  278. package/src/event/phase-emitter.test.ts +212 -0
  279. package/src/event/phase-emitter.ts +209 -0
  280. package/src/event/shortcut-event-utils.ts +33 -0
  281. package/src/event/utils.ts +6 -0
  282. package/src/event/when.ts +40 -0
  283. package/src/function/debounce.test.ts +274 -0
  284. package/src/function/debounce.ts +168 -0
  285. package/src/function/index.ts +2 -0
  286. package/src/function/node_modules/.vitest/results.json +1 -0
  287. package/src/function/throttle.test.ts +179 -0
  288. package/src/function/throttle.ts +26 -0
  289. package/src/hash/hash-t.test.ts +100 -0
  290. package/src/hash/hash-t.ts +51 -0
  291. package/src/hash/index.ts +3 -0
  292. package/src/json/index.ts +1 -0
  293. package/src/json/node_modules/.vitest/results.json +1 -0
  294. package/src/json/parse.ts +19 -0
  295. package/src/launch/abstract-job.ts +45 -0
  296. package/src/launch/cost-recorder.ts +22 -0
  297. package/src/launch/index.ts +2 -0
  298. package/src/launch/job-scheduler.test.ts +122 -0
  299. package/src/launch/job-scheduler.ts +118 -0
  300. package/src/launch/node_modules/.vitest/deps/_metadata.json +8 -0
  301. package/src/launch/node_modules/.vitest/deps/package.json +3 -0
  302. package/src/launch/node_modules/.vitest/results.json +1 -0
  303. package/src/lock/README.md +11 -0
  304. package/src/lock/capability.test.ts +110 -0
  305. package/src/lock/capability.ts +89 -0
  306. package/src/lock/index.ts +15 -0
  307. package/src/lock/node_modules/.vitest/results.json +1 -0
  308. package/src/lock/semaphore.ts +21 -0
  309. package/src/lock/shared-mutex.test.ts +537 -0
  310. package/src/lock/shared-mutex.ts +242 -0
  311. package/src/lock/utils.test.ts +165 -0
  312. package/src/lock/utils.ts +135 -0
  313. package/src/lodash-es/index.ts +1 -0
  314. package/src/math/degree.ts +16 -0
  315. package/src/math/index.ts +7 -0
  316. package/src/math/math.test.ts +40 -0
  317. package/src/math/math.ts +64 -0
  318. package/src/math/node_modules/.vitest/results.json +1 -0
  319. package/src/math/vector.test.ts +73 -0
  320. package/src/math/vector.ts +114 -0
  321. package/src/network/client.interface.ts +104 -0
  322. package/src/network/client.web.ts +24 -0
  323. package/src/network/index.common.ts +10 -0
  324. package/src/network/index.ts +2 -0
  325. package/src/network/plugins/retry.ts +98 -0
  326. package/src/objects/deep-clone.test.ts +40 -0
  327. package/src/objects/deep-clone.ts +13 -0
  328. package/src/objects/deep-equal.test.ts +86 -0
  329. package/src/objects/deep-equal.ts +60 -0
  330. package/src/objects/index.ts +4 -0
  331. package/src/platform/index.ts +64 -0
  332. package/src/promise/index.ts +16 -0
  333. package/src/promise/promise.test.ts +254 -0
  334. package/src/promise/promise.ts +212 -0
  335. package/src/scheduler/callback-token.ts +31 -0
  336. package/src/scheduler/core/actuator-args.test.ts +47 -0
  337. package/src/scheduler/core/actuator.test.ts +82 -0
  338. package/src/scheduler/core/actuator.ts +58 -0
  339. package/src/scheduler/core/chunk-scheduler.test.ts +54 -0
  340. package/src/scheduler/core/chunk-scheduler.ts +28 -0
  341. package/src/scheduler/core/node_modules/.vitest/results.json +1 -0
  342. package/src/scheduler/core/scheduler.test.ts +328 -0
  343. package/src/scheduler/core/scheduler.ts +172 -0
  344. package/src/scheduler/core/task-queue.test.ts +78 -0
  345. package/src/scheduler/core/task-queue.ts +44 -0
  346. package/src/scheduler/core/task.test.ts +34 -0
  347. package/src/scheduler/core/task.ts +52 -0
  348. package/src/scheduler/core/utils.ts +48 -0
  349. package/src/scheduler/executor/abstract-executor.test.ts +44 -0
  350. package/src/scheduler/executor/abstract-executor.ts +38 -0
  351. package/src/scheduler/executor/executor.interface.ts +39 -0
  352. package/src/scheduler/executor/idle-callback-executor.test.ts +70 -0
  353. package/src/scheduler/executor/idle-callback-executor.ts +98 -0
  354. package/src/scheduler/executor/make-executor.ts +18 -0
  355. package/src/scheduler/executor/post-message-executor.test.ts +66 -0
  356. package/src/scheduler/executor/post-message-executor.ts +52 -0
  357. package/src/scheduler/index.ts +15 -0
  358. package/src/scheduler/lv-scheduler-callback.ts +19 -0
  359. package/src/scheduler/lv-scheduler-config.ts +17 -0
  360. package/src/scheduler/type.ts +48 -0
  361. package/src/sprintf/index.ts +2 -0
  362. package/src/sprintf/sprintf.test.ts +95 -0
  363. package/src/sprintf/sprintf.ts +97 -0
  364. package/src/structure/graph.test.ts +181 -0
  365. package/src/structure/graph.ts +105 -0
  366. package/src/structure/index.ts +8 -0
  367. package/src/structure/linked-list.test.ts +74 -0
  368. package/src/structure/linked-list.ts +145 -0
  369. package/src/structure/min-heap.test.ts +71 -0
  370. package/src/structure/min-heap.ts +91 -0
  371. package/src/type/REAME.md +2 -0
  372. package/src/type/distributive-omit.interface.ts +4 -0
  373. package/src/type/index.ts +3 -0
  374. package/src/type/object-key-paths.interface.ts +40 -0
  375. package/src/undo-redo-stack/README.md +61 -0
  376. package/src/undo-redo-stack/action-stack.test.ts +330 -0
  377. package/src/undo-redo-stack/action-stack.ts +150 -0
  378. package/src/undo-redo-stack/element.ts +4 -0
  379. package/src/undo-redo-stack/index.ts +7 -0
  380. package/src/undo-redo-stack/state-stack.test.ts +118 -0
  381. package/src/undo-redo-stack/state-stack.ts +133 -0
  382. package/src/uuid/index.ts +7 -0
  383. package/src/uuid/uuid.ts +86 -0
  384. package/src/worker/cors-worker.ts +38 -0
  385. package/src/worker/index.ts +4 -0
  386. package/src/worker/node_modules/.vitest/results.json +1 -0
  387. package/src/worker/promise-worker-main-thread.test.ts +91 -0
  388. package/src/worker/promise-worker-main-thread.ts +76 -0
  389. package/src/worker/promise-worker-worker-thread.ts +64 -0
  390. package/src/worker/promise-worker.interface.ts +15 -0
@@ -0,0 +1,211 @@
1
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
2
+ var __decorateClass = (decorators, target, key, kind) => {
3
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
4
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
5
+ if (decorator = decorators[i])
6
+ result = (decorator(result)) || result;
7
+ return result;
8
+ };
9
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
10
+
11
+ // src/assert/assert.ts
12
+ function abort(reason) {
13
+ throw new Error(`lvAssert(${reason})`);
14
+ }
15
+ function lvAssert(expr, reason) {
16
+ if (!expr) {
17
+ abort(reason);
18
+ }
19
+ }
20
+ function lvAssertNotHere(reason) {
21
+ abort(reason ?? "unreachable code flow");
22
+ }
23
+
24
+ // src/launch/abstract-job.ts
25
+ var AbstractJob = class {
26
+ constructor() {
27
+ this._store = /* @__PURE__ */ new Map();
28
+ }
29
+ get name() {
30
+ return this._name;
31
+ }
32
+ shouldWait(phase) {
33
+ const barriers = this._store.get(phase);
34
+ if (!barriers?.length) {
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ wait(phase) {
40
+ try {
41
+ const barriers = this._store.get(phase);
42
+ if (!barriers?.length) {
43
+ return Promise.resolve();
44
+ }
45
+ return Promise.all(barriers.map((barrier) => barrier.wait()));
46
+ } finally {
47
+ this._store.delete(phase);
48
+ }
49
+ }
50
+ prepare(phase) {
51
+ this._executePhase(phase);
52
+ }
53
+ _setBarrier(phase, barrier) {
54
+ if (!this._store.has(phase)) {
55
+ this._store.set(phase, []);
56
+ }
57
+ const barriers = this._store.get(phase);
58
+ barriers.push(barrier);
59
+ }
60
+ };
61
+
62
+ // src/di/base.ts
63
+ var serviceIds = /* @__PURE__ */ new Map();
64
+ var DI_TARGET = "$di$target";
65
+ var DI_DEPENDENCIES = "$di$dependencies";
66
+ function setServiceDependency(id, ctor, index) {
67
+ if (ctor[DI_TARGET] === ctor) {
68
+ ctor[DI_DEPENDENCIES].push({ id, index });
69
+ } else {
70
+ ctor[DI_DEPENDENCIES] = [{ id, index }];
71
+ ctor[DI_TARGET] = ctor;
72
+ }
73
+ }
74
+ function createDecorator(serviceId) {
75
+ if (serviceIds.has(serviceId)) {
76
+ return serviceIds.get(serviceId);
77
+ }
78
+ const id = function(target, key, index) {
79
+ if (arguments.length !== 3) {
80
+ throw new Error("@IServiceName-decorator can only be used to decorate a parameter");
81
+ }
82
+ setServiceDependency(id, target, index);
83
+ };
84
+ id.toString = () => serviceId;
85
+ serviceIds.set(serviceId, id);
86
+ return id;
87
+ }
88
+
89
+ // src/di/instantiation-service.interface.ts
90
+ var IInstantiationService = createDecorator("instantiation");
91
+
92
+ // src/launch/cost-recorder.ts
93
+ var CostRecorder = class {
94
+ constructor() {
95
+ // 每个job在不同阶段的耗时
96
+ this._jobCost = {};
97
+ }
98
+ record(jobName, lifecycle, cost) {
99
+ if (!this._jobCost[jobName]) {
100
+ this._jobCost[jobName] = {};
101
+ }
102
+ if (!this._jobCost[jobName][lifecycle]) {
103
+ this._jobCost[jobName][lifecycle] = 0;
104
+ }
105
+ this._jobCost[jobName][lifecycle] += cost;
106
+ }
107
+ toString() {
108
+ return JSON.stringify(this._jobCost);
109
+ }
110
+ };
111
+
112
+ // src/launch/job-scheduler.ts
113
+ var JobDescriptor = class {
114
+ constructor(ctor, args) {
115
+ this.ctor = ctor;
116
+ this.staticArguments = args;
117
+ }
118
+ };
119
+ var JobScheduler = class {
120
+ constructor(_currentPhase, _instantiationService) {
121
+ this._currentPhase = _currentPhase;
122
+ this._instantiationService = _instantiationService;
123
+ this._jobPools = /* @__PURE__ */ new Map();
124
+ this._costRecorder = new CostRecorder();
125
+ this._unconstructedJobs = /* @__PURE__ */ new Map();
126
+ }
127
+ get currentPhase() {
128
+ return this._currentPhase;
129
+ }
130
+ /**
131
+ * 按需添加一个job,job会在phase时刻才进行实例化
132
+ * @param phase job实例化时机
133
+ * @param ctor job构造函数
134
+ * @param args job构造静态参数
135
+ */
136
+ registerJob(phase, ctor, ...args) {
137
+ if (!this._unconstructedJobs.has(phase)) {
138
+ this._unconstructedJobs.set(phase, [new JobDescriptor(ctor, args)]);
139
+ } else {
140
+ this._unconstructedJobs.get(phase).push(new JobDescriptor(ctor, args));
141
+ }
142
+ }
143
+ /**
144
+ * 添加一个构造好的job
145
+ * @param job 任务
146
+ */
147
+ addJob(job) {
148
+ lvAssert(!this._jobPools.has(job.name), "cant duplicate add job.");
149
+ this._jobPools.set(job.name, job);
150
+ }
151
+ removeJob(jobName) {
152
+ this._jobPools.delete(jobName);
153
+ }
154
+ prepare(phase) {
155
+ const descriptors = this._unconstructedJobs.get(phase) ?? [];
156
+ for (const d of descriptors) {
157
+ this.addJob(this._instantiationService.createInstance(d.ctor, ...d.staticArguments));
158
+ }
159
+ let shouldWait = false;
160
+ this._unconstructedJobs.delete(phase);
161
+ for (const [, job] of this._jobPools) {
162
+ const start = Date.now();
163
+ job.prepare(phase);
164
+ this._costRecorder.record(job.name, phase, Date.now() - start);
165
+ if (job.shouldWait(phase)) {
166
+ shouldWait = true;
167
+ }
168
+ }
169
+ return shouldWait;
170
+ }
171
+ getCost() {
172
+ return this._costRecorder.toString();
173
+ }
174
+ /**
175
+ * 推进到目标阶段,要求目标阶段没有需要等待的任务
176
+ * @param phase 目标阶段
177
+ */
178
+ advanceToPhase(phase) {
179
+ for (const [, job] of this._jobPools) {
180
+ if (job.shouldWait(phase)) {
181
+ lvAssertNotHere(`exists job should wait, job name: ${job.name}, phase: ${phase}`);
182
+ }
183
+ }
184
+ this._currentPhase = phase;
185
+ }
186
+ async wait(phase) {
187
+ const jobPromises = [];
188
+ for (const [, job] of this._jobPools) {
189
+ if (!job.shouldWait(phase)) {
190
+ continue;
191
+ }
192
+ jobPromises.push(
193
+ (() => {
194
+ const start = Date.now();
195
+ return job.wait(phase).then(() => {
196
+ this._costRecorder.record(job.name, phase, Date.now() - start);
197
+ });
198
+ })()
199
+ );
200
+ }
201
+ await Promise.all(jobPromises);
202
+ this._currentPhase = phase;
203
+ }
204
+ };
205
+ JobScheduler = __decorateClass([
206
+ __decorateParam(1, IInstantiationService)
207
+ ], JobScheduler);
208
+
209
+ export { AbstractJob, JobScheduler };
210
+ //# sourceMappingURL=index.js.map
211
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/assert/assert.ts","../../src/launch/abstract-job.ts","../../src/di/base.ts","../../src/di/instantiation-service.interface.ts","../../src/launch/cost-recorder.ts","../../src/launch/job-scheduler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["function abort(reason: string): never {\n throw new Error(`lvAssert(${reason})`);\n}\n\n/**\n * 断言表达式为真\n * @param expr \n * @param reason \n */\nexport function lvAssert(expr: unknown, reason?: string): asserts expr {\n if (!expr) {\n abort(reason ?? '#expr is false');\n }\n}\n\n/**\n * 断言deadcode路径\n * @param reason \n */\nexport function lvAssertNotHere(reason?: string): never {\n abort(reason ?? 'unreachable code flow');\n}\n\n/**\n * 断言类型不可达\n * @param member \n * @param message \n */\nexport function lvAssertNever(member: never, message = 'Illegal value:'): never {\n abort(`${message}: ${member}`);\n}\n\n/**\n * 断言变量为null或者undefined\n * @param val \n * @param reason \n */\nexport function lvAssertNotNil<T>(val: T, reason?: string): asserts val is NonNullable<T> {\n if (val === null || val === undefined) {\n abort(reason ?? '#val is nil');\n }\n}\n","import { Barrier } from '@/async';\n\nexport abstract class AbstractJob<T, K extends T = T> {\n protected abstract _name: string;\n protected _store: Map<K, Barrier[]> = new Map();\n\n get name() {\n return this._name;\n }\n\n shouldWait(phase: K) {\n const barriers = this._store.get(phase);\n if (!barriers?.length) {\n return false;\n }\n return true;\n }\n\n wait(phase: K): Promise<void> {\n try {\n const barriers = this._store.get(phase);\n if (!barriers?.length) {\n return Promise.resolve();\n }\n return Promise.all(barriers.map((barrier) => barrier.wait())) as unknown as Promise<void>;\n } finally {\n // 执行之后就清空,确保失败或cancel态时可以重复 prepare.\n this._store.delete(phase);\n }\n }\n\n prepare(phase: K) {\n this._executePhase(phase);\n }\n\n protected _setBarrier(phase: K, barrier: Barrier) {\n if (!this._store.has(phase)) {\n this._store.set(phase, []);\n }\n const barriers = this._store.get(phase)!;\n barriers.push(barrier);\n }\n\n protected abstract _executePhase(phase: K): void;\n}\n","// service特征标识\nexport type BrandedService = { _serviceBrand: undefined };\n\n//\n// 服务唯一标识符(编译时生成)\n// 需要DI进行注入的服务必须拥有该标识符\n// 本质上是一个参数装饰器\n//\nexport interface ServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\n// 获取服务的视图接口\nexport interface ServicesAccessor {\n get: <T>(id: ServiceIdentifier<T>) => T;\n}\n\n// 服务唯一标识符存储\nconst serviceIds = new Map<string, ServiceIdentifier<any>>();\n\nexport const DI_TARGET = '$di$target';\nexport const DI_DEPENDENCIES = '$di$dependencies';\n\n// 获取某个服务的依赖\n// 因为服务依赖关系会存放在构造函数的属性上\nexport function getServiceDependencies(ctor: any): { id: ServiceIdentifier<any>; index: number }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\n// 更新服务依赖依赖关系\nfunction setServiceDependency(id: ServiceIdentifier<any>, ctor: any, index: number): void {\n if (ctor[DI_TARGET] === ctor) {\n ctor[DI_DEPENDENCIES].push({ id, index });\n } else {\n ctor[DI_DEPENDENCIES] = [{ id, index }];\n ctor[DI_TARGET] = ctor;\n }\n}\n\n//\n// 创建服务唯一标识符\n// 传入服务ID,返回一个参数装饰器\n// 参数装饰器会记录A需要\n// const IFooServiceId = createDecorator<FooService>('FooService');\n//\n// class Bar\n// constructor(@IFooServiceId a: IFooService) // IFooService是接口声明\n//\nexport function createDecorator<T>(serviceId: string): ServiceIdentifier<T> {\n if (serviceIds.has(serviceId)) {\n return serviceIds.get(serviceId)!;\n }\n\n const id = function (target: any, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n setServiceDependency(id, target, index);\n } as any;\n\n id.toString = () => serviceId;\n\n serviceIds.set(serviceId, id);\n return id;\n}\n\n// TODO(niurouwan): 补一下注释和例子\nexport function refineServiceDecorator<T1, T extends T1>(\n serviceIdentifier: ServiceIdentifier<T1>,\n): ServiceIdentifier<T> {\n return serviceIdentifier as ServiceIdentifier<T>;\n}\n","import type { BrandedService, ServicesAccessor } from './base';\nimport { createDecorator } from './base';\nimport type { SyncDescriptor0 } from './descriptor';\nimport type { ServiceCollection } from './service-collection';\n\nexport type GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends []\n ? []\n : TArgs extends [...infer TFirst, BrandedService]\n ? GetLeadingNonServiceArgs<TFirst>\n : TArgs;\n\nexport interface IInstantiationService {\n readonly _serviceBrand: undefined;\n\n /**\n * Synchronously creates an instance that is denoted by the descriptor\n */\n createInstance: {\n <T>(descriptor: SyncDescriptor0<T>): T;\n <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(\n ctor: Ctor,\n ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>\n ): R;\n };\n\n /**\n * Calls a function with a service accessor.\n */\n invokeFunction: <R, TS extends any[] = []>(\n fn: (accessor: ServicesAccessor, ...args: TS) => R,\n ...args: TS\n ) => R;\n\n /**\n * Creates a child of this service which inherits all current services\n * and adds/overwrites the given services.\n */\n createChild: (services: ServiceCollection) => IInstantiationService;\n\n /**\n * 生命周期归属该DI上下文的服务进行销毁\n */\n dispose: () => void;\n}\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('instantiation');\n","// lifecycle -> cost\n// 启动流程lifecycle某个阶段对应的耗时\ntype Trace = Record<string | number, number>;\n\nexport class CostRecorder {\n // 每个job在不同阶段的耗时\n private _jobCost: Record<string, Trace> = {};\n\n record(jobName: string, lifecycle: string | number, cost: number) {\n if (!this._jobCost[jobName]) {\n this._jobCost[jobName] = {};\n }\n if (!this._jobCost[jobName][lifecycle]) {\n this._jobCost[jobName][lifecycle] = 0;\n }\n this._jobCost[jobName][lifecycle] += cost;\n }\n\n toString() {\n return JSON.stringify(this._jobCost);\n }\n}\n","import { IInstantiationService, type GetLeadingNonServiceArgs } from '@/di';\nimport { lvAssert, lvAssertNotHere } from '@/assert';\nimport type { AbstractJob } from './abstract-job';\nimport { CostRecorder } from './cost-recorder';\n\nclass JobDescriptor<T, K extends T> {\n readonly ctor: new (...args: any[]) => AbstractJob<T, K>;\n readonly staticArguments: any[];\n\n constructor(ctor: new (...args: any[]) => AbstractJob<T, K>, args: any[]) {\n this.ctor = ctor;\n this.staticArguments = args;\n }\n}\n\nexport class JobScheduler<T, K extends T = T> {\n private readonly _jobPools: Map<string, AbstractJob<T, K>> = new Map();\n private readonly _costRecorder = new CostRecorder();\n private readonly _unconstructedJobs: Map<K, JobDescriptor<AbstractJob<T, K>, any>[]> = new Map();\n\n constructor(\n private _currentPhase: K,\n @IInstantiationService private readonly _instantiationService: IInstantiationService,\n ) {}\n\n get currentPhase() {\n return this._currentPhase;\n }\n\n /**\n * 按需添加一个job,job会在phase时刻才进行实例化\n * @param phase job实例化时机\n * @param ctor job构造函数\n * @param args job构造静态参数\n */\n registerJob<Ctor extends new (...args: any[]) => AbstractJob<T, K>>(\n phase: K,\n ctor: Ctor,\n ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>\n ) {\n if (!this._unconstructedJobs.has(phase)) {\n this._unconstructedJobs.set(phase, [new JobDescriptor(ctor, args)]);\n } else {\n this._unconstructedJobs.get(phase)!.push(new JobDescriptor(ctor, args));\n }\n }\n\n /**\n * 添加一个构造好的job\n * @param job 任务\n */\n addJob(job: AbstractJob<T, K>) {\n lvAssert(!this._jobPools.has(job.name), 'cant duplicate add job.');\n this._jobPools.set(job.name, job);\n }\n\n removeJob(jobName: string) {\n this._jobPools.delete(jobName);\n }\n\n prepare(phase: K) {\n const descriptors = this._unconstructedJobs.get(phase) ?? [];\n for (const d of descriptors) {\n this.addJob(this._instantiationService.createInstance(d.ctor, ...d.staticArguments));\n }\n let shouldWait = false;\n this._unconstructedJobs.delete(phase);\n for (const [, job] of this._jobPools) {\n const start = Date.now();\n job.prepare(phase);\n this._costRecorder.record(job.name, phase as number | string, Date.now() - start);\n\n if (job.shouldWait(phase)) {\n shouldWait = true;\n }\n }\n\n return shouldWait;\n }\n\n getCost() {\n return this._costRecorder.toString();\n }\n\n /**\n * 推进到目标阶段,要求目标阶段没有需要等待的任务\n * @param phase 目标阶段\n */\n advanceToPhase(phase: K) {\n for (const [, job] of this._jobPools) {\n if (job.shouldWait(phase)) {\n lvAssertNotHere(`exists job should wait, job name: ${job.name}, phase: ${phase}`);\n }\n }\n\n this._currentPhase = phase;\n }\n\n async wait(phase: K) {\n const jobPromises: Promise<void>[] = [];\n for (const [, job] of this._jobPools) {\n if (!job.shouldWait(phase)) {\n continue;\n }\n jobPromises.push(\n (() => {\n const start = Date.now();\n return job.wait(phase).then(() => {\n this._costRecorder.record(job.name, phase as number | string, Date.now() - start);\n });\n })(),\n );\n }\n\n await Promise.all(jobPromises);\n this._currentPhase = phase;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ declare class ListNode<T> {
2
+ value: T;
3
+ next: ListNode<T> | null;
4
+ prev: ListNode<T> | null;
5
+ constructor(value: T, next?: ListNode<T> | null, prev?: ListNode<T> | null);
6
+ }
7
+ declare class LinkedList<T> {
8
+ protected _head: ListNode<T> | null;
9
+ protected _tail: ListNode<T> | null;
10
+ protected _count: number;
11
+ get size(): number;
12
+ get firstNode(): ListNode<T> | null;
13
+ isEmpty(): boolean;
14
+ clear(): void;
15
+ unshift(value: T): LinkedList<T>;
16
+ push(value: T): LinkedList<T>;
17
+ shift(): T | null;
18
+ pop(): T | null;
19
+ toArray(): T[];
20
+ [Symbol.iterator](): Iterator<T>;
21
+ protected _remove(node: ListNode<T>): void;
22
+ }
23
+
24
+ export { LinkedList as L };
@@ -0,0 +1,24 @@
1
+ declare class ListNode<T> {
2
+ value: T;
3
+ next: ListNode<T> | null;
4
+ prev: ListNode<T> | null;
5
+ constructor(value: T, next?: ListNode<T> | null, prev?: ListNode<T> | null);
6
+ }
7
+ declare class LinkedList<T> {
8
+ protected _head: ListNode<T> | null;
9
+ protected _tail: ListNode<T> | null;
10
+ protected _count: number;
11
+ get size(): number;
12
+ get firstNode(): ListNode<T> | null;
13
+ isEmpty(): boolean;
14
+ clear(): void;
15
+ unshift(value: T): LinkedList<T>;
16
+ push(value: T): LinkedList<T>;
17
+ shift(): T | null;
18
+ pop(): T | null;
19
+ toArray(): T[];
20
+ [Symbol.iterator](): Iterator<T>;
21
+ protected _remove(node: ListNode<T>): void;
22
+ }
23
+
24
+ export { LinkedList as L };