@zk-tech/bedrock 0.0.1 → 0.0.2

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 (203) hide show
  1. package/package.json +1 -2
  2. package/src/_internal/logger.ts +0 -59
  3. package/src/array/array.test.ts +0 -35
  4. package/src/array/array.ts +0 -25
  5. package/src/array/index.ts +0 -1
  6. package/src/assert/assert.test.ts +0 -86
  7. package/src/assert/assert.ts +0 -42
  8. package/src/assert/index.ts +0 -2
  9. package/src/async/barrier.test.ts +0 -90
  10. package/src/async/barrier.ts +0 -58
  11. package/src/async/cancellation.test.ts +0 -85
  12. package/src/async/cancellation.ts +0 -193
  13. package/src/async/index.ts +0 -18
  14. package/src/async/queue/queue.test.ts +0 -70
  15. package/src/async/queue/queue.ts +0 -56
  16. package/src/async/queue/task.test.ts +0 -155
  17. package/src/async/queue/task.ts +0 -67
  18. package/src/async/utils.test.ts +0 -28
  19. package/src/async/utils.ts +0 -8
  20. package/src/async/wait.ts +0 -9
  21. package/src/byte/format.test.ts +0 -64
  22. package/src/byte/format.ts +0 -44
  23. package/src/byte/index.ts +0 -2
  24. package/src/byte/node_modules/.vitest/results.json +0 -1
  25. package/src/byte/var.ts +0 -11
  26. package/src/cache/index.ts +0 -2
  27. package/src/cache/lru-with-timeout.test.ts +0 -88
  28. package/src/cache/lru-with-timeout.ts +0 -85
  29. package/src/cache/lru.test.ts +0 -56
  30. package/src/cache/lru.ts +0 -59
  31. package/src/context/context.test.ts +0 -17
  32. package/src/context/context.ts +0 -60
  33. package/src/context/index.ts +0 -8
  34. package/src/di/base.ts +0 -73
  35. package/src/di/container-service.test.ts +0 -179
  36. package/src/di/context.web.tsx +0 -41
  37. package/src/di/descriptor.ts +0 -31
  38. package/src/di/idle-value.test.ts +0 -73
  39. package/src/di/idle-value.ts +0 -63
  40. package/src/di/index.common.ts +0 -32
  41. package/src/di/index.ts +0 -2
  42. package/src/di/instantiation-service.interface.ts +0 -46
  43. package/src/di/instantiation-service.test.ts +0 -337
  44. package/src/di/instantiation-service.ts +0 -468
  45. package/src/di/lazy/foo.mock.ts +0 -28
  46. package/src/di/lazy/idle-load.ts +0 -39
  47. package/src/di/lazy/index.ts +0 -4
  48. package/src/di/lazy/lazy-service.test.ts +0 -65
  49. package/src/di/lazy/lazy-service.ts +0 -71
  50. package/src/di/lazy/type.ts +0 -5
  51. package/src/di/node_modules/.vitest/results.json +0 -1
  52. package/src/di/proxy-builder.test.ts +0 -45
  53. package/src/di/proxy-builder.ts +0 -38
  54. package/src/di/service-collection.test.ts +0 -27
  55. package/src/di/service-collection.ts +0 -46
  56. package/src/di/service-ownership-collection.test.ts +0 -39
  57. package/src/di/service-ownership-collection.ts +0 -38
  58. package/src/di/service-registry.test.ts +0 -66
  59. package/src/di/service-registry.ts +0 -99
  60. package/src/di/trace.ts +0 -85
  61. package/src/dispose/disposable-store.test.ts +0 -57
  62. package/src/dispose/disposable-store.ts +0 -80
  63. package/src/dispose/disposable-t.test.ts +0 -123
  64. package/src/dispose/disposable-t.ts +0 -238
  65. package/src/dispose/disposable-utils.test.ts +0 -15
  66. package/src/dispose/disposable-utils.ts +0 -28
  67. package/src/dispose/dispose-base.ts +0 -9
  68. package/src/dispose/index.ts +0 -34
  69. package/src/dispose/logger.test.ts +0 -65
  70. package/src/dispose/logger.ts +0 -39
  71. package/src/dispose/timer.test.ts +0 -30
  72. package/src/dispose/timer.ts +0 -16
  73. package/src/dispose/tracker.test.ts +0 -51
  74. package/src/dispose/tracker.ts +0 -105
  75. package/src/error/error-base.ts +0 -45
  76. package/src/error/error-code.ts +0 -39
  77. package/src/error/error-const.test.ts +0 -30
  78. package/src/error/error-const.ts +0 -16
  79. package/src/error/error-or.test.ts +0 -44
  80. package/src/error/error-or.ts +0 -2
  81. package/src/error/error-t.test.ts +0 -116
  82. package/src/error/error-t.ts +0 -100
  83. package/src/error/index.ts +0 -24
  84. package/src/error/node_modules/.vitest/results.json +0 -1
  85. package/src/event/disposable-linked-list.ts +0 -29
  86. package/src/event/emitter.test.ts +0 -191
  87. package/src/event/emitter.ts +0 -162
  88. package/src/event/error-handler.ts +0 -22
  89. package/src/event/index.ts +0 -34
  90. package/src/event/once.ts +0 -29
  91. package/src/event/phase-emitter.test.ts +0 -212
  92. package/src/event/phase-emitter.ts +0 -209
  93. package/src/event/shortcut-event-utils.ts +0 -33
  94. package/src/event/utils.ts +0 -6
  95. package/src/event/when.ts +0 -40
  96. package/src/function/debounce.test.ts +0 -274
  97. package/src/function/debounce.ts +0 -168
  98. package/src/function/index.ts +0 -2
  99. package/src/function/node_modules/.vitest/results.json +0 -1
  100. package/src/function/throttle.test.ts +0 -179
  101. package/src/function/throttle.ts +0 -26
  102. package/src/hash/hash-t.test.ts +0 -100
  103. package/src/hash/hash-t.ts +0 -51
  104. package/src/hash/index.ts +0 -3
  105. package/src/json/index.ts +0 -1
  106. package/src/json/node_modules/.vitest/results.json +0 -1
  107. package/src/json/parse.ts +0 -19
  108. package/src/launch/abstract-job.ts +0 -45
  109. package/src/launch/cost-recorder.ts +0 -22
  110. package/src/launch/index.ts +0 -2
  111. package/src/launch/job-scheduler.test.ts +0 -122
  112. package/src/launch/job-scheduler.ts +0 -118
  113. package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
  114. package/src/launch/node_modules/.vitest/deps/package.json +0 -3
  115. package/src/launch/node_modules/.vitest/results.json +0 -1
  116. package/src/lock/README.md +0 -11
  117. package/src/lock/capability.test.ts +0 -110
  118. package/src/lock/capability.ts +0 -89
  119. package/src/lock/index.ts +0 -15
  120. package/src/lock/node_modules/.vitest/results.json +0 -1
  121. package/src/lock/semaphore.ts +0 -21
  122. package/src/lock/shared-mutex.test.ts +0 -537
  123. package/src/lock/shared-mutex.ts +0 -242
  124. package/src/lock/utils.test.ts +0 -165
  125. package/src/lock/utils.ts +0 -135
  126. package/src/lodash-es/index.ts +0 -1
  127. package/src/math/degree.ts +0 -16
  128. package/src/math/index.ts +0 -7
  129. package/src/math/math.test.ts +0 -40
  130. package/src/math/math.ts +0 -64
  131. package/src/math/node_modules/.vitest/results.json +0 -1
  132. package/src/math/vector.test.ts +0 -73
  133. package/src/math/vector.ts +0 -114
  134. package/src/network/client.interface.ts +0 -104
  135. package/src/network/client.web.ts +0 -24
  136. package/src/network/index.common.ts +0 -10
  137. package/src/network/index.ts +0 -2
  138. package/src/network/plugins/retry.ts +0 -98
  139. package/src/objects/deep-clone.test.ts +0 -40
  140. package/src/objects/deep-clone.ts +0 -13
  141. package/src/objects/deep-equal.test.ts +0 -86
  142. package/src/objects/deep-equal.ts +0 -60
  143. package/src/objects/index.ts +0 -4
  144. package/src/platform/index.ts +0 -64
  145. package/src/promise/index.ts +0 -16
  146. package/src/promise/promise.test.ts +0 -254
  147. package/src/promise/promise.ts +0 -212
  148. package/src/scheduler/callback-token.ts +0 -31
  149. package/src/scheduler/core/actuator-args.test.ts +0 -47
  150. package/src/scheduler/core/actuator.test.ts +0 -82
  151. package/src/scheduler/core/actuator.ts +0 -58
  152. package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
  153. package/src/scheduler/core/chunk-scheduler.ts +0 -28
  154. package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
  155. package/src/scheduler/core/scheduler.test.ts +0 -328
  156. package/src/scheduler/core/scheduler.ts +0 -172
  157. package/src/scheduler/core/task-queue.test.ts +0 -78
  158. package/src/scheduler/core/task-queue.ts +0 -44
  159. package/src/scheduler/core/task.test.ts +0 -34
  160. package/src/scheduler/core/task.ts +0 -52
  161. package/src/scheduler/core/utils.ts +0 -48
  162. package/src/scheduler/executor/abstract-executor.test.ts +0 -44
  163. package/src/scheduler/executor/abstract-executor.ts +0 -38
  164. package/src/scheduler/executor/executor.interface.ts +0 -39
  165. package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
  166. package/src/scheduler/executor/idle-callback-executor.ts +0 -98
  167. package/src/scheduler/executor/make-executor.ts +0 -18
  168. package/src/scheduler/executor/post-message-executor.test.ts +0 -66
  169. package/src/scheduler/executor/post-message-executor.ts +0 -52
  170. package/src/scheduler/index.ts +0 -15
  171. package/src/scheduler/lv-scheduler-callback.ts +0 -19
  172. package/src/scheduler/lv-scheduler-config.ts +0 -17
  173. package/src/scheduler/type.ts +0 -48
  174. package/src/sprintf/index.ts +0 -2
  175. package/src/sprintf/sprintf.test.ts +0 -95
  176. package/src/sprintf/sprintf.ts +0 -97
  177. package/src/structure/graph.test.ts +0 -181
  178. package/src/structure/graph.ts +0 -105
  179. package/src/structure/index.ts +0 -8
  180. package/src/structure/linked-list.test.ts +0 -74
  181. package/src/structure/linked-list.ts +0 -145
  182. package/src/structure/min-heap.test.ts +0 -71
  183. package/src/structure/min-heap.ts +0 -91
  184. package/src/type/REAME.md +0 -2
  185. package/src/type/distributive-omit.interface.ts +0 -4
  186. package/src/type/index.ts +0 -3
  187. package/src/type/object-key-paths.interface.ts +0 -40
  188. package/src/undo-redo-stack/README.md +0 -61
  189. package/src/undo-redo-stack/action-stack.test.ts +0 -330
  190. package/src/undo-redo-stack/action-stack.ts +0 -150
  191. package/src/undo-redo-stack/element.ts +0 -4
  192. package/src/undo-redo-stack/index.ts +0 -7
  193. package/src/undo-redo-stack/state-stack.test.ts +0 -118
  194. package/src/undo-redo-stack/state-stack.ts +0 -133
  195. package/src/uuid/index.ts +0 -7
  196. package/src/uuid/uuid.ts +0 -86
  197. package/src/worker/cors-worker.ts +0 -38
  198. package/src/worker/index.ts +0 -4
  199. package/src/worker/node_modules/.vitest/results.json +0 -1
  200. package/src/worker/promise-worker-main-thread.test.ts +0 -91
  201. package/src/worker/promise-worker-main-thread.ts +0 -76
  202. package/src/worker/promise-worker-worker-thread.ts +0 -64
  203. package/src/worker/promise-worker.interface.ts +0 -15
@@ -1,58 +0,0 @@
1
- import { ChunkScheduler } from './chunk-scheduler';
2
- import type { Scheduler } from './scheduler';
3
- import type { TaskQueue } from './task-queue';
4
- import { getCurrentTime } from './utils';
5
-
6
- export class Actuator {
7
- constructor(
8
- private readonly _taskQueue: TaskQueue,
9
- private readonly _scheduler: Scheduler,
10
- ) {}
11
-
12
- workLoop(hasTimeRemaining: boolean, initialTime: number, deadline: number): boolean {
13
- let currentTime = initialTime;
14
- this._taskQueue.advance(currentTime);
15
- let currentTask = this._taskQueue.waitingTasks.peek();
16
-
17
- while (currentTask !== null) {
18
- // 暂停执行需要满足的条件(1,2同时满足)
19
- // 1. 不能超时了,超时的任务一定会执行
20
- // 2. 没有剩余时间了,或者调度器认为需要释放资源
21
- if (
22
- currentTask.getExpirationTime() > currentTime &&
23
- (!hasTimeRemaining || this._scheduler.shouldYieldToHost(deadline))
24
- ) {
25
- break;
26
- }
27
-
28
- if (currentTask.getCallback() === undefined) {
29
- // 任务取消了
30
- this._taskQueue.waitingTasks.remove();
31
- } else {
32
- const callback = currentTask.getCallback()!;
33
- const didUserCallbackTimeout = currentTask.getExpirationTime() <= currentTime;
34
- const remainingTime = deadline - currentTime;
35
- currentTask.clearCallback();
36
-
37
- const chunkInvoker = new ChunkScheduler(currentTask, this._scheduler);
38
- callback(chunkInvoker, didUserCallbackTimeout, remainingTime);
39
-
40
- if (!chunkInvoker.needContinue) {
41
- this._taskQueue.waitingTasks.remove();
42
- }
43
-
44
- currentTime = getCurrentTime();
45
- this._taskQueue.advance(currentTime);
46
- }
47
-
48
- currentTask = this._taskQueue.waitingTasks.peek();
49
- }
50
-
51
- if (currentTask !== null) {
52
- return true;
53
- }
54
- // 如果等待队列结束了,要启动异步调度了
55
- this._scheduler.requestHostTimeout(currentTime);
56
- return false;
57
- }
58
- }
@@ -1,54 +0,0 @@
1
- import { ChunkScheduler } from './chunk-scheduler';
2
- import { getScheduler } from './scheduler';
3
- import { Task } from './task';
4
-
5
- const scheduler = getScheduler();
6
-
7
- describe('ChunkScheduler', () => {
8
- beforeEach(() => {
9
- scheduler.taskQueue.waitingTasks.clear();
10
- scheduler.taskQueue.timerTasks.clear();
11
- });
12
-
13
- // 续上task执行
14
- test('continueExecute1', () => {
15
- const fn1 = vi.fn();
16
- const fn2 = vi.fn();
17
- const task = new Task(fn1, 10, 30);
18
- scheduler.taskQueue.waitingTasks.insert(task);
19
- task.clearCallback();
20
-
21
- const chunkScheduler = new ChunkScheduler(task, scheduler);
22
- chunkScheduler.continueExecute(fn2);
23
-
24
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(1);
25
- expect(task.getCallback()).toBe(fn2);
26
- });
27
-
28
- // task没有执行完,就进行continue,报错
29
- test('continueExecute2', () => {
30
- const fn1 = vi.fn();
31
- const fn2 = vi.fn();
32
- const task = new Task(fn1, 10, 30);
33
- scheduler.taskQueue.waitingTasks.insert(task);
34
-
35
- const chunkScheduler = new ChunkScheduler(task, scheduler);
36
- expect(() => {
37
- chunkScheduler.continueExecute(fn2);
38
- }).toThrowError();
39
- });
40
-
41
- // task正常执行
42
- test('execute', () => {
43
- const fn1 = vi.fn();
44
- const fn2 = vi.fn();
45
- const task = new Task(fn1, 10, 30);
46
- scheduler.taskQueue.waitingTasks.insert(task);
47
- task.clearCallback();
48
-
49
- const chunkScheduler = new ChunkScheduler(task, scheduler);
50
- chunkScheduler.execute(fn2);
51
-
52
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(2);
53
- });
54
- });
@@ -1,28 +0,0 @@
1
- import type { Scheduler } from './scheduler';
2
- import { Task } from './task';
3
- import { type IChunkScheduler, type IScheduledCallback, type IOptions } from '../type';
4
- import { makeTask } from './utils';
5
-
6
- export class ChunkScheduler implements IChunkScheduler {
7
- private _needContinue: boolean = false;
8
-
9
- constructor(
10
- private readonly _task: Task,
11
- private readonly _scheduler: Scheduler,
12
- ) {}
13
-
14
- get needContinue() {
15
- return this._needContinue;
16
- }
17
-
18
- continueExecute(callback: IScheduledCallback) {
19
- this._needContinue = true;
20
- // 该task还需要延续执行,更新一些信息
21
- this._task.setCallback(callback);
22
- }
23
-
24
- execute(callback: IScheduledCallback, options: IOptions = {}) {
25
- const newTask = makeTask(callback, options);
26
- this._scheduler.addTask(newTask);
27
- }
28
- }
@@ -1 +0,0 @@
1
- {"version":"1.0.1","results":[[":task.test.ts",{"duration":0,"failed":true}],[":task-queue.test.ts",{"duration":0,"failed":true}],[":actuator.test.ts",{"duration":0,"failed":true}],[":actuator-args.test.ts",{"duration":0,"failed":true}],[":scheduler.test.ts",{"duration":0,"failed":true}],[":chunk-scheduler.test.ts",{"duration":0,"failed":true}]]}
@@ -1,328 +0,0 @@
1
- /* eslint-disable max-lines-per-function */
2
- import { Task } from './task';
3
- import { getScheduler } from './scheduler';
4
- import { getCurrentTime } from './utils';
5
-
6
- const scheduler = getScheduler();
7
-
8
- function pending(timeMs: number) {
9
- const now = getCurrentTime();
10
- vi.useRealTimers();
11
- const fakeNow = now + timeMs;
12
- vi.useFakeTimers({ now: fakeNow });
13
- }
14
-
15
- describe('Scheduler', () => {
16
- beforeEach(() => {
17
- vi.useFakeTimers();
18
- scheduler.taskQueue.waitingTasks.clear();
19
- scheduler.taskQueue.timerTasks.clear();
20
- });
21
-
22
- // 添加单个及时任务
23
- it('add callback task1', () => {
24
- const data: number[] = [];
25
- const time = getCurrentTime();
26
- const task = new Task(
27
- vi.fn(() => {
28
- data.push(1);
29
- }),
30
- time,
31
- time + 10,
32
- );
33
- scheduler.addTask(task);
34
-
35
- vi.advanceTimersByTime(10);
36
-
37
- expect(data).toStrictEqual([1]);
38
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
39
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
40
- });
41
-
42
- // 添加多个及时任务,顺序不变
43
- it('add callback task2', () => {
44
- const data: number[] = [];
45
- const time = getCurrentTime();
46
- const task1 = new Task(
47
- vi.fn(() => {
48
- data.push(1);
49
- }),
50
- time,
51
- time + 10,
52
- );
53
- const task2 = new Task(
54
- vi.fn(() => {
55
- data.push(2);
56
- }),
57
- time,
58
- time + 15,
59
- );
60
- scheduler.addTask(task1);
61
- scheduler.addTask(task2);
62
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(2);
63
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
64
-
65
- vi.advanceTimersByTime(10);
66
-
67
- expect(data).toStrictEqual([1, 2]);
68
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
69
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
70
- });
71
-
72
- // 添加多个及时任务,触发插队
73
- it('add callback task3', () => {
74
- const data: number[] = [];
75
- const time = getCurrentTime();
76
- const task1 = new Task(
77
- vi.fn(() => {
78
- data.push(1);
79
- }),
80
- time,
81
- time + 10,
82
- );
83
- scheduler.addTask(task1);
84
-
85
- const task2 = new Task(
86
- vi.fn(() => {
87
- data.push(2);
88
- }),
89
- time,
90
- time + 5,
91
- );
92
- scheduler.addTask(task2);
93
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(2);
94
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
95
-
96
- vi.advanceTimersByTime(10);
97
-
98
- expect(data).toStrictEqual([2, 1]);
99
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
100
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
101
- });
102
-
103
- // 添加多个及时任务,分两次执行
104
- it('add callback task4', () => {
105
- const data: number[] = [];
106
- const time = getCurrentTime();
107
- const task1 = new Task(
108
- vi.fn(() => {
109
- pending(20);
110
- data.push(1);
111
- }),
112
- time,
113
- time + 10,
114
- );
115
- const task2 = new Task(
116
- vi.fn(() => {
117
- data.push(2);
118
- }),
119
- time,
120
- time + 30,
121
- );
122
- scheduler.addTask(task1);
123
- scheduler.addTask(task2);
124
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(2);
125
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
126
-
127
- vi.advanceTimersByTime(5);
128
-
129
- expect(data).toStrictEqual([1]);
130
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(1);
131
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
132
-
133
- vi.advanceTimersByTime(10);
134
-
135
- expect(data).toStrictEqual([1, 2]);
136
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
137
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
138
- });
139
-
140
- // 添加单个延迟任务
141
- it('add timeout task1', () => {
142
- const data: number[] = [];
143
- const time = getCurrentTime();
144
- const task = new Task(
145
- vi.fn(() => {
146
- data.push(1);
147
- }),
148
- time + 100,
149
- time + 20,
150
- );
151
- scheduler.addTask(task);
152
- expect(scheduler.taskQueue.timerTasks.size()).toBe(1);
153
-
154
- vi.advanceTimersByTime(10);
155
- expect(scheduler.taskQueue.timerTasks.size()).toBe(1);
156
- expect(data).toStrictEqual([]);
157
-
158
- vi.advanceTimersByTime(200);
159
- expect(data).toStrictEqual([1]);
160
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
161
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
162
- });
163
-
164
- // 添加多个延迟任务
165
- it('add timeout task2', () => {
166
- const data: number[] = [];
167
- const time = getCurrentTime();
168
- const task1 = new Task(
169
- vi.fn(() => {
170
- data.push(1);
171
- }),
172
- time + 10,
173
- time + 20,
174
- );
175
- const task2 = new Task(
176
- vi.fn(() => {
177
- data.push(2);
178
- }),
179
- time + 10,
180
- time + 20,
181
- );
182
- scheduler.addTask(task1);
183
- scheduler.addTask(task2);
184
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
185
- expect(scheduler.taskQueue.timerTasks.size()).toBe(2);
186
-
187
- vi.advanceTimersByTime(100);
188
-
189
- expect(data).toStrictEqual([1, 2]);
190
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
191
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
192
- });
193
-
194
- // 添加多个延迟任务,顺序变化
195
- it('add timeout task3', () => {
196
- const data: number[] = [];
197
- const time = getCurrentTime();
198
- const task1 = new Task(
199
- vi.fn(() => {
200
- data.push(1);
201
- }),
202
- time + 10,
203
- time + 20,
204
- );
205
- const task2 = new Task(
206
- vi.fn(() => {
207
- data.push(2);
208
- }),
209
- time + 10,
210
- time + 10,
211
- );
212
- scheduler.addTask(task1);
213
- scheduler.addTask(task2);
214
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
215
- expect(scheduler.taskQueue.timerTasks.size()).toBe(2);
216
-
217
- vi.advanceTimersByTime(100);
218
-
219
- expect(data).toStrictEqual([2, 1]);
220
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
221
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
222
- });
223
-
224
- // 添加多个延迟任务,分两次执行
225
- it('add timeout task4', () => {
226
- const data: number[] = [];
227
- const time = getCurrentTime();
228
- const task1 = new Task(
229
- vi.fn(() => {
230
- data.push(1);
231
- }),
232
- time + 10,
233
- time + 20,
234
- );
235
- const task2 = new Task(
236
- vi.fn(() => {
237
- data.push(2);
238
- }),
239
- time + 100,
240
- time + 120,
241
- );
242
- scheduler.addTask(task1);
243
- scheduler.addTask(task2);
244
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
245
- expect(scheduler.taskQueue.timerTasks.size()).toBe(2);
246
-
247
- vi.advanceTimersByTime(30);
248
- expect(data).toStrictEqual([1]);
249
- expect(scheduler.taskQueue.timerTasks.size()).toBe(1);
250
-
251
- vi.advanceTimersByTime(200);
252
-
253
- expect(data).toStrictEqual([1, 2]);
254
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
255
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
256
- });
257
-
258
- // 添加及时任务与延迟任务
259
- it('add mix task1', () => {
260
- const data: number[] = [];
261
- const time = getCurrentTime();
262
- const task1 = new Task(
263
- vi.fn(() => {
264
- data.push(1);
265
- }),
266
- time,
267
- time + 10,
268
- );
269
- const task2 = new Task(
270
- vi.fn(() => {
271
- data.push(2);
272
- }),
273
- time + 10,
274
- time + 20,
275
- );
276
- scheduler.addTask(task1);
277
- scheduler.addTask(task2);
278
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(1);
279
- expect(scheduler.taskQueue.timerTasks.size()).toBe(1);
280
-
281
- vi.advanceTimersByTime(50);
282
-
283
- expect(data).toStrictEqual([1, 2]);
284
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
285
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
286
- });
287
-
288
- // 添加及时任务与延迟任务,延迟任务会插队
289
- it('add mix task2', () => {
290
- const data: number[] = [];
291
- const time = getCurrentTime();
292
- const task1 = new Task(
293
- vi.fn(() => {
294
- pending(20);
295
- data.push(1);
296
- }),
297
- time,
298
- time + 10,
299
- );
300
- const task2 = new Task(
301
- vi.fn(() => {
302
- data.push(2);
303
- }),
304
- time,
305
- time + 30,
306
- );
307
- const task3 = new Task(
308
- vi.fn(() => {
309
- data.push(3);
310
- }),
311
- time + 10,
312
- time + 20,
313
- );
314
- scheduler.addTask(task1);
315
- scheduler.addTask(task2);
316
- scheduler.addTask(task3);
317
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(2);
318
- expect(scheduler.taskQueue.timerTasks.size()).toBe(1);
319
-
320
- // 因为要触发两次scheduler的requestHostCallback,用fakeTime就得这么写
321
- vi.advanceTimersByTime(50);
322
- vi.advanceTimersByTime(0);
323
-
324
- expect(data).toStrictEqual([1, 3, 2]);
325
- expect(scheduler.taskQueue.waitingTasks.size()).toBe(0);
326
- expect(scheduler.taskQueue.timerTasks.size()).toBe(0);
327
- });
328
- });
@@ -1,172 +0,0 @@
1
- import { Actuator } from './actuator';
2
- import { TaskQueue } from './task-queue';
3
- import { Task } from './task';
4
- import { getCurrentTime } from './utils';
5
- import { lvAssert } from '../../assert';
6
- import type { IExecutor } from '../executor/executor.interface';
7
- import { makeExecutor } from '../executor/make-executor';
8
-
9
- declare const global: {
10
- navigator:
11
- | (Navigator & {
12
- scheduling?: {
13
- isInputPending?: () => boolean;
14
- };
15
- })
16
- | undefined;
17
- };
18
-
19
- /**
20
- * 调度器
21
- * 负责推动任务的执行,闲时和非闲时的处理
22
- */
23
- export class Scheduler {
24
- private _isHostTimeoutScheduled: boolean = false;
25
- private _isHostCallbackScheduled: boolean = false;
26
- private _isWorking: boolean = false;
27
- private _enableInputPending: boolean = true;
28
- private readonly _executor: IExecutor = makeExecutor();
29
-
30
- private readonly _taskQueue: TaskQueue = new TaskQueue();
31
- private readonly _actuator: Actuator = new Actuator(this._taskQueue, this);
32
-
33
- public get taskQueue() {
34
- return this._taskQueue;
35
- }
36
-
37
- public get executor() {
38
- return this._executor;
39
- }
40
-
41
- /**
42
- * 是否需要让出事件给宿主
43
- */
44
- public shouldYieldToHost = (() => {
45
- try {
46
- if (global.navigator?.scheduling?.isInputPending !== undefined) {
47
- const { scheduling } = global.navigator;
48
- return (deadline: number) => {
49
- if (this._enableInputPending && scheduling.isInputPending!()) {
50
- // 当遇到inputPending时,认为需要释放时间片
51
- return true;
52
- }
53
- return getCurrentTime() >= deadline;
54
- };
55
- }
56
- } catch (e) {
57
- // ...
58
- }
59
- return (deadline: number) => {
60
- // 如果不考虑isInputPending的情况下
61
- // 当前时间已经超了,认为需要释放时间片,返回true
62
- return getCurrentTime() >= deadline;
63
- };
64
- })();
65
-
66
- /**
67
- * 设置是否开启InputPending
68
- */
69
- public setEnableInputPending(val: boolean) {
70
- this._enableInputPending = val;
71
- }
72
-
73
- /**
74
- * 调度器中添加任务
75
- */
76
- public addTask(task: Task) {
77
- const currentTime = getCurrentTime();
78
- if (task.getStartTime() > currentTime) {
79
- task.setSortIndex(task.getStartTime());
80
- this._taskQueue.timerTasks.insert(task);
81
-
82
- // 如果等待队列为空,延迟队列队首是该任务,进行延迟调度
83
- if (this._taskQueue.waitingTasks.peek() === null && task === this._taskQueue.timerTasks.peek()) {
84
- // 如果之前已经有延迟调度了,取消再重新延迟调度
85
- // 有可能之前延迟10s
86
- // 最新的任务只需要延迟3s
87
- if (this._isHostTimeoutScheduled) {
88
- this._executor.cancelHostTimeout();
89
- } else {
90
- this._isHostTimeoutScheduled = true;
91
- }
92
- this._executor.requestHostTimeout(this._handleHostTimeout, task.getStartTime() - currentTime);
93
- }
94
- } else {
95
- task.setSortIndex(task.getExpirationTime());
96
- this._taskQueue.waitingTasks.insert(task);
97
-
98
- // 如果当前没有在及时调度或者执行中,进行及时调度
99
- if (!this._isHostCallbackScheduled && !this._isWorking) {
100
- this._isHostCallbackScheduled = true;
101
- this._executor.requestHostCallback(this._handleHostCallback);
102
- }
103
- }
104
- }
105
-
106
- /**
107
- * 尝试启动异步任务调度
108
- */
109
- public requestHostTimeout(currentTime: number) {
110
- this._requestHostTimeout(currentTime);
111
- }
112
-
113
- private readonly _handleHostTimeout = () => {
114
- this._isHostTimeoutScheduled = false;
115
- const currentTime = getCurrentTime();
116
- this._taskQueue.advance(currentTime);
117
-
118
- if (this._isHostCallbackScheduled) {
119
- return;
120
- }
121
-
122
- if (this._taskQueue.waitingTasks.peek() !== null) {
123
- this._isHostCallbackScheduled = true;
124
- this._executor.requestHostCallback(this._handleHostCallback);
125
- return;
126
- }
127
-
128
- this._requestHostTimeout(currentTime);
129
- };
130
-
131
- private readonly _handleHostCallback = (
132
- hasTimeRemaining: boolean,
133
- initialTime: number,
134
- deadline: number,
135
- ) => {
136
- this._isHostCallbackScheduled = false;
137
-
138
- if (this._isHostTimeoutScheduled) {
139
- // 如果有异步任务调度中,直接取消,应该没必要了
140
- this._isHostTimeoutScheduled = false;
141
- this._executor.cancelHostTimeout();
142
- }
143
-
144
- // 进入work状态
145
- this._isWorking = true;
146
- try {
147
- return this._actuator.workLoop(hasTimeRemaining, initialTime, deadline);
148
- } finally {
149
- this._isWorking = false;
150
- }
151
- };
152
-
153
- private _requestHostTimeout(currentTime: number) {
154
- // 调用该函数时,一定不在及时调度和异步调度的状态中
155
- lvAssert(!this._isHostCallbackScheduled);
156
- lvAssert(!this._isHostTimeoutScheduled);
157
- const firstTimerTask = this._taskQueue.timerTasks.peek();
158
- if (firstTimerTask !== null) {
159
- this._isHostTimeoutScheduled = true;
160
- this._executor.requestHostTimeout(this._handleHostTimeout, firstTimerTask.getStartTime() - currentTime);
161
- }
162
- }
163
- }
164
-
165
- // 考虑到外界复杂的场景,不编译时构造,按需构造
166
- let scheduler: Scheduler | undefined;
167
- export function getScheduler() {
168
- if (!scheduler) {
169
- scheduler = new Scheduler();
170
- }
171
- return scheduler;
172
- }