@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,1965 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __decorateClass = (decorators, target, key, kind) => {
7
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
8
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
+ if (decorator = decorators[i])
10
+ result = (decorator(result)) || result;
11
+ return result;
12
+ };
13
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
14
+
15
+ // src/di/base.ts
16
+ var serviceIds = /* @__PURE__ */ new Map();
17
+ var DI_TARGET = "$di$target";
18
+ var DI_DEPENDENCIES = "$di$dependencies";
19
+ function getServiceDependencies(ctor) {
20
+ return ctor[DI_DEPENDENCIES] || [];
21
+ }
22
+ function setServiceDependency(id, ctor, index) {
23
+ if (ctor[DI_TARGET] === ctor) {
24
+ ctor[DI_DEPENDENCIES].push({ id, index });
25
+ } else {
26
+ ctor[DI_DEPENDENCIES] = [{ id, index }];
27
+ ctor[DI_TARGET] = ctor;
28
+ }
29
+ }
30
+ function createDecorator(serviceId) {
31
+ if (serviceIds.has(serviceId)) {
32
+ return serviceIds.get(serviceId);
33
+ }
34
+ const id = function(target, key, index) {
35
+ if (arguments.length !== 3) {
36
+ throw new Error("@IServiceName-decorator can only be used to decorate a parameter");
37
+ }
38
+ setServiceDependency(id, target, index);
39
+ };
40
+ id.toString = () => serviceId;
41
+ serviceIds.set(serviceId, id);
42
+ return id;
43
+ }
44
+ function refineServiceDecorator(serviceIdentifier) {
45
+ return serviceIdentifier;
46
+ }
47
+
48
+ // src/di/descriptor.ts
49
+ var SyncDescriptor = class {
50
+ constructor(ctor, staticArguments = [], supportsDelayedInstantiation = false) {
51
+ this.ctor = ctor;
52
+ this.staticArguments = staticArguments;
53
+ this.supportsDelayedInstantiation = supportsDelayedInstantiation;
54
+ }
55
+ };
56
+
57
+ // src/di/instantiation-service.interface.ts
58
+ var IInstantiationService = createDecorator("instantiation");
59
+
60
+ // src/_internal/logger.ts
61
+ var Logger = {
62
+ error(...data) {
63
+ if (typeof console.error === "function") {
64
+ console.error(...data);
65
+ }
66
+ },
67
+ info(...data) {
68
+ if (typeof console.info === "function") {
69
+ console.info(...data);
70
+ }
71
+ },
72
+ log(...data) {
73
+ if (typeof console.log === "function") {
74
+ console.log(...data);
75
+ }
76
+ },
77
+ time(label) {
78
+ if (typeof console.time === "function") {
79
+ console.time(label);
80
+ }
81
+ },
82
+ timeEnd(label) {
83
+ if (typeof console.timeEnd === "function") {
84
+ console.timeEnd(label);
85
+ }
86
+ },
87
+ timeLog(label, ...data) {
88
+ if (typeof console.timeLog === "function") {
89
+ console.timeLog(label, ...data);
90
+ }
91
+ },
92
+ timeStamp(label) {
93
+ if (typeof console.timeStamp === "function") {
94
+ console.timeStamp(label);
95
+ }
96
+ },
97
+ trace(...data) {
98
+ if (typeof console.trace === "function") {
99
+ console.trace(...data);
100
+ }
101
+ },
102
+ warn(...data) {
103
+ if (typeof console.warn === "function") {
104
+ console.warn(...data);
105
+ }
106
+ },
107
+ profile(label) {
108
+ if (typeof console.profile === "function") {
109
+ console.profile(label);
110
+ }
111
+ },
112
+ profileEnd(label) {
113
+ if (typeof console.profileEnd === "function") {
114
+ console.profileEnd(label);
115
+ }
116
+ }
117
+ };
118
+
119
+ // src/assert/assert.ts
120
+ function abort(reason) {
121
+ throw new Error(`lvAssert(${reason})`);
122
+ }
123
+ function lvAssert(expr, reason) {
124
+ if (!expr) {
125
+ abort(reason ?? "#expr is false");
126
+ }
127
+ }
128
+ function lvAssertNotNil(val, reason) {
129
+ if (val === null || val === void 0) {
130
+ abort(reason ?? "#val is nil");
131
+ }
132
+ }
133
+
134
+ // src/dispose/disposable-t.ts
135
+ var SafeDisposable = class {
136
+ constructor(value) {
137
+ this._value = value;
138
+ }
139
+ get value() {
140
+ return this._value;
141
+ }
142
+ isEmpty() {
143
+ return this._value === void 0;
144
+ }
145
+ dispose() {
146
+ if (!this._value) {
147
+ return;
148
+ }
149
+ this._value.dispose();
150
+ this._value = void 0;
151
+ }
152
+ };
153
+
154
+ // src/dispose/disposable-utils.ts
155
+ function makeSafeDisposable(fn) {
156
+ const disposable = new SafeDisposable({
157
+ dispose: fn
158
+ });
159
+ return disposable;
160
+ }
161
+ function isDisposable(thing) {
162
+ return typeof thing.dispose === "function" && thing.dispose.length === 0;
163
+ }
164
+
165
+ // src/scheduler/core/task.ts
166
+ var Task = class {
167
+ constructor(callback, _startTime, _expirationTime) {
168
+ this._startTime = _startTime;
169
+ this._expirationTime = _expirationTime;
170
+ this._sortIndex = -1;
171
+ this._callback = callback;
172
+ }
173
+ getCallback() {
174
+ return this._callback;
175
+ }
176
+ setCallback(callback) {
177
+ lvAssert(this._callback === void 0, "cant overlay callback.");
178
+ this._callback = callback;
179
+ }
180
+ clearCallback() {
181
+ this._callback = void 0;
182
+ }
183
+ getStartTime() {
184
+ return this._startTime;
185
+ }
186
+ setStartTime(startTime) {
187
+ this._startTime = startTime;
188
+ }
189
+ getExpirationTime() {
190
+ return this._expirationTime;
191
+ }
192
+ setExpirationTime(expirationTime) {
193
+ this._expirationTime = expirationTime;
194
+ }
195
+ setSortIndex(index) {
196
+ this._sortIndex = index;
197
+ }
198
+ getSortIndex() {
199
+ return this._sortIndex;
200
+ }
201
+ };
202
+
203
+ // src/scheduler/core/utils.ts
204
+ var maxSigned31BitInt = 1073741823;
205
+ var IMMEDIATE_PRIORITY_TIMEOUT = -1;
206
+ var USER_BLOCKING_PRIORITY_TIMEOUT = 250;
207
+ var NORMAL_PRIORITY_TIMEOUT = 5e3;
208
+ var LOW_PRIORITY_TIMEOUT = 1e4;
209
+ var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;
210
+ function getCurrentTime() {
211
+ return Date.now();
212
+ }
213
+ function getTimeout(priorityLevel = 2 /* NormalPriority */) {
214
+ switch (priorityLevel) {
215
+ case 0 /* ImmediatePriority */:
216
+ return IMMEDIATE_PRIORITY_TIMEOUT;
217
+ case 1 /* UserBlockingPriority */:
218
+ return USER_BLOCKING_PRIORITY_TIMEOUT;
219
+ case 4 /* IdlePriority */:
220
+ return IDLE_PRIORITY_TIMEOUT;
221
+ case 3 /* LowPriority */:
222
+ return LOW_PRIORITY_TIMEOUT;
223
+ case 2 /* NormalPriority */:
224
+ default:
225
+ return NORMAL_PRIORITY_TIMEOUT;
226
+ }
227
+ }
228
+ function makeTask(callback, options = {}) {
229
+ const currentTime = getCurrentTime();
230
+ const delay = options.delay ?? 0;
231
+ const timeout = getTimeout(options.priorityLevel);
232
+ const startTime = delay + currentTime;
233
+ const expirationTime = startTime + timeout;
234
+ const newTask = new Task(callback, startTime, expirationTime);
235
+ return newTask;
236
+ }
237
+
238
+ // src/scheduler/core/chunk-scheduler.ts
239
+ var ChunkScheduler = class {
240
+ constructor(_task, _scheduler) {
241
+ this._task = _task;
242
+ this._scheduler = _scheduler;
243
+ this._needContinue = false;
244
+ }
245
+ get needContinue() {
246
+ return this._needContinue;
247
+ }
248
+ continueExecute(callback) {
249
+ this._needContinue = true;
250
+ this._task.setCallback(callback);
251
+ }
252
+ execute(callback, options = {}) {
253
+ const newTask = makeTask(callback, options);
254
+ this._scheduler.addTask(newTask);
255
+ }
256
+ };
257
+
258
+ // src/scheduler/core/actuator.ts
259
+ var Actuator = class {
260
+ constructor(_taskQueue, _scheduler) {
261
+ this._taskQueue = _taskQueue;
262
+ this._scheduler = _scheduler;
263
+ }
264
+ workLoop(hasTimeRemaining, initialTime, deadline) {
265
+ let currentTime = initialTime;
266
+ this._taskQueue.advance(currentTime);
267
+ let currentTask = this._taskQueue.waitingTasks.peek();
268
+ while (currentTask !== null) {
269
+ if (currentTask.getExpirationTime() > currentTime && (!hasTimeRemaining || this._scheduler.shouldYieldToHost(deadline))) {
270
+ break;
271
+ }
272
+ if (currentTask.getCallback() === void 0) {
273
+ this._taskQueue.waitingTasks.remove();
274
+ } else {
275
+ const callback = currentTask.getCallback();
276
+ const didUserCallbackTimeout = currentTask.getExpirationTime() <= currentTime;
277
+ const remainingTime = deadline - currentTime;
278
+ currentTask.clearCallback();
279
+ const chunkInvoker = new ChunkScheduler(currentTask, this._scheduler);
280
+ callback(chunkInvoker, didUserCallbackTimeout, remainingTime);
281
+ if (!chunkInvoker.needContinue) {
282
+ this._taskQueue.waitingTasks.remove();
283
+ }
284
+ currentTime = getCurrentTime();
285
+ this._taskQueue.advance(currentTime);
286
+ }
287
+ currentTask = this._taskQueue.waitingTasks.peek();
288
+ }
289
+ if (currentTask !== null) {
290
+ return true;
291
+ }
292
+ this._scheduler.requestHostTimeout(currentTime);
293
+ return false;
294
+ }
295
+ };
296
+
297
+ // src/structure/min-heap.ts
298
+ var MinHeap = class {
299
+ constructor(compareFunction) {
300
+ this._heap = [];
301
+ if (compareFunction) {
302
+ this._compare = compareFunction;
303
+ } else {
304
+ this._compare = (a, b) => {
305
+ if (a < b) return -1;
306
+ if (a > b) return 1;
307
+ return 0;
308
+ };
309
+ }
310
+ }
311
+ insert(value) {
312
+ this._heap.push(value);
313
+ this._siftUp();
314
+ }
315
+ peek() {
316
+ return this._heap.length > 0 ? this._heap[0] : null;
317
+ }
318
+ remove() {
319
+ if (this._heap.length === 0) return null;
320
+ if (this._heap.length === 1) return this._heap.pop();
321
+ const item = this._heap[0];
322
+ this._heap[0] = this._heap.pop();
323
+ this._siftDown();
324
+ return item;
325
+ }
326
+ size() {
327
+ return this._heap.length;
328
+ }
329
+ clear() {
330
+ this._heap.length = 0;
331
+ }
332
+ _getLeftChildIndex(parentIndex) {
333
+ return 2 * parentIndex + 1;
334
+ }
335
+ _getRightChildIndex(parentIndex) {
336
+ return 2 * parentIndex + 2;
337
+ }
338
+ _getParentIndex(childIndex) {
339
+ return Math.floor((childIndex - 1) / 2);
340
+ }
341
+ _swap(indexOne, indexTwo) {
342
+ [this._heap[indexOne], this._heap[indexTwo]] = [this._heap[indexTwo], this._heap[indexOne]];
343
+ }
344
+ _siftUp() {
345
+ let index = this._heap.length - 1;
346
+ while (index > 0 && this._compare(this._heap[this._getParentIndex(index)], this._heap[index]) > 0) {
347
+ const parentIndex = this._getParentIndex(index);
348
+ this._swap(index, parentIndex);
349
+ index = parentIndex;
350
+ }
351
+ }
352
+ _siftDown() {
353
+ let index = 0;
354
+ let smallerChildIndex = this._getLeftChildIndex(index);
355
+ while (smallerChildIndex < this._heap.length) {
356
+ const rightChildIndex = this._getRightChildIndex(index);
357
+ if (rightChildIndex < this._heap.length && this._compare(this._heap[rightChildIndex], this._heap[smallerChildIndex]) < 0) {
358
+ smallerChildIndex = rightChildIndex;
359
+ }
360
+ if (this._compare(this._heap[index], this._heap[smallerChildIndex]) <= 0) {
361
+ break;
362
+ }
363
+ this._swap(index, smallerChildIndex);
364
+ index = smallerChildIndex;
365
+ smallerChildIndex = this._getLeftChildIndex(index);
366
+ }
367
+ }
368
+ };
369
+
370
+ // src/scheduler/core/task-queue.ts
371
+ function compare(lhs, rhs) {
372
+ return lhs.getSortIndex() - rhs.getSortIndex();
373
+ }
374
+ var TaskQueue = class {
375
+ constructor() {
376
+ // 延时任务
377
+ this._timerTasks = new MinHeap(compare);
378
+ // 等待执行的任务
379
+ this._waitingTasks = new MinHeap(compare);
380
+ }
381
+ get timerTasks() {
382
+ return this._timerTasks;
383
+ }
384
+ get waitingTasks() {
385
+ return this._waitingTasks;
386
+ }
387
+ advance(currentTime) {
388
+ let task = this._timerTasks.peek();
389
+ while (task !== null) {
390
+ if (task.getCallback() === null) {
391
+ this._timerTasks.remove();
392
+ } else if (task.getStartTime() <= currentTime) {
393
+ this._timerTasks.remove();
394
+ task.setSortIndex(task.getExpirationTime());
395
+ this._waitingTasks.insert(task);
396
+ } else {
397
+ return;
398
+ }
399
+ task = this._timerTasks.peek();
400
+ }
401
+ }
402
+ };
403
+
404
+ // src/scheduler/executor/abstract-executor.ts
405
+ var AbstractExecutor = class {
406
+ constructor() {
407
+ this._timeoutId = -1;
408
+ this._deadline = 0;
409
+ this._yieldInterval = 16;
410
+ }
411
+ get deadline() {
412
+ return this._deadline;
413
+ }
414
+ setFrameRate(fps) {
415
+ lvAssert(fps > 0 && fps <= 125);
416
+ this._yieldInterval = Math.floor(1e3 / fps);
417
+ }
418
+ resetFrameRate() {
419
+ this._yieldInterval = 16;
420
+ }
421
+ requestHostTimeout(fn, delayMs) {
422
+ lvAssert(this._timeoutId === -1, "has request host timeout.");
423
+ clearTimeout(this._timeoutId);
424
+ this._timeoutId = setTimeout(() => {
425
+ this._timeoutId = -1;
426
+ fn();
427
+ }, delayMs);
428
+ }
429
+ cancelHostTimeout() {
430
+ clearTimeout(this._timeoutId);
431
+ this._timeoutId = -1;
432
+ }
433
+ };
434
+
435
+ // src/scheduler/executor/idle-callback-executor.ts
436
+ var IdleCallbackExecutor = class extends AbstractExecutor {
437
+ constructor() {
438
+ super();
439
+ this._flushCallback = () => {
440
+ if (!this._scheduledCallback) {
441
+ return;
442
+ }
443
+ const currentTime = getCurrentTime();
444
+ const deadline = currentTime + this._yieldInterval;
445
+ try {
446
+ const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);
447
+ if (!hasMoreWork) {
448
+ this._scheduledCallback = void 0;
449
+ this._disposable = void 0;
450
+ } else {
451
+ this._disposable = this._runWhenIdle(this._flushCallback);
452
+ }
453
+ } catch (err) {
454
+ this._disposable = this._runWhenIdle(this._flushCallback);
455
+ throw err;
456
+ }
457
+ };
458
+ if (typeof requestIdleCallback !== "function" || typeof cancelIdleCallback !== "function") {
459
+ this._runWhenIdle = (runner) => {
460
+ let disposed = false;
461
+ setTimeout(() => {
462
+ if (disposed) {
463
+ return;
464
+ }
465
+ const end = Date.now() + 15;
466
+ runner(
467
+ Object.freeze({
468
+ didTimeout: true,
469
+ timeRemaining() {
470
+ return Math.max(0, end - Date.now());
471
+ }
472
+ })
473
+ );
474
+ });
475
+ return {
476
+ dispose() {
477
+ if (disposed) {
478
+ return;
479
+ }
480
+ disposed = true;
481
+ }
482
+ };
483
+ };
484
+ } else {
485
+ this._runWhenIdle = (runner, timeout) => {
486
+ const handle = requestIdleCallback(
487
+ runner,
488
+ typeof timeout === "number" ? { timeout } : void 0
489
+ );
490
+ let disposed = false;
491
+ return {
492
+ dispose() {
493
+ if (disposed) {
494
+ return;
495
+ }
496
+ disposed = true;
497
+ cancelIdleCallback(handle);
498
+ }
499
+ };
500
+ };
501
+ }
502
+ }
503
+ requestHostCallback(fn) {
504
+ this._scheduledCallback = fn;
505
+ if (!this._disposable) {
506
+ this._disposable = this._runWhenIdle(this._flushCallback);
507
+ }
508
+ }
509
+ cancelHostCallback() {
510
+ this._disposable?.dispose();
511
+ this._scheduledCallback = void 0;
512
+ this._disposable = void 0;
513
+ }
514
+ };
515
+
516
+ // src/scheduler/executor/post-message-executor.ts
517
+ var PostMessageExecutor = class extends AbstractExecutor {
518
+ constructor() {
519
+ super();
520
+ this._isMessageLoopRunning = false;
521
+ this._channel = new MessageChannel();
522
+ this._flushCallback = () => {
523
+ if (!this._scheduledCallback) {
524
+ this._isMessageLoopRunning = false;
525
+ return;
526
+ }
527
+ const currentTime = getCurrentTime();
528
+ const deadline = currentTime + this._yieldInterval;
529
+ try {
530
+ const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);
531
+ if (!hasMoreWork) {
532
+ this._isMessageLoopRunning = false;
533
+ this._scheduledCallback = void 0;
534
+ } else {
535
+ this._channel.port2.postMessage(null);
536
+ }
537
+ } catch (err) {
538
+ this._channel.port2.postMessage(null);
539
+ throw err;
540
+ }
541
+ };
542
+ this._channel.port1.onmessage = () => {
543
+ this._flushCallback();
544
+ };
545
+ }
546
+ requestHostCallback(fn) {
547
+ this._scheduledCallback = fn;
548
+ if (!this._isMessageLoopRunning) {
549
+ this._isMessageLoopRunning = true;
550
+ this._channel.port2.postMessage(null);
551
+ }
552
+ }
553
+ cancelHostCallback() {
554
+ this._scheduledCallback = void 0;
555
+ }
556
+ };
557
+
558
+ // src/scheduler/executor/make-executor.ts
559
+ function makeExecutor() {
560
+ try {
561
+ if (global.window) {
562
+ return new PostMessageExecutor();
563
+ }
564
+ } catch (e) {
565
+ }
566
+ return new IdleCallbackExecutor();
567
+ }
568
+
569
+ // src/scheduler/core/scheduler.ts
570
+ var Scheduler = class {
571
+ constructor() {
572
+ this._isHostTimeoutScheduled = false;
573
+ this._isHostCallbackScheduled = false;
574
+ this._isWorking = false;
575
+ this._enableInputPending = true;
576
+ this._executor = makeExecutor();
577
+ this._taskQueue = new TaskQueue();
578
+ this._actuator = new Actuator(this._taskQueue, this);
579
+ /**
580
+ * 是否需要让出事件给宿主
581
+ */
582
+ this.shouldYieldToHost = (() => {
583
+ try {
584
+ if (global.navigator?.scheduling?.isInputPending !== void 0) {
585
+ const { scheduling } = global.navigator;
586
+ return (deadline) => {
587
+ if (this._enableInputPending && scheduling.isInputPending()) {
588
+ return true;
589
+ }
590
+ return getCurrentTime() >= deadline;
591
+ };
592
+ }
593
+ } catch (e) {
594
+ }
595
+ return (deadline) => {
596
+ return getCurrentTime() >= deadline;
597
+ };
598
+ })();
599
+ this._handleHostTimeout = () => {
600
+ this._isHostTimeoutScheduled = false;
601
+ const currentTime = getCurrentTime();
602
+ this._taskQueue.advance(currentTime);
603
+ if (this._isHostCallbackScheduled) {
604
+ return;
605
+ }
606
+ if (this._taskQueue.waitingTasks.peek() !== null) {
607
+ this._isHostCallbackScheduled = true;
608
+ this._executor.requestHostCallback(this._handleHostCallback);
609
+ return;
610
+ }
611
+ this._requestHostTimeout(currentTime);
612
+ };
613
+ this._handleHostCallback = (hasTimeRemaining, initialTime, deadline) => {
614
+ this._isHostCallbackScheduled = false;
615
+ if (this._isHostTimeoutScheduled) {
616
+ this._isHostTimeoutScheduled = false;
617
+ this._executor.cancelHostTimeout();
618
+ }
619
+ this._isWorking = true;
620
+ try {
621
+ return this._actuator.workLoop(hasTimeRemaining, initialTime, deadline);
622
+ } finally {
623
+ this._isWorking = false;
624
+ }
625
+ };
626
+ }
627
+ get taskQueue() {
628
+ return this._taskQueue;
629
+ }
630
+ get executor() {
631
+ return this._executor;
632
+ }
633
+ /**
634
+ * 设置是否开启InputPending
635
+ */
636
+ setEnableInputPending(val) {
637
+ this._enableInputPending = val;
638
+ }
639
+ /**
640
+ * 调度器中添加任务
641
+ */
642
+ addTask(task) {
643
+ const currentTime = getCurrentTime();
644
+ if (task.getStartTime() > currentTime) {
645
+ task.setSortIndex(task.getStartTime());
646
+ this._taskQueue.timerTasks.insert(task);
647
+ if (this._taskQueue.waitingTasks.peek() === null && task === this._taskQueue.timerTasks.peek()) {
648
+ if (this._isHostTimeoutScheduled) {
649
+ this._executor.cancelHostTimeout();
650
+ } else {
651
+ this._isHostTimeoutScheduled = true;
652
+ }
653
+ this._executor.requestHostTimeout(this._handleHostTimeout, task.getStartTime() - currentTime);
654
+ }
655
+ } else {
656
+ task.setSortIndex(task.getExpirationTime());
657
+ this._taskQueue.waitingTasks.insert(task);
658
+ if (!this._isHostCallbackScheduled && !this._isWorking) {
659
+ this._isHostCallbackScheduled = true;
660
+ this._executor.requestHostCallback(this._handleHostCallback);
661
+ }
662
+ }
663
+ }
664
+ /**
665
+ * 尝试启动异步任务调度
666
+ */
667
+ requestHostTimeout(currentTime) {
668
+ this._requestHostTimeout(currentTime);
669
+ }
670
+ _requestHostTimeout(currentTime) {
671
+ lvAssert(!this._isHostCallbackScheduled);
672
+ lvAssert(!this._isHostTimeoutScheduled);
673
+ const firstTimerTask = this._taskQueue.timerTasks.peek();
674
+ if (firstTimerTask !== null) {
675
+ this._isHostTimeoutScheduled = true;
676
+ this._executor.requestHostTimeout(this._handleHostTimeout, firstTimerTask.getStartTime() - currentTime);
677
+ }
678
+ }
679
+ };
680
+ var scheduler;
681
+ function getScheduler() {
682
+ if (!scheduler) {
683
+ scheduler = new Scheduler();
684
+ }
685
+ return scheduler;
686
+ }
687
+
688
+ // src/scheduler/callback-token.ts
689
+ var CallbackToken = class {
690
+ constructor(_task) {
691
+ this._task = _task;
692
+ }
693
+ dispose() {
694
+ this._task.clearCallback();
695
+ }
696
+ updatePriorityLevel(priorityLevel) {
697
+ const callback = this._task.getCallback();
698
+ if (!callback) {
699
+ return;
700
+ }
701
+ this._task.clearCallback();
702
+ const newTask = makeTask(callback, {
703
+ priorityLevel
704
+ });
705
+ const startTime = this._task.getStartTime();
706
+ const timeout = getTimeout(priorityLevel);
707
+ const expirationTime = startTime + timeout;
708
+ newTask.setStartTime(startTime);
709
+ newTask.setExpirationTime(expirationTime);
710
+ getScheduler().addTask(newTask);
711
+ this._task = newTask;
712
+ }
713
+ };
714
+
715
+ // src/scheduler/lv-scheduler-callback.ts
716
+ function lvSchedulerCallback(callback, options = {}) {
717
+ const newTask = makeTask(callback, options);
718
+ getScheduler().addTask(newTask);
719
+ return new CallbackToken(newTask);
720
+ }
721
+
722
+ // src/structure/linked-list.ts
723
+ var ListNode = class {
724
+ constructor(value, next = null, prev = null) {
725
+ this.value = value;
726
+ this.next = next;
727
+ this.prev = prev;
728
+ }
729
+ };
730
+ var LinkedList = class {
731
+ constructor() {
732
+ this._head = null;
733
+ this._tail = null;
734
+ this._count = 0;
735
+ }
736
+ get size() {
737
+ return this._count;
738
+ }
739
+ get firstNode() {
740
+ return this._head;
741
+ }
742
+ isEmpty() {
743
+ return this._head === null;
744
+ }
745
+ clear() {
746
+ let current = this._head;
747
+ while (current !== null) {
748
+ const next = current.next;
749
+ current.prev = null;
750
+ current.next = null;
751
+ current = next;
752
+ }
753
+ this._head = null;
754
+ this._tail = null;
755
+ this._count = 0;
756
+ }
757
+ unshift(value) {
758
+ const node = new ListNode(value);
759
+ if (this.isEmpty()) {
760
+ this._head = node;
761
+ this._tail = node;
762
+ } else {
763
+ const oldHead = this._head;
764
+ this._head = node;
765
+ node.next = oldHead;
766
+ oldHead.prev = node;
767
+ }
768
+ this._count++;
769
+ return this;
770
+ }
771
+ push(value) {
772
+ const node = new ListNode(value);
773
+ if (this.isEmpty()) {
774
+ this._head = node;
775
+ this._tail = node;
776
+ } else {
777
+ const oldTail = this._tail;
778
+ this._tail = node;
779
+ node.prev = oldTail;
780
+ oldTail.next = node;
781
+ }
782
+ this._count++;
783
+ return this;
784
+ }
785
+ shift() {
786
+ if (this.isEmpty()) {
787
+ return null;
788
+ }
789
+ const node = this._head;
790
+ const value = node.value;
791
+ this._remove(node);
792
+ return value;
793
+ }
794
+ pop() {
795
+ if (this.isEmpty()) {
796
+ return null;
797
+ }
798
+ const node = this._tail;
799
+ const value = node.value;
800
+ this._remove(node);
801
+ return value;
802
+ }
803
+ toArray() {
804
+ const result = [];
805
+ for (const value of this) {
806
+ result.push(value);
807
+ }
808
+ return result;
809
+ }
810
+ *[Symbol.iterator]() {
811
+ let current = this._head;
812
+ while (current !== null) {
813
+ yield current.value;
814
+ current = current.next;
815
+ }
816
+ }
817
+ _remove(node) {
818
+ if (node.prev === null && node.next === null && node !== this._head && node !== this._tail) {
819
+ return;
820
+ }
821
+ if (node === this._head) {
822
+ this._head = node.next;
823
+ if (this._head) {
824
+ this._head.prev = null;
825
+ }
826
+ }
827
+ if (node === this._tail) {
828
+ this._tail = node.prev;
829
+ if (this._tail) {
830
+ this._tail.next = null;
831
+ }
832
+ }
833
+ if (node.prev) {
834
+ node.prev.next = node.next;
835
+ }
836
+ if (node.next) {
837
+ node.next.prev = node.prev;
838
+ }
839
+ node.prev = null;
840
+ node.next = null;
841
+ this._count--;
842
+ }
843
+ };
844
+
845
+ // src/event/disposable-linked-list.ts
846
+ var DisposableLinkedList = class extends LinkedList {
847
+ unshiftAndGetDisposableNode(value) {
848
+ this.unshift(value);
849
+ const node = this._head;
850
+ let hasRemoved = false;
851
+ return () => {
852
+ if (!hasRemoved) {
853
+ hasRemoved = true;
854
+ super._remove(node);
855
+ }
856
+ };
857
+ }
858
+ pushAndGetDisposableNode(value) {
859
+ this.push(value);
860
+ const node = this._tail;
861
+ let hasRemoved = false;
862
+ return () => {
863
+ if (!hasRemoved) {
864
+ hasRemoved = true;
865
+ super._remove(node);
866
+ }
867
+ };
868
+ }
869
+ };
870
+
871
+ // src/event/error-handler.ts
872
+ function asyncUnexpectedError(e) {
873
+ setTimeout(() => {
874
+ throw e;
875
+ }, 0);
876
+ }
877
+
878
+ // src/event/emitter.ts
879
+ var Listener = class {
880
+ constructor(callback, callbackThis) {
881
+ this._callback = callback;
882
+ this._callbackThis = callbackThis;
883
+ }
884
+ invoke(...args) {
885
+ this._callback.call(this._callbackThis, ...args);
886
+ }
887
+ };
888
+ var EventDeliveryQueueElement = class {
889
+ constructor(emitter, listener, event) {
890
+ this.emitter = emitter;
891
+ this.listener = listener;
892
+ this.event = event;
893
+ }
894
+ };
895
+ var EventDeliveryQueue = class {
896
+ constructor(_onListenerError = asyncUnexpectedError) {
897
+ this._onListenerError = _onListenerError;
898
+ this._queue = new DisposableLinkedList();
899
+ }
900
+ get size() {
901
+ return this._queue.size;
902
+ }
903
+ push(emitter, listener, event) {
904
+ this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));
905
+ }
906
+ clear(emitter) {
907
+ const newQueue = new DisposableLinkedList();
908
+ for (const element of this._queue) {
909
+ if (element.emitter !== emitter) {
910
+ newQueue.push(element);
911
+ }
912
+ }
913
+ this._queue = newQueue;
914
+ }
915
+ deliver() {
916
+ while (this._queue.size > 0) {
917
+ const element = this._queue.shift();
918
+ try {
919
+ element.listener.invoke(...element.event);
920
+ } catch (e) {
921
+ this._onListenerError(e);
922
+ }
923
+ }
924
+ }
925
+ };
926
+ var Emitter = class {
927
+ constructor(options) {
928
+ this._disposed = false;
929
+ this._options = options;
930
+ }
931
+ get event() {
932
+ if (this._event) {
933
+ return this._event;
934
+ }
935
+ this._event = (callback, thisArgs) => {
936
+ const listener = new Listener(callback, thisArgs);
937
+ if (!this._listeners) {
938
+ this._listeners = new DisposableLinkedList();
939
+ }
940
+ const removeListener = this._listeners.pushAndGetDisposableNode(listener);
941
+ if (this._options?.onAddListener) {
942
+ this._options.onAddListener(this, callback, thisArgs);
943
+ }
944
+ const result = () => {
945
+ if (!this._disposed) {
946
+ removeListener();
947
+ if (this._options?.onRemoveListener) {
948
+ this._options.onRemoveListener(this, callback, thisArgs);
949
+ }
950
+ }
951
+ };
952
+ return makeSafeDisposable(result);
953
+ };
954
+ return this._event;
955
+ }
956
+ dispose() {
957
+ if (this._disposed) {
958
+ return;
959
+ }
960
+ this._disposed = true;
961
+ this._listeners?.clear();
962
+ this._deliveryQueue?.clear(this);
963
+ }
964
+ fire(...event) {
965
+ if (!this._listeners || this._listeners.size === 0) {
966
+ return;
967
+ }
968
+ if (this._listeners.size === 1) {
969
+ const listener = this._listeners.firstNode;
970
+ try {
971
+ listener.value.invoke(...event);
972
+ } catch (e) {
973
+ if (this._options?.onListenerError) {
974
+ this._options.onListenerError(e);
975
+ } else {
976
+ asyncUnexpectedError(e);
977
+ }
978
+ }
979
+ return;
980
+ }
981
+ this._deliveryQueue ?? (this._deliveryQueue = new EventDeliveryQueue(this._options?.onListenerError));
982
+ for (const listener of this._listeners) {
983
+ this._deliveryQueue.push(this, listener, event);
984
+ }
985
+ this._deliveryQueue.deliver();
986
+ }
987
+ };
988
+
989
+ // src/event/once.ts
990
+ function listenOnce(event) {
991
+ return (listener, thisArgs = null) => {
992
+ let didFire = false;
993
+ let result = void 0;
994
+ result = event((...args) => {
995
+ if (didFire) {
996
+ return;
997
+ } else if (result) {
998
+ result.dispose();
999
+ } else {
1000
+ didFire = true;
1001
+ }
1002
+ return listener.call(thisArgs, ...args);
1003
+ }, null);
1004
+ if (didFire) {
1005
+ result.dispose();
1006
+ }
1007
+ return result;
1008
+ };
1009
+ }
1010
+
1011
+ // src/di/idle-value.ts
1012
+ var IdleValue = class {
1013
+ constructor(executor) {
1014
+ this._didRun = false;
1015
+ this._executor = () => {
1016
+ try {
1017
+ this._value = executor();
1018
+ } catch (err) {
1019
+ this._error = err;
1020
+ throw err;
1021
+ } finally {
1022
+ this._didRun = true;
1023
+ if (this._value && this._executorEmitter) {
1024
+ this._executorEmitter.fire();
1025
+ }
1026
+ }
1027
+ };
1028
+ this._handle = lvSchedulerCallback(() => this._executor(), {
1029
+ priorityLevel: 4 /* IdlePriority */
1030
+ });
1031
+ }
1032
+ get value() {
1033
+ if (!this._didRun) {
1034
+ this._handle.dispose();
1035
+ this._executor();
1036
+ }
1037
+ if (this._error) {
1038
+ throw this._error;
1039
+ }
1040
+ return this._value;
1041
+ }
1042
+ get isInitialized() {
1043
+ return this._didRun;
1044
+ }
1045
+ get onExecutor() {
1046
+ if (!this._executorEmitter) {
1047
+ this._executorEmitter = new Emitter();
1048
+ }
1049
+ return this._executorEmitter.event;
1050
+ }
1051
+ dispose() {
1052
+ this._handle.dispose();
1053
+ }
1054
+ };
1055
+
1056
+ // src/structure/graph.ts
1057
+ var Node = class {
1058
+ constructor(key, data) {
1059
+ this.key = key;
1060
+ this.data = data;
1061
+ this.incoming = /* @__PURE__ */ new Map();
1062
+ this.outgoing = /* @__PURE__ */ new Map();
1063
+ }
1064
+ };
1065
+ var Graph = class {
1066
+ constructor(_hashFn) {
1067
+ this._hashFn = _hashFn;
1068
+ this._nodes = /* @__PURE__ */ new Map();
1069
+ }
1070
+ // 寻找所有的叶子节点
1071
+ leafs() {
1072
+ const ret = [];
1073
+ for (const node of this._nodes.values()) {
1074
+ if (node.outgoing.size === 0) {
1075
+ ret.push(node);
1076
+ }
1077
+ }
1078
+ return ret;
1079
+ }
1080
+ // 插入一条边
1081
+ insertEdge(from, to) {
1082
+ const fromNode = this.lookupOrInsertNode(from);
1083
+ const toNode = this.lookupOrInsertNode(to);
1084
+ fromNode.outgoing.set(toNode.key, toNode);
1085
+ toNode.incoming.set(fromNode.key, fromNode);
1086
+ }
1087
+ // 移除某个节点
1088
+ removeNode(data) {
1089
+ const key = this._hashFn(data);
1090
+ this._nodes.delete(key);
1091
+ for (const node of this._nodes.values()) {
1092
+ node.outgoing.delete(key);
1093
+ node.incoming.delete(key);
1094
+ }
1095
+ }
1096
+ // 查找某个节点
1097
+ lookup(data) {
1098
+ return this._nodes.get(this._hashFn(data));
1099
+ }
1100
+ // 查找某个节点,不存在则插入
1101
+ lookupOrInsertNode(data) {
1102
+ const key = this._hashFn(data);
1103
+ let node = this._nodes.get(key);
1104
+ if (!node) {
1105
+ node = new Node(key, data);
1106
+ this._nodes.set(key, node);
1107
+ }
1108
+ return node;
1109
+ }
1110
+ isEmpty() {
1111
+ return this._nodes.size === 0;
1112
+ }
1113
+ toString() {
1114
+ const data = [];
1115
+ for (const [key, value] of this._nodes) {
1116
+ data.push(
1117
+ `${key}
1118
+ (-> incoming)[${[...value.incoming.keys()].join(", ")}]
1119
+ (outgoing ->)[${[
1120
+ ...value.outgoing.keys()
1121
+ ].join(",")}]
1122
+ `
1123
+ );
1124
+ }
1125
+ return data.join("\n");
1126
+ }
1127
+ findCycleSlow() {
1128
+ for (const [id, node] of this._nodes) {
1129
+ const seen = /* @__PURE__ */ new Set([id]);
1130
+ const res = this._findCycle(node, seen);
1131
+ if (res) {
1132
+ return res;
1133
+ }
1134
+ }
1135
+ return void 0;
1136
+ }
1137
+ _findCycle(node, seen) {
1138
+ for (const [id, outgoing] of node.outgoing) {
1139
+ if (seen.has(id)) {
1140
+ return [...seen, id].join(" -> ");
1141
+ }
1142
+ seen.add(id);
1143
+ const value = this._findCycle(outgoing, seen);
1144
+ if (value) {
1145
+ return value;
1146
+ }
1147
+ seen.delete(id);
1148
+ }
1149
+ return void 0;
1150
+ }
1151
+ };
1152
+
1153
+ // src/di/service-ownership-collection.ts
1154
+ var ServiceOwnership = /* @__PURE__ */ ((ServiceOwnership2) => {
1155
+ ServiceOwnership2[ServiceOwnership2["Owned"] = 1] = "Owned";
1156
+ ServiceOwnership2[ServiceOwnership2["Reference"] = 2] = "Reference";
1157
+ return ServiceOwnership2;
1158
+ })(ServiceOwnership || {});
1159
+ var ServiceOwnershipCollection = class {
1160
+ constructor(...entries) {
1161
+ this._entries = /* @__PURE__ */ new Map();
1162
+ for (const [id, service] of entries) {
1163
+ this.set(id, service);
1164
+ }
1165
+ }
1166
+ get entries() {
1167
+ return this._entries;
1168
+ }
1169
+ set(id, ownership) {
1170
+ this._entries.set(id, ownership);
1171
+ }
1172
+ has(id) {
1173
+ return this._entries.has(id);
1174
+ }
1175
+ get(id) {
1176
+ return this._entries.get(id);
1177
+ }
1178
+ };
1179
+
1180
+ // src/di/service-collection.ts
1181
+ var ServiceCollection = class {
1182
+ constructor(options) {
1183
+ this._entries = /* @__PURE__ */ new Map();
1184
+ for (const [id, service] of options?.entries || []) {
1185
+ this.set(id, service);
1186
+ }
1187
+ if (options?.ownership) {
1188
+ this._ownership = options.ownership;
1189
+ }
1190
+ }
1191
+ get entries() {
1192
+ return this._entries;
1193
+ }
1194
+ get ownerships() {
1195
+ return this._ownership?.entries;
1196
+ }
1197
+ set(id, instanceOrDescriptor) {
1198
+ this._entries.set(id, instanceOrDescriptor);
1199
+ }
1200
+ has(id) {
1201
+ return this._entries.has(id);
1202
+ }
1203
+ get(id) {
1204
+ return this._entries.get(id);
1205
+ }
1206
+ };
1207
+
1208
+ // src/di/proxy-builder.ts
1209
+ function makeProxy(valueWrapper, ctor) {
1210
+ const wrapper = /* @__PURE__ */ Object.create(null);
1211
+ const result = new Proxy(wrapper, {
1212
+ get(target, key) {
1213
+ if (key in target) {
1214
+ return target[key];
1215
+ }
1216
+ const obj = valueWrapper.value;
1217
+ let prop = obj[key];
1218
+ if (typeof prop !== "function") {
1219
+ return prop;
1220
+ }
1221
+ prop = prop.bind(obj);
1222
+ target[key] = prop;
1223
+ return prop;
1224
+ },
1225
+ set(_target, p, value) {
1226
+ const obj = valueWrapper.value;
1227
+ obj[p] = value;
1228
+ return true;
1229
+ }
1230
+ });
1231
+ wrapper.__originClass__ = ctor;
1232
+ listenOnce(valueWrapper.onExecutor)(() => {
1233
+ wrapper.__origin__ = valueWrapper.value;
1234
+ });
1235
+ return result;
1236
+ }
1237
+
1238
+ // src/di/trace.ts
1239
+ var _Trace = class _Trace {
1240
+ constructor(type, name) {
1241
+ this._start = Date.now();
1242
+ this._dep = [];
1243
+ this._type = type;
1244
+ this._name = name;
1245
+ }
1246
+ static traceInvocation(_enableTracing, ctor) {
1247
+ return !_enableTracing ? _Trace._None : new _Trace(2 /* Invocation */, ctor.name || new Error().stack.split("\n").slice(3, 4).join("\n"));
1248
+ }
1249
+ static traceCreation(_enableTracing, ctor) {
1250
+ return !_enableTracing ? _Trace._None : new _Trace(1 /* Creation */, ctor.name);
1251
+ }
1252
+ branch(id, first) {
1253
+ const child = new _Trace(3 /* Branch */, id.toString());
1254
+ this._dep.push([id, first, child]);
1255
+ return child;
1256
+ }
1257
+ stop() {
1258
+ const dur = Date.now() - this._start;
1259
+ _Trace._totals += dur;
1260
+ let causedCreation = false;
1261
+ function printChild(n, trace) {
1262
+ const res = [];
1263
+ const prefix = new Array(n + 1).join(" ");
1264
+ for (const [id, first, child] of trace._dep) {
1265
+ if (first && child) {
1266
+ causedCreation = true;
1267
+ res.push(`${prefix}CREATES -> ${id}`);
1268
+ const nested = printChild(n + 1, child);
1269
+ if (nested) {
1270
+ res.push(nested);
1271
+ }
1272
+ } else {
1273
+ res.push(`${prefix}uses -> ${id}`);
1274
+ }
1275
+ }
1276
+ return res.join("\n");
1277
+ }
1278
+ const lines = [
1279
+ `${this._type === 1 /* Creation */ ? "CREATE" : "CALL"} ${this._name}`,
1280
+ `${printChild(1, this)}`,
1281
+ `DONE, took ${dur.toFixed(2)}ms (grand total ${_Trace._totals.toFixed(2)}ms)`
1282
+ ];
1283
+ if (dur > 2 || causedCreation) {
1284
+ _Trace.all.add(lines.join("\n"));
1285
+ }
1286
+ }
1287
+ };
1288
+ _Trace.all = /* @__PURE__ */ new Set();
1289
+ _Trace._None = new class extends _Trace {
1290
+ constructor() {
1291
+ super(0 /* None */, null);
1292
+ }
1293
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
1294
+ stop() {
1295
+ }
1296
+ branch() {
1297
+ return this;
1298
+ }
1299
+ }();
1300
+ _Trace._totals = 0;
1301
+ var Trace = _Trace;
1302
+
1303
+ // src/di/instantiation-service.ts
1304
+ var _enableAllTracing = false;
1305
+ var CyclicDependencyError = class extends Error {
1306
+ constructor(graph) {
1307
+ super("cyclic dependency between services");
1308
+ this.message = graph.findCycleSlow() ?? `UNABLE to detect cycle, dumping graph:
1309
+ ${graph.toString()}`;
1310
+ }
1311
+ };
1312
+ var InstantiationErrorType = /* @__PURE__ */ ((InstantiationErrorType2) => {
1313
+ InstantiationErrorType2["UnknownDependency"] = "UnknownDependency";
1314
+ return InstantiationErrorType2;
1315
+ })(InstantiationErrorType || {});
1316
+ function getService(instantiationService, id) {
1317
+ return instantiationService.invokeFunction((accessor) => {
1318
+ return accessor.get(id);
1319
+ });
1320
+ }
1321
+ var InstantiationService = class _InstantiationService {
1322
+ constructor(services = new ServiceCollection(), parent, enableTracing = _enableAllTracing) {
1323
+ this._childs = /* @__PURE__ */ new Set();
1324
+ // 记录当前正在创建的服务,防止循环依赖
1325
+ this._activeInstantiations = /* @__PURE__ */ new Set();
1326
+ this._emitter = null;
1327
+ this._services = services;
1328
+ this._services.set(IInstantiationService, this);
1329
+ this._parent = parent;
1330
+ if (this._parent) {
1331
+ this._parent._childs.add(this);
1332
+ }
1333
+ this._enableTracing = enableTracing;
1334
+ if (enableTracing) {
1335
+ this._globalGraph = parent?._globalGraph ?? new Graph((e) => e);
1336
+ }
1337
+ }
1338
+ get services() {
1339
+ return this._services;
1340
+ }
1341
+ // 仅限 Flow 调用
1342
+ get onError() {
1343
+ if (!this._emitter) {
1344
+ this._emitter = new Emitter();
1345
+ }
1346
+ return this._emitter.event;
1347
+ }
1348
+ // 创建子instantiationService
1349
+ createChild(services) {
1350
+ return new _InstantiationService(services, this, this._enableTracing);
1351
+ }
1352
+ // 提供通过instantiationService直接获取到内部服务的能力
1353
+ // 返回servicesAccessor这一视图类,并不暴露instantiationService内部接口
1354
+ invokeFunction(fn, ...args) {
1355
+ const _trace = Trace.traceInvocation(this._enableTracing, fn);
1356
+ let _done = false;
1357
+ try {
1358
+ const accessor = {
1359
+ get: (id) => {
1360
+ if (_done) {
1361
+ throw new Error("service accessor is only valid during the invocation of its target method");
1362
+ }
1363
+ const result = this._getOrCreateServiceInstance(id, _trace);
1364
+ if (!result) {
1365
+ this._handleError({
1366
+ errorType: "UnknownDependency" /* UnknownDependency */,
1367
+ issuer: "service-accessor",
1368
+ dependencyId: `${id}`,
1369
+ message: `[invokeFunction] unknown service '${id}'`
1370
+ });
1371
+ }
1372
+ return result;
1373
+ }
1374
+ };
1375
+ return fn(accessor, ...args);
1376
+ } finally {
1377
+ _done = true;
1378
+ _trace.stop();
1379
+ }
1380
+ }
1381
+ createInstance(ctorOrDescriptor, ...rest) {
1382
+ let _trace, result;
1383
+ if (ctorOrDescriptor instanceof SyncDescriptor) {
1384
+ _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor.ctor);
1385
+ result = this._createInstance(
1386
+ ctorOrDescriptor.ctor,
1387
+ ctorOrDescriptor.staticArguments.concat(rest),
1388
+ _trace
1389
+ );
1390
+ } else {
1391
+ _trace = Trace.traceCreation(this._enableTracing, ctorOrDescriptor);
1392
+ result = this._createInstance(ctorOrDescriptor, rest, _trace);
1393
+ }
1394
+ _trace.stop();
1395
+ return result;
1396
+ }
1397
+ dispose() {
1398
+ for (const child of this._childs) {
1399
+ child.dispose();
1400
+ }
1401
+ this._parent?._childs.delete(this);
1402
+ for (const [identifier, instanceOrDescriptor] of this._services.entries) {
1403
+ if (instanceOrDescriptor instanceof SyncDescriptor) {
1404
+ continue;
1405
+ }
1406
+ if (instanceOrDescriptor === this) {
1407
+ continue;
1408
+ }
1409
+ if (instanceOrDescriptor.__origin__ === this) {
1410
+ continue;
1411
+ }
1412
+ if (isDisposable(instanceOrDescriptor)) {
1413
+ const ownerShip = this._services.ownerships?.get(identifier);
1414
+ switch (ownerShip) {
1415
+ case 2 /* Reference */:
1416
+ break;
1417
+ case 1 /* Owned */:
1418
+ default:
1419
+ instanceOrDescriptor.dispose();
1420
+ break;
1421
+ }
1422
+ }
1423
+ }
1424
+ }
1425
+ // 创建实例
1426
+ _createInstance(ctor, args = [], _trace) {
1427
+ const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);
1428
+ const serviceArgs = [];
1429
+ for (const dependency of serviceDependencies) {
1430
+ const service = this._getOrCreateServiceInstance(dependency.id, _trace);
1431
+ if (!service) {
1432
+ this._handleError({
1433
+ errorType: "UnknownDependency" /* UnknownDependency */,
1434
+ issuer: `create-instance-${ctor.name}`,
1435
+ dependencyId: `${dependency.id}`,
1436
+ message: `[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`
1437
+ });
1438
+ }
1439
+ serviceArgs.push(service);
1440
+ }
1441
+ const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;
1442
+ if (args.length !== firstServiceArgPos) {
1443
+ Logger.trace(
1444
+ `[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`
1445
+ );
1446
+ const delta = firstServiceArgPos - args.length;
1447
+ if (delta > 0) {
1448
+ args = args.concat(new Array(delta));
1449
+ } else {
1450
+ args = args.slice(0, firstServiceArgPos);
1451
+ }
1452
+ }
1453
+ return Reflect.construct(ctor, args.concat(serviceArgs));
1454
+ }
1455
+ // 保存服务实例
1456
+ _setServiceInstance(id, instance) {
1457
+ if (this._services.get(id) instanceof SyncDescriptor) {
1458
+ this._services.set(id, instance);
1459
+ } else if (this._parent) {
1460
+ this._parent._setServiceInstance(id, instance);
1461
+ } else {
1462
+ throw new Error("illegalState - setting UNKNOWN service instance");
1463
+ }
1464
+ }
1465
+ // 获取服务实例或者描述符
1466
+ _getServiceInstanceOrDescriptor(id) {
1467
+ const instanceOrDesc = this._services.get(id);
1468
+ if (!instanceOrDesc && this._parent) {
1469
+ return this._parent._getServiceInstanceOrDescriptor(id);
1470
+ } else {
1471
+ return instanceOrDesc;
1472
+ }
1473
+ }
1474
+ // 获取服务实例,没有的话就创建
1475
+ _getOrCreateServiceInstance(id, _trace) {
1476
+ if (this._globalGraph && this._globalGraphImplicitDependency) {
1477
+ this._globalGraph.insertEdge(this._globalGraphImplicitDependency, String(id));
1478
+ }
1479
+ const thing = this._getServiceInstanceOrDescriptor(id);
1480
+ if (thing instanceof SyncDescriptor) {
1481
+ return this._safeCreateAndCacheServiceInstance(id, thing, _trace.branch(id, true));
1482
+ } else {
1483
+ _trace.branch(id, false);
1484
+ return thing;
1485
+ }
1486
+ }
1487
+ // 安全的创建并且记录在缓存中
1488
+ _safeCreateAndCacheServiceInstance(id, desc, _trace) {
1489
+ if (this._activeInstantiations.has(id)) {
1490
+ throw new Error(`illegal state - RECURSIVELY instantiating service '${id}'`);
1491
+ }
1492
+ this._activeInstantiations.add(id);
1493
+ try {
1494
+ return this._createAndCacheServiceInstance(id, desc, _trace);
1495
+ } finally {
1496
+ this._activeInstantiations.delete(id);
1497
+ }
1498
+ }
1499
+ // 非安全创建并记录在缓存中
1500
+ // 核心方法,服务创建的最基础流程
1501
+ _createAndCacheServiceInstance(id, desc, _trace) {
1502
+ const graph = new Graph((data) => data.id.toString());
1503
+ let cycleCount = 0;
1504
+ const stack = [{ id, desc, _trace }];
1505
+ while (stack.length) {
1506
+ const item = stack.pop();
1507
+ graph.lookupOrInsertNode(item);
1508
+ if (cycleCount++ > 1e3) {
1509
+ throw new CyclicDependencyError(graph);
1510
+ }
1511
+ for (const dependency of getServiceDependencies(item.desc.ctor)) {
1512
+ const instanceOrDesc = this._getServiceInstanceOrDescriptor(dependency.id);
1513
+ if (!instanceOrDesc) {
1514
+ this._handleError({
1515
+ errorType: "UnknownDependency" /* UnknownDependency */,
1516
+ issuer: `create-service-${id}`,
1517
+ dependencyId: `${dependency.id}`,
1518
+ message: `[createInstance] ${id} depends on ${dependency.id} which is NOT registered.`
1519
+ });
1520
+ }
1521
+ this._globalGraph?.insertEdge(String(item.id), String(dependency.id));
1522
+ if (instanceOrDesc instanceof SyncDescriptor) {
1523
+ const d = {
1524
+ id: dependency.id,
1525
+ desc: instanceOrDesc,
1526
+ _trace: item._trace.branch(dependency.id, true)
1527
+ };
1528
+ graph.insertEdge(item, d);
1529
+ stack.push(d);
1530
+ }
1531
+ }
1532
+ }
1533
+ while (true) {
1534
+ const leafs = graph.leafs();
1535
+ if (leafs.length === 0) {
1536
+ if (!graph.isEmpty()) {
1537
+ throw new CyclicDependencyError(graph);
1538
+ }
1539
+ break;
1540
+ }
1541
+ for (const { data } of leafs) {
1542
+ const instanceOrDesc = this._getServiceInstanceOrDescriptor(data.id);
1543
+ if (instanceOrDesc instanceof SyncDescriptor) {
1544
+ const instance = this._createServiceInstanceWithOwner(
1545
+ data.id,
1546
+ data.desc.ctor,
1547
+ data.desc.staticArguments,
1548
+ data.desc.supportsDelayedInstantiation,
1549
+ data._trace
1550
+ );
1551
+ this._setServiceInstance(data.id, instance);
1552
+ }
1553
+ graph.removeNode(data);
1554
+ }
1555
+ }
1556
+ return this._getServiceInstanceOrDescriptor(id);
1557
+ }
1558
+ // 创建服务实例(会判断在哪层instantiation中判断)
1559
+ _createServiceInstanceWithOwner(id, ctor, args = [], supportsDelayedInstantiation, _trace) {
1560
+ if (this._services.get(id) instanceof SyncDescriptor) {
1561
+ return this._createServiceInstance(id, ctor, args, supportsDelayedInstantiation, _trace);
1562
+ } else if (this._parent) {
1563
+ return this._parent._createServiceInstanceWithOwner(
1564
+ id,
1565
+ ctor,
1566
+ args,
1567
+ supportsDelayedInstantiation,
1568
+ _trace
1569
+ );
1570
+ } else {
1571
+ throw new Error(`illegalState - creating UNKNOWN service instance ${ctor.name}`);
1572
+ }
1573
+ }
1574
+ // 准备创建服务实例
1575
+ _createServiceInstance(id, ctor, args = [], supportsDelayedInstantiation, _trace) {
1576
+ if (!supportsDelayedInstantiation) {
1577
+ return this._createService(ctor, args, _trace);
1578
+ }
1579
+ const idle = new IdleValue(() => this._createService(ctor, args, _trace));
1580
+ return makeProxy(idle, ctor);
1581
+ }
1582
+ // 创建服务
1583
+ _createService(ctor, args = [], _trace) {
1584
+ const service = this._createInstance(ctor, args, _trace);
1585
+ if (isDisposable(service)) ;
1586
+ return service;
1587
+ }
1588
+ // 处理错误
1589
+ _handleError(errorData) {
1590
+ let topInstantiationService = this;
1591
+ while (topInstantiationService._parent) {
1592
+ topInstantiationService = topInstantiationService._parent;
1593
+ }
1594
+ if (topInstantiationService._emitter) {
1595
+ topInstantiationService._emitter.fire(errorData);
1596
+ }
1597
+ throw new Error(errorData.message);
1598
+ }
1599
+ };
1600
+
1601
+ // src/di/service-registry.ts
1602
+ var ServiceRegistry = class {
1603
+ constructor(config = {}) {
1604
+ this._registry = [];
1605
+ this._serviceOwnership = new ServiceOwnershipCollection();
1606
+ // 重复检测的id记录
1607
+ this._ids = /* @__PURE__ */ new Set();
1608
+ this._checkDuplicate = config.checkDuplicate ?? false;
1609
+ }
1610
+ get registry() {
1611
+ return this._registry;
1612
+ }
1613
+ register(id, ctorOrDescriptor, supportsDelayedInstantiation) {
1614
+ if (!(ctorOrDescriptor instanceof SyncDescriptor)) {
1615
+ ctorOrDescriptor = new SyncDescriptor(
1616
+ ctorOrDescriptor,
1617
+ [],
1618
+ Boolean(supportsDelayedInstantiation)
1619
+ );
1620
+ }
1621
+ if (this._checkDuplicate) {
1622
+ lvAssert(!this._ids.has(id.toString()), `service: ${id.toString()} duplicate register.`);
1623
+ this._ids.add(id.toString());
1624
+ }
1625
+ this._registry.push([id, ctorOrDescriptor]);
1626
+ }
1627
+ /**
1628
+ * 直接注册一个服务的实例
1629
+ *
1630
+ * 注意:谨慎使用,优先使用register
1631
+ * 一般用于特殊场景:需要先于DI之前就构造了某个service
1632
+ */
1633
+ registerInstance(id, instance, options) {
1634
+ if (this._checkDuplicate) {
1635
+ lvAssert(!this._ids.has(id.toString()), `service: ${id.toString()} duplicate register.`);
1636
+ this._ids.add(id.toString());
1637
+ }
1638
+ this._registry.push([id, instance]);
1639
+ this._serviceOwnership.set(id, options?.ownership ?? 1 /* Owned */);
1640
+ }
1641
+ makeCollection() {
1642
+ const serviceCollection = new ServiceCollection({
1643
+ ownership: this._serviceOwnership
1644
+ });
1645
+ for (const [id, instanceOrDescriptor] of this.registry) {
1646
+ serviceCollection.set(id, instanceOrDescriptor);
1647
+ }
1648
+ return serviceCollection;
1649
+ }
1650
+ };
1651
+
1652
+ // src/lock/capability.ts
1653
+ var Capability = class {
1654
+ constructor() {
1655
+ this._onUnlocked = new Emitter();
1656
+ this._status = 0 /* Unlocked */;
1657
+ this.onUnlocked = this._onUnlocked.event;
1658
+ }
1659
+ get status() {
1660
+ return this._status;
1661
+ }
1662
+ acquire() {
1663
+ lvAssert(this._status === 0 /* Unlocked */);
1664
+ this._status = 1 /* Locked */;
1665
+ }
1666
+ release() {
1667
+ lvAssert(this._status === 1 /* Locked */);
1668
+ this._status = 0 /* Unlocked */;
1669
+ this._onUnlocked.fire();
1670
+ }
1671
+ };
1672
+ var SharedCapability = class {
1673
+ constructor() {
1674
+ this._onUnlocked = new Emitter();
1675
+ this._status = 0 /* Unlocked */;
1676
+ this._counter = 0;
1677
+ this.onUnlocked = this._onUnlocked.event;
1678
+ }
1679
+ get status() {
1680
+ return this._status;
1681
+ }
1682
+ get counter() {
1683
+ return this._counter;
1684
+ }
1685
+ acquire() {
1686
+ if (this._status === 0 /* Unlocked */) {
1687
+ this._status = 1 /* Locked */;
1688
+ }
1689
+ this._counter++;
1690
+ }
1691
+ release() {
1692
+ lvAssert(this._counter > 0);
1693
+ this._counter--;
1694
+ if (this._counter === 0) {
1695
+ this._status = 0 /* Unlocked */;
1696
+ this._onUnlocked.fire();
1697
+ }
1698
+ }
1699
+ };
1700
+
1701
+ // src/lock/semaphore.ts
1702
+ var Semaphore = class {
1703
+ constructor() {
1704
+ this._onActive = new Emitter();
1705
+ this.onActive = this._onActive.event;
1706
+ }
1707
+ notify() {
1708
+ this._onActive.fire();
1709
+ }
1710
+ };
1711
+
1712
+ // src/lock/shared-mutex.ts
1713
+ var SharedMutex = class {
1714
+ constructor() {
1715
+ // 在第一道门外等待的写者
1716
+ this._waitingWriters = [];
1717
+ }
1718
+ /**
1719
+ * 是否被锁住
1720
+ */
1721
+ isLocked() {
1722
+ return this._writer || this._readerCount !== 0;
1723
+ }
1724
+ /**
1725
+ * 等待并获取写锁
1726
+ */
1727
+ lock() {
1728
+ return new Promise((resolve) => {
1729
+ if (this._writer) {
1730
+ const token = new Semaphore();
1731
+ this._waitingWriters.push(token);
1732
+ token.onActive(() => {
1733
+ this._writerEnterGate1(resolve);
1734
+ });
1735
+ } else {
1736
+ this._writerEnterGate1(resolve);
1737
+ }
1738
+ });
1739
+ }
1740
+ /**
1741
+ * 尝试获取写锁,立刻返回结果
1742
+ */
1743
+ tryLock() {
1744
+ if (this._writer || this._readerCount > 0) {
1745
+ return false;
1746
+ }
1747
+ this.lock();
1748
+ return true;
1749
+ }
1750
+ /**
1751
+ * 解除写锁
1752
+ */
1753
+ unLock() {
1754
+ lvAssertNotNil(this._writer);
1755
+ this._writer.release();
1756
+ }
1757
+ /**
1758
+ * 等待并获取读锁
1759
+ */
1760
+ lockShared() {
1761
+ return new Promise((resolve) => {
1762
+ if (this._writer) {
1763
+ if (!this._waitingReader) {
1764
+ this._waitingReader = new Semaphore();
1765
+ }
1766
+ this._waitingReader.onActive(() => {
1767
+ this._readerEnterGate1(resolve);
1768
+ });
1769
+ } else {
1770
+ this._readerEnterGate1(resolve);
1771
+ }
1772
+ });
1773
+ }
1774
+ /**
1775
+ * 尝试获取读锁,立刻返回结果
1776
+ */
1777
+ tryLockShared() {
1778
+ if (this._writer) {
1779
+ return false;
1780
+ }
1781
+ this.lockShared();
1782
+ return true;
1783
+ }
1784
+ /**
1785
+ * 解除读锁
1786
+ */
1787
+ unLockShared() {
1788
+ lvAssertNotNil(this._reader);
1789
+ if (this._writer) {
1790
+ lvAssert(this._writer.status === 0 /* Unlocked */);
1791
+ }
1792
+ this._reader.release();
1793
+ }
1794
+ /**
1795
+ * 获取当前读者数量
1796
+ */
1797
+ get _readerCount() {
1798
+ return this._reader ? this._reader.counter : 0;
1799
+ }
1800
+ /**
1801
+ * 写者进入第一道门
1802
+ */
1803
+ _writerEnterGate1(resolve) {
1804
+ lvAssert(!this._writer);
1805
+ this._writer = new Capability();
1806
+ if (this._readerCount > 0) {
1807
+ listenOnce(this._reader.onUnlocked)(() => {
1808
+ this._writerEnterGate2(resolve);
1809
+ });
1810
+ } else {
1811
+ this._writerEnterGate2(resolve);
1812
+ }
1813
+ }
1814
+ /**
1815
+ * 写者进入第二道门
1816
+ */
1817
+ _writerEnterGate2(resolve) {
1818
+ lvAssertNotNil(this._writer);
1819
+ lvAssert(this._readerCount === 0);
1820
+ this._writer.acquire();
1821
+ listenOnce(this._writer.onUnlocked)(() => {
1822
+ lvAssertNotNil(this._writer);
1823
+ this._writer = void 0;
1824
+ this._moveForward();
1825
+ });
1826
+ resolve();
1827
+ }
1828
+ /**
1829
+ * 读者进入第一道门
1830
+ */
1831
+ _readerEnterGate1(resolve) {
1832
+ lvAssert(!this._writer);
1833
+ this._waitingReader = void 0;
1834
+ if (!this._reader) {
1835
+ this._reader = new SharedCapability();
1836
+ this._reader.acquire();
1837
+ listenOnce(this._reader.onUnlocked)(() => {
1838
+ this._moveForward();
1839
+ });
1840
+ } else {
1841
+ this._reader.acquire();
1842
+ }
1843
+ resolve();
1844
+ }
1845
+ /**
1846
+ * 锁释放时推进流程
1847
+ */
1848
+ _moveForward() {
1849
+ if (this._writer) {
1850
+ return;
1851
+ }
1852
+ if (this._waitingWriters.length > 0) {
1853
+ const semaphore = this._waitingWriters.shift();
1854
+ semaphore.notify();
1855
+ return;
1856
+ }
1857
+ if (this._waitingReader) {
1858
+ this._waitingReader.notify();
1859
+ }
1860
+ }
1861
+ };
1862
+
1863
+ // src/di/lazy/lazy-service.ts
1864
+ exports.LazyServiceLoader = class LazyServiceLoader {
1865
+ constructor(_instantiationService) {
1866
+ this._instantiationService = _instantiationService;
1867
+ this._sharedMutex = new SharedMutex();
1868
+ }
1869
+ get loaded() {
1870
+ return Boolean(this._instance);
1871
+ }
1872
+ preload() {
1873
+ this._getModule();
1874
+ }
1875
+ // 创建模块实例
1876
+ async getInstance() {
1877
+ await this._sharedMutex.lock();
1878
+ try {
1879
+ if (this._instance) {
1880
+ return this._instance;
1881
+ }
1882
+ this._instance = await this._makeInstance(...this._getStaticArguments());
1883
+ return this._instance;
1884
+ } finally {
1885
+ this._sharedMutex.unLock();
1886
+ }
1887
+ }
1888
+ // 加载module,获取实例
1889
+ async _makeInstance(...rest) {
1890
+ const module = await this._getModule();
1891
+ if (module.default) {
1892
+ return this._instantiationService.createInstance(module.default, ...rest);
1893
+ } else {
1894
+ return this._instantiationService.createInstance(module, ...rest);
1895
+ }
1896
+ }
1897
+ // 获取模块的静态参数,子类可以复写
1898
+ _getStaticArguments() {
1899
+ return [];
1900
+ }
1901
+ };
1902
+ exports.LazyServiceLoader = __decorateClass([
1903
+ __decorateParam(0, IInstantiationService)
1904
+ ], exports.LazyServiceLoader);
1905
+
1906
+ // src/di/lazy/idle-load.ts
1907
+ var IdleServiceLoader = class {
1908
+ constructor(originService, staticArguments, _instantiationService) {
1909
+ this._instantiationService = _instantiationService;
1910
+ this._service = this._instantiationService.createInstance(originService, ...staticArguments);
1911
+ lvSchedulerCallback(() => this._service.preload());
1912
+ }
1913
+ get loaded() {
1914
+ return this._service.loaded;
1915
+ }
1916
+ getInstance() {
1917
+ return this._service.getInstance();
1918
+ }
1919
+ preload() {
1920
+ this._service.preload();
1921
+ }
1922
+ };
1923
+ IdleServiceLoader = __decorateClass([
1924
+ __decorateParam(2, IInstantiationService)
1925
+ ], IdleServiceLoader);
1926
+ function makeLazyServiceIdleLoad(ctor, staticArguments = []) {
1927
+ return new SyncDescriptor(IdleServiceLoader, [ctor, staticArguments]);
1928
+ }
1929
+ var Context = react.createContext(null);
1930
+ var InstantiationContext = (props) => {
1931
+ return react.createElement(
1932
+ Context.Provider,
1933
+ { value: props.instantiationService },
1934
+ props.children
1935
+ );
1936
+ };
1937
+ function useService(identifier) {
1938
+ const instantiationService = react.useContext(Context);
1939
+ lvAssertNotNil(instantiationService, "react components need service context.");
1940
+ const service = react.useMemo(
1941
+ () => instantiationService.invokeFunction(
1942
+ (servicesAccessor) => servicesAccessor.get(identifier)
1943
+ ),
1944
+ [instantiationService, identifier]
1945
+ );
1946
+ return service;
1947
+ }
1948
+
1949
+ exports.ContainerService = InstantiationService;
1950
+ exports.IContainerService = IInstantiationService;
1951
+ exports.IInstantiationService = IInstantiationService;
1952
+ exports.InstantiationContext = InstantiationContext;
1953
+ exports.InstantiationErrorType = InstantiationErrorType;
1954
+ exports.InstantiationService = InstantiationService;
1955
+ exports.ServiceCollection = ServiceCollection;
1956
+ exports.ServiceOwnership = ServiceOwnership;
1957
+ exports.ServiceRegistry = ServiceRegistry;
1958
+ exports.SyncDescriptor = SyncDescriptor;
1959
+ exports.createDecorator = createDecorator;
1960
+ exports.getService = getService;
1961
+ exports.makeLazyServiceIdleLoad = makeLazyServiceIdleLoad;
1962
+ exports.refineServiceDecorator = refineServiceDecorator;
1963
+ exports.useService = useService;
1964
+ //# sourceMappingURL=index.cjs.map
1965
+ //# sourceMappingURL=index.cjs.map