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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可取消的 Promise 包装器
|
|
3
|
+
*
|
|
4
|
+
* 将任意 Promise 与 AbortSignal 结合,使其可以被外部取消
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 将 AbortSignal 转换为 Promise
|
|
9
|
+
* 当 abort 事件触发时,Promise 会 reject
|
|
10
|
+
*/
|
|
11
|
+
function abortSignalToPromise(signal: AbortSignal): Promise<never> {
|
|
12
|
+
return new Promise((_, reject) => {
|
|
13
|
+
// 如果已经被 abort,立即 reject
|
|
14
|
+
if (signal.aborted) {
|
|
15
|
+
reject(new Error('Operation was aborted'))
|
|
16
|
+
return
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// 监听 abort 事件
|
|
20
|
+
const abortHandler = () => {
|
|
21
|
+
reject(new Error('Operation was aborted'))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
signal.addEventListener('abort', abortHandler, { once: true })
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 将 Promise 包装为可取消的版本
|
|
30
|
+
*
|
|
31
|
+
* @param promise 原始 Promise
|
|
32
|
+
* @param abortSignal 取消信号
|
|
33
|
+
* @returns 可取消的 Promise
|
|
34
|
+
*
|
|
35
|
+
* 工作原理:
|
|
36
|
+
* - 使用 Promise.race 让 promise 和 abortPromise 竞争
|
|
37
|
+
* - 如果 abort 先触发,整个操作会立即被 reject
|
|
38
|
+
* - 如果 promise 先完成,正常返回结果
|
|
39
|
+
*
|
|
40
|
+
* 效果:
|
|
41
|
+
* - 对 fetch:网络请求会被立即取消
|
|
42
|
+
* - 对自定义 execute:即使不处理 signal,也会被中断
|
|
43
|
+
*/
|
|
44
|
+
export function makeAbortable<T>(
|
|
45
|
+
promise: Promise<T>,
|
|
46
|
+
abortSignal?: AbortSignal
|
|
47
|
+
): Promise<T> {
|
|
48
|
+
// 如果没有提供 signal,直接返回原 promise
|
|
49
|
+
if (!abortSignal) {
|
|
50
|
+
return promise
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 如果 signal 已经 aborted,立即 reject
|
|
54
|
+
if (abortSignal.aborted) {
|
|
55
|
+
return Promise.reject(new Error('Operation was aborted'))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 使用 Promise.race 让执行和取消竞争
|
|
59
|
+
return Promise.race([
|
|
60
|
+
promise,
|
|
61
|
+
abortSignalToPromise(abortSignal)
|
|
62
|
+
])
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 创建一个可取消的延迟函数
|
|
67
|
+
*
|
|
68
|
+
* @param ms 延迟毫秒数
|
|
69
|
+
* @param abortSignal 取消信号
|
|
70
|
+
*/
|
|
71
|
+
export function cancellableDelay(ms: number, abortSignal?: AbortSignal): Promise<void> {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
if (abortSignal?.aborted) {
|
|
74
|
+
reject(new Error('Operation was aborted'))
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const timeoutId = setTimeout(() => {
|
|
79
|
+
resolve()
|
|
80
|
+
}, ms)
|
|
81
|
+
|
|
82
|
+
abortSignal?.addEventListener('abort', () => {
|
|
83
|
+
clearTimeout(timeoutId)
|
|
84
|
+
reject(new Error('Operation was aborted'))
|
|
85
|
+
}, { once: true })
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrontCPU 统一请求工具(解耦版)
|
|
3
|
+
*
|
|
4
|
+
* 通过依赖注入实现HTTP客户端解耦
|
|
5
|
+
*
|
|
6
|
+
* 支持:
|
|
7
|
+
* 1. 单个请求
|
|
8
|
+
* 2. 多个请求(并发/串行)
|
|
9
|
+
* 3. 自动添加 correlation-id
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { IHttpClient } from '../interfaces'
|
|
13
|
+
import type { InstructionContext } from '../types'
|
|
14
|
+
import type { RequestConfig, MultiRequestConfig } from '../isa/types'
|
|
15
|
+
|
|
16
|
+
// 全局HTTP客户端(通过setHttpClient注入)
|
|
17
|
+
let httpClient: IHttpClient | null = null
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 设置HTTP客户端(必须在使用前调用)
|
|
21
|
+
*/
|
|
22
|
+
export function setHttpClient(client: IHttpClient): void {
|
|
23
|
+
httpClient = client
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 执行单个 HTTP 请求
|
|
28
|
+
*/
|
|
29
|
+
async function executeSingleRequest(
|
|
30
|
+
config: RequestConfig,
|
|
31
|
+
payload: any,
|
|
32
|
+
context: InstructionContext,
|
|
33
|
+
abortSignal?: AbortSignal
|
|
34
|
+
): Promise<any> {
|
|
35
|
+
if (!httpClient) {
|
|
36
|
+
throw new Error('HttpClient未初始化,请先调用setHttpClient()')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// 解析 URL
|
|
40
|
+
const url = typeof config.url === 'function' ? config.url(payload) : config.url
|
|
41
|
+
|
|
42
|
+
// 解析请求体
|
|
43
|
+
const body = config.body ? config.body(payload) : payload
|
|
44
|
+
|
|
45
|
+
// 统一添加 correlation-id
|
|
46
|
+
const headers = {
|
|
47
|
+
'X-Correlation-ID': context.correlationId,
|
|
48
|
+
...config.headers,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const requestConfig = {
|
|
52
|
+
headers,
|
|
53
|
+
signal: abortSignal // 传递取消信号
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 根据方法执行请求
|
|
57
|
+
switch (config.method) {
|
|
58
|
+
case 'GET':
|
|
59
|
+
return await httpClient.get(url, requestConfig)
|
|
60
|
+
case 'POST':
|
|
61
|
+
return await httpClient.post(url, body, requestConfig)
|
|
62
|
+
case 'PUT':
|
|
63
|
+
return await httpClient.put(url, body, requestConfig)
|
|
64
|
+
case 'PATCH':
|
|
65
|
+
return await httpClient.patch(url, body, requestConfig)
|
|
66
|
+
case 'DELETE':
|
|
67
|
+
return await httpClient.delete(url, requestConfig)
|
|
68
|
+
default:
|
|
69
|
+
throw new Error(`Unsupported HTTP method: ${config.method}`)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 判断是否是多请求配置
|
|
75
|
+
*/
|
|
76
|
+
function isMultiRequestConfig(
|
|
77
|
+
config: RequestConfig | MultiRequestConfig
|
|
78
|
+
): config is MultiRequestConfig {
|
|
79
|
+
return 'requests' in config && Array.isArray(config.requests)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 执行 HTTP 请求(单个或多个)
|
|
84
|
+
*
|
|
85
|
+
* @param config 请求配置(单个或多个)
|
|
86
|
+
* @param payload 指令负载
|
|
87
|
+
* @param context 指令上下文
|
|
88
|
+
* @returns 请求结果
|
|
89
|
+
*/
|
|
90
|
+
export async function executeRequest(
|
|
91
|
+
config: RequestConfig | MultiRequestConfig,
|
|
92
|
+
payload: any,
|
|
93
|
+
context: InstructionContext,
|
|
94
|
+
abortSignal?: AbortSignal
|
|
95
|
+
): Promise<any> {
|
|
96
|
+
// 单个请求
|
|
97
|
+
if (!isMultiRequestConfig(config)) {
|
|
98
|
+
return await executeSingleRequest(config, payload, context, abortSignal)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// 多个请求
|
|
102
|
+
const { requests, mode, combineResults } = config
|
|
103
|
+
|
|
104
|
+
let results: any[]
|
|
105
|
+
|
|
106
|
+
if (mode === 'parallel') {
|
|
107
|
+
// 🔥 并发执行所有请求
|
|
108
|
+
results = await Promise.all(requests.map((req) => executeSingleRequest(req, payload, context, abortSignal)))
|
|
109
|
+
} else {
|
|
110
|
+
// 🔥 串行执行所有请求
|
|
111
|
+
results = []
|
|
112
|
+
for (const req of requests) {
|
|
113
|
+
const result = await executeSingleRequest(req, payload, context, abortSignal)
|
|
114
|
+
results.push(result)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 合并结果(如果提供了合并函数)
|
|
119
|
+
if (combineResults) {
|
|
120
|
+
return combineResults(results)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 默认:返回结果数组
|
|
124
|
+
return results
|
|
125
|
+
}
|