@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,599 @@
1
+ 'use strict';
2
+
3
+ // src/scheduler/type.ts
4
+ var PriorityLevel = /* @__PURE__ */ ((PriorityLevel2) => {
5
+ PriorityLevel2[PriorityLevel2["ImmediatePriority"] = 0] = "ImmediatePriority";
6
+ PriorityLevel2[PriorityLevel2["UserBlockingPriority"] = 1] = "UserBlockingPriority";
7
+ PriorityLevel2[PriorityLevel2["NormalPriority"] = 2] = "NormalPriority";
8
+ PriorityLevel2[PriorityLevel2["LowPriority"] = 3] = "LowPriority";
9
+ PriorityLevel2[PriorityLevel2["IdlePriority"] = 4] = "IdlePriority";
10
+ return PriorityLevel2;
11
+ })(PriorityLevel || {});
12
+
13
+ // src/assert/assert.ts
14
+ function abort(reason) {
15
+ throw new Error(`lvAssert(${reason})`);
16
+ }
17
+ function lvAssert(expr, reason) {
18
+ if (!expr) {
19
+ abort(reason ?? "#expr is false");
20
+ }
21
+ }
22
+
23
+ // src/scheduler/core/task.ts
24
+ var Task = class {
25
+ constructor(callback, _startTime, _expirationTime) {
26
+ this._startTime = _startTime;
27
+ this._expirationTime = _expirationTime;
28
+ this._sortIndex = -1;
29
+ this._callback = callback;
30
+ }
31
+ getCallback() {
32
+ return this._callback;
33
+ }
34
+ setCallback(callback) {
35
+ lvAssert(this._callback === void 0, "cant overlay callback.");
36
+ this._callback = callback;
37
+ }
38
+ clearCallback() {
39
+ this._callback = void 0;
40
+ }
41
+ getStartTime() {
42
+ return this._startTime;
43
+ }
44
+ setStartTime(startTime) {
45
+ this._startTime = startTime;
46
+ }
47
+ getExpirationTime() {
48
+ return this._expirationTime;
49
+ }
50
+ setExpirationTime(expirationTime) {
51
+ this._expirationTime = expirationTime;
52
+ }
53
+ setSortIndex(index) {
54
+ this._sortIndex = index;
55
+ }
56
+ getSortIndex() {
57
+ return this._sortIndex;
58
+ }
59
+ };
60
+
61
+ // src/scheduler/core/utils.ts
62
+ var maxSigned31BitInt = 1073741823;
63
+ var IMMEDIATE_PRIORITY_TIMEOUT = -1;
64
+ var USER_BLOCKING_PRIORITY_TIMEOUT = 250;
65
+ var NORMAL_PRIORITY_TIMEOUT = 5e3;
66
+ var LOW_PRIORITY_TIMEOUT = 1e4;
67
+ var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;
68
+ function getCurrentTime() {
69
+ return Date.now();
70
+ }
71
+ function getTimeout(priorityLevel = 2 /* NormalPriority */) {
72
+ switch (priorityLevel) {
73
+ case 0 /* ImmediatePriority */:
74
+ return IMMEDIATE_PRIORITY_TIMEOUT;
75
+ case 1 /* UserBlockingPriority */:
76
+ return USER_BLOCKING_PRIORITY_TIMEOUT;
77
+ case 4 /* IdlePriority */:
78
+ return IDLE_PRIORITY_TIMEOUT;
79
+ case 3 /* LowPriority */:
80
+ return LOW_PRIORITY_TIMEOUT;
81
+ case 2 /* NormalPriority */:
82
+ default:
83
+ return NORMAL_PRIORITY_TIMEOUT;
84
+ }
85
+ }
86
+ function makeTask(callback, options = {}) {
87
+ const currentTime = getCurrentTime();
88
+ const delay = options.delay ?? 0;
89
+ const timeout = getTimeout(options.priorityLevel);
90
+ const startTime = delay + currentTime;
91
+ const expirationTime = startTime + timeout;
92
+ const newTask = new Task(callback, startTime, expirationTime);
93
+ return newTask;
94
+ }
95
+
96
+ // src/scheduler/core/chunk-scheduler.ts
97
+ var ChunkScheduler = class {
98
+ constructor(_task, _scheduler) {
99
+ this._task = _task;
100
+ this._scheduler = _scheduler;
101
+ this._needContinue = false;
102
+ }
103
+ get needContinue() {
104
+ return this._needContinue;
105
+ }
106
+ continueExecute(callback) {
107
+ this._needContinue = true;
108
+ this._task.setCallback(callback);
109
+ }
110
+ execute(callback, options = {}) {
111
+ const newTask = makeTask(callback, options);
112
+ this._scheduler.addTask(newTask);
113
+ }
114
+ };
115
+
116
+ // src/scheduler/core/actuator.ts
117
+ var Actuator = class {
118
+ constructor(_taskQueue, _scheduler) {
119
+ this._taskQueue = _taskQueue;
120
+ this._scheduler = _scheduler;
121
+ }
122
+ workLoop(hasTimeRemaining, initialTime, deadline) {
123
+ let currentTime = initialTime;
124
+ this._taskQueue.advance(currentTime);
125
+ let currentTask = this._taskQueue.waitingTasks.peek();
126
+ while (currentTask !== null) {
127
+ if (currentTask.getExpirationTime() > currentTime && (!hasTimeRemaining || this._scheduler.shouldYieldToHost(deadline))) {
128
+ break;
129
+ }
130
+ if (currentTask.getCallback() === void 0) {
131
+ this._taskQueue.waitingTasks.remove();
132
+ } else {
133
+ const callback = currentTask.getCallback();
134
+ const didUserCallbackTimeout = currentTask.getExpirationTime() <= currentTime;
135
+ const remainingTime = deadline - currentTime;
136
+ currentTask.clearCallback();
137
+ const chunkInvoker = new ChunkScheduler(currentTask, this._scheduler);
138
+ callback(chunkInvoker, didUserCallbackTimeout, remainingTime);
139
+ if (!chunkInvoker.needContinue) {
140
+ this._taskQueue.waitingTasks.remove();
141
+ }
142
+ currentTime = getCurrentTime();
143
+ this._taskQueue.advance(currentTime);
144
+ }
145
+ currentTask = this._taskQueue.waitingTasks.peek();
146
+ }
147
+ if (currentTask !== null) {
148
+ return true;
149
+ }
150
+ this._scheduler.requestHostTimeout(currentTime);
151
+ return false;
152
+ }
153
+ };
154
+
155
+ // src/structure/min-heap.ts
156
+ var MinHeap = class {
157
+ constructor(compareFunction) {
158
+ this._heap = [];
159
+ if (compareFunction) {
160
+ this._compare = compareFunction;
161
+ } else {
162
+ this._compare = (a, b) => {
163
+ if (a < b) return -1;
164
+ if (a > b) return 1;
165
+ return 0;
166
+ };
167
+ }
168
+ }
169
+ insert(value) {
170
+ this._heap.push(value);
171
+ this._siftUp();
172
+ }
173
+ peek() {
174
+ return this._heap.length > 0 ? this._heap[0] : null;
175
+ }
176
+ remove() {
177
+ if (this._heap.length === 0) return null;
178
+ if (this._heap.length === 1) return this._heap.pop();
179
+ const item = this._heap[0];
180
+ this._heap[0] = this._heap.pop();
181
+ this._siftDown();
182
+ return item;
183
+ }
184
+ size() {
185
+ return this._heap.length;
186
+ }
187
+ clear() {
188
+ this._heap.length = 0;
189
+ }
190
+ _getLeftChildIndex(parentIndex) {
191
+ return 2 * parentIndex + 1;
192
+ }
193
+ _getRightChildIndex(parentIndex) {
194
+ return 2 * parentIndex + 2;
195
+ }
196
+ _getParentIndex(childIndex) {
197
+ return Math.floor((childIndex - 1) / 2);
198
+ }
199
+ _swap(indexOne, indexTwo) {
200
+ [this._heap[indexOne], this._heap[indexTwo]] = [this._heap[indexTwo], this._heap[indexOne]];
201
+ }
202
+ _siftUp() {
203
+ let index = this._heap.length - 1;
204
+ while (index > 0 && this._compare(this._heap[this._getParentIndex(index)], this._heap[index]) > 0) {
205
+ const parentIndex = this._getParentIndex(index);
206
+ this._swap(index, parentIndex);
207
+ index = parentIndex;
208
+ }
209
+ }
210
+ _siftDown() {
211
+ let index = 0;
212
+ let smallerChildIndex = this._getLeftChildIndex(index);
213
+ while (smallerChildIndex < this._heap.length) {
214
+ const rightChildIndex = this._getRightChildIndex(index);
215
+ if (rightChildIndex < this._heap.length && this._compare(this._heap[rightChildIndex], this._heap[smallerChildIndex]) < 0) {
216
+ smallerChildIndex = rightChildIndex;
217
+ }
218
+ if (this._compare(this._heap[index], this._heap[smallerChildIndex]) <= 0) {
219
+ break;
220
+ }
221
+ this._swap(index, smallerChildIndex);
222
+ index = smallerChildIndex;
223
+ smallerChildIndex = this._getLeftChildIndex(index);
224
+ }
225
+ }
226
+ };
227
+
228
+ // src/scheduler/core/task-queue.ts
229
+ function compare(lhs, rhs) {
230
+ return lhs.getSortIndex() - rhs.getSortIndex();
231
+ }
232
+ var TaskQueue = class {
233
+ constructor() {
234
+ // 延时任务
235
+ this._timerTasks = new MinHeap(compare);
236
+ // 等待执行的任务
237
+ this._waitingTasks = new MinHeap(compare);
238
+ }
239
+ get timerTasks() {
240
+ return this._timerTasks;
241
+ }
242
+ get waitingTasks() {
243
+ return this._waitingTasks;
244
+ }
245
+ advance(currentTime) {
246
+ let task = this._timerTasks.peek();
247
+ while (task !== null) {
248
+ if (task.getCallback() === null) {
249
+ this._timerTasks.remove();
250
+ } else if (task.getStartTime() <= currentTime) {
251
+ this._timerTasks.remove();
252
+ task.setSortIndex(task.getExpirationTime());
253
+ this._waitingTasks.insert(task);
254
+ } else {
255
+ return;
256
+ }
257
+ task = this._timerTasks.peek();
258
+ }
259
+ }
260
+ };
261
+
262
+ // src/scheduler/executor/abstract-executor.ts
263
+ var AbstractExecutor = class {
264
+ constructor() {
265
+ this._timeoutId = -1;
266
+ this._deadline = 0;
267
+ this._yieldInterval = 16;
268
+ }
269
+ get deadline() {
270
+ return this._deadline;
271
+ }
272
+ setFrameRate(fps) {
273
+ lvAssert(fps > 0 && fps <= 125);
274
+ this._yieldInterval = Math.floor(1e3 / fps);
275
+ }
276
+ resetFrameRate() {
277
+ this._yieldInterval = 16;
278
+ }
279
+ requestHostTimeout(fn, delayMs) {
280
+ lvAssert(this._timeoutId === -1, "has request host timeout.");
281
+ clearTimeout(this._timeoutId);
282
+ this._timeoutId = setTimeout(() => {
283
+ this._timeoutId = -1;
284
+ fn();
285
+ }, delayMs);
286
+ }
287
+ cancelHostTimeout() {
288
+ clearTimeout(this._timeoutId);
289
+ this._timeoutId = -1;
290
+ }
291
+ };
292
+
293
+ // src/scheduler/executor/idle-callback-executor.ts
294
+ var IdleCallbackExecutor = class extends AbstractExecutor {
295
+ constructor() {
296
+ super();
297
+ this._flushCallback = () => {
298
+ if (!this._scheduledCallback) {
299
+ return;
300
+ }
301
+ const currentTime = getCurrentTime();
302
+ const deadline = currentTime + this._yieldInterval;
303
+ try {
304
+ const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);
305
+ if (!hasMoreWork) {
306
+ this._scheduledCallback = void 0;
307
+ this._disposable = void 0;
308
+ } else {
309
+ this._disposable = this._runWhenIdle(this._flushCallback);
310
+ }
311
+ } catch (err) {
312
+ this._disposable = this._runWhenIdle(this._flushCallback);
313
+ throw err;
314
+ }
315
+ };
316
+ if (typeof requestIdleCallback !== "function" || typeof cancelIdleCallback !== "function") {
317
+ this._runWhenIdle = (runner) => {
318
+ let disposed = false;
319
+ setTimeout(() => {
320
+ if (disposed) {
321
+ return;
322
+ }
323
+ const end = Date.now() + 15;
324
+ runner(
325
+ Object.freeze({
326
+ didTimeout: true,
327
+ timeRemaining() {
328
+ return Math.max(0, end - Date.now());
329
+ }
330
+ })
331
+ );
332
+ });
333
+ return {
334
+ dispose() {
335
+ if (disposed) {
336
+ return;
337
+ }
338
+ disposed = true;
339
+ }
340
+ };
341
+ };
342
+ } else {
343
+ this._runWhenIdle = (runner, timeout) => {
344
+ const handle = requestIdleCallback(
345
+ runner,
346
+ typeof timeout === "number" ? { timeout } : void 0
347
+ );
348
+ let disposed = false;
349
+ return {
350
+ dispose() {
351
+ if (disposed) {
352
+ return;
353
+ }
354
+ disposed = true;
355
+ cancelIdleCallback(handle);
356
+ }
357
+ };
358
+ };
359
+ }
360
+ }
361
+ requestHostCallback(fn) {
362
+ this._scheduledCallback = fn;
363
+ if (!this._disposable) {
364
+ this._disposable = this._runWhenIdle(this._flushCallback);
365
+ }
366
+ }
367
+ cancelHostCallback() {
368
+ this._disposable?.dispose();
369
+ this._scheduledCallback = void 0;
370
+ this._disposable = void 0;
371
+ }
372
+ };
373
+
374
+ // src/scheduler/executor/post-message-executor.ts
375
+ var PostMessageExecutor = class extends AbstractExecutor {
376
+ constructor() {
377
+ super();
378
+ this._isMessageLoopRunning = false;
379
+ this._channel = new MessageChannel();
380
+ this._flushCallback = () => {
381
+ if (!this._scheduledCallback) {
382
+ this._isMessageLoopRunning = false;
383
+ return;
384
+ }
385
+ const currentTime = getCurrentTime();
386
+ const deadline = currentTime + this._yieldInterval;
387
+ try {
388
+ const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);
389
+ if (!hasMoreWork) {
390
+ this._isMessageLoopRunning = false;
391
+ this._scheduledCallback = void 0;
392
+ } else {
393
+ this._channel.port2.postMessage(null);
394
+ }
395
+ } catch (err) {
396
+ this._channel.port2.postMessage(null);
397
+ throw err;
398
+ }
399
+ };
400
+ this._channel.port1.onmessage = () => {
401
+ this._flushCallback();
402
+ };
403
+ }
404
+ requestHostCallback(fn) {
405
+ this._scheduledCallback = fn;
406
+ if (!this._isMessageLoopRunning) {
407
+ this._isMessageLoopRunning = true;
408
+ this._channel.port2.postMessage(null);
409
+ }
410
+ }
411
+ cancelHostCallback() {
412
+ this._scheduledCallback = void 0;
413
+ }
414
+ };
415
+
416
+ // src/scheduler/executor/make-executor.ts
417
+ function makeExecutor() {
418
+ try {
419
+ if (global.window) {
420
+ return new PostMessageExecutor();
421
+ }
422
+ } catch (e) {
423
+ }
424
+ return new IdleCallbackExecutor();
425
+ }
426
+
427
+ // src/scheduler/core/scheduler.ts
428
+ var Scheduler = class {
429
+ constructor() {
430
+ this._isHostTimeoutScheduled = false;
431
+ this._isHostCallbackScheduled = false;
432
+ this._isWorking = false;
433
+ this._enableInputPending = true;
434
+ this._executor = makeExecutor();
435
+ this._taskQueue = new TaskQueue();
436
+ this._actuator = new Actuator(this._taskQueue, this);
437
+ /**
438
+ * 是否需要让出事件给宿主
439
+ */
440
+ this.shouldYieldToHost = (() => {
441
+ try {
442
+ if (global.navigator?.scheduling?.isInputPending !== void 0) {
443
+ const { scheduling } = global.navigator;
444
+ return (deadline) => {
445
+ if (this._enableInputPending && scheduling.isInputPending()) {
446
+ return true;
447
+ }
448
+ return getCurrentTime() >= deadline;
449
+ };
450
+ }
451
+ } catch (e) {
452
+ }
453
+ return (deadline) => {
454
+ return getCurrentTime() >= deadline;
455
+ };
456
+ })();
457
+ this._handleHostTimeout = () => {
458
+ this._isHostTimeoutScheduled = false;
459
+ const currentTime = getCurrentTime();
460
+ this._taskQueue.advance(currentTime);
461
+ if (this._isHostCallbackScheduled) {
462
+ return;
463
+ }
464
+ if (this._taskQueue.waitingTasks.peek() !== null) {
465
+ this._isHostCallbackScheduled = true;
466
+ this._executor.requestHostCallback(this._handleHostCallback);
467
+ return;
468
+ }
469
+ this._requestHostTimeout(currentTime);
470
+ };
471
+ this._handleHostCallback = (hasTimeRemaining, initialTime, deadline) => {
472
+ this._isHostCallbackScheduled = false;
473
+ if (this._isHostTimeoutScheduled) {
474
+ this._isHostTimeoutScheduled = false;
475
+ this._executor.cancelHostTimeout();
476
+ }
477
+ this._isWorking = true;
478
+ try {
479
+ return this._actuator.workLoop(hasTimeRemaining, initialTime, deadline);
480
+ } finally {
481
+ this._isWorking = false;
482
+ }
483
+ };
484
+ }
485
+ get taskQueue() {
486
+ return this._taskQueue;
487
+ }
488
+ get executor() {
489
+ return this._executor;
490
+ }
491
+ /**
492
+ * 设置是否开启InputPending
493
+ */
494
+ setEnableInputPending(val) {
495
+ this._enableInputPending = val;
496
+ }
497
+ /**
498
+ * 调度器中添加任务
499
+ */
500
+ addTask(task) {
501
+ const currentTime = getCurrentTime();
502
+ if (task.getStartTime() > currentTime) {
503
+ task.setSortIndex(task.getStartTime());
504
+ this._taskQueue.timerTasks.insert(task);
505
+ if (this._taskQueue.waitingTasks.peek() === null && task === this._taskQueue.timerTasks.peek()) {
506
+ if (this._isHostTimeoutScheduled) {
507
+ this._executor.cancelHostTimeout();
508
+ } else {
509
+ this._isHostTimeoutScheduled = true;
510
+ }
511
+ this._executor.requestHostTimeout(this._handleHostTimeout, task.getStartTime() - currentTime);
512
+ }
513
+ } else {
514
+ task.setSortIndex(task.getExpirationTime());
515
+ this._taskQueue.waitingTasks.insert(task);
516
+ if (!this._isHostCallbackScheduled && !this._isWorking) {
517
+ this._isHostCallbackScheduled = true;
518
+ this._executor.requestHostCallback(this._handleHostCallback);
519
+ }
520
+ }
521
+ }
522
+ /**
523
+ * 尝试启动异步任务调度
524
+ */
525
+ requestHostTimeout(currentTime) {
526
+ this._requestHostTimeout(currentTime);
527
+ }
528
+ _requestHostTimeout(currentTime) {
529
+ lvAssert(!this._isHostCallbackScheduled);
530
+ lvAssert(!this._isHostTimeoutScheduled);
531
+ const firstTimerTask = this._taskQueue.timerTasks.peek();
532
+ if (firstTimerTask !== null) {
533
+ this._isHostTimeoutScheduled = true;
534
+ this._executor.requestHostTimeout(this._handleHostTimeout, firstTimerTask.getStartTime() - currentTime);
535
+ }
536
+ }
537
+ };
538
+ var scheduler;
539
+ function getScheduler() {
540
+ if (!scheduler) {
541
+ scheduler = new Scheduler();
542
+ }
543
+ return scheduler;
544
+ }
545
+
546
+ // src/scheduler/callback-token.ts
547
+ var CallbackToken = class {
548
+ constructor(_task) {
549
+ this._task = _task;
550
+ }
551
+ dispose() {
552
+ this._task.clearCallback();
553
+ }
554
+ updatePriorityLevel(priorityLevel) {
555
+ const callback = this._task.getCallback();
556
+ if (!callback) {
557
+ return;
558
+ }
559
+ this._task.clearCallback();
560
+ const newTask = makeTask(callback, {
561
+ priorityLevel
562
+ });
563
+ const startTime = this._task.getStartTime();
564
+ const timeout = getTimeout(priorityLevel);
565
+ const expirationTime = startTime + timeout;
566
+ newTask.setStartTime(startTime);
567
+ newTask.setExpirationTime(expirationTime);
568
+ getScheduler().addTask(newTask);
569
+ this._task = newTask;
570
+ }
571
+ };
572
+
573
+ // src/scheduler/lv-scheduler-callback.ts
574
+ function lvSchedulerCallback(callback, options = {}) {
575
+ const newTask = makeTask(callback, options);
576
+ getScheduler().addTask(newTask);
577
+ return new CallbackToken(newTask);
578
+ }
579
+
580
+ // src/scheduler/lv-scheduler-config.ts
581
+ function lvSchedulerConfig(config) {
582
+ if (config.fps !== void 0) {
583
+ getScheduler().executor.setFrameRate(config.fps);
584
+ }
585
+ if (config.enableInputPending !== void 0) {
586
+ getScheduler().setEnableInputPending(config.enableInputPending);
587
+ }
588
+ }
589
+ function lvSchedulerResetConfig() {
590
+ getScheduler().executor.resetFrameRate();
591
+ getScheduler().setEnableInputPending(true);
592
+ }
593
+
594
+ exports.PriorityLevel = PriorityLevel;
595
+ exports.lvSchedulerCallback = lvSchedulerCallback;
596
+ exports.lvSchedulerConfig = lvSchedulerConfig;
597
+ exports.lvSchedulerResetConfig = lvSchedulerResetConfig;
598
+ //# sourceMappingURL=index.cjs.map
599
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/scheduler/type.ts","../../src/assert/assert.ts","../../src/scheduler/core/task.ts","../../src/scheduler/core/utils.ts","../../src/scheduler/core/chunk-scheduler.ts","../../src/scheduler/core/actuator.ts","../../src/structure/min-heap.ts","../../src/scheduler/core/task-queue.ts","../../src/scheduler/executor/abstract-executor.ts","../../src/scheduler/executor/idle-callback-executor.ts","../../src/scheduler/executor/post-message-executor.ts","../../src/scheduler/executor/make-executor.ts","../../src/scheduler/core/scheduler.ts","../../src/scheduler/callback-token.ts","../../src/scheduler/lv-scheduler-callback.ts","../../src/scheduler/lv-scheduler-config.ts"],"names":["PriorityLevel"],"mappings":"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","file":"index.cjs","sourcesContent":["// 任务调度的优先级,从高到低\nexport enum PriorityLevel {\n /** 立即执行任务的优先级 */\n ImmediatePriority,\n /** 用户阻塞的优先级 */\n UserBlockingPriority,\n /** 普通优先级 */\n NormalPriority,\n /** 低优先级 */\n LowPriority,\n /** 闲置优先级 */\n IdlePriority,\n}\n\nexport interface IOptions {\n delay?: number;\n priorityLevel?: PriorityLevel;\n}\n\nexport interface IConfig {\n fps?: number;\n enableInputPending?: boolean;\n}\n\nexport interface IScheduledCallback {\n /**\n * @param chunkScheduler 分片调度器\n * @param didUserCallbackTimeout 该callback执行时,是否已经超过了注册时设置的过期时间\n * @param remainingTime 该callback执行时,当前调度loop中剩余的可用时间\n */\n (chunkScheduler: IChunkScheduler, didUserCallbackTimeout: boolean, remainingTime: number): void;\n}\n\n/**\n * 分片调度器\n * 支持将某个大的宏任务,拆成小的粒度执行\n */\nexport interface IChunkScheduler {\n /**\n * 在分片结束状态下,启动一个新的任务进入调度器\n */\n execute: (callback: IScheduledCallback, options?: IOptions) => void;\n\n /**\n * 在分片结束状态下,延续当前任务(本质上是立即执行任务)\n */\n continueExecute: (callback: IScheduledCallback) => void;\n}\n","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 { lvAssert } from '../../assert';\nimport type { IScheduledCallback } from '../type';\n\nexport class Task {\n private _callback?: IScheduledCallback;\n private _sortIndex: number = -1;\n\n constructor(\n callback: IScheduledCallback,\n private _startTime: number,\n private _expirationTime: number,\n ) {\n this._callback = callback;\n }\n\n getCallback() {\n return this._callback;\n }\n\n setCallback(callback: IScheduledCallback) {\n lvAssert(this._callback === undefined, 'cant overlay callback.');\n this._callback = callback;\n }\n\n clearCallback() {\n this._callback = undefined;\n }\n\n getStartTime() {\n return this._startTime;\n }\n\n setStartTime(startTime: number) {\n this._startTime = startTime;\n }\n\n getExpirationTime() {\n return this._expirationTime;\n }\n\n setExpirationTime(expirationTime: number) {\n this._expirationTime = expirationTime;\n }\n\n setSortIndex(index: number) {\n this._sortIndex = index;\n }\n\n getSortIndex() {\n return this._sortIndex;\n }\n}\n","// Max 31 bit integer. The max integer size in V8 for 32-bit systems.\n// Math.pow(2, 30) - 1\n\nimport { Task } from './task';\nimport { PriorityLevel, type IScheduledCallback, type IOptions } from '../type';\n\n// 0b111111111111111111111111111111\nconst maxSigned31BitInt = 1073741823;\n\n// Times out immediately\nconst IMMEDIATE_PRIORITY_TIMEOUT = -1;\n// Eventually times out\nconst USER_BLOCKING_PRIORITY_TIMEOUT = 250;\nconst NORMAL_PRIORITY_TIMEOUT = 5000;\nconst LOW_PRIORITY_TIMEOUT = 10000;\n// Never times out\nconst IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;\n\nexport function getCurrentTime() {\n return Date.now();\n}\n\nexport function getTimeout(priorityLevel: PriorityLevel = PriorityLevel.NormalPriority) {\n switch (priorityLevel) {\n case PriorityLevel.ImmediatePriority:\n return IMMEDIATE_PRIORITY_TIMEOUT;\n case PriorityLevel.UserBlockingPriority:\n return USER_BLOCKING_PRIORITY_TIMEOUT;\n case PriorityLevel.IdlePriority:\n return IDLE_PRIORITY_TIMEOUT;\n case PriorityLevel.LowPriority:\n return LOW_PRIORITY_TIMEOUT;\n case PriorityLevel.NormalPriority:\n default:\n return NORMAL_PRIORITY_TIMEOUT;\n }\n}\n\nexport function makeTask(callback: IScheduledCallback, options: IOptions = {}) {\n const currentTime = getCurrentTime();\n const delay = options.delay ?? 0;\n const timeout = getTimeout(options.priorityLevel);\n const startTime = delay + currentTime;\n const expirationTime = startTime + timeout;\n\n const newTask = new Task(callback, startTime, expirationTime);\n return newTask;\n}\n","import type { Scheduler } from './scheduler';\nimport { Task } from './task';\nimport { type IChunkScheduler, type IScheduledCallback, type IOptions } from '../type';\nimport { makeTask } from './utils';\n\nexport class ChunkScheduler implements IChunkScheduler {\n private _needContinue: boolean = false;\n\n constructor(\n private readonly _task: Task,\n private readonly _scheduler: Scheduler,\n ) {}\n\n get needContinue() {\n return this._needContinue;\n }\n\n continueExecute(callback: IScheduledCallback) {\n this._needContinue = true;\n // 该task还需要延续执行,更新一些信息\n this._task.setCallback(callback);\n }\n\n execute(callback: IScheduledCallback, options: IOptions = {}) {\n const newTask = makeTask(callback, options);\n this._scheduler.addTask(newTask);\n }\n}\n","import { ChunkScheduler } from './chunk-scheduler';\nimport type { Scheduler } from './scheduler';\nimport type { TaskQueue } from './task-queue';\nimport { getCurrentTime } from './utils';\n\nexport class Actuator {\n constructor(\n private readonly _taskQueue: TaskQueue,\n private readonly _scheduler: Scheduler,\n ) {}\n\n workLoop(hasTimeRemaining: boolean, initialTime: number, deadline: number): boolean {\n let currentTime = initialTime;\n this._taskQueue.advance(currentTime);\n let currentTask = this._taskQueue.waitingTasks.peek();\n\n while (currentTask !== null) {\n // 暂停执行需要满足的条件(1,2同时满足)\n // 1. 不能超时了,超时的任务一定会执行\n // 2. 没有剩余时间了,或者调度器认为需要释放资源\n if (\n currentTask.getExpirationTime() > currentTime &&\n (!hasTimeRemaining || this._scheduler.shouldYieldToHost(deadline))\n ) {\n break;\n }\n\n if (currentTask.getCallback() === undefined) {\n // 任务取消了\n this._taskQueue.waitingTasks.remove();\n } else {\n const callback = currentTask.getCallback()!;\n const didUserCallbackTimeout = currentTask.getExpirationTime() <= currentTime;\n const remainingTime = deadline - currentTime;\n currentTask.clearCallback();\n\n const chunkInvoker = new ChunkScheduler(currentTask, this._scheduler);\n callback(chunkInvoker, didUserCallbackTimeout, remainingTime);\n\n if (!chunkInvoker.needContinue) {\n this._taskQueue.waitingTasks.remove();\n }\n\n currentTime = getCurrentTime();\n this._taskQueue.advance(currentTime);\n }\n\n currentTask = this._taskQueue.waitingTasks.peek();\n }\n\n if (currentTask !== null) {\n return true;\n }\n // 如果等待队列结束了,要启动异步调度了\n this._scheduler.requestHostTimeout(currentTime);\n return false;\n }\n}\n","export class MinHeap<T> {\n private readonly _heap: T[] = [];\n private readonly _compare: (a: T, b: T) => number;\n\n constructor(compareFunction?: (a: T, b: T) => number) {\n if (compareFunction) {\n this._compare = compareFunction;\n } else {\n this._compare = (a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n };\n }\n }\n\n public insert(value: T): void {\n this._heap.push(value);\n this._siftUp();\n }\n\n public peek(): T | null {\n return this._heap.length > 0 ? this._heap[0] : null;\n }\n\n public remove(): T | null {\n if (this._heap.length === 0) return null;\n if (this._heap.length === 1) return this._heap.pop()!;\n\n const item = this._heap[0];\n this._heap[0] = this._heap.pop()!;\n this._siftDown();\n return item;\n }\n\n public size(): number {\n return this._heap.length;\n }\n\n public clear(): void {\n this._heap.length = 0;\n }\n\n private _getLeftChildIndex(parentIndex: number): number {\n return 2 * parentIndex + 1;\n }\n\n private _getRightChildIndex(parentIndex: number): number {\n return 2 * parentIndex + 2;\n }\n\n private _getParentIndex(childIndex: number): number {\n return Math.floor((childIndex - 1) / 2);\n }\n\n private _swap(indexOne: number, indexTwo: number): void {\n [this._heap[indexOne], this._heap[indexTwo]] = [this._heap[indexTwo], this._heap[indexOne]];\n }\n\n private _siftUp(): void {\n let index = this._heap.length - 1;\n while (index > 0 && this._compare(this._heap[this._getParentIndex(index)], this._heap[index]) > 0) {\n const parentIndex = this._getParentIndex(index);\n this._swap(index, parentIndex);\n index = parentIndex;\n }\n }\n\n private _siftDown(): void {\n let index = 0;\n let smallerChildIndex = this._getLeftChildIndex(index);\n\n while (smallerChildIndex < this._heap.length) {\n const rightChildIndex = this._getRightChildIndex(index);\n if (\n rightChildIndex < this._heap.length &&\n this._compare(this._heap[rightChildIndex], this._heap[smallerChildIndex]) < 0\n ) {\n smallerChildIndex = rightChildIndex;\n }\n\n if (this._compare(this._heap[index], this._heap[smallerChildIndex]) <= 0) {\n break;\n }\n\n this._swap(index, smallerChildIndex);\n index = smallerChildIndex;\n smallerChildIndex = this._getLeftChildIndex(index);\n }\n }\n}\n","import { MinHeap } from '../../structure/min-heap';\nimport type { Task } from './task';\n\nfunction compare(lhs: Task, rhs: Task) {\n return lhs.getSortIndex() - rhs.getSortIndex();\n}\n\n/**\n * 任务存储队列\n * 本身是两个小根堆\n */\nexport class TaskQueue {\n // 延时任务\n private readonly _timerTasks = new MinHeap<Task>(compare);\n // 等待执行的任务\n private readonly _waitingTasks = new MinHeap<Task>(compare);\n\n get timerTasks() {\n return this._timerTasks;\n }\n\n get waitingTasks() {\n return this._waitingTasks;\n }\n\n advance(currentTime: number) {\n let task = this._timerTasks.peek();\n while (task !== null) {\n if (task.getCallback() === null) {\n // 任务已经取消\n this._timerTasks.remove();\n } else if (task.getStartTime() <= currentTime) {\n // 任务触发,移动到等待队列\n this._timerTasks.remove();\n task.setSortIndex(task.getExpirationTime());\n this._waitingTasks.insert(task);\n } else {\n // 剩余的异步任务pending即可\n return;\n }\n task = this._timerTasks.peek();\n }\n }\n}\n","import { lvAssert } from '../../assert';\nimport type { IExecutedCallback, IExecutor } from './executor.interface';\n\nexport abstract class AbstractExecutor implements IExecutor {\n private _timeoutId: number = -1;\n protected _deadline: number = 0;\n protected _yieldInterval: number = 16;\n\n get deadline() {\n return this._deadline;\n }\n\n setFrameRate(fps: number) {\n lvAssert(fps > 0 && fps <= 125);\n this._yieldInterval = Math.floor(1000 / fps);\n }\n\n resetFrameRate() {\n this._yieldInterval = 16;\n }\n\n public abstract requestHostCallback(fn: IExecutedCallback): void;\n public abstract cancelHostCallback(): void;\n\n public requestHostTimeout(fn: () => void, delayMs: number) {\n lvAssert(this._timeoutId === -1, 'has request host timeout.');\n clearTimeout(this._timeoutId);\n this._timeoutId = setTimeout(() => {\n this._timeoutId = -1;\n fn();\n }, delayMs) as unknown as number;\n }\n\n public cancelHostTimeout() {\n clearTimeout(this._timeoutId);\n this._timeoutId = -1;\n }\n}\n","import type { IDisposable } from '../../dispose';\nimport { getCurrentTime } from '../core/utils';\nimport { AbstractExecutor } from './abstract-executor';\nimport type { IExecutedCallback } from './executor.interface';\n\ndeclare function requestIdleCallback(\n callback: (args: IdleDeadline) => void,\n options?: { timeout: number },\n): number;\ndeclare function cancelIdleCallback(handle: number): void;\n\nexport class IdleCallbackExecutor extends AbstractExecutor {\n private _scheduledCallback?: IExecutedCallback;\n private _disposable?: IDisposable;\n private _runWhenIdle: (callback: (idle: IdleDeadline) => void, timeout?: number) => IDisposable;\n\n constructor() {\n super();\n if (typeof requestIdleCallback !== 'function' || typeof cancelIdleCallback !== 'function') {\n this._runWhenIdle = (runner) => {\n let disposed = false;\n setTimeout(() => {\n if (disposed) {\n return;\n }\n const end = Date.now() + 15; // one frame at 64fps\n runner(\n Object.freeze({\n didTimeout: true,\n timeRemaining() {\n return Math.max(0, end - Date.now());\n },\n }),\n );\n });\n return {\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n },\n };\n };\n } else {\n this._runWhenIdle = (runner, timeout?) => {\n const handle: number = requestIdleCallback(\n runner,\n typeof timeout === 'number' ? { timeout } : undefined,\n );\n let disposed = false;\n return {\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n cancelIdleCallback(handle);\n },\n };\n };\n }\n }\n\n public requestHostCallback(fn: IExecutedCallback) {\n this._scheduledCallback = fn;\n if (!this._disposable) {\n this._disposable = this._runWhenIdle(this._flushCallback);\n }\n }\n\n public cancelHostCallback() {\n this._disposable?.dispose();\n this._scheduledCallback = undefined;\n this._disposable = undefined;\n }\n\n private readonly _flushCallback = () => {\n if (!this._scheduledCallback) {\n return;\n }\n const currentTime = getCurrentTime();\n const deadline = currentTime + this._yieldInterval;\n\n try {\n const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);\n if (!hasMoreWork) {\n this._scheduledCallback = undefined;\n this._disposable = undefined;\n } else {\n this._disposable = this._runWhenIdle(this._flushCallback);\n }\n } catch (err) {\n this._disposable = this._runWhenIdle(this._flushCallback);\n throw err;\n }\n };\n}\n","import { getCurrentTime } from '../core/utils';\nimport { AbstractExecutor } from './abstract-executor';\nimport type { IExecutedCallback } from './executor.interface';\n\nexport class PostMessageExecutor extends AbstractExecutor {\n private _scheduledCallback?: IExecutedCallback;\n private _isMessageLoopRunning: boolean = false;\n private readonly _channel = new MessageChannel();\n\n constructor() {\n super();\n\n this._channel.port1.onmessage = () => {\n this._flushCallback();\n };\n }\n\n public requestHostCallback(fn: IExecutedCallback) {\n this._scheduledCallback = fn;\n if (!this._isMessageLoopRunning) {\n this._isMessageLoopRunning = true;\n this._channel.port2.postMessage(null);\n }\n }\n\n public cancelHostCallback() {\n this._scheduledCallback = undefined;\n }\n\n private readonly _flushCallback = () => {\n if (!this._scheduledCallback) {\n this._isMessageLoopRunning = false;\n return;\n }\n\n const currentTime = getCurrentTime();\n const deadline = currentTime + this._yieldInterval;\n\n try {\n const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);\n if (!hasMoreWork) {\n this._isMessageLoopRunning = false;\n this._scheduledCallback = undefined;\n } else {\n this._channel.port2.postMessage(null);\n }\n } catch (err) {\n this._channel.port2.postMessage(null);\n throw err;\n }\n };\n}\n","import type { IExecutor } from './executor.interface';\nimport { IdleCallbackExecutor } from './idle-callback-executor';\nimport { PostMessageExecutor } from './post-message-executor';\n\ndeclare const global: {\n window?: any;\n};\n\nexport function makeExecutor(): IExecutor {\n try {\n if (global.window) {\n return new PostMessageExecutor();\n }\n } catch (e) {\n // ...\n }\n return new IdleCallbackExecutor();\n}\n","import { Actuator } from './actuator';\nimport { TaskQueue } from './task-queue';\nimport { Task } from './task';\nimport { getCurrentTime } from './utils';\nimport { lvAssert } from '../../assert';\nimport type { IExecutor } from '../executor/executor.interface';\nimport { makeExecutor } from '../executor/make-executor';\n\ndeclare const global: {\n navigator:\n | (Navigator & {\n scheduling?: {\n isInputPending?: () => boolean;\n };\n })\n | undefined;\n};\n\n/**\n * 调度器\n * 负责推动任务的执行,闲时和非闲时的处理\n */\nexport class Scheduler {\n private _isHostTimeoutScheduled: boolean = false;\n private _isHostCallbackScheduled: boolean = false;\n private _isWorking: boolean = false;\n private _enableInputPending: boolean = true;\n private readonly _executor: IExecutor = makeExecutor();\n\n private readonly _taskQueue: TaskQueue = new TaskQueue();\n private readonly _actuator: Actuator = new Actuator(this._taskQueue, this);\n\n public get taskQueue() {\n return this._taskQueue;\n }\n\n public get executor() {\n return this._executor;\n }\n\n /**\n * 是否需要让出事件给宿主\n */\n public shouldYieldToHost = (() => {\n try {\n if (global.navigator?.scheduling?.isInputPending !== undefined) {\n const { scheduling } = global.navigator;\n return (deadline: number) => {\n if (this._enableInputPending && scheduling.isInputPending!()) {\n // 当遇到inputPending时,认为需要释放时间片\n return true;\n }\n return getCurrentTime() >= deadline;\n };\n }\n } catch (e) {\n // ...\n }\n return (deadline: number) => {\n // 如果不考虑isInputPending的情况下\n // 当前时间已经超了,认为需要释放时间片,返回true\n return getCurrentTime() >= deadline;\n };\n })();\n\n /**\n * 设置是否开启InputPending\n */\n public setEnableInputPending(val: boolean) {\n this._enableInputPending = val;\n }\n\n /**\n * 调度器中添加任务\n */\n public addTask(task: Task) {\n const currentTime = getCurrentTime();\n if (task.getStartTime() > currentTime) {\n task.setSortIndex(task.getStartTime());\n this._taskQueue.timerTasks.insert(task);\n\n // 如果等待队列为空,延迟队列队首是该任务,进行延迟调度\n if (this._taskQueue.waitingTasks.peek() === null && task === this._taskQueue.timerTasks.peek()) {\n // 如果之前已经有延迟调度了,取消再重新延迟调度\n // 有可能之前延迟10s\n // 最新的任务只需要延迟3s\n if (this._isHostTimeoutScheduled) {\n this._executor.cancelHostTimeout();\n } else {\n this._isHostTimeoutScheduled = true;\n }\n this._executor.requestHostTimeout(this._handleHostTimeout, task.getStartTime() - currentTime);\n }\n } else {\n task.setSortIndex(task.getExpirationTime());\n this._taskQueue.waitingTasks.insert(task);\n\n // 如果当前没有在及时调度或者执行中,进行及时调度\n if (!this._isHostCallbackScheduled && !this._isWorking) {\n this._isHostCallbackScheduled = true;\n this._executor.requestHostCallback(this._handleHostCallback);\n }\n }\n }\n\n /**\n * 尝试启动异步任务调度\n */\n public requestHostTimeout(currentTime: number) {\n this._requestHostTimeout(currentTime);\n }\n\n private readonly _handleHostTimeout = () => {\n this._isHostTimeoutScheduled = false;\n const currentTime = getCurrentTime();\n this._taskQueue.advance(currentTime);\n\n if (this._isHostCallbackScheduled) {\n return;\n }\n\n if (this._taskQueue.waitingTasks.peek() !== null) {\n this._isHostCallbackScheduled = true;\n this._executor.requestHostCallback(this._handleHostCallback);\n return;\n }\n\n this._requestHostTimeout(currentTime);\n };\n\n private readonly _handleHostCallback = (\n hasTimeRemaining: boolean,\n initialTime: number,\n deadline: number,\n ) => {\n this._isHostCallbackScheduled = false;\n\n if (this._isHostTimeoutScheduled) {\n // 如果有异步任务调度中,直接取消,应该没必要了\n this._isHostTimeoutScheduled = false;\n this._executor.cancelHostTimeout();\n }\n\n // 进入work状态\n this._isWorking = true;\n try {\n return this._actuator.workLoop(hasTimeRemaining, initialTime, deadline);\n } finally {\n this._isWorking = false;\n }\n };\n\n private _requestHostTimeout(currentTime: number) {\n // 调用该函数时,一定不在及时调度和异步调度的状态中\n lvAssert(!this._isHostCallbackScheduled);\n lvAssert(!this._isHostTimeoutScheduled);\n const firstTimerTask = this._taskQueue.timerTasks.peek();\n if (firstTimerTask !== null) {\n this._isHostTimeoutScheduled = true;\n this._executor.requestHostTimeout(this._handleHostTimeout, firstTimerTask.getStartTime() - currentTime);\n }\n }\n}\n\n// 考虑到外界复杂的场景,不编译时构造,按需构造\nlet scheduler: Scheduler | undefined;\nexport function getScheduler() {\n if (!scheduler) {\n scheduler = new Scheduler();\n }\n return scheduler;\n}\n","import type { IDisposable } from '../dispose';\nimport { Task } from './core/task';\nimport { getTimeout, makeTask } from './core/utils';\nimport { getScheduler } from './core/scheduler';\nimport type { PriorityLevel } from './type';\n\nexport class CallbackToken implements IDisposable {\n constructor(private _task: Task) {}\n\n dispose() {\n this._task.clearCallback();\n }\n\n updatePriorityLevel(priorityLevel: PriorityLevel) {\n const callback = this._task.getCallback();\n if (!callback) {\n return;\n }\n this._task.clearCallback();\n const newTask = makeTask(callback, {\n priorityLevel,\n });\n const startTime = this._task.getStartTime();\n const timeout = getTimeout(priorityLevel);\n const expirationTime = startTime + timeout;\n newTask.setStartTime(startTime);\n newTask.setExpirationTime(expirationTime);\n getScheduler().addTask(newTask);\n this._task = newTask;\n }\n}\n","import { type IDisposable } from '../dispose';\nimport { getScheduler } from './core/scheduler';\nimport type { IOptions, IScheduledCallback, PriorityLevel } from './type';\nimport { makeTask } from './core/utils';\nimport { CallbackToken } from './callback-token';\n\nexport interface ILvCallbackToken extends IDisposable {\n /**\n * 更新优先级\n */\n updatePriorityLevel: (priorityLevel: PriorityLevel) => void;\n}\n\nexport function lvSchedulerCallback(callback: IScheduledCallback, options: IOptions = {}): ILvCallbackToken {\n const newTask = makeTask(callback, options);\n getScheduler().addTask(newTask);\n\n return new CallbackToken(newTask);\n}\n","import { getScheduler } from './core/scheduler';\nimport type { IConfig } from './type';\n\nexport function lvSchedulerConfig(config: IConfig) {\n if (config.fps !== undefined) {\n getScheduler().executor.setFrameRate(config.fps);\n }\n\n if (config.enableInputPending !== undefined) {\n getScheduler().setEnableInputPending(config.enableInputPending);\n }\n}\n\nexport function lvSchedulerResetConfig() {\n getScheduler().executor.resetFrameRate();\n getScheduler().setEnableInputPending(true);\n}\n"]}