front-cpu 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +475 -0
- package/README.zh-CN.md +474 -0
- package/dist/Pipeline.d.ts +119 -0
- package/dist/Pipeline.d.ts.map +1 -0
- package/dist/Pipeline.js +373 -0
- package/dist/Pipeline.js.map +1 -0
- package/dist/debug.d.ts +3 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +12 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +49 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +8 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/isa/index.d.ts +20 -0
- package/dist/isa/index.d.ts.map +1 -0
- package/dist/isa/index.js +26 -0
- package/dist/isa/index.js.map +1 -0
- package/dist/isa/types.d.ts +144 -0
- package/dist/isa/types.d.ts.map +1 -0
- package/dist/isa/types.js +10 -0
- package/dist/isa/types.js.map +1 -0
- package/dist/logging/CPUConsole.d.ts +105 -0
- package/dist/logging/CPUConsole.d.ts.map +1 -0
- package/dist/logging/CPUConsole.js +471 -0
- package/dist/logging/CPUConsole.js.map +1 -0
- package/dist/logging/CPUDebugger.d.ts +91 -0
- package/dist/logging/CPUDebugger.d.ts.map +1 -0
- package/dist/logging/CPUDebugger.js +166 -0
- package/dist/logging/CPUDebugger.js.map +1 -0
- package/dist/logging/CPUEventCollector.d.ts +90 -0
- package/dist/logging/CPUEventCollector.d.ts.map +1 -0
- package/dist/logging/CPUEventCollector.js +353 -0
- package/dist/logging/CPUEventCollector.js.map +1 -0
- package/dist/logging/CPULogger.d.ts +150 -0
- package/dist/logging/CPULogger.d.ts.map +1 -0
- package/dist/logging/CPULogger.js +336 -0
- package/dist/logging/CPULogger.js.map +1 -0
- package/dist/logging/index.d.ts +10 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +16 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/runtime.d.ts +37 -0
- package/dist/logging/runtime.d.ts.map +1 -0
- package/dist/logging/runtime.js +42 -0
- package/dist/logging/runtime.js.map +1 -0
- package/dist/logging/stack-parser.d.ts +22 -0
- package/dist/logging/stack-parser.d.ts.map +1 -0
- package/dist/logging/stack-parser.js +144 -0
- package/dist/logging/stack-parser.js.map +1 -0
- package/dist/logging/types.d.ts +73 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +47 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/scheduling/ResourceStrategyRegistry.d.ts +61 -0
- package/dist/scheduling/ResourceStrategyRegistry.d.ts.map +1 -0
- package/dist/scheduling/ResourceStrategyRegistry.js +109 -0
- package/dist/scheduling/ResourceStrategyRegistry.js.map +1 -0
- package/dist/scheduling/index.d.ts +6 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +5 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/types.d.ts +44 -0
- package/dist/scheduling/types.d.ts.map +1 -0
- package/dist/scheduling/types.js +5 -0
- package/dist/scheduling/types.js.map +1 -0
- package/dist/stages/EX.d.ts +17 -0
- package/dist/stages/EX.d.ts.map +1 -0
- package/dist/stages/EX.js +95 -0
- package/dist/stages/EX.js.map +1 -0
- package/dist/stages/IF.d.ts +41 -0
- package/dist/stages/IF.d.ts.map +1 -0
- package/dist/stages/IF.js +83 -0
- package/dist/stages/IF.js.map +1 -0
- package/dist/stages/RES.d.ts +17 -0
- package/dist/stages/RES.d.ts.map +1 -0
- package/dist/stages/RES.js +37 -0
- package/dist/stages/RES.js.map +1 -0
- package/dist/stages/SCH.d.ts +77 -0
- package/dist/stages/SCH.d.ts.map +1 -0
- package/dist/stages/SCH.js +270 -0
- package/dist/stages/SCH.js.map +1 -0
- package/dist/stages/WB.d.ts +19 -0
- package/dist/stages/WB.d.ts.map +1 -0
- package/dist/stages/WB.js +102 -0
- package/dist/stages/WB.js.map +1 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/InstructionCancellation.d.ts +31 -0
- package/dist/utils/InstructionCancellation.d.ts.map +1 -0
- package/dist/utils/InstructionCancellation.js +53 -0
- package/dist/utils/InstructionCancellation.js.map +1 -0
- package/dist/utils/abortable.d.ts +30 -0
- package/dist/utils/abortable.d.ts.map +1 -0
- package/dist/utils/abortable.js +76 -0
- package/dist/utils/abortable.js.map +1 -0
- package/dist/utils/request.d.ts +27 -0
- package/dist/utils/request.d.ts.map +1 -0
- package/dist/utils/request.js +96 -0
- package/dist/utils/request.js.map +1 -0
- package/package.json +74 -0
- package/src/Pipeline.ts +475 -0
- package/src/debug.ts +15 -0
- package/src/index.ts +67 -0
- package/src/interfaces.ts +53 -0
- package/src/isa/index.ts +34 -0
- package/src/isa/types.ts +178 -0
- package/src/logging/CPUConsole.md +843 -0
- package/src/logging/CPUConsole.ts +631 -0
- package/src/logging/CPUDebugger.ts +235 -0
- package/src/logging/CPUEventCollector.ts +418 -0
- package/src/logging/CPULogger.ts +435 -0
- package/src/logging/CPU_LOGGING_DESIGN.md +1319 -0
- package/src/logging/USAGE_GUIDE.md +505 -0
- package/src/logging/index.ts +21 -0
- package/src/logging/runtime.ts +96 -0
- package/src/logging/stack-parser.ts +168 -0
- package/src/logging/types.ts +101 -0
- package/src/scheduling/ResourceStrategyRegistry.ts +124 -0
- package/src/scheduling/index.ts +13 -0
- package/src/scheduling/types.ts +47 -0
- package/src/stages/EX.ts +121 -0
- package/src/stages/IF.ts +103 -0
- package/src/stages/RES.ts +46 -0
- package/src/stages/SCH.ts +331 -0
- package/src/stages/WB.ts +127 -0
- package/src/types.ts +118 -0
- package/src/utils/InstructionCancellation.ts +73 -0
- package/src/utils/abortable.ts +89 -0
- package/src/utils/request.ts +125 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 调用栈解析工具
|
|
3
|
+
*
|
|
4
|
+
* 用于从 Error.stack 中提取调用源信息(文件路径、行号、列号)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 捕获并解析调用栈,获取调用源信息
|
|
8
|
+
*
|
|
9
|
+
* @param skipFrames 跳过的栈帧数(用于跳过内部函数)
|
|
10
|
+
* @returns 调用源信息,解析失败返回 undefined
|
|
11
|
+
*/
|
|
12
|
+
export function captureCallSource(skipFrames = 0) {
|
|
13
|
+
try {
|
|
14
|
+
const error = new Error();
|
|
15
|
+
const stack = error.stack;
|
|
16
|
+
if (!stack) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
// 解析调用栈
|
|
20
|
+
// 典型格式:
|
|
21
|
+
// Chrome: " at functionName (file:///path/to/file.ts:123:45)"
|
|
22
|
+
// Firefox: "functionName@file:///path/to/file.ts:123:45"
|
|
23
|
+
const lines = stack.split('\n');
|
|
24
|
+
// 跳过第一行(Error message)和 captureCallSource 本身
|
|
25
|
+
// 从第 2 行开始(索引 2),再加上额外跳过的帧数
|
|
26
|
+
const startIndex = 2 + skipFrames;
|
|
27
|
+
// 🔥 改进:查找第一个可以成功解析的行
|
|
28
|
+
// 这样可以跳过 Promise constructor、async wrapper 等无法解析的行
|
|
29
|
+
for (let i = startIndex; i < lines.length; i++) {
|
|
30
|
+
const line = lines[i];
|
|
31
|
+
if (!line)
|
|
32
|
+
continue;
|
|
33
|
+
// 跳过不包含有用信息的行
|
|
34
|
+
if (line.includes('<anonymous>') || line.includes('new Promise')) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// 跳过 CPU 内部文件(Pipeline.ts, IF.ts 等)
|
|
38
|
+
if (line.includes('/cpu/Pipeline.ts') ||
|
|
39
|
+
line.includes('/cpu/stages/') ||
|
|
40
|
+
line.includes('/cpu/logging/')) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const result = parseStackLine(line);
|
|
44
|
+
if (result) {
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.warn('Failed to capture call source:', error);
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 解析单行调用栈
|
|
57
|
+
*/
|
|
58
|
+
function parseStackLine(line) {
|
|
59
|
+
try {
|
|
60
|
+
// Chrome/V8 格式: " at functionName (file:///path/to/file.ts:123:45)"
|
|
61
|
+
// 或: " at file:///path/to/file.ts:123:45"
|
|
62
|
+
const chromeMatch = line.match(/at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/);
|
|
63
|
+
if (chromeMatch) {
|
|
64
|
+
const [, functionName, filePath, lineStr, columnStr] = chromeMatch;
|
|
65
|
+
if (!filePath || !lineStr || !columnStr) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
file: cleanFilePath(filePath),
|
|
70
|
+
line: parseInt(lineStr, 10),
|
|
71
|
+
column: parseInt(columnStr, 10),
|
|
72
|
+
function: functionName?.trim() || undefined,
|
|
73
|
+
raw: line.trim(),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Firefox 格式: "functionName@file:///path/to/file.ts:123:45"
|
|
77
|
+
const firefoxMatch = line.match(/(.+?)@(.+?):(\d+):(\d+)/);
|
|
78
|
+
if (firefoxMatch) {
|
|
79
|
+
const [, functionName, filePath, lineStr, columnStr] = firefoxMatch;
|
|
80
|
+
if (!filePath || !lineStr || !columnStr) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
file: cleanFilePath(filePath),
|
|
85
|
+
line: parseInt(lineStr, 10),
|
|
86
|
+
column: parseInt(columnStr, 10),
|
|
87
|
+
function: functionName?.trim() || undefined,
|
|
88
|
+
raw: line.trim(),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.warn('Failed to parse stack line:', line, error);
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 清理文件路径
|
|
100
|
+
* - 移除 file:// 协议
|
|
101
|
+
* - 移除 webpack:// 前缀
|
|
102
|
+
* - 移除 Vite 时间戳参数 (?t=...)
|
|
103
|
+
* - 转换为相对于项目根目录的路径
|
|
104
|
+
*/
|
|
105
|
+
function cleanFilePath(filePath) {
|
|
106
|
+
let cleaned = filePath;
|
|
107
|
+
// 移除 file:// 协议
|
|
108
|
+
cleaned = cleaned.replace(/^file:\/\/\//, '');
|
|
109
|
+
// 移除 webpack:// 前缀
|
|
110
|
+
cleaned = cleaned.replace(/^webpack:\/\/\//, '');
|
|
111
|
+
// 移除 http:// 或 https://(开发服务器)
|
|
112
|
+
cleaned = cleaned.replace(/^https?:\/\/[^/]+\//, '');
|
|
113
|
+
// 🔥 移除 Vite 时间戳参数 (?t=1760628451326)
|
|
114
|
+
cleaned = cleaned.replace(/\?t=\d+/, '');
|
|
115
|
+
// 移除其他查询参数
|
|
116
|
+
const withoutQuery = cleaned.split('?')[0];
|
|
117
|
+
cleaned = withoutQuery || cleaned;
|
|
118
|
+
// 尝试提取相对路径(从 src/ 或 @/ 开始)
|
|
119
|
+
const srcMatch = cleaned.match(/(src\/.+)/);
|
|
120
|
+
if (srcMatch && srcMatch[1]) {
|
|
121
|
+
return srcMatch[1];
|
|
122
|
+
}
|
|
123
|
+
// 如果包含完整路径,尝试提取文件名和上层目录
|
|
124
|
+
const segments = cleaned.split('/');
|
|
125
|
+
if (segments.length >= 3) {
|
|
126
|
+
// 返回最后3个段(例如:components/parts/TaskCard.vue)
|
|
127
|
+
return segments.slice(-3).join('/');
|
|
128
|
+
}
|
|
129
|
+
return cleaned;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 格式化调用源为可读字符串
|
|
133
|
+
*/
|
|
134
|
+
export function formatCallSource(callSource) {
|
|
135
|
+
const funcPrefix = callSource.function ? `${callSource.function} @ ` : '';
|
|
136
|
+
return `${funcPrefix}${callSource.file}:${callSource.line}:${callSource.column}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 格式化调用源为简短字符串(仅文件和行号)
|
|
140
|
+
*/
|
|
141
|
+
export function formatCallSourceShort(callSource) {
|
|
142
|
+
return `${callSource.file}:${callSource.line}`;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=stack-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-parser.js","sourceRoot":"","sources":["../../src/logging/stack-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CPU 日志系统类型定义
|
|
3
|
+
*/
|
|
4
|
+
import type { PipelineStage, InstructionStatus } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* 调用源信息(从 Error.stack 解析)
|
|
7
|
+
*/
|
|
8
|
+
export interface CallSource {
|
|
9
|
+
file: string;
|
|
10
|
+
line: number;
|
|
11
|
+
column: number;
|
|
12
|
+
function?: string;
|
|
13
|
+
raw: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* CPU 指令事件类型
|
|
17
|
+
*/
|
|
18
|
+
export declare enum CPUEventType {
|
|
19
|
+
INSTRUCTION_CREATED = "instruction.created",
|
|
20
|
+
INSTRUCTION_ISSUED = "instruction.issued",
|
|
21
|
+
INSTRUCTION_EXECUTING = "instruction.executing",
|
|
22
|
+
INSTRUCTION_RESPONDED = "instruction.responded",
|
|
23
|
+
INSTRUCTION_COMMITTED = "instruction.committed",
|
|
24
|
+
INSTRUCTION_FAILED = "instruction.failed",
|
|
25
|
+
INSTRUCTION_CANCELLED = "instruction.cancelled",
|
|
26
|
+
OPTIMISTIC_APPLIED = "optimistic.applied",
|
|
27
|
+
OPTIMISTIC_ROLLED_BACK = "optimistic.rolled_back",
|
|
28
|
+
SCHEDULER_CONFLICT_DETECTED = "scheduler.conflict_detected",
|
|
29
|
+
SCHEDULER_INSTRUCTION_QUEUED = "scheduler.instruction_queued",
|
|
30
|
+
SCHEDULER_INSTRUCTION_DEQUEUED = "scheduler.instruction_dequeued",
|
|
31
|
+
NETWORK_REQUEST_SENT = "network.request_sent",
|
|
32
|
+
NETWORK_RESPONSE_RECEIVED = "network.response_received",
|
|
33
|
+
NETWORK_ERROR = "network.error",
|
|
34
|
+
INTERRUPT_REGISTERED = "interrupt.registered",
|
|
35
|
+
INTERRUPT_DISPATCHED = "interrupt.dispatched",
|
|
36
|
+
INTERRUPT_DEDUPLICATED = "interrupt.deduplicated",
|
|
37
|
+
PERFORMANCE_WARNING = "performance.warning",
|
|
38
|
+
PERFORMANCE_BOTTLENECK = "performance.bottleneck"
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* CPU 事件基础接口
|
|
42
|
+
*/
|
|
43
|
+
export interface CPUEvent {
|
|
44
|
+
eventId: string;
|
|
45
|
+
eventType: CPUEventType;
|
|
46
|
+
timestamp: number;
|
|
47
|
+
instructionId: string;
|
|
48
|
+
instructionType: string;
|
|
49
|
+
correlationId: string;
|
|
50
|
+
pipelineStage: PipelineStage;
|
|
51
|
+
instructionStatus: InstructionStatus;
|
|
52
|
+
callSource?: CallSource;
|
|
53
|
+
latency?: number;
|
|
54
|
+
duration?: number;
|
|
55
|
+
payload: any;
|
|
56
|
+
metadata?: {
|
|
57
|
+
resourceIds?: string[];
|
|
58
|
+
priority?: number;
|
|
59
|
+
retryCount?: number;
|
|
60
|
+
tags?: string[];
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 控制台级别
|
|
65
|
+
*/
|
|
66
|
+
export declare enum ConsoleLevel {
|
|
67
|
+
SILENT = 0,// 不输出任何内容
|
|
68
|
+
MINIMAL = 1,// 只输出成功/失败
|
|
69
|
+
NORMAL = 2,// 输出关键阶段
|
|
70
|
+
VERBOSE = 3,// 输出所有细节
|
|
71
|
+
DEBUG = 4
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/logging/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,oBAAY,YAAY;IAEtB,mBAAmB,wBAAwB;IAC3C,kBAAkB,uBAAuB;IACzC,qBAAqB,0BAA0B;IAC/C,qBAAqB,0BAA0B;IAC/C,qBAAqB,0BAA0B;IAC/C,kBAAkB,uBAAuB;IACzC,qBAAqB,0BAA0B;IAG/C,kBAAkB,uBAAuB;IACzC,sBAAsB,2BAA2B;IAGjD,2BAA2B,gCAAgC;IAC3D,4BAA4B,iCAAiC;IAC7D,8BAA8B,mCAAmC;IAGjE,oBAAoB,yBAAyB;IAC7C,yBAAyB,8BAA8B;IACvD,aAAa,kBAAkB;IAG/B,oBAAoB,yBAAyB;IAC7C,oBAAoB,yBAAyB;IAC7C,sBAAsB,2BAA2B;IAGjD,mBAAmB,wBAAwB;IAC3C,sBAAsB,2BAA2B;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,YAAY,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IAGjB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IAGrB,aAAa,EAAE,aAAa,CAAA;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IAGpC,UAAU,CAAC,EAAE,UAAU,CAAA;IAGvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,GAAG,CAAA;IAGZ,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,oBAAY,YAAY;IACtB,MAAM,IAAI,CAAE,UAAU;IACtB,OAAO,IAAI,CAAE,WAAW;IACxB,MAAM,IAAI,CAAE,SAAS;IACrB,OAAO,IAAI,CAAE,SAAS;IACtB,KAAK,IAAI;CACV"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CPU 日志系统类型定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* CPU 指令事件类型
|
|
6
|
+
*/
|
|
7
|
+
export var CPUEventType;
|
|
8
|
+
(function (CPUEventType) {
|
|
9
|
+
// 指令生命周期
|
|
10
|
+
CPUEventType["INSTRUCTION_CREATED"] = "instruction.created";
|
|
11
|
+
CPUEventType["INSTRUCTION_ISSUED"] = "instruction.issued";
|
|
12
|
+
CPUEventType["INSTRUCTION_EXECUTING"] = "instruction.executing";
|
|
13
|
+
CPUEventType["INSTRUCTION_RESPONDED"] = "instruction.responded";
|
|
14
|
+
CPUEventType["INSTRUCTION_COMMITTED"] = "instruction.committed";
|
|
15
|
+
CPUEventType["INSTRUCTION_FAILED"] = "instruction.failed";
|
|
16
|
+
CPUEventType["INSTRUCTION_CANCELLED"] = "instruction.cancelled";
|
|
17
|
+
// 乐观更新
|
|
18
|
+
CPUEventType["OPTIMISTIC_APPLIED"] = "optimistic.applied";
|
|
19
|
+
CPUEventType["OPTIMISTIC_ROLLED_BACK"] = "optimistic.rolled_back";
|
|
20
|
+
// 调度器
|
|
21
|
+
CPUEventType["SCHEDULER_CONFLICT_DETECTED"] = "scheduler.conflict_detected";
|
|
22
|
+
CPUEventType["SCHEDULER_INSTRUCTION_QUEUED"] = "scheduler.instruction_queued";
|
|
23
|
+
CPUEventType["SCHEDULER_INSTRUCTION_DEQUEUED"] = "scheduler.instruction_dequeued";
|
|
24
|
+
// 网络
|
|
25
|
+
CPUEventType["NETWORK_REQUEST_SENT"] = "network.request_sent";
|
|
26
|
+
CPUEventType["NETWORK_RESPONSE_RECEIVED"] = "network.response_received";
|
|
27
|
+
CPUEventType["NETWORK_ERROR"] = "network.error";
|
|
28
|
+
// 中断
|
|
29
|
+
CPUEventType["INTERRUPT_REGISTERED"] = "interrupt.registered";
|
|
30
|
+
CPUEventType["INTERRUPT_DISPATCHED"] = "interrupt.dispatched";
|
|
31
|
+
CPUEventType["INTERRUPT_DEDUPLICATED"] = "interrupt.deduplicated";
|
|
32
|
+
// 性能
|
|
33
|
+
CPUEventType["PERFORMANCE_WARNING"] = "performance.warning";
|
|
34
|
+
CPUEventType["PERFORMANCE_BOTTLENECK"] = "performance.bottleneck";
|
|
35
|
+
})(CPUEventType || (CPUEventType = {}));
|
|
36
|
+
/**
|
|
37
|
+
* 控制台级别
|
|
38
|
+
*/
|
|
39
|
+
export var ConsoleLevel;
|
|
40
|
+
(function (ConsoleLevel) {
|
|
41
|
+
ConsoleLevel[ConsoleLevel["SILENT"] = 0] = "SILENT";
|
|
42
|
+
ConsoleLevel[ConsoleLevel["MINIMAL"] = 1] = "MINIMAL";
|
|
43
|
+
ConsoleLevel[ConsoleLevel["NORMAL"] = 2] = "NORMAL";
|
|
44
|
+
ConsoleLevel[ConsoleLevel["VERBOSE"] = 3] = "VERBOSE";
|
|
45
|
+
ConsoleLevel[ConsoleLevel["DEBUG"] = 4] = "DEBUG";
|
|
46
|
+
})(ConsoleLevel || (ConsoleLevel = {}));
|
|
47
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/logging/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH;;GAEG;AACH,MAAM,CAAN,IAAY,YAgCX;AAhCD,WAAY,YAAY;IACtB,SAAS;IACT,2DAA2C,CAAA;IAC3C,yDAAyC,CAAA;IACzC,+DAA+C,CAAA;IAC/C,+DAA+C,CAAA;IAC/C,+DAA+C,CAAA;IAC/C,yDAAyC,CAAA;IACzC,+DAA+C,CAAA;IAE/C,OAAO;IACP,yDAAyC,CAAA;IACzC,iEAAiD,CAAA;IAEjD,MAAM;IACN,2EAA2D,CAAA;IAC3D,6EAA6D,CAAA;IAC7D,iFAAiE,CAAA;IAEjE,KAAK;IACL,6DAA6C,CAAA;IAC7C,uEAAuD,CAAA;IACvD,+CAA+B,CAAA;IAE/B,KAAK;IACL,6DAA6C,CAAA;IAC7C,6DAA6C,CAAA;IAC7C,iEAAiD,CAAA;IAEjD,KAAK;IACL,2DAA2C,CAAA;IAC3C,iEAAiD,CAAA;AACnD,CAAC,EAhCW,YAAY,KAAZ,YAAY,QAgCvB;AAuCD;;GAEG;AACH,MAAM,CAAN,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,mDAAU,CAAA;IACV,qDAAW,CAAA;IACX,mDAAU,CAAA;IACV,qDAAW,CAAA;IACX,iDAAS,CAAA;AACX,CAAC,EANW,YAAY,KAAZ,YAAY,QAMvB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 资源调度策略注册表
|
|
3
|
+
*
|
|
4
|
+
* 用于配置不同资源的调度策略
|
|
5
|
+
*/
|
|
6
|
+
import type { SchedulingStrategy, ResourceStrategyConfig } from './types';
|
|
7
|
+
declare class ResourceStrategyRegistry {
|
|
8
|
+
private strategies;
|
|
9
|
+
private defaultStrategy;
|
|
10
|
+
/**
|
|
11
|
+
* 注册资源策略
|
|
12
|
+
*/
|
|
13
|
+
register(config: ResourceStrategyConfig): void;
|
|
14
|
+
/**
|
|
15
|
+
* 批量注册策略
|
|
16
|
+
*/
|
|
17
|
+
registerBatch(configs: ResourceStrategyConfig[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* 设置默认策略
|
|
20
|
+
*/
|
|
21
|
+
setDefaultStrategy(strategy: SchedulingStrategy): void;
|
|
22
|
+
/**
|
|
23
|
+
* 获取资源的调度策略
|
|
24
|
+
*
|
|
25
|
+
* 优先级:
|
|
26
|
+
* 1. 指令级别配置(来自 InstructionMeta)
|
|
27
|
+
* 2. 资源级别配置(来自 ResourceStrategyRegistry)
|
|
28
|
+
* 3. 全局默认策略
|
|
29
|
+
*/
|
|
30
|
+
getStrategy(resourceId: string, instructionStrategy?: SchedulingStrategy): SchedulingStrategy;
|
|
31
|
+
/**
|
|
32
|
+
* 匹配资源 ID 是否符合模式
|
|
33
|
+
* 支持简单的通配符:
|
|
34
|
+
* - "task:*" 匹配所有以 "task:" 开头的资源
|
|
35
|
+
* - "task:123" 精确匹配
|
|
36
|
+
*/
|
|
37
|
+
private matchPattern;
|
|
38
|
+
/**
|
|
39
|
+
* 获取所有已注册的策略(用于调试)
|
|
40
|
+
*/
|
|
41
|
+
getAllStrategies(): ResourceStrategyConfig[];
|
|
42
|
+
/**
|
|
43
|
+
* 清空所有策略
|
|
44
|
+
*/
|
|
45
|
+
clear(): void;
|
|
46
|
+
}
|
|
47
|
+
export declare const resourceStrategyRegistry: ResourceStrategyRegistry;
|
|
48
|
+
/**
|
|
49
|
+
* 便捷函数:注册资源策略
|
|
50
|
+
*/
|
|
51
|
+
export declare function registerResourceStrategy(config: ResourceStrategyConfig): void;
|
|
52
|
+
/**
|
|
53
|
+
* 便捷函数:批量注册资源策略
|
|
54
|
+
*/
|
|
55
|
+
export declare function registerResourceStrategies(configs: ResourceStrategyConfig[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* 便捷函数:设置默认策略
|
|
58
|
+
*/
|
|
59
|
+
export declare function setDefaultSchedulingStrategy(strategy: SchedulingStrategy): void;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=ResourceStrategyRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceStrategyRegistry.d.ts","sourceRoot":"","sources":["../../src/scheduling/ResourceStrategyRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAEzE,cAAM,wBAAwB;IAC5B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAA+B;IAEtD;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAY9C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,IAAI;IAItD;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAItD;;;;;;;OAOG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,kBAAkB;IAiB7F;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,gBAAgB,IAAI,sBAAsB,EAAE;IAI5C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,wBAAwB,0BAAiC,CAAA;AAEtE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAElF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 资源调度策略注册表
|
|
3
|
+
*
|
|
4
|
+
* 用于配置不同资源的调度策略
|
|
5
|
+
*/
|
|
6
|
+
class ResourceStrategyRegistry {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.strategies = [];
|
|
9
|
+
this.defaultStrategy = 'serial';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 注册资源策略
|
|
13
|
+
*/
|
|
14
|
+
register(config) {
|
|
15
|
+
// 检查是否已存在相同的 pattern
|
|
16
|
+
const existingIndex = this.strategies.findIndex(s => s.pattern === config.pattern);
|
|
17
|
+
if (existingIndex !== -1) {
|
|
18
|
+
// 替换已存在的配置
|
|
19
|
+
this.strategies[existingIndex] = config;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// 添加新配置
|
|
23
|
+
this.strategies.push(config);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 批量注册策略
|
|
28
|
+
*/
|
|
29
|
+
registerBatch(configs) {
|
|
30
|
+
configs.forEach(config => this.register(config));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 设置默认策略
|
|
34
|
+
*/
|
|
35
|
+
setDefaultStrategy(strategy) {
|
|
36
|
+
this.defaultStrategy = strategy;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 获取资源的调度策略
|
|
40
|
+
*
|
|
41
|
+
* 优先级:
|
|
42
|
+
* 1. 指令级别配置(来自 InstructionMeta)
|
|
43
|
+
* 2. 资源级别配置(来自 ResourceStrategyRegistry)
|
|
44
|
+
* 3. 全局默认策略
|
|
45
|
+
*/
|
|
46
|
+
getStrategy(resourceId, instructionStrategy) {
|
|
47
|
+
// 1. 如果指令明确指定了策略,优先使用
|
|
48
|
+
if (instructionStrategy) {
|
|
49
|
+
return instructionStrategy;
|
|
50
|
+
}
|
|
51
|
+
// 2. 查找匹配的资源策略
|
|
52
|
+
for (const config of this.strategies) {
|
|
53
|
+
if (this.matchPattern(resourceId, config.pattern)) {
|
|
54
|
+
return config.strategy;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// 3. 使用默认策略
|
|
58
|
+
return this.defaultStrategy;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 匹配资源 ID 是否符合模式
|
|
62
|
+
* 支持简单的通配符:
|
|
63
|
+
* - "task:*" 匹配所有以 "task:" 开头的资源
|
|
64
|
+
* - "task:123" 精确匹配
|
|
65
|
+
*/
|
|
66
|
+
matchPattern(resourceId, pattern) {
|
|
67
|
+
if (pattern === '*') {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (pattern.endsWith('*')) {
|
|
71
|
+
const prefix = pattern.slice(0, -1);
|
|
72
|
+
return resourceId.startsWith(prefix);
|
|
73
|
+
}
|
|
74
|
+
return resourceId === pattern;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 获取所有已注册的策略(用于调试)
|
|
78
|
+
*/
|
|
79
|
+
getAllStrategies() {
|
|
80
|
+
return [...this.strategies];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 清空所有策略
|
|
84
|
+
*/
|
|
85
|
+
clear() {
|
|
86
|
+
this.strategies = [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 导出单例
|
|
90
|
+
export const resourceStrategyRegistry = new ResourceStrategyRegistry();
|
|
91
|
+
/**
|
|
92
|
+
* 便捷函数:注册资源策略
|
|
93
|
+
*/
|
|
94
|
+
export function registerResourceStrategy(config) {
|
|
95
|
+
resourceStrategyRegistry.register(config);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 便捷函数:批量注册资源策略
|
|
99
|
+
*/
|
|
100
|
+
export function registerResourceStrategies(configs) {
|
|
101
|
+
resourceStrategyRegistry.registerBatch(configs);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 便捷函数:设置默认策略
|
|
105
|
+
*/
|
|
106
|
+
export function setDefaultSchedulingStrategy(strategy) {
|
|
107
|
+
resourceStrategyRegistry.setDefaultStrategy(strategy);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ResourceStrategyRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceStrategyRegistry.js","sourceRoot":"","sources":["../../src/scheduling/ResourceStrategyRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,wBAAwB;IAA9B;QACU,eAAU,GAA6B,EAAE,CAAA;QACzC,oBAAe,GAAuB,QAAQ,CAAA;IAwFxD,CAAC;IAtFC;;OAEG;IACH,QAAQ,CAAC,MAA8B;QACrC,qBAAqB;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CAAA;QAClF,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,WAAW;YACX,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,MAAM,CAAA;QACzC,CAAC;aAAM,CAAC;YACN,QAAQ;YACR,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAiC;QAC7C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAClD,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAA4B;QAC7C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAA;IACjC,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,UAAkB,EAAE,mBAAwC;QACtE,sBAAsB;QACtB,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,mBAAmB,CAAA;QAC5B,CAAC;QAED,eAAe;QACf,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC,QAAQ,CAAA;YACxB,CAAC;QACH,CAAC;QAED,YAAY;QACZ,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,UAAkB,EAAE,OAAe;QACtD,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACnC,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,UAAU,KAAK,OAAO,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;IACtB,CAAC;CACF;AAED,OAAO;AACP,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,EAAE,CAAA;AAEtE;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA8B;IACrE,wBAAwB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAiC;IAC1E,wBAAwB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAA4B;IACvE,wBAAwB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;AACvD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 资源调度策略模块
|
|
3
|
+
*/
|
|
4
|
+
export type { SchedulingStrategy, ResourceStrategyConfig, StrategyContext } from './types';
|
|
5
|
+
export { resourceStrategyRegistry, registerResourceStrategy, registerResourceStrategies, setDefaultSchedulingStrategy, } from './ResourceStrategyRegistry';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduling/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC1F,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduling/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 资源调度策略类型定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 资源调度策略
|
|
6
|
+
*
|
|
7
|
+
* - out-of-order: 允许并发执行,不会阻塞或取消其他指令(乱序执行)
|
|
8
|
+
* 适用场景:读操作、独立的并发任务
|
|
9
|
+
*
|
|
10
|
+
* - serial: 串行执行,等待前一个指令完成后再执行下一个(顺序执行)
|
|
11
|
+
* 适用场景:写操作、需要保证顺序的操作
|
|
12
|
+
*
|
|
13
|
+
* - latest: 取消旧的,只保留最新的指令,先发后至的响应会被丢弃(保留最新)
|
|
14
|
+
* 适用场景:搜索、自动保存、实时预览等
|
|
15
|
+
*
|
|
16
|
+
* - read-write: 读共享、写互斥(读可并发,写需要独占)
|
|
17
|
+
* 适用场景:读多写少、详情读取 + 编辑写入
|
|
18
|
+
*/
|
|
19
|
+
export type SchedulingStrategy = 'out-of-order' | 'serial' | 'latest' | 'read-write';
|
|
20
|
+
/**
|
|
21
|
+
* 资源策略配置
|
|
22
|
+
*/
|
|
23
|
+
export interface ResourceStrategyConfig {
|
|
24
|
+
/** 资源模式(支持通配符,如 "task:*", "search:*") */
|
|
25
|
+
pattern: string;
|
|
26
|
+
/** 调度策略 */
|
|
27
|
+
strategy: SchedulingStrategy;
|
|
28
|
+
/** 描述 */
|
|
29
|
+
description?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 调度策略上下文
|
|
33
|
+
*/
|
|
34
|
+
export interface StrategyContext {
|
|
35
|
+
/** 指令ID */
|
|
36
|
+
instructionId: string;
|
|
37
|
+
/** 资源ID */
|
|
38
|
+
resourceId: string;
|
|
39
|
+
/** 当前策略 */
|
|
40
|
+
strategy: SchedulingStrategy;
|
|
41
|
+
/** 是否被取消 */
|
|
42
|
+
cancelled: boolean;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduling/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAA;AAEpF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW;IACX,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,SAAS;IACT,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW;IACX,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,YAAY;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduling/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EX阶段:Execute(执行)
|
|
3
|
+
*
|
|
4
|
+
* 支持:
|
|
5
|
+
* 1. 声明式请求(单个或多个)
|
|
6
|
+
* 2. 自定义执行逻辑
|
|
7
|
+
* 3. 乐观更新 + 自动回滚
|
|
8
|
+
* 4. 超时控制(基于指令配置)
|
|
9
|
+
*/
|
|
10
|
+
import type { QueuedInstruction } from '../types';
|
|
11
|
+
export declare class ExecuteStage {
|
|
12
|
+
/**
|
|
13
|
+
* 执行指令
|
|
14
|
+
*/
|
|
15
|
+
execute(instruction: QueuedInstruction): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=EX.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EX.d.ts","sourceRoot":"","sources":["../../src/stages/EX.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAQjD,qBAAa,YAAY;IACvB;;OAEG;IACG,OAAO,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAkG7D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EX阶段:Execute(执行)
|
|
3
|
+
*
|
|
4
|
+
* 支持:
|
|
5
|
+
* 1. 声明式请求(单个或多个)
|
|
6
|
+
* 2. 自定义执行逻辑
|
|
7
|
+
* 3. 乐观更新 + 自动回滚
|
|
8
|
+
* 4. 超时控制(基于指令配置)
|
|
9
|
+
*/
|
|
10
|
+
import { InstructionStatus } from '../types';
|
|
11
|
+
import { getISA } from '../isa';
|
|
12
|
+
import { executeRequest } from '../utils/request';
|
|
13
|
+
import { cpuEventCollector, cpuConsole } from '../logging/runtime';
|
|
14
|
+
import { isInstructionCancelled } from '../utils/InstructionCancellation';
|
|
15
|
+
import { makeAbortable } from '../utils/abortable';
|
|
16
|
+
export class ExecuteStage {
|
|
17
|
+
/**
|
|
18
|
+
* 执行指令
|
|
19
|
+
*/
|
|
20
|
+
async execute(instruction) {
|
|
21
|
+
// 🔥 在执行前检查指令是否已被取消(可能在 SCH 阶段被取消)
|
|
22
|
+
if (isInstructionCancelled(instruction)) {
|
|
23
|
+
throw instruction.error || new Error('Instruction was cancelled');
|
|
24
|
+
}
|
|
25
|
+
const ISA = getISA();
|
|
26
|
+
const isa = ISA[instruction.type];
|
|
27
|
+
if (!isa) {
|
|
28
|
+
throw new Error(`未找到指令定义: ${instruction.type}`);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
// 步骤1: 前置验证
|
|
32
|
+
if (isa.validate) {
|
|
33
|
+
const isValid = await isa.validate(instruction.payload, instruction.context);
|
|
34
|
+
if (!isValid) {
|
|
35
|
+
throw new Error(`指令验证失败: ${instruction.type}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 步骤2: 执行乐观更新(可选)
|
|
39
|
+
if (isa.optimistic?.enabled) {
|
|
40
|
+
instruction.optimisticSnapshot = isa.optimistic.apply(instruction.payload, instruction.context);
|
|
41
|
+
// 🎯 记录乐观更新应用事件
|
|
42
|
+
cpuEventCollector.onOptimisticApplied(instruction.id, instruction.type, instruction.context.correlationId, instruction.optimisticSnapshot, {});
|
|
43
|
+
cpuConsole.onOptimisticApplied(instruction);
|
|
44
|
+
}
|
|
45
|
+
// 步骤3: 标记 EX 阶段开始
|
|
46
|
+
instruction.status = InstructionStatus.EXECUTING;
|
|
47
|
+
instruction.timestamps.EX = Date.now();
|
|
48
|
+
// 步骤4: 执行网络请求/操作(带超时控制和取消控制)
|
|
49
|
+
let result;
|
|
50
|
+
// 🔥 根据指令配置的超时时间创建执行 Promise
|
|
51
|
+
const executePromise = (async () => {
|
|
52
|
+
if (isa.request) {
|
|
53
|
+
// 声明式请求 - 传递 AbortSignal
|
|
54
|
+
return await executeRequest(isa.request, instruction.payload, instruction.context, instruction.abortController?.signal);
|
|
55
|
+
}
|
|
56
|
+
else if (isa.execute) {
|
|
57
|
+
// 自定义执行逻辑 - 传递包含 instruction 的 context
|
|
58
|
+
const contextWithInstruction = {
|
|
59
|
+
...instruction.context,
|
|
60
|
+
instruction // 让用户代码可以访问 abortController
|
|
61
|
+
};
|
|
62
|
+
return await isa.execute(instruction.payload, contextWithInstruction);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error(`指令 ${instruction.type} 既没有 request 也没有 execute`);
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
// 🔥 关键:将执行 Promise 包装为可取消版本
|
|
69
|
+
// 即使用户代码不处理 AbortSignal,系统也能响应取消
|
|
70
|
+
const abortableExecutePromise = makeAbortable(executePromise, instruction.abortController?.signal);
|
|
71
|
+
// 🔥 如果指令定义了超时时间,应用超时控制
|
|
72
|
+
if (isa.meta.timeout) {
|
|
73
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
reject(new Error(`指令 ${instruction.type} 执行超时(${isa.meta.timeout}ms)`));
|
|
76
|
+
}, isa.meta.timeout);
|
|
77
|
+
});
|
|
78
|
+
// 三方竞争:执行、超时、取消
|
|
79
|
+
result = await Promise.race([abortableExecutePromise, timeoutPromise]);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// 双方竞争:执行、取消
|
|
83
|
+
result = await abortableExecutePromise;
|
|
84
|
+
}
|
|
85
|
+
// 保存结果
|
|
86
|
+
instruction.result = result;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
// 保存错误信息(回滚由 WB 阶段统一处理)
|
|
90
|
+
instruction.error = error;
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=EX.js.map
|