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.
Files changed (136) hide show
  1. package/README.md +475 -0
  2. package/README.zh-CN.md +474 -0
  3. package/dist/Pipeline.d.ts +119 -0
  4. package/dist/Pipeline.d.ts.map +1 -0
  5. package/dist/Pipeline.js +373 -0
  6. package/dist/Pipeline.js.map +1 -0
  7. package/dist/debug.d.ts +3 -0
  8. package/dist/debug.d.ts.map +1 -0
  9. package/dist/debug.js +12 -0
  10. package/dist/debug.js.map +1 -0
  11. package/dist/index.d.ts +20 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +19 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/interfaces.d.ts +49 -0
  16. package/dist/interfaces.d.ts.map +1 -0
  17. package/dist/interfaces.js +8 -0
  18. package/dist/interfaces.js.map +1 -0
  19. package/dist/isa/index.d.ts +20 -0
  20. package/dist/isa/index.d.ts.map +1 -0
  21. package/dist/isa/index.js +26 -0
  22. package/dist/isa/index.js.map +1 -0
  23. package/dist/isa/types.d.ts +144 -0
  24. package/dist/isa/types.d.ts.map +1 -0
  25. package/dist/isa/types.js +10 -0
  26. package/dist/isa/types.js.map +1 -0
  27. package/dist/logging/CPUConsole.d.ts +105 -0
  28. package/dist/logging/CPUConsole.d.ts.map +1 -0
  29. package/dist/logging/CPUConsole.js +471 -0
  30. package/dist/logging/CPUConsole.js.map +1 -0
  31. package/dist/logging/CPUDebugger.d.ts +91 -0
  32. package/dist/logging/CPUDebugger.d.ts.map +1 -0
  33. package/dist/logging/CPUDebugger.js +166 -0
  34. package/dist/logging/CPUDebugger.js.map +1 -0
  35. package/dist/logging/CPUEventCollector.d.ts +90 -0
  36. package/dist/logging/CPUEventCollector.d.ts.map +1 -0
  37. package/dist/logging/CPUEventCollector.js +353 -0
  38. package/dist/logging/CPUEventCollector.js.map +1 -0
  39. package/dist/logging/CPULogger.d.ts +150 -0
  40. package/dist/logging/CPULogger.d.ts.map +1 -0
  41. package/dist/logging/CPULogger.js +336 -0
  42. package/dist/logging/CPULogger.js.map +1 -0
  43. package/dist/logging/index.d.ts +10 -0
  44. package/dist/logging/index.d.ts.map +1 -0
  45. package/dist/logging/index.js +16 -0
  46. package/dist/logging/index.js.map +1 -0
  47. package/dist/logging/runtime.d.ts +37 -0
  48. package/dist/logging/runtime.d.ts.map +1 -0
  49. package/dist/logging/runtime.js +42 -0
  50. package/dist/logging/runtime.js.map +1 -0
  51. package/dist/logging/stack-parser.d.ts +22 -0
  52. package/dist/logging/stack-parser.d.ts.map +1 -0
  53. package/dist/logging/stack-parser.js +144 -0
  54. package/dist/logging/stack-parser.js.map +1 -0
  55. package/dist/logging/types.d.ts +73 -0
  56. package/dist/logging/types.d.ts.map +1 -0
  57. package/dist/logging/types.js +47 -0
  58. package/dist/logging/types.js.map +1 -0
  59. package/dist/scheduling/ResourceStrategyRegistry.d.ts +61 -0
  60. package/dist/scheduling/ResourceStrategyRegistry.d.ts.map +1 -0
  61. package/dist/scheduling/ResourceStrategyRegistry.js +109 -0
  62. package/dist/scheduling/ResourceStrategyRegistry.js.map +1 -0
  63. package/dist/scheduling/index.d.ts +6 -0
  64. package/dist/scheduling/index.d.ts.map +1 -0
  65. package/dist/scheduling/index.js +5 -0
  66. package/dist/scheduling/index.js.map +1 -0
  67. package/dist/scheduling/types.d.ts +44 -0
  68. package/dist/scheduling/types.d.ts.map +1 -0
  69. package/dist/scheduling/types.js +5 -0
  70. package/dist/scheduling/types.js.map +1 -0
  71. package/dist/stages/EX.d.ts +17 -0
  72. package/dist/stages/EX.d.ts.map +1 -0
  73. package/dist/stages/EX.js +95 -0
  74. package/dist/stages/EX.js.map +1 -0
  75. package/dist/stages/IF.d.ts +41 -0
  76. package/dist/stages/IF.d.ts.map +1 -0
  77. package/dist/stages/IF.js +83 -0
  78. package/dist/stages/IF.js.map +1 -0
  79. package/dist/stages/RES.d.ts +17 -0
  80. package/dist/stages/RES.d.ts.map +1 -0
  81. package/dist/stages/RES.js +37 -0
  82. package/dist/stages/RES.js.map +1 -0
  83. package/dist/stages/SCH.d.ts +77 -0
  84. package/dist/stages/SCH.d.ts.map +1 -0
  85. package/dist/stages/SCH.js +270 -0
  86. package/dist/stages/SCH.js.map +1 -0
  87. package/dist/stages/WB.d.ts +19 -0
  88. package/dist/stages/WB.d.ts.map +1 -0
  89. package/dist/stages/WB.js +102 -0
  90. package/dist/stages/WB.js.map +1 -0
  91. package/dist/types.d.ts +111 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +26 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils/InstructionCancellation.d.ts +31 -0
  96. package/dist/utils/InstructionCancellation.d.ts.map +1 -0
  97. package/dist/utils/InstructionCancellation.js +53 -0
  98. package/dist/utils/InstructionCancellation.js.map +1 -0
  99. package/dist/utils/abortable.d.ts +30 -0
  100. package/dist/utils/abortable.d.ts.map +1 -0
  101. package/dist/utils/abortable.js +76 -0
  102. package/dist/utils/abortable.js.map +1 -0
  103. package/dist/utils/request.d.ts +27 -0
  104. package/dist/utils/request.d.ts.map +1 -0
  105. package/dist/utils/request.js +96 -0
  106. package/dist/utils/request.js.map +1 -0
  107. package/package.json +74 -0
  108. package/src/Pipeline.ts +475 -0
  109. package/src/debug.ts +15 -0
  110. package/src/index.ts +67 -0
  111. package/src/interfaces.ts +53 -0
  112. package/src/isa/index.ts +34 -0
  113. package/src/isa/types.ts +178 -0
  114. package/src/logging/CPUConsole.md +843 -0
  115. package/src/logging/CPUConsole.ts +631 -0
  116. package/src/logging/CPUDebugger.ts +235 -0
  117. package/src/logging/CPUEventCollector.ts +418 -0
  118. package/src/logging/CPULogger.ts +435 -0
  119. package/src/logging/CPU_LOGGING_DESIGN.md +1319 -0
  120. package/src/logging/USAGE_GUIDE.md +505 -0
  121. package/src/logging/index.ts +21 -0
  122. package/src/logging/runtime.ts +96 -0
  123. package/src/logging/stack-parser.ts +168 -0
  124. package/src/logging/types.ts +101 -0
  125. package/src/scheduling/ResourceStrategyRegistry.ts +124 -0
  126. package/src/scheduling/index.ts +13 -0
  127. package/src/scheduling/types.ts +47 -0
  128. package/src/stages/EX.ts +121 -0
  129. package/src/stages/IF.ts +103 -0
  130. package/src/stages/RES.ts +46 -0
  131. package/src/stages/SCH.ts +331 -0
  132. package/src/stages/WB.ts +127 -0
  133. package/src/types.ts +118 -0
  134. package/src/utils/InstructionCancellation.ts +73 -0
  135. package/src/utils/abortable.ts +89 -0
  136. 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
+ }