@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.
- package/dist/async/index.cjs.map +1 -1
- package/dist/async/index.d.cts +2 -2
- package/dist/async/index.d.ts +2 -2
- package/dist/async/index.js.map +1 -1
- package/dist/error/index.cjs.map +1 -1
- package/dist/error/index.d.cts +19 -19
- package/dist/error/index.d.ts +19 -19
- package/dist/error/index.js.map +1 -1
- package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
- package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
- package/dist/promise/index.cjs.map +1 -1
- package/dist/promise/index.d.cts +4 -4
- package/dist/promise/index.d.ts +4 -4
- package/dist/promise/index.js.map +1 -1
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +2 -2
- package/dist/worker/index.d.ts +2 -2
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -2
- package/src/_internal/logger.ts +0 -59
- package/src/array/array.test.ts +0 -35
- package/src/array/array.ts +0 -25
- package/src/array/index.ts +0 -1
- package/src/assert/assert.test.ts +0 -86
- package/src/assert/assert.ts +0 -42
- package/src/assert/index.ts +0 -2
- package/src/async/barrier.test.ts +0 -90
- package/src/async/barrier.ts +0 -58
- package/src/async/cancellation.test.ts +0 -85
- package/src/async/cancellation.ts +0 -193
- package/src/async/index.ts +0 -18
- package/src/async/queue/queue.test.ts +0 -70
- package/src/async/queue/queue.ts +0 -56
- package/src/async/queue/task.test.ts +0 -155
- package/src/async/queue/task.ts +0 -67
- package/src/async/utils.test.ts +0 -28
- package/src/async/utils.ts +0 -8
- package/src/async/wait.ts +0 -9
- package/src/byte/format.test.ts +0 -64
- package/src/byte/format.ts +0 -44
- package/src/byte/index.ts +0 -2
- package/src/byte/node_modules/.vitest/results.json +0 -1
- package/src/byte/var.ts +0 -11
- package/src/cache/index.ts +0 -2
- package/src/cache/lru-with-timeout.test.ts +0 -88
- package/src/cache/lru-with-timeout.ts +0 -85
- package/src/cache/lru.test.ts +0 -56
- package/src/cache/lru.ts +0 -59
- package/src/context/context.test.ts +0 -17
- package/src/context/context.ts +0 -60
- package/src/context/index.ts +0 -8
- package/src/di/base.ts +0 -73
- package/src/di/container-service.test.ts +0 -179
- package/src/di/context.web.tsx +0 -41
- package/src/di/descriptor.ts +0 -31
- package/src/di/idle-value.test.ts +0 -73
- package/src/di/idle-value.ts +0 -63
- package/src/di/index.common.ts +0 -32
- package/src/di/index.ts +0 -2
- package/src/di/instantiation-service.interface.ts +0 -46
- package/src/di/instantiation-service.test.ts +0 -337
- package/src/di/instantiation-service.ts +0 -468
- package/src/di/lazy/foo.mock.ts +0 -28
- package/src/di/lazy/idle-load.ts +0 -39
- package/src/di/lazy/index.ts +0 -4
- package/src/di/lazy/lazy-service.test.ts +0 -65
- package/src/di/lazy/lazy-service.ts +0 -71
- package/src/di/lazy/type.ts +0 -5
- package/src/di/node_modules/.vitest/results.json +0 -1
- package/src/di/proxy-builder.test.ts +0 -45
- package/src/di/proxy-builder.ts +0 -38
- package/src/di/service-collection.test.ts +0 -27
- package/src/di/service-collection.ts +0 -46
- package/src/di/service-ownership-collection.test.ts +0 -39
- package/src/di/service-ownership-collection.ts +0 -38
- package/src/di/service-registry.test.ts +0 -66
- package/src/di/service-registry.ts +0 -99
- package/src/di/trace.ts +0 -85
- package/src/dispose/disposable-store.test.ts +0 -57
- package/src/dispose/disposable-store.ts +0 -80
- package/src/dispose/disposable-t.test.ts +0 -123
- package/src/dispose/disposable-t.ts +0 -238
- package/src/dispose/disposable-utils.test.ts +0 -15
- package/src/dispose/disposable-utils.ts +0 -28
- package/src/dispose/dispose-base.ts +0 -9
- package/src/dispose/index.ts +0 -34
- package/src/dispose/logger.test.ts +0 -65
- package/src/dispose/logger.ts +0 -39
- package/src/dispose/timer.test.ts +0 -30
- package/src/dispose/timer.ts +0 -16
- package/src/dispose/tracker.test.ts +0 -51
- package/src/dispose/tracker.ts +0 -105
- package/src/error/error-base.ts +0 -45
- package/src/error/error-code.ts +0 -39
- package/src/error/error-const.test.ts +0 -30
- package/src/error/error-const.ts +0 -16
- package/src/error/error-or.test.ts +0 -44
- package/src/error/error-or.ts +0 -2
- package/src/error/error-t.test.ts +0 -116
- package/src/error/error-t.ts +0 -100
- package/src/error/index.ts +0 -24
- package/src/error/node_modules/.vitest/results.json +0 -1
- package/src/event/disposable-linked-list.ts +0 -29
- package/src/event/emitter.test.ts +0 -191
- package/src/event/emitter.ts +0 -162
- package/src/event/error-handler.ts +0 -22
- package/src/event/index.ts +0 -34
- package/src/event/once.ts +0 -29
- package/src/event/phase-emitter.test.ts +0 -212
- package/src/event/phase-emitter.ts +0 -209
- package/src/event/shortcut-event-utils.ts +0 -33
- package/src/event/utils.ts +0 -6
- package/src/event/when.ts +0 -40
- package/src/function/debounce.test.ts +0 -274
- package/src/function/debounce.ts +0 -168
- package/src/function/index.ts +0 -2
- package/src/function/node_modules/.vitest/results.json +0 -1
- package/src/function/throttle.test.ts +0 -179
- package/src/function/throttle.ts +0 -26
- package/src/hash/hash-t.test.ts +0 -100
- package/src/hash/hash-t.ts +0 -51
- package/src/hash/index.ts +0 -3
- package/src/json/index.ts +0 -1
- package/src/json/node_modules/.vitest/results.json +0 -1
- package/src/json/parse.ts +0 -19
- package/src/launch/abstract-job.ts +0 -45
- package/src/launch/cost-recorder.ts +0 -22
- package/src/launch/index.ts +0 -2
- package/src/launch/job-scheduler.test.ts +0 -122
- package/src/launch/job-scheduler.ts +0 -118
- package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
- package/src/launch/node_modules/.vitest/deps/package.json +0 -3
- package/src/launch/node_modules/.vitest/results.json +0 -1
- package/src/lock/README.md +0 -11
- package/src/lock/capability.test.ts +0 -110
- package/src/lock/capability.ts +0 -89
- package/src/lock/index.ts +0 -15
- package/src/lock/node_modules/.vitest/results.json +0 -1
- package/src/lock/semaphore.ts +0 -21
- package/src/lock/shared-mutex.test.ts +0 -537
- package/src/lock/shared-mutex.ts +0 -242
- package/src/lock/utils.test.ts +0 -165
- package/src/lock/utils.ts +0 -135
- package/src/lodash-es/index.ts +0 -1
- package/src/math/degree.ts +0 -16
- package/src/math/index.ts +0 -7
- package/src/math/math.test.ts +0 -40
- package/src/math/math.ts +0 -64
- package/src/math/node_modules/.vitest/results.json +0 -1
- package/src/math/vector.test.ts +0 -73
- package/src/math/vector.ts +0 -114
- package/src/network/client.interface.ts +0 -104
- package/src/network/client.web.ts +0 -24
- package/src/network/index.common.ts +0 -10
- package/src/network/index.ts +0 -2
- package/src/network/plugins/retry.ts +0 -98
- package/src/objects/deep-clone.test.ts +0 -40
- package/src/objects/deep-clone.ts +0 -13
- package/src/objects/deep-equal.test.ts +0 -86
- package/src/objects/deep-equal.ts +0 -60
- package/src/objects/index.ts +0 -4
- package/src/platform/index.ts +0 -64
- package/src/promise/index.ts +0 -16
- package/src/promise/promise.test.ts +0 -254
- package/src/promise/promise.ts +0 -212
- package/src/scheduler/callback-token.ts +0 -31
- package/src/scheduler/core/actuator-args.test.ts +0 -47
- package/src/scheduler/core/actuator.test.ts +0 -82
- package/src/scheduler/core/actuator.ts +0 -58
- package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
- package/src/scheduler/core/chunk-scheduler.ts +0 -28
- package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
- package/src/scheduler/core/scheduler.test.ts +0 -328
- package/src/scheduler/core/scheduler.ts +0 -172
- package/src/scheduler/core/task-queue.test.ts +0 -78
- package/src/scheduler/core/task-queue.ts +0 -44
- package/src/scheduler/core/task.test.ts +0 -34
- package/src/scheduler/core/task.ts +0 -52
- package/src/scheduler/core/utils.ts +0 -48
- package/src/scheduler/executor/abstract-executor.test.ts +0 -44
- package/src/scheduler/executor/abstract-executor.ts +0 -38
- package/src/scheduler/executor/executor.interface.ts +0 -39
- package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
- package/src/scheduler/executor/idle-callback-executor.ts +0 -98
- package/src/scheduler/executor/make-executor.ts +0 -18
- package/src/scheduler/executor/post-message-executor.test.ts +0 -66
- package/src/scheduler/executor/post-message-executor.ts +0 -52
- package/src/scheduler/index.ts +0 -15
- package/src/scheduler/lv-scheduler-callback.ts +0 -19
- package/src/scheduler/lv-scheduler-config.ts +0 -17
- package/src/scheduler/type.ts +0 -48
- package/src/sprintf/index.ts +0 -2
- package/src/sprintf/sprintf.test.ts +0 -95
- package/src/sprintf/sprintf.ts +0 -97
- package/src/structure/graph.test.ts +0 -181
- package/src/structure/graph.ts +0 -105
- package/src/structure/index.ts +0 -8
- package/src/structure/linked-list.test.ts +0 -74
- package/src/structure/linked-list.ts +0 -145
- package/src/structure/min-heap.test.ts +0 -71
- package/src/structure/min-heap.ts +0 -91
- package/src/type/REAME.md +0 -2
- package/src/type/distributive-omit.interface.ts +0 -4
- package/src/type/index.ts +0 -3
- package/src/type/object-key-paths.interface.ts +0 -40
- package/src/undo-redo-stack/README.md +0 -61
- package/src/undo-redo-stack/action-stack.test.ts +0 -330
- package/src/undo-redo-stack/action-stack.ts +0 -150
- package/src/undo-redo-stack/element.ts +0 -4
- package/src/undo-redo-stack/index.ts +0 -7
- package/src/undo-redo-stack/state-stack.test.ts +0 -118
- package/src/undo-redo-stack/state-stack.ts +0 -133
- package/src/uuid/index.ts +0 -7
- package/src/uuid/uuid.ts +0 -86
- package/src/worker/cors-worker.ts +0 -38
- package/src/worker/index.ts +0 -4
- package/src/worker/node_modules/.vitest/results.json +0 -1
- package/src/worker/promise-worker-main-thread.test.ts +0 -91
- package/src/worker/promise-worker-main-thread.ts +0 -76
- package/src/worker/promise-worker-worker-thread.ts +0 -64
- 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
|
-
}
|