@zk-tech/bedrock 0.0.1 → 0.1.0

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 (221) hide show
  1. package/dist/async/index.cjs.map +1 -1
  2. package/dist/async/index.d.cts +2 -2
  3. package/dist/async/index.d.ts +2 -2
  4. package/dist/async/index.js.map +1 -1
  5. package/dist/error/index.cjs.map +1 -1
  6. package/dist/error/index.d.cts +19 -19
  7. package/dist/error/index.d.ts +19 -19
  8. package/dist/error/index.js.map +1 -1
  9. package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
  10. package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
  11. package/dist/promise/index.cjs.map +1 -1
  12. package/dist/promise/index.d.cts +4 -4
  13. package/dist/promise/index.d.ts +4 -4
  14. package/dist/promise/index.js.map +1 -1
  15. package/dist/worker/index.cjs.map +1 -1
  16. package/dist/worker/index.d.cts +2 -2
  17. package/dist/worker/index.d.ts +2 -2
  18. package/dist/worker/index.js.map +1 -1
  19. package/package.json +1 -2
  20. package/src/_internal/logger.ts +0 -59
  21. package/src/array/array.test.ts +0 -35
  22. package/src/array/array.ts +0 -25
  23. package/src/array/index.ts +0 -1
  24. package/src/assert/assert.test.ts +0 -86
  25. package/src/assert/assert.ts +0 -42
  26. package/src/assert/index.ts +0 -2
  27. package/src/async/barrier.test.ts +0 -90
  28. package/src/async/barrier.ts +0 -58
  29. package/src/async/cancellation.test.ts +0 -85
  30. package/src/async/cancellation.ts +0 -193
  31. package/src/async/index.ts +0 -18
  32. package/src/async/queue/queue.test.ts +0 -70
  33. package/src/async/queue/queue.ts +0 -56
  34. package/src/async/queue/task.test.ts +0 -155
  35. package/src/async/queue/task.ts +0 -67
  36. package/src/async/utils.test.ts +0 -28
  37. package/src/async/utils.ts +0 -8
  38. package/src/async/wait.ts +0 -9
  39. package/src/byte/format.test.ts +0 -64
  40. package/src/byte/format.ts +0 -44
  41. package/src/byte/index.ts +0 -2
  42. package/src/byte/node_modules/.vitest/results.json +0 -1
  43. package/src/byte/var.ts +0 -11
  44. package/src/cache/index.ts +0 -2
  45. package/src/cache/lru-with-timeout.test.ts +0 -88
  46. package/src/cache/lru-with-timeout.ts +0 -85
  47. package/src/cache/lru.test.ts +0 -56
  48. package/src/cache/lru.ts +0 -59
  49. package/src/context/context.test.ts +0 -17
  50. package/src/context/context.ts +0 -60
  51. package/src/context/index.ts +0 -8
  52. package/src/di/base.ts +0 -73
  53. package/src/di/container-service.test.ts +0 -179
  54. package/src/di/context.web.tsx +0 -41
  55. package/src/di/descriptor.ts +0 -31
  56. package/src/di/idle-value.test.ts +0 -73
  57. package/src/di/idle-value.ts +0 -63
  58. package/src/di/index.common.ts +0 -32
  59. package/src/di/index.ts +0 -2
  60. package/src/di/instantiation-service.interface.ts +0 -46
  61. package/src/di/instantiation-service.test.ts +0 -337
  62. package/src/di/instantiation-service.ts +0 -468
  63. package/src/di/lazy/foo.mock.ts +0 -28
  64. package/src/di/lazy/idle-load.ts +0 -39
  65. package/src/di/lazy/index.ts +0 -4
  66. package/src/di/lazy/lazy-service.test.ts +0 -65
  67. package/src/di/lazy/lazy-service.ts +0 -71
  68. package/src/di/lazy/type.ts +0 -5
  69. package/src/di/node_modules/.vitest/results.json +0 -1
  70. package/src/di/proxy-builder.test.ts +0 -45
  71. package/src/di/proxy-builder.ts +0 -38
  72. package/src/di/service-collection.test.ts +0 -27
  73. package/src/di/service-collection.ts +0 -46
  74. package/src/di/service-ownership-collection.test.ts +0 -39
  75. package/src/di/service-ownership-collection.ts +0 -38
  76. package/src/di/service-registry.test.ts +0 -66
  77. package/src/di/service-registry.ts +0 -99
  78. package/src/di/trace.ts +0 -85
  79. package/src/dispose/disposable-store.test.ts +0 -57
  80. package/src/dispose/disposable-store.ts +0 -80
  81. package/src/dispose/disposable-t.test.ts +0 -123
  82. package/src/dispose/disposable-t.ts +0 -238
  83. package/src/dispose/disposable-utils.test.ts +0 -15
  84. package/src/dispose/disposable-utils.ts +0 -28
  85. package/src/dispose/dispose-base.ts +0 -9
  86. package/src/dispose/index.ts +0 -34
  87. package/src/dispose/logger.test.ts +0 -65
  88. package/src/dispose/logger.ts +0 -39
  89. package/src/dispose/timer.test.ts +0 -30
  90. package/src/dispose/timer.ts +0 -16
  91. package/src/dispose/tracker.test.ts +0 -51
  92. package/src/dispose/tracker.ts +0 -105
  93. package/src/error/error-base.ts +0 -45
  94. package/src/error/error-code.ts +0 -39
  95. package/src/error/error-const.test.ts +0 -30
  96. package/src/error/error-const.ts +0 -16
  97. package/src/error/error-or.test.ts +0 -44
  98. package/src/error/error-or.ts +0 -2
  99. package/src/error/error-t.test.ts +0 -116
  100. package/src/error/error-t.ts +0 -100
  101. package/src/error/index.ts +0 -24
  102. package/src/error/node_modules/.vitest/results.json +0 -1
  103. package/src/event/disposable-linked-list.ts +0 -29
  104. package/src/event/emitter.test.ts +0 -191
  105. package/src/event/emitter.ts +0 -162
  106. package/src/event/error-handler.ts +0 -22
  107. package/src/event/index.ts +0 -34
  108. package/src/event/once.ts +0 -29
  109. package/src/event/phase-emitter.test.ts +0 -212
  110. package/src/event/phase-emitter.ts +0 -209
  111. package/src/event/shortcut-event-utils.ts +0 -33
  112. package/src/event/utils.ts +0 -6
  113. package/src/event/when.ts +0 -40
  114. package/src/function/debounce.test.ts +0 -274
  115. package/src/function/debounce.ts +0 -168
  116. package/src/function/index.ts +0 -2
  117. package/src/function/node_modules/.vitest/results.json +0 -1
  118. package/src/function/throttle.test.ts +0 -179
  119. package/src/function/throttle.ts +0 -26
  120. package/src/hash/hash-t.test.ts +0 -100
  121. package/src/hash/hash-t.ts +0 -51
  122. package/src/hash/index.ts +0 -3
  123. package/src/json/index.ts +0 -1
  124. package/src/json/node_modules/.vitest/results.json +0 -1
  125. package/src/json/parse.ts +0 -19
  126. package/src/launch/abstract-job.ts +0 -45
  127. package/src/launch/cost-recorder.ts +0 -22
  128. package/src/launch/index.ts +0 -2
  129. package/src/launch/job-scheduler.test.ts +0 -122
  130. package/src/launch/job-scheduler.ts +0 -118
  131. package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
  132. package/src/launch/node_modules/.vitest/deps/package.json +0 -3
  133. package/src/launch/node_modules/.vitest/results.json +0 -1
  134. package/src/lock/README.md +0 -11
  135. package/src/lock/capability.test.ts +0 -110
  136. package/src/lock/capability.ts +0 -89
  137. package/src/lock/index.ts +0 -15
  138. package/src/lock/node_modules/.vitest/results.json +0 -1
  139. package/src/lock/semaphore.ts +0 -21
  140. package/src/lock/shared-mutex.test.ts +0 -537
  141. package/src/lock/shared-mutex.ts +0 -242
  142. package/src/lock/utils.test.ts +0 -165
  143. package/src/lock/utils.ts +0 -135
  144. package/src/lodash-es/index.ts +0 -1
  145. package/src/math/degree.ts +0 -16
  146. package/src/math/index.ts +0 -7
  147. package/src/math/math.test.ts +0 -40
  148. package/src/math/math.ts +0 -64
  149. package/src/math/node_modules/.vitest/results.json +0 -1
  150. package/src/math/vector.test.ts +0 -73
  151. package/src/math/vector.ts +0 -114
  152. package/src/network/client.interface.ts +0 -104
  153. package/src/network/client.web.ts +0 -24
  154. package/src/network/index.common.ts +0 -10
  155. package/src/network/index.ts +0 -2
  156. package/src/network/plugins/retry.ts +0 -98
  157. package/src/objects/deep-clone.test.ts +0 -40
  158. package/src/objects/deep-clone.ts +0 -13
  159. package/src/objects/deep-equal.test.ts +0 -86
  160. package/src/objects/deep-equal.ts +0 -60
  161. package/src/objects/index.ts +0 -4
  162. package/src/platform/index.ts +0 -64
  163. package/src/promise/index.ts +0 -16
  164. package/src/promise/promise.test.ts +0 -254
  165. package/src/promise/promise.ts +0 -212
  166. package/src/scheduler/callback-token.ts +0 -31
  167. package/src/scheduler/core/actuator-args.test.ts +0 -47
  168. package/src/scheduler/core/actuator.test.ts +0 -82
  169. package/src/scheduler/core/actuator.ts +0 -58
  170. package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
  171. package/src/scheduler/core/chunk-scheduler.ts +0 -28
  172. package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
  173. package/src/scheduler/core/scheduler.test.ts +0 -328
  174. package/src/scheduler/core/scheduler.ts +0 -172
  175. package/src/scheduler/core/task-queue.test.ts +0 -78
  176. package/src/scheduler/core/task-queue.ts +0 -44
  177. package/src/scheduler/core/task.test.ts +0 -34
  178. package/src/scheduler/core/task.ts +0 -52
  179. package/src/scheduler/core/utils.ts +0 -48
  180. package/src/scheduler/executor/abstract-executor.test.ts +0 -44
  181. package/src/scheduler/executor/abstract-executor.ts +0 -38
  182. package/src/scheduler/executor/executor.interface.ts +0 -39
  183. package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
  184. package/src/scheduler/executor/idle-callback-executor.ts +0 -98
  185. package/src/scheduler/executor/make-executor.ts +0 -18
  186. package/src/scheduler/executor/post-message-executor.test.ts +0 -66
  187. package/src/scheduler/executor/post-message-executor.ts +0 -52
  188. package/src/scheduler/index.ts +0 -15
  189. package/src/scheduler/lv-scheduler-callback.ts +0 -19
  190. package/src/scheduler/lv-scheduler-config.ts +0 -17
  191. package/src/scheduler/type.ts +0 -48
  192. package/src/sprintf/index.ts +0 -2
  193. package/src/sprintf/sprintf.test.ts +0 -95
  194. package/src/sprintf/sprintf.ts +0 -97
  195. package/src/structure/graph.test.ts +0 -181
  196. package/src/structure/graph.ts +0 -105
  197. package/src/structure/index.ts +0 -8
  198. package/src/structure/linked-list.test.ts +0 -74
  199. package/src/structure/linked-list.ts +0 -145
  200. package/src/structure/min-heap.test.ts +0 -71
  201. package/src/structure/min-heap.ts +0 -91
  202. package/src/type/REAME.md +0 -2
  203. package/src/type/distributive-omit.interface.ts +0 -4
  204. package/src/type/index.ts +0 -3
  205. package/src/type/object-key-paths.interface.ts +0 -40
  206. package/src/undo-redo-stack/README.md +0 -61
  207. package/src/undo-redo-stack/action-stack.test.ts +0 -330
  208. package/src/undo-redo-stack/action-stack.ts +0 -150
  209. package/src/undo-redo-stack/element.ts +0 -4
  210. package/src/undo-redo-stack/index.ts +0 -7
  211. package/src/undo-redo-stack/state-stack.test.ts +0 -118
  212. package/src/undo-redo-stack/state-stack.ts +0 -133
  213. package/src/uuid/index.ts +0 -7
  214. package/src/uuid/uuid.ts +0 -86
  215. package/src/worker/cors-worker.ts +0 -38
  216. package/src/worker/index.ts +0 -4
  217. package/src/worker/node_modules/.vitest/results.json +0 -1
  218. package/src/worker/promise-worker-main-thread.test.ts +0 -91
  219. package/src/worker/promise-worker-main-thread.ts +0 -76
  220. package/src/worker/promise-worker-worker-thread.ts +0 -64
  221. package/src/worker/promise-worker.interface.ts +0 -15
@@ -1,78 +0,0 @@
1
- import { Task } from './task';
2
- import { TaskQueue } from './task-queue';
3
-
4
- describe('TaskQueue', () => {
5
- // 保留在异步队列中
6
- test('advance1', () => {
7
- const taskQueue = new TaskQueue();
8
- const fn = vi.fn();
9
- const task1 = new Task(fn, 10, 30);
10
- const task2 = new Task(fn, 20, 40);
11
- taskQueue.timerTasks.insert(task1);
12
- taskQueue.timerTasks.insert(task2);
13
- taskQueue.advance(0);
14
-
15
- expect(taskQueue.waitingTasks.size()).toBe(0);
16
- expect(taskQueue.timerTasks.size()).toBe(2);
17
- });
18
-
19
- // 一个延时任务进入到等待任务队列
20
- test('advance2', () => {
21
- const taskQueue = new TaskQueue();
22
- const fn = vi.fn();
23
- const task1 = new Task(fn, 10, 30);
24
- const task2 = new Task(fn, 20, 40);
25
- taskQueue.timerTasks.insert(task1);
26
- taskQueue.timerTasks.insert(task2);
27
- taskQueue.advance(15);
28
-
29
- expect(taskQueue.waitingTasks.size()).toBe(1);
30
- const task = taskQueue.waitingTasks.peek()!;
31
- expect(task).not.toBeUndefined();
32
- expect(task.getCallback()).toBe(fn);
33
- expect(task.getExpirationTime()).toBe(30);
34
- expect(task.getSortIndex()).toBe(30);
35
-
36
- expect(taskQueue.timerTasks.size()).toBe(1);
37
- });
38
-
39
- // 所有延时任务进入到等待任务队列,保持顺序
40
- test('advance3', () => {
41
- const taskQueue = new TaskQueue();
42
- const fn = vi.fn();
43
- const task1 = new Task(fn, 10, 30);
44
- const task2 = new Task(fn, 20, 40);
45
- taskQueue.timerTasks.insert(task1);
46
- taskQueue.timerTasks.insert(task2);
47
- taskQueue.advance(25);
48
-
49
- expect(taskQueue.waitingTasks.size()).toBe(2);
50
- const task = taskQueue.waitingTasks.peek()!;
51
- expect(task).not.toBeUndefined();
52
- expect(task.getCallback()).toBe(fn);
53
- expect(task.getExpirationTime()).toBe(30);
54
- expect(task.getSortIndex()).toBe(30);
55
-
56
- expect(taskQueue.timerTasks.size()).toBe(0);
57
- });
58
-
59
- // 所有延时任务进入到等待任务队列,保持顺序
60
- test('advance4', () => {
61
- const taskQueue = new TaskQueue();
62
- const fn = vi.fn();
63
- const task1 = new Task(fn, 10, 50);
64
- const task2 = new Task(fn, 20, 40);
65
- taskQueue.timerTasks.insert(task1);
66
- taskQueue.timerTasks.insert(task2);
67
- taskQueue.advance(25);
68
-
69
- expect(taskQueue.waitingTasks.size()).toBe(2);
70
- const task = taskQueue.waitingTasks.peek()!;
71
- expect(task).not.toBeUndefined();
72
- expect(task.getCallback()).toBe(fn);
73
- expect(task.getExpirationTime()).toBe(40);
74
- expect(task.getSortIndex()).toBe(40);
75
-
76
- expect(taskQueue.timerTasks.size()).toBe(0);
77
- });
78
- });
@@ -1,44 +0,0 @@
1
- import { MinHeap } from '../../structure/min-heap';
2
- import type { Task } from './task';
3
-
4
- function compare(lhs: Task, rhs: Task) {
5
- return lhs.getSortIndex() - rhs.getSortIndex();
6
- }
7
-
8
- /**
9
- * 任务存储队列
10
- * 本身是两个小根堆
11
- */
12
- export class TaskQueue {
13
- // 延时任务
14
- private readonly _timerTasks = new MinHeap<Task>(compare);
15
- // 等待执行的任务
16
- private readonly _waitingTasks = new MinHeap<Task>(compare);
17
-
18
- get timerTasks() {
19
- return this._timerTasks;
20
- }
21
-
22
- get waitingTasks() {
23
- return this._waitingTasks;
24
- }
25
-
26
- advance(currentTime: number) {
27
- let task = this._timerTasks.peek();
28
- while (task !== null) {
29
- if (task.getCallback() === null) {
30
- // 任务已经取消
31
- this._timerTasks.remove();
32
- } else if (task.getStartTime() <= currentTime) {
33
- // 任务触发,移动到等待队列
34
- this._timerTasks.remove();
35
- task.setSortIndex(task.getExpirationTime());
36
- this._waitingTasks.insert(task);
37
- } else {
38
- // 剩余的异步任务pending即可
39
- return;
40
- }
41
- task = this._timerTasks.peek();
42
- }
43
- }
44
- }
@@ -1,34 +0,0 @@
1
- import { Task } from './task';
2
-
3
- describe('Task', () => {
4
- test('initialize', () => {
5
- const callback = vi.fn();
6
- const task = new Task(callback, 10, 20);
7
- expect(task.getCallback()).toBe(callback);
8
- expect(task.getStartTime()).toBe(10);
9
- expect(task.getExpirationTime()).toBe(20);
10
- expect(task.getSortIndex()).toBe(-1);
11
- });
12
-
13
- test('setCallback1', () => {
14
- const callback = vi.fn();
15
- const task = new Task(callback, 10, 20);
16
- const callback2 = vi.fn();
17
- expect(() => {
18
- task.setCallback(callback2);
19
- }).toThrowError();
20
- });
21
-
22
- test('setCallback2', () => {
23
- const callback = vi.fn();
24
- const task = new Task(callback, 10, 20);
25
- task.clearCallback();
26
- expect(task.getCallback()).toBeUndefined();
27
-
28
- const callback2 = vi.fn();
29
- expect(() => {
30
- task.setCallback(callback2);
31
- }).not.toThrowError();
32
- expect(task.getCallback()).toBe(callback2);
33
- });
34
- });
@@ -1,52 +0,0 @@
1
- import { lvAssert } from '../../assert';
2
- import type { IScheduledCallback } from '../type';
3
-
4
- export class Task {
5
- private _callback?: IScheduledCallback;
6
- private _sortIndex: number = -1;
7
-
8
- constructor(
9
- callback: IScheduledCallback,
10
- private _startTime: number,
11
- private _expirationTime: number,
12
- ) {
13
- this._callback = callback;
14
- }
15
-
16
- getCallback() {
17
- return this._callback;
18
- }
19
-
20
- setCallback(callback: IScheduledCallback) {
21
- lvAssert(this._callback === undefined, 'cant overlay callback.');
22
- this._callback = callback;
23
- }
24
-
25
- clearCallback() {
26
- this._callback = undefined;
27
- }
28
-
29
- getStartTime() {
30
- return this._startTime;
31
- }
32
-
33
- setStartTime(startTime: number) {
34
- this._startTime = startTime;
35
- }
36
-
37
- getExpirationTime() {
38
- return this._expirationTime;
39
- }
40
-
41
- setExpirationTime(expirationTime: number) {
42
- this._expirationTime = expirationTime;
43
- }
44
-
45
- setSortIndex(index: number) {
46
- this._sortIndex = index;
47
- }
48
-
49
- getSortIndex() {
50
- return this._sortIndex;
51
- }
52
- }
@@ -1,48 +0,0 @@
1
- // Max 31 bit integer. The max integer size in V8 for 32-bit systems.
2
- // Math.pow(2, 30) - 1
3
-
4
- import { Task } from './task';
5
- import { PriorityLevel, type IScheduledCallback, type IOptions } from '../type';
6
-
7
- // 0b111111111111111111111111111111
8
- const maxSigned31BitInt = 1073741823;
9
-
10
- // Times out immediately
11
- const IMMEDIATE_PRIORITY_TIMEOUT = -1;
12
- // Eventually times out
13
- const USER_BLOCKING_PRIORITY_TIMEOUT = 250;
14
- const NORMAL_PRIORITY_TIMEOUT = 5000;
15
- const LOW_PRIORITY_TIMEOUT = 10000;
16
- // Never times out
17
- const IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;
18
-
19
- export function getCurrentTime() {
20
- return Date.now();
21
- }
22
-
23
- export function getTimeout(priorityLevel: PriorityLevel = PriorityLevel.NormalPriority) {
24
- switch (priorityLevel) {
25
- case PriorityLevel.ImmediatePriority:
26
- return IMMEDIATE_PRIORITY_TIMEOUT;
27
- case PriorityLevel.UserBlockingPriority:
28
- return USER_BLOCKING_PRIORITY_TIMEOUT;
29
- case PriorityLevel.IdlePriority:
30
- return IDLE_PRIORITY_TIMEOUT;
31
- case PriorityLevel.LowPriority:
32
- return LOW_PRIORITY_TIMEOUT;
33
- case PriorityLevel.NormalPriority:
34
- default:
35
- return NORMAL_PRIORITY_TIMEOUT;
36
- }
37
- }
38
-
39
- export function makeTask(callback: IScheduledCallback, options: IOptions = {}) {
40
- const currentTime = getCurrentTime();
41
- const delay = options.delay ?? 0;
42
- const timeout = getTimeout(options.priorityLevel);
43
- const startTime = delay + currentTime;
44
- const expirationTime = startTime + timeout;
45
-
46
- const newTask = new Task(callback, startTime, expirationTime);
47
- return newTask;
48
- }
@@ -1,44 +0,0 @@
1
- import { AbstractExecutor } from './abstract-executor';
2
- import type { IExecutedCallback } from './executor.interface';
3
-
4
- class TestExecutor extends AbstractExecutor {
5
- // eslint-disable-next-line @typescript-eslint/no-empty-function
6
- public requestHostCallback(fn: IExecutedCallback) {}
7
-
8
- // eslint-disable-next-line @typescript-eslint/no-empty-function
9
- public cancelHostCallback() {}
10
- }
11
-
12
- describe('AbstractExecutor', () => {
13
- beforeEach(() => {
14
- vi.useFakeTimers();
15
- });
16
-
17
- // 延迟任务调度正常执行
18
- test('requestHostTimeout1', () => {
19
- const testExecutor = new TestExecutor();
20
- const fn = vi.fn();
21
- testExecutor.requestHostTimeout(fn, 3);
22
- vi.advanceTimersByTime(10);
23
- expect(fn).toBeCalled();
24
- });
25
-
26
- // 重复进行延迟任务调度,报错
27
- test('requestHostTimeout2', () => {
28
- const testExecutor = new TestExecutor();
29
- const fn = vi.fn();
30
- testExecutor.requestHostTimeout(fn, 3);
31
- expect(() => {
32
- testExecutor.requestHostTimeout(fn, 3);
33
- }).toThrowError();
34
- });
35
-
36
- test('cancelHostTimeout', () => {
37
- const testExecutor = new TestExecutor();
38
- const fn = vi.fn();
39
- testExecutor.requestHostTimeout(fn, 3);
40
- testExecutor.cancelHostTimeout();
41
- vi.advanceTimersByTime(10);
42
- expect(fn).not.toBeCalled();
43
- });
44
- });
@@ -1,38 +0,0 @@
1
- import { lvAssert } from '../../assert';
2
- import type { IExecutedCallback, IExecutor } from './executor.interface';
3
-
4
- export abstract class AbstractExecutor implements IExecutor {
5
- private _timeoutId: number = -1;
6
- protected _deadline: number = 0;
7
- protected _yieldInterval: number = 16;
8
-
9
- get deadline() {
10
- return this._deadline;
11
- }
12
-
13
- setFrameRate(fps: number) {
14
- lvAssert(fps > 0 && fps <= 125);
15
- this._yieldInterval = Math.floor(1000 / fps);
16
- }
17
-
18
- resetFrameRate() {
19
- this._yieldInterval = 16;
20
- }
21
-
22
- public abstract requestHostCallback(fn: IExecutedCallback): void;
23
- public abstract cancelHostCallback(): void;
24
-
25
- public requestHostTimeout(fn: () => void, delayMs: number) {
26
- lvAssert(this._timeoutId === -1, 'has request host timeout.');
27
- clearTimeout(this._timeoutId);
28
- this._timeoutId = setTimeout(() => {
29
- this._timeoutId = -1;
30
- fn();
31
- }, delayMs) as unknown as number;
32
- }
33
-
34
- public cancelHostTimeout() {
35
- clearTimeout(this._timeoutId);
36
- this._timeoutId = -1;
37
- }
38
- }
@@ -1,39 +0,0 @@
1
- export interface IExecutedCallback {
2
- /**
3
- * hasTimeRemaining 该回调执行时还有没有剩余时间片
4
- * currentTime 执行该回调时时间
5
- */
6
- (hasTimeRemaining: boolean, currentTime: number, deadline: number): boolean;
7
- }
8
-
9
- export interface IExecutor {
10
- /**
11
- * 设置帧率,该值会影响每次执行的deadline
12
- */
13
- setFrameRate: (fps: number) => void;
14
-
15
- /**
16
- * 重置帧率
17
- */
18
- resetFrameRate: () => void;
19
-
20
- /**
21
- * 请求及时任务调用
22
- */
23
- requestHostCallback: (fn: IExecutedCallback) => void;
24
-
25
- /**
26
- * 取消及时任务调用
27
- */
28
- cancelHostCallback: () => void;
29
-
30
- /**
31
- * 请求延迟任务调用
32
- */
33
- requestHostTimeout: (fn: () => void, delayMs: number) => void;
34
-
35
- /**
36
- * 取消延迟任务调用
37
- */
38
- cancelHostTimeout: () => void;
39
- }
@@ -1,70 +0,0 @@
1
- import { IdleCallbackExecutor } from './idle-callback-executor';
2
-
3
- describe('IdleCallbackExecutor', () => {
4
- beforeEach(() => {
5
- vi.useFakeTimers();
6
- });
7
-
8
- test('requestHostCallback1', async () => {
9
- const idleCallbackExecutor = new IdleCallbackExecutor();
10
- const fn1 = vi.fn();
11
-
12
- idleCallbackExecutor.requestHostCallback(fn1);
13
-
14
- vi.advanceTimersByTime(50);
15
- expect(fn1).toBeCalled();
16
- });
17
-
18
- // 多次调度及时任务,后者覆盖
19
- test('requestHostCallback2', async () => {
20
- const idleCallbackExecutor = new IdleCallbackExecutor();
21
- const fn1 = vi.fn();
22
- const fn2 = vi.fn();
23
-
24
- idleCallbackExecutor.requestHostCallback(fn1);
25
- idleCallbackExecutor.requestHostCallback(fn2);
26
-
27
- vi.advanceTimersByTime(50);
28
- expect(fn1).not.toBeCalled();
29
- expect(fn2).toBeCalled();
30
- });
31
-
32
- // 成功取消
33
- test('cancelHostCallback1', async () => {
34
- const idleCallbackExecutor = new IdleCallbackExecutor();
35
- const fn1 = vi.fn();
36
-
37
- idleCallbackExecutor.requestHostCallback(fn1);
38
- idleCallbackExecutor.cancelHostCallback();
39
-
40
- vi.advanceTimersByTime(50);
41
- expect(fn1).not.toBeCalled();
42
- });
43
-
44
- // 成功取消,后续添加正常
45
- test('cancelHostCallback2', async () => {
46
- const idleCallbackExecutor = new IdleCallbackExecutor();
47
- const fn1 = vi.fn();
48
-
49
- idleCallbackExecutor.requestHostCallback(fn1);
50
- idleCallbackExecutor.cancelHostCallback();
51
- vi.advanceTimersByTime(50);
52
- expect(fn1).not.toBeCalled();
53
-
54
- idleCallbackExecutor.requestHostCallback(fn1);
55
- vi.advanceTimersByTime(50);
56
- expect(fn1).toBeCalled();
57
- });
58
-
59
- // 针对场景2的同步行为
60
- test('cancelHostCallback3', async () => {
61
- const idleCallbackExecutor = new IdleCallbackExecutor();
62
- const fn1 = vi.fn();
63
-
64
- idleCallbackExecutor.requestHostCallback(fn1);
65
- idleCallbackExecutor.cancelHostCallback();
66
- idleCallbackExecutor.requestHostCallback(fn1);
67
- vi.advanceTimersByTime(50);
68
- expect(fn1).toBeCalledTimes(1);
69
- });
70
- });
@@ -1,98 +0,0 @@
1
- import type { IDisposable } from '../../dispose';
2
- import { getCurrentTime } from '../core/utils';
3
- import { AbstractExecutor } from './abstract-executor';
4
- import type { IExecutedCallback } from './executor.interface';
5
-
6
- declare function requestIdleCallback(
7
- callback: (args: IdleDeadline) => void,
8
- options?: { timeout: number },
9
- ): number;
10
- declare function cancelIdleCallback(handle: number): void;
11
-
12
- export class IdleCallbackExecutor extends AbstractExecutor {
13
- private _scheduledCallback?: IExecutedCallback;
14
- private _disposable?: IDisposable;
15
- private _runWhenIdle: (callback: (idle: IdleDeadline) => void, timeout?: number) => IDisposable;
16
-
17
- constructor() {
18
- super();
19
- if (typeof requestIdleCallback !== 'function' || typeof cancelIdleCallback !== 'function') {
20
- this._runWhenIdle = (runner) => {
21
- let disposed = false;
22
- setTimeout(() => {
23
- if (disposed) {
24
- return;
25
- }
26
- const end = Date.now() + 15; // one frame at 64fps
27
- runner(
28
- Object.freeze({
29
- didTimeout: true,
30
- timeRemaining() {
31
- return Math.max(0, end - Date.now());
32
- },
33
- }),
34
- );
35
- });
36
- return {
37
- dispose() {
38
- if (disposed) {
39
- return;
40
- }
41
- disposed = true;
42
- },
43
- };
44
- };
45
- } else {
46
- this._runWhenIdle = (runner, timeout?) => {
47
- const handle: number = requestIdleCallback(
48
- runner,
49
- typeof timeout === 'number' ? { timeout } : undefined,
50
- );
51
- let disposed = false;
52
- return {
53
- dispose() {
54
- if (disposed) {
55
- return;
56
- }
57
- disposed = true;
58
- cancelIdleCallback(handle);
59
- },
60
- };
61
- };
62
- }
63
- }
64
-
65
- public requestHostCallback(fn: IExecutedCallback) {
66
- this._scheduledCallback = fn;
67
- if (!this._disposable) {
68
- this._disposable = this._runWhenIdle(this._flushCallback);
69
- }
70
- }
71
-
72
- public cancelHostCallback() {
73
- this._disposable?.dispose();
74
- this._scheduledCallback = undefined;
75
- this._disposable = undefined;
76
- }
77
-
78
- private readonly _flushCallback = () => {
79
- if (!this._scheduledCallback) {
80
- return;
81
- }
82
- const currentTime = getCurrentTime();
83
- const deadline = currentTime + this._yieldInterval;
84
-
85
- try {
86
- const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);
87
- if (!hasMoreWork) {
88
- this._scheduledCallback = undefined;
89
- this._disposable = undefined;
90
- } else {
91
- this._disposable = this._runWhenIdle(this._flushCallback);
92
- }
93
- } catch (err) {
94
- this._disposable = this._runWhenIdle(this._flushCallback);
95
- throw err;
96
- }
97
- };
98
- }
@@ -1,18 +0,0 @@
1
- import type { IExecutor } from './executor.interface';
2
- import { IdleCallbackExecutor } from './idle-callback-executor';
3
- import { PostMessageExecutor } from './post-message-executor';
4
-
5
- declare const global: {
6
- window?: any;
7
- };
8
-
9
- export function makeExecutor(): IExecutor {
10
- try {
11
- if (global.window) {
12
- return new PostMessageExecutor();
13
- }
14
- } catch (e) {
15
- // ...
16
- }
17
- return new IdleCallbackExecutor();
18
- }
@@ -1,66 +0,0 @@
1
- import { wait } from '../../async';
2
- import { PostMessageExecutor } from './post-message-executor';
3
-
4
- describe('PostMessageExecutor', () => {
5
- test('requestHostCallback1', async () => {
6
- const postMessageExecutor = new PostMessageExecutor();
7
- const fn1 = vi.fn();
8
-
9
- postMessageExecutor.requestHostCallback(fn1);
10
-
11
- await wait(150);
12
- expect(fn1).toBeCalled();
13
- });
14
-
15
- // 多次调度及时任务,后者覆盖
16
- test('requestHostCallback2', async () => {
17
- const postMessageExecutor = new PostMessageExecutor();
18
- const fn1 = vi.fn();
19
- const fn2 = vi.fn();
20
-
21
- postMessageExecutor.requestHostCallback(fn1);
22
- postMessageExecutor.requestHostCallback(fn2);
23
-
24
- await wait(150);
25
- expect(fn1).not.toBeCalled();
26
- expect(fn2).toBeCalled();
27
- });
28
-
29
- // 成功取消
30
- test('cancelHostCallback1', async () => {
31
- const postMessageExecutor = new PostMessageExecutor();
32
- const fn1 = vi.fn();
33
-
34
- postMessageExecutor.requestHostCallback(fn1);
35
- postMessageExecutor.cancelHostCallback();
36
-
37
- await wait(150);
38
- expect(fn1).not.toBeCalled();
39
- });
40
-
41
- // 成功取消,后续添加正常
42
- test('cancelHostCallback2', async () => {
43
- const postMessageExecutor = new PostMessageExecutor();
44
- const fn1 = vi.fn();
45
-
46
- postMessageExecutor.requestHostCallback(fn1);
47
- postMessageExecutor.cancelHostCallback();
48
- await wait(150);
49
- expect(fn1).not.toBeCalled();
50
-
51
- postMessageExecutor.requestHostCallback(fn1);
52
- await wait(150);
53
- expect(fn1).toBeCalled();
54
- });
55
-
56
- test('cancelHostCallback3', async () => {
57
- const postMessageExecutor = new PostMessageExecutor();
58
- const fn1 = vi.fn();
59
-
60
- postMessageExecutor.requestHostCallback(fn1);
61
- postMessageExecutor.cancelHostCallback();
62
- postMessageExecutor.requestHostCallback(fn1);
63
- await wait(150);
64
- expect(fn1).toBeCalledTimes(1);
65
- });
66
- });
@@ -1,52 +0,0 @@
1
- import { getCurrentTime } from '../core/utils';
2
- import { AbstractExecutor } from './abstract-executor';
3
- import type { IExecutedCallback } from './executor.interface';
4
-
5
- export class PostMessageExecutor extends AbstractExecutor {
6
- private _scheduledCallback?: IExecutedCallback;
7
- private _isMessageLoopRunning: boolean = false;
8
- private readonly _channel = new MessageChannel();
9
-
10
- constructor() {
11
- super();
12
-
13
- this._channel.port1.onmessage = () => {
14
- this._flushCallback();
15
- };
16
- }
17
-
18
- public requestHostCallback(fn: IExecutedCallback) {
19
- this._scheduledCallback = fn;
20
- if (!this._isMessageLoopRunning) {
21
- this._isMessageLoopRunning = true;
22
- this._channel.port2.postMessage(null);
23
- }
24
- }
25
-
26
- public cancelHostCallback() {
27
- this._scheduledCallback = undefined;
28
- }
29
-
30
- private readonly _flushCallback = () => {
31
- if (!this._scheduledCallback) {
32
- this._isMessageLoopRunning = false;
33
- return;
34
- }
35
-
36
- const currentTime = getCurrentTime();
37
- const deadline = currentTime + this._yieldInterval;
38
-
39
- try {
40
- const hasMoreWork = this._scheduledCallback(true, currentTime, deadline);
41
- if (!hasMoreWork) {
42
- this._isMessageLoopRunning = false;
43
- this._scheduledCallback = undefined;
44
- } else {
45
- this._channel.port2.postMessage(null);
46
- }
47
- } catch (err) {
48
- this._channel.port2.postMessage(null);
49
- throw err;
50
- }
51
- };
52
- }