hyper-scheduler 1.0.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 (76) hide show
  1. package/.editorconfig +21 -0
  2. package/.eslintrc.cjs +26 -0
  3. package/GEMINI.md +1 -0
  4. package/README.md +38 -0
  5. package/docs/.vitepress/config.ts +52 -0
  6. package/docs/README.md +120 -0
  7. package/docs/api/devtools.md +232 -0
  8. package/docs/api/index.md +178 -0
  9. package/docs/api/scheduler.md +322 -0
  10. package/docs/api/task.md +439 -0
  11. package/docs/api/types.md +365 -0
  12. package/docs/examples/index.md +295 -0
  13. package/docs/guide/best-practices.md +436 -0
  14. package/docs/guide/core-concepts.md +363 -0
  15. package/docs/guide/getting-started.md +138 -0
  16. package/docs/index.md +33 -0
  17. package/docs/public/logo.svg +54 -0
  18. package/examples/browser/index.html +354 -0
  19. package/examples/node/simple.js +36 -0
  20. package/examples/react-demo/index.html +12 -0
  21. package/examples/react-demo/package.json +23 -0
  22. package/examples/react-demo/src/App.css +212 -0
  23. package/examples/react-demo/src/App.jsx +160 -0
  24. package/examples/react-demo/src/main.jsx +9 -0
  25. package/examples/react-demo/vite.config.ts +12 -0
  26. package/examples/react-demo/yarn.lock +752 -0
  27. package/examples/vue-demo/index.html +12 -0
  28. package/examples/vue-demo/package.json +21 -0
  29. package/examples/vue-demo/src/App.vue +373 -0
  30. package/examples/vue-demo/src/main.ts +4 -0
  31. package/examples/vue-demo/vite.config.ts +13 -0
  32. package/examples/vue-demo/yarn.lock +375 -0
  33. package/package.json +51 -0
  34. package/src/constants.ts +18 -0
  35. package/src/core/retry-strategy.ts +28 -0
  36. package/src/core/scheduler.ts +601 -0
  37. package/src/core/task-registry.ts +58 -0
  38. package/src/index.ts +74 -0
  39. package/src/platform/browser/browser-timer.ts +66 -0
  40. package/src/platform/browser/main-thread-timer.ts +16 -0
  41. package/src/platform/browser/worker.ts +31 -0
  42. package/src/platform/node/debug-cli.ts +19 -0
  43. package/src/platform/node/node-timer.ts +15 -0
  44. package/src/platform/timer-strategy.ts +19 -0
  45. package/src/plugins/dev-tools.ts +101 -0
  46. package/src/types.ts +115 -0
  47. package/src/ui/components/devtools.ts +525 -0
  48. package/src/ui/components/floating-trigger.ts +102 -0
  49. package/src/ui/components/icons.ts +16 -0
  50. package/src/ui/components/resizer.ts +129 -0
  51. package/src/ui/components/task-detail.ts +228 -0
  52. package/src/ui/components/task-header.ts +319 -0
  53. package/src/ui/components/task-list.ts +416 -0
  54. package/src/ui/components/timeline.ts +364 -0
  55. package/src/ui/debug-panel.ts +56 -0
  56. package/src/ui/i18n/en.ts +76 -0
  57. package/src/ui/i18n/index.ts +42 -0
  58. package/src/ui/i18n/zh.ts +76 -0
  59. package/src/ui/store/dev-tools-store.ts +191 -0
  60. package/src/ui/styles/theme.css.ts +56 -0
  61. package/src/ui/styles.ts +43 -0
  62. package/src/utils/cron-lite.ts +221 -0
  63. package/src/utils/cron.ts +20 -0
  64. package/src/utils/id.ts +10 -0
  65. package/src/utils/schedule.ts +93 -0
  66. package/src/vite-env.d.ts +1 -0
  67. package/stats.html +4949 -0
  68. package/tests/integration/Debug.test.ts +58 -0
  69. package/tests/unit/Plugin.test.ts +16 -0
  70. package/tests/unit/RetryStrategy.test.ts +21 -0
  71. package/tests/unit/Scheduler.test.ts +38 -0
  72. package/tests/unit/schedule.test.ts +70 -0
  73. package/tests/unit/ui/DevToolsStore.test.ts +67 -0
  74. package/tsconfig.json +28 -0
  75. package/vite.config.ts +51 -0
  76. package/vitest.config.ts +24 -0
@@ -0,0 +1,322 @@
1
+ # Scheduler
2
+
3
+ 核心调度器类,负责任务的注册、调度和生命周期管理。
4
+
5
+ ## 概念说明:Scheduler vs Task
6
+
7
+ 在 Hyper Scheduler 中,理解这两个核心概念的区别至关重要:
8
+
9
+ - **Scheduler (调度器)**:
10
+ - **角色**:管理者、指挥官。
11
+ - **职责**:维护任务列表、管理时间轴、触发执行、处理全局配置(如时区、插件)。
12
+ - **数量**:通常一个应用只需一个全局 Scheduler 实例。
13
+
14
+ - **Task (任务)**:
15
+ - **角色**:执行单元、工兵。
16
+ - **职责**:包含具体的业务逻辑(`handler`)、调度规则(`schedule`)和运行配置(如 `driver`、重试策略)。
17
+ - **数量**:一个 Scheduler 可以管理成百上千个 Task。
18
+
19
+ 简而言之,**Scheduler** 决定了“**什么时候**”以及“**如何**”运行,而 **Task** 定义了“**做什么**”。
20
+
21
+ ## 构造函数
22
+
23
+ ```typescript
24
+ new Scheduler(config?: SchedulerConfig)
25
+ ```
26
+
27
+ ### 参数
28
+
29
+ - **config** `SchedulerConfig` - 可选配置对象
30
+
31
+ | 属性 | 类型 | 默认值 | 说明 |
32
+ |------|------|--------|------|
33
+ | `debug` | `boolean` | `false` | 启用调试日志输出 |
34
+ | `timezone` | `string` | 系统时区 | 全局时区设置,如 `'Asia/Shanghai'` |
35
+ | `maxHistory` | `number` | `50` | 每个任务保留的最大执行历史记录数 |
36
+ | `plugins` | `HyperSchedulerPlugin[]` | `[]` | 要在初始化时加载的插件实例数组 |
37
+
38
+ ### 示例
39
+
40
+ ```typescript
41
+ import { Scheduler, DevTools } from 'hyper-scheduler';
42
+
43
+ const scheduler = new Scheduler({
44
+ debug: true,
45
+ timezone: 'Asia/Shanghai',
46
+ maxHistory: 100,
47
+ plugins: [
48
+ new DevTools({ theme: 'dark' })
49
+ ]
50
+ });
51
+ ```
52
+
53
+ ## 实例方法
54
+
55
+ ### createTask()
56
+
57
+ 注册新任务到调度器。
58
+
59
+ ```typescript
60
+ createTask(definition: TaskDefinition): void
61
+ ```
62
+
63
+ #### 参数
64
+
65
+ - **definition** `TaskDefinition` - 任务定义对象
66
+
67
+ | 属性 | 类型 | 必填 | 说明 |
68
+ |------|------|------|------|
69
+ | `id` | `string` | ✓ | 任务唯一标识符 |
70
+ | `schedule` | `string` | ✓ | 调度规则(Cron 表达式或时间间隔) |
71
+ | `handler` | `() => void \| Promise<void>` | ✓ | 任务执行函数 |
72
+ | `tags` | `string[]` | - | 任务标签,用于分类过滤 |
73
+ | `options` | `TaskOptions` | - | 任务选项 |
74
+
75
+ 详细的 `TaskOptions` 配置请参考 [Task API](./task.md)。
76
+
77
+ #### 示例
78
+
79
+ ```typescript
80
+ // 基础任务
81
+ scheduler.createTask({
82
+ id: 'daily-backup',
83
+ schedule: '0 0 2 * * *', // 每天凌晨 2:00
84
+ handler: async () => {
85
+ await backupDatabase();
86
+ },
87
+ tags: ['backup', 'critical']
88
+ });
89
+
90
+ // 带重试和错误处理的任务
91
+ scheduler.createTask({
92
+ id: 'api-sync',
93
+ schedule: '5m',
94
+ handler: async () => {
95
+ await syncWithAPI();
96
+ },
97
+ options: {
98
+ retry: {
99
+ maxAttempts: 3,
100
+ initialDelay: 1000,
101
+ factor: 2
102
+ },
103
+ onError: (error, taskId) => {
104
+ console.error(`Task ${taskId} failed:`, error.message);
105
+ }
106
+ }
107
+ });
108
+ ```
109
+
110
+ ### start()
111
+
112
+ 启动调度器,开始执行所有已注册的任务。
113
+
114
+ ```typescript
115
+ start(): void
116
+ ```
117
+
118
+ #### 示例
119
+
120
+ ```typescript
121
+ scheduler.start();
122
+ ```
123
+
124
+ ### stop()
125
+
126
+ 停止调度器,暂停所有任务的调度。已经在执行的任务会继续完成。
127
+
128
+ ```typescript
129
+ stop(): void
130
+ ```
131
+
132
+ #### 示例
133
+
134
+ ```typescript
135
+ scheduler.stop();
136
+ ```
137
+
138
+ ### startTask()
139
+
140
+ 启动指定任务(从 stopped 状态恢复)。
141
+
142
+ ```typescript
143
+ startTask(taskId: string): void
144
+ ```
145
+
146
+ #### 参数
147
+
148
+ - **taskId** `string` - 任务 ID
149
+
150
+ #### 示例
151
+
152
+ ```typescript
153
+ scheduler.startTask('daily-backup');
154
+ ```
155
+
156
+ ### stopTask()
157
+
158
+ 停止指定任务,任务状态变为 `stopped`,不再参与调度。
159
+
160
+ ```typescript
161
+ stopTask(taskId: string): void
162
+ ```
163
+
164
+ #### 参数
165
+
166
+ - **taskId** `string` - 任务 ID
167
+
168
+ #### 示例
169
+
170
+ ```typescript
171
+ scheduler.stopTask('daily-backup');
172
+ ```
173
+
174
+ ### triggerTask()
175
+
176
+ 手动触发任务立即执行一次,不影响正常调度。执行完成后恢复到之前的状态。
177
+
178
+ ```typescript
179
+ triggerTask(taskId: string): Promise<void>
180
+ ```
181
+
182
+ #### 参数
183
+
184
+ - **taskId** `string` - 任务 ID
185
+
186
+ #### 返回值
187
+
188
+ - `Promise<void>` - 任务执行完成后 resolve
189
+
190
+ #### 示例
191
+
192
+ ```typescript
193
+ await scheduler.triggerTask('daily-backup');
194
+ console.log('Manual trigger completed');
195
+ ```
196
+
197
+ ### deleteTask()
198
+
199
+ 删除指定任务,任务将从调度器中移除。
200
+
201
+ ```typescript
202
+ deleteTask(taskId: string): boolean
203
+ ```
204
+
205
+ #### 参数
206
+
207
+ - **taskId** `string` - 任务 ID
208
+
209
+ #### 返回值
210
+
211
+ - `boolean` - 删除成功返回 `true`,任务不存在返回 `false`
212
+
213
+ #### 示例
214
+
215
+ ```typescript
216
+ const deleted = scheduler.deleteTask('old-task');
217
+ if (deleted) {
218
+ console.log('Task removed successfully');
219
+ }
220
+ ```
221
+
222
+ ### getTask()
223
+
224
+ 获取指定任务的详细信息。
225
+
226
+ ```typescript
227
+ getTask(taskId: string): Task | undefined
228
+ ```
229
+
230
+ #### 参数
231
+
232
+ - **taskId** `string` - 任务 ID
233
+
234
+ #### 返回值
235
+
236
+ - `Task | undefined` - 任务对象,不存在则返回 `undefined`
237
+
238
+ #### 示例
239
+
240
+ ```typescript
241
+ const task = scheduler.getTask('daily-backup');
242
+ if (task) {
243
+ console.log('Task status:', task.status);
244
+ console.log('Next run:', new Date(task.nextRun));
245
+ }
246
+ ```
247
+
248
+ ### getAllTasks()
249
+
250
+ 获取所有已注册任务的列表。
251
+
252
+ ```typescript
253
+ getAllTasks(): Task[]
254
+ ```
255
+
256
+ #### 返回值
257
+
258
+ - `Task[]` - 任务对象数组
259
+
260
+ #### 示例
261
+
262
+ ```typescript
263
+ const tasks = scheduler.getAllTasks();
264
+ console.log(`Total tasks: ${tasks.length}`);
265
+
266
+ tasks.forEach(task => {
267
+ console.log(`${task.id}: ${task.status}`);
268
+ });
269
+ ```
270
+
271
+ ### on()
272
+
273
+ 订阅调度器事件。
274
+
275
+ ```typescript
276
+ on(event: string, handler: (payload: any) => void): () => void
277
+ ```
278
+
279
+ #### 参数
280
+
281
+ - **event** `string` - 事件名称
282
+ - **handler** `(payload: any) => void` - 事件处理函数
283
+
284
+ #### 返回值
285
+
286
+ - `() => void` - 取消订阅函数
287
+
288
+ #### 支持的事件
289
+
290
+ | 事件名 | 触发时机 | payload 结构 |
291
+ |--------|----------|--------------|
292
+ | `task_registered` | 任务注册时 | `{ taskId: string, task: Task }` |
293
+ | `task_started` | 任务开始执行时 | `{ taskId: string, task: Task }` |
294
+ | `task_completed` | 任务执行成功时 | `{ taskId: string, task: Task, duration: number }` |
295
+ | `task_failed` | 任务执行失败时 | `{ taskId: string, task: Task, error: Error, duration: number }` |
296
+ | `task_stopped` | 任务停止时 | `{ taskId: string, task: Task }` |
297
+ | `task_removed` | 任务删除时 | `{ taskId: string }` |
298
+
299
+ #### 示例
300
+
301
+ ```typescript
302
+ // 订阅任务完成事件
303
+ const unsubscribe = scheduler.on('task_completed', ({ taskId, duration }) => {
304
+ console.log(`Task ${taskId} completed in ${duration}ms`);
305
+ });
306
+
307
+ // 订阅任务失败事件
308
+ scheduler.on('task_failed', ({ taskId, error }) => {
309
+ console.error(`Task ${taskId} failed:`, error.message);
310
+ // 发送告警通知
311
+ sendAlert(taskId, error);
312
+ });
313
+
314
+ // 取消订阅
315
+ unsubscribe();
316
+ ```
317
+
318
+ ## 相关链接
319
+
320
+ - [Task API](./task.md) - 任务配置详解
321
+ - [DevTools API](./devtools.md) - 调试工具配置
322
+ - [类型定义](./types.md) - 完整类型定义