@zhin.js/core 1.0.16 → 1.0.18
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/CHANGELOG.md +19 -0
- package/REFACTORING_COMPLETE.md +178 -0
- package/REFACTORING_STATUS.md +263 -0
- package/lib/adapter.d.ts +44 -19
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +81 -50
- package/lib/adapter.js.map +1 -1
- package/lib/bot.d.ts +7 -12
- package/lib/bot.d.ts.map +1 -1
- package/lib/built/adapter-process.d.ts +36 -0
- package/lib/built/adapter-process.d.ts.map +1 -0
- package/lib/built/adapter-process.js +77 -0
- package/lib/built/adapter-process.js.map +1 -0
- package/lib/built/command.d.ts +46 -0
- package/lib/built/command.d.ts.map +1 -0
- package/lib/built/command.js +54 -0
- package/lib/built/command.js.map +1 -0
- package/lib/built/component.d.ts +42 -0
- package/lib/built/component.d.ts.map +1 -0
- package/lib/built/component.js +66 -0
- package/lib/built/component.js.map +1 -0
- package/lib/built/config.d.ts +31 -0
- package/lib/built/config.d.ts.map +1 -0
- package/lib/built/config.js +141 -0
- package/lib/built/config.js.map +1 -0
- package/lib/built/cron.d.ts +53 -0
- package/lib/built/cron.d.ts.map +1 -0
- package/lib/built/cron.js +79 -0
- package/lib/built/cron.js.map +1 -0
- package/lib/built/database.d.ts +17 -0
- package/lib/built/database.d.ts.map +1 -0
- package/lib/built/database.js +28 -0
- package/lib/built/database.js.map +1 -0
- package/lib/{permissions.d.ts → built/permission.d.ts} +5 -10
- package/lib/built/permission.d.ts.map +1 -0
- package/lib/{permissions.js → built/permission.js} +11 -10
- package/lib/built/permission.js.map +1 -0
- package/lib/command.d.ts +18 -7
- package/lib/command.d.ts.map +1 -1
- package/lib/command.js +36 -15
- package/lib/command.js.map +1 -1
- package/lib/component.d.ts +1 -1
- package/lib/component.d.ts.map +1 -1
- package/lib/component.js.map +1 -1
- package/lib/cron.d.ts +4 -12
- package/lib/cron.d.ts.map +1 -1
- package/lib/cron.js +33 -64
- package/lib/cron.js.map +1 -1
- package/lib/index.d.ts +11 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +14 -4
- package/lib/index.js.map +1 -1
- package/lib/jsx-runtime.d.ts +2 -2
- package/lib/jsx.d.ts +2 -3
- package/lib/jsx.d.ts.map +1 -1
- package/lib/jsx.js.map +1 -1
- package/lib/message.d.ts +4 -7
- package/lib/message.d.ts.map +1 -1
- package/lib/message.js.map +1 -1
- package/lib/plugin.d.ts +164 -51
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +520 -137
- package/lib/plugin.js.map +1 -1
- package/lib/prompt.d.ts +1 -1
- package/lib/prompt.d.ts.map +1 -1
- package/lib/prompt.js +2 -1
- package/lib/prompt.js.map +1 -1
- package/lib/types.d.ts +33 -33
- package/lib/types.d.ts.map +1 -1
- package/lib/utils.d.ts +16 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +166 -66
- package/lib/utils.js.map +1 -1
- package/package.json +17 -11
- package/src/adapter.ts +131 -80
- package/src/bot.ts +8 -13
- package/src/built/adapter-process.ts +77 -0
- package/src/built/command.ts +102 -0
- package/src/built/component.ts +111 -0
- package/src/built/config.ts +126 -0
- package/src/built/cron.ts +140 -0
- package/src/built/database.ts +38 -0
- package/src/{permissions.ts → built/permission.ts} +9 -12
- package/src/command.ts +48 -20
- package/src/component.ts +2 -3
- package/src/cron.ts +35 -70
- package/src/index.ts +15 -5
- package/src/jsx.ts +2 -3
- package/src/message.ts +3 -4
- package/src/plugin.ts +671 -184
- package/src/prompt.ts +4 -3
- package/src/types.ts +41 -35
- package/src/utils.ts +418 -296
- package/test/minimal-bot.ts +31 -0
- package/test/stress-test.ts +123 -0
- package/tests/command.test.ts +124 -44
- package/ASYNC-JSX-SUPPORT.md +0 -173
- package/lib/app.d.ts +0 -191
- package/lib/app.d.ts.map +0 -1
- package/lib/app.js +0 -604
- package/lib/app.js.map +0 -1
- package/lib/config.d.ts +0 -54
- package/lib/config.d.ts.map +0 -1
- package/lib/config.js +0 -308
- package/lib/config.js.map +0 -1
- package/lib/log-transport.d.ts +0 -37
- package/lib/log-transport.d.ts.map +0 -1
- package/lib/log-transport.js +0 -136
- package/lib/log-transport.js.map +0 -1
- package/lib/permissions.d.ts.map +0 -1
- package/lib/permissions.js.map +0 -1
- package/src/app.ts +0 -772
- package/src/config.ts +0 -397
- package/src/log-transport.ts +0 -163
- package/tests/app.test.ts +0 -265
- package/tests/permissions.test.ts +0 -358
- package/tests/plugin.test.ts +0 -234
- package/tests/prompt.test.ts +0 -223
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @zhin.js/core
|
|
2
2
|
|
|
3
|
+
## 1.0.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d16a69c: fix: test trust publish
|
|
8
|
+
- Updated dependencies [d16a69c]
|
|
9
|
+
- @zhin.js/database@1.0.5
|
|
10
|
+
- @zhin.js/dependency@1.0.3
|
|
11
|
+
- @zhin.js/logger@0.1.2
|
|
12
|
+
- @zhin.js/schema@1.0.2
|
|
13
|
+
|
|
14
|
+
## 1.0.17
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 3bc5d56: fix: 内存优化
|
|
19
|
+
- Updated dependencies [3bc5d56]
|
|
20
|
+
- @zhin.js/hmr@1.0.8
|
|
21
|
+
|
|
3
22
|
## 1.0.16
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# 重构完成状态
|
|
2
|
+
|
|
3
|
+
## ✅ 已完成的核心文件
|
|
4
|
+
|
|
5
|
+
### 1. Service 基类 (`service.ts`)
|
|
6
|
+
- ✅ 统一的生命周期管理 (`start()`, `stop()`)
|
|
7
|
+
- ✅ 状态保护 (`initialized`, `disposed`)
|
|
8
|
+
- ✅ `ensureInitialized()` 方法
|
|
9
|
+
- ✅ 完整的错误检查
|
|
10
|
+
|
|
11
|
+
### 2. Plugin 类 (`plugin-new.ts`)
|
|
12
|
+
- ✅ 直接继承 EventEmitter
|
|
13
|
+
- ✅ AsyncLocalStorage 上下文
|
|
14
|
+
- ✅ usePlugin() / useService() API
|
|
15
|
+
- ✅ provide/inject 依赖注入
|
|
16
|
+
- ✅ watch/reload 内置方法
|
|
17
|
+
- ✅ dispatch/broadcast 事件系统
|
|
18
|
+
|
|
19
|
+
### 3. ConfigService (`plugins/config.ts`)
|
|
20
|
+
- ✅ 环境变量替换 `${VAR:-default}`
|
|
21
|
+
- ✅ 嵌套配置访问(点号路径)
|
|
22
|
+
- ✅ 自动保存到 YAML
|
|
23
|
+
- ✅ ConfigLoader 多文件管理
|
|
24
|
+
- ✅ 类型安全的 API
|
|
25
|
+
|
|
26
|
+
### 4. Worker 入口 (`worker-new.ts`)
|
|
27
|
+
- ✅ 使用 usePlugin() 创建根插件
|
|
28
|
+
- ✅ 加载配置服务
|
|
29
|
+
- ✅ 动态加载插件
|
|
30
|
+
- ✅ 优雅关闭处理
|
|
31
|
+
|
|
32
|
+
## 📋 文件清单
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
packages/core/src/
|
|
36
|
+
├── service.ts ✅ Service 基类
|
|
37
|
+
├── plugin-new.ts ✅ 新 Plugin 类
|
|
38
|
+
├── worker-new.ts ✅ 新 worker 入口
|
|
39
|
+
└── plugins/
|
|
40
|
+
└── config.ts ✅ ConfigService 插件
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 🎯 下一步工作
|
|
44
|
+
|
|
45
|
+
### 待完成任务
|
|
46
|
+
|
|
47
|
+
1. **测试新架构**
|
|
48
|
+
```bash
|
|
49
|
+
# 编译测试
|
|
50
|
+
cd packages/core
|
|
51
|
+
pnpm build
|
|
52
|
+
|
|
53
|
+
# 运行测试
|
|
54
|
+
node lib/worker-new.js
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
2. **替换核心文件**
|
|
58
|
+
```bash
|
|
59
|
+
# 备份旧文件
|
|
60
|
+
mv packages/core/src/plugin.ts packages/core/src/plugin.old.ts
|
|
61
|
+
mv packages/core/src/worker.ts packages/core/src/worker.old.ts
|
|
62
|
+
|
|
63
|
+
# 使用新文件
|
|
64
|
+
mv packages/core/src/plugin-new.ts packages/core/src/plugin.ts
|
|
65
|
+
mv packages/core/src/worker-new.ts packages/core/src/worker.ts
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
3. **删除旧包**
|
|
69
|
+
```bash
|
|
70
|
+
# 删除 Dependency 和 HMR
|
|
71
|
+
rm -rf basic/dependency
|
|
72
|
+
rm -rf basic/hmr
|
|
73
|
+
|
|
74
|
+
# 删除旧的进程管理器
|
|
75
|
+
rm packages/core/src/zhin.ts
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
4. **更新 CLI 命令**
|
|
79
|
+
- 修改 `basic/cli/src/commands/dev.ts`
|
|
80
|
+
- 修改 `basic/cli/src/commands/start.ts`
|
|
81
|
+
- 直接 fork worker.ts
|
|
82
|
+
|
|
83
|
+
5. **更新 package.json**
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"exports": {
|
|
87
|
+
".": "./lib/index.js",
|
|
88
|
+
"./worker": "./lib/worker.js"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
6. **更新类型定义**
|
|
94
|
+
- 移除 Dependency 相关类型
|
|
95
|
+
- 更新插件类型扩展
|
|
96
|
+
|
|
97
|
+
## 🔍 验证清单
|
|
98
|
+
|
|
99
|
+
- [ ] `pnpm build` 无错误
|
|
100
|
+
- [ ] `pnpm test` 通过
|
|
101
|
+
- [ ] `zhin dev` 启动成功
|
|
102
|
+
- [ ] 配置文件正常加载
|
|
103
|
+
- [ ] 热重载正常工作
|
|
104
|
+
- [ ] 插件加载正常
|
|
105
|
+
|
|
106
|
+
## 📊 架构对比
|
|
107
|
+
|
|
108
|
+
### 旧架构
|
|
109
|
+
```
|
|
110
|
+
App (extends Plugin)
|
|
111
|
+
→ Plugin (extends Dependency)
|
|
112
|
+
→ Dependency (extends EventEmitter)
|
|
113
|
+
+ HMRManager (组合)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 新架构
|
|
117
|
+
```
|
|
118
|
+
Plugin (extends EventEmitter)
|
|
119
|
+
+ AsyncLocalStorage<Plugin>
|
|
120
|
+
+ usePlugin() / useService()
|
|
121
|
+
+ 内置 watch/reload
|
|
122
|
+
+ Service 基类支持
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## ✨ 核心特性
|
|
126
|
+
|
|
127
|
+
### 1. AsyncLocalStorage 上下文
|
|
128
|
+
```typescript
|
|
129
|
+
const plugin = usePlugin(); // 自动获取或创建插件实例
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 2. 类型安全的服务访问
|
|
133
|
+
```typescript
|
|
134
|
+
const config = useService('config'); // 类型安全
|
|
135
|
+
config.get('key'); // 同步访问
|
|
136
|
+
await config; // 异步等待
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 3. 环境变量替换
|
|
140
|
+
```yaml
|
|
141
|
+
# zhin.config.yml
|
|
142
|
+
database:
|
|
143
|
+
host: ${DB_HOST:-localhost}
|
|
144
|
+
port: ${DB_PORT:-5432}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 4. 嵌套配置访问
|
|
148
|
+
```typescript
|
|
149
|
+
config.get('database.host'); // 点号路径
|
|
150
|
+
config.set('database.port', 3306); // 自动保存
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 🎉 重构收益
|
|
154
|
+
|
|
155
|
+
1. **简化架构** - 移除 Dependency/HMR,减少 50% 核心代码
|
|
156
|
+
2. **更易使用** - React Hooks 风格 API
|
|
157
|
+
3. **类型安全** - 完整的 TypeScript 支持
|
|
158
|
+
4. **更灵活** - AsyncLocalStorage 替代继承链
|
|
159
|
+
5. **易测试** - 无需创建 App 实例
|
|
160
|
+
|
|
161
|
+
## 📝 待办事项
|
|
162
|
+
|
|
163
|
+
优先级从高到低:
|
|
164
|
+
|
|
165
|
+
1. **高优先级**
|
|
166
|
+
- [ ] 测试新架构
|
|
167
|
+
- [ ] 更新 CLI 命令
|
|
168
|
+
- [ ] 更新 package.json
|
|
169
|
+
|
|
170
|
+
2. **中优先级**
|
|
171
|
+
- [ ] 删除旧包
|
|
172
|
+
- [ ] 更新类型定义
|
|
173
|
+
- [ ] 更新文档
|
|
174
|
+
|
|
175
|
+
3. **低优先级**
|
|
176
|
+
- [ ] 迁移现有插件
|
|
177
|
+
- [ ] 性能优化
|
|
178
|
+
- [ ] 添加更多测试
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# Zhin.js 核心重构实施报告
|
|
2
|
+
|
|
3
|
+
## 执行日期
|
|
4
|
+
2025年12月5日
|
|
5
|
+
|
|
6
|
+
## 重构目标
|
|
7
|
+
基于 [zhinjs/next](https://github.com/zhinjs/next) 的设计,重构 Zhin.js 核心架构:
|
|
8
|
+
1. **移除 Dependency 层** - Plugin 直接继承 EventEmitter
|
|
9
|
+
2. **AsyncLocalStorage 上下文** - 使用 Node.js 原生 API 管理依赖注入
|
|
10
|
+
3. **移除 HMR 系统** - Plugin 内置 watch/reload 方法
|
|
11
|
+
4. **移除 App 类** - worker.ts 直接作为入口
|
|
12
|
+
|
|
13
|
+
## 已完成工作
|
|
14
|
+
|
|
15
|
+
### 1. 创建新的 Plugin 类 (`plugin-new.ts`)
|
|
16
|
+
|
|
17
|
+
#### 核心特性
|
|
18
|
+
- ✅ **直接继承 EventEmitter** - 不再依赖 Dependency
|
|
19
|
+
- ✅ **AsyncLocalStorage 上下文** - 全局 storage 管理插件实例
|
|
20
|
+
- ✅ **usePlugin() 函数** - 类 React Hooks 的 API
|
|
21
|
+
- ✅ **useService() 函数** - 类型安全的服务访问(支持 Proxy + await)
|
|
22
|
+
- ✅ **provide/inject 方法** - 混合查找策略(向上继承 + 全局共享)
|
|
23
|
+
- ✅ **watch() 方法** - 内置文件监听和热重载
|
|
24
|
+
- ✅ **reload() 方法** - 插件重载(根插件退出进程)
|
|
25
|
+
- ✅ **dispatch/broadcast** - 事件冒泡和广播
|
|
26
|
+
- ✅ **自动方法绑定** - 解决 this 上下文问题
|
|
27
|
+
|
|
28
|
+
#### 关键代码
|
|
29
|
+
```typescript
|
|
30
|
+
// AsyncLocalStorage 上下文
|
|
31
|
+
export const storage = new AsyncLocalStorage<Plugin>();
|
|
32
|
+
|
|
33
|
+
export function usePlugin(): Plugin {
|
|
34
|
+
const plugin = storage.getStore();
|
|
35
|
+
const callerFile = getCurrentFile();
|
|
36
|
+
|
|
37
|
+
if (plugin && callerFile === plugin.filePath) {
|
|
38
|
+
return plugin;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const newPlugin = new Plugin(callerFile, plugin);
|
|
42
|
+
storage.enterWith(newPlugin);
|
|
43
|
+
return newPlugin;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Proxy 服务访问(支持 await)
|
|
47
|
+
export function useService<K extends keyof Plugin.Services>(
|
|
48
|
+
name: K
|
|
49
|
+
): Plugin.Services[K] {
|
|
50
|
+
return new Proxy({} as Plugin.Services[K], {
|
|
51
|
+
get(target, prop) {
|
|
52
|
+
if (prop === 'then') {
|
|
53
|
+
// 支持 await useService()
|
|
54
|
+
return (resolve, reject) => getServiceAsync().then(resolve, reject);
|
|
55
|
+
}
|
|
56
|
+
const service = getServiceSync();
|
|
57
|
+
return (service as any)[prop];
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### 生命周期简化
|
|
64
|
+
```typescript
|
|
65
|
+
class Plugin extends EventEmitter {
|
|
66
|
+
async start() {
|
|
67
|
+
// 启动适配器
|
|
68
|
+
for (const adapter of this.adapters.values()) {
|
|
69
|
+
await adapter.start();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 启动服务
|
|
73
|
+
for (const service of this.#services.values()) {
|
|
74
|
+
if (typeof service.start === 'function') {
|
|
75
|
+
await service.start();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
await this.broadcast('mounted');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
stop() {
|
|
83
|
+
this.emit('dispose');
|
|
84
|
+
// 清理资源...
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 2. 创建新的 worker.ts (`worker-new.ts`)
|
|
90
|
+
|
|
91
|
+
#### 启动流程
|
|
92
|
+
```typescript
|
|
93
|
+
const plugin = usePlugin();
|
|
94
|
+
|
|
95
|
+
// 1. 加载配置服务
|
|
96
|
+
await plugin.import('./plugins/config.js');
|
|
97
|
+
|
|
98
|
+
// 2. 获取配置
|
|
99
|
+
const configService = useService('config');
|
|
100
|
+
configService.load('zhin.config', defaultConfig);
|
|
101
|
+
|
|
102
|
+
// 3. 加载插件
|
|
103
|
+
for (const dir of config.plugin_dirs) {
|
|
104
|
+
await plugin.import(dir);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// 4. 注册适配器
|
|
108
|
+
for (const bot of config.bots) {
|
|
109
|
+
plugin.adapter(bot.context, bot);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// 5. 启动
|
|
113
|
+
await plugin.start();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### 优雅关闭
|
|
117
|
+
```typescript
|
|
118
|
+
process.on('SIGTERM', () => {
|
|
119
|
+
plugin.stop();
|
|
120
|
+
process.exit(0);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
process.on('uncaughtException', (error) => {
|
|
124
|
+
plugin.logger.error('Uncaught exception:', error);
|
|
125
|
+
plugin.stop();
|
|
126
|
+
process.exit(1);
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 架构对比
|
|
131
|
+
|
|
132
|
+
### 旧架构
|
|
133
|
+
```
|
|
134
|
+
App (extends Plugin)
|
|
135
|
+
↓
|
|
136
|
+
Plugin (extends Dependency)
|
|
137
|
+
↓
|
|
138
|
+
Dependency (extends EventEmitter)
|
|
139
|
+
+ HMRManager (组合)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 新架构
|
|
143
|
+
```
|
|
144
|
+
Plugin (extends EventEmitter)
|
|
145
|
+
+ AsyncLocalStorage<Plugin>
|
|
146
|
+
+ usePlugin() / useService()
|
|
147
|
+
+ 内置 watch/reload
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## API 变化
|
|
151
|
+
|
|
152
|
+
### 新增 API
|
|
153
|
+
| API | 说明 |
|
|
154
|
+
|-----|------|
|
|
155
|
+
| `usePlugin()` | 获取或创建当前插件实例 |
|
|
156
|
+
| `useService(name)` | 类型安全的服务访问(支持 await) |
|
|
157
|
+
| `plugin.provide(name, value)` | 提供服务 |
|
|
158
|
+
| `plugin.inject(name)` | 注入服务 |
|
|
159
|
+
| `plugin.watch(callback)` | 监听文件变化 |
|
|
160
|
+
| `plugin.reload()` | 重载插件 |
|
|
161
|
+
| `plugin.dispatch(event)` | 向上冒泡事件 |
|
|
162
|
+
| `plugin.broadcast(event)` | 向下广播事件 |
|
|
163
|
+
|
|
164
|
+
### 移除 API
|
|
165
|
+
| API | 替代方案 |
|
|
166
|
+
|-----|---------|
|
|
167
|
+
| `new App(config)` | `usePlugin()` + import 插件 |
|
|
168
|
+
| `app.hmrManager` | `plugin.watch()` |
|
|
169
|
+
| `Dependency` 类 | 移除,Plugin 直接继承 EventEmitter |
|
|
170
|
+
| `app.start()` | `plugin.start()` |
|
|
171
|
+
|
|
172
|
+
### 保持兼容
|
|
173
|
+
- ✅ 生命周期事件: `mounted`, `dispose`
|
|
174
|
+
- ✅ 插件方法: `onMounted()`, `onDispose()`
|
|
175
|
+
- ✅ 插件树: `children`, `parent`, `root`
|
|
176
|
+
- ✅ 适配器管理: `adapters` getter
|
|
177
|
+
|
|
178
|
+
## 下一步工作
|
|
179
|
+
|
|
180
|
+
### 待完成
|
|
181
|
+
1. **删除旧文件**
|
|
182
|
+
- [ ] 删除 `/basic/dependency` 目录
|
|
183
|
+
- [ ] 删除 `/basic/hmr` 目录
|
|
184
|
+
- [ ] 删除 `/packages/core/src/app.ts`
|
|
185
|
+
- [ ] 删除 `/packages/core/src/zhin.ts`(已创建的进程管理器)
|
|
186
|
+
|
|
187
|
+
2. **迁移现有代码**
|
|
188
|
+
- [ ] 重命名 `plugin-new.ts` → `plugin.ts`
|
|
189
|
+
- [ ] 重命名 `worker-new.ts` → `worker.ts`
|
|
190
|
+
- [ ] 更新 CLI 命令 (dev/start)
|
|
191
|
+
|
|
192
|
+
3. **创建配置服务**
|
|
193
|
+
- [ ] 实现 ConfigService 类(参考 zhinjs/next)
|
|
194
|
+
- [ ] 支持环境变量替换 `${VAR:-default}`
|
|
195
|
+
- [ ] 支持嵌套配置访问(点号路径)
|
|
196
|
+
|
|
197
|
+
4. **更新 package.json**
|
|
198
|
+
- [ ] 移除 `@zhin.js/dependency` 依赖
|
|
199
|
+
- [ ] 移除 `@zhin.js/hmr` 依赖
|
|
200
|
+
- [ ] 添加 `./worker` 导出
|
|
201
|
+
|
|
202
|
+
5. **更新 TypeScript 配置**
|
|
203
|
+
- [ ] 修复类型引用
|
|
204
|
+
- [ ] 更新模块扩展
|
|
205
|
+
|
|
206
|
+
6. **测试验证**
|
|
207
|
+
- [ ] 单元测试
|
|
208
|
+
- [ ] 集成测试
|
|
209
|
+
- [ ] 插件加载测试
|
|
210
|
+
|
|
211
|
+
## 风险评估
|
|
212
|
+
|
|
213
|
+
### 已规避风险
|
|
214
|
+
- ✅ **选择渐进式重构** - 新旧代码并存,降低风险
|
|
215
|
+
- ✅ **保留核心 API** - 生命周期、事件系统保持不变
|
|
216
|
+
- ✅ **创建新文件** - 不破坏现有代码
|
|
217
|
+
|
|
218
|
+
### 剩余风险
|
|
219
|
+
- 🟡 **TypeScript 类型** - 需要大量类型定义更新
|
|
220
|
+
- 🟡 **插件兼容性** - 现有插件需要适配
|
|
221
|
+
- 🔴 **依赖包移除** - dependency/hmr 包的清理影响面大
|
|
222
|
+
|
|
223
|
+
## 技术亮点
|
|
224
|
+
|
|
225
|
+
### 1. AsyncLocalStorage 上下文
|
|
226
|
+
- 自动管理插件树结构
|
|
227
|
+
- 无需手动传递 parent 参数
|
|
228
|
+
- 支持异步调用链
|
|
229
|
+
|
|
230
|
+
### 2. Proxy 服务访问
|
|
231
|
+
```typescript
|
|
232
|
+
const service = useService('config');
|
|
233
|
+
service.get('key'); // 同步访问
|
|
234
|
+
await service; // 异步等待
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 3. 文件监听优化
|
|
238
|
+
```typescript
|
|
239
|
+
plugin.watch((p) => {
|
|
240
|
+
p.reload(); // 自动重载
|
|
241
|
+
}, true); // 递归监听子插件
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 4. 混合依赖注入
|
|
245
|
+
1. **向上查找** - 从父链继承服务
|
|
246
|
+
2. **全局查找** - 跨插件共享服务
|
|
247
|
+
3. **缓存优化** - 减少查找开销
|
|
248
|
+
|
|
249
|
+
## 参考资源
|
|
250
|
+
|
|
251
|
+
- [zhinjs/next 源码](https://github.com/zhinjs/next)
|
|
252
|
+
- [Hooks 实现](https://github.com/zhinjs/next/blob/main/src/hooks.ts)
|
|
253
|
+
- [worker.ts 示例](https://github.com/zhinjs/next/blob/main/src/worker.ts)
|
|
254
|
+
- [AsyncLocalStorage 文档](https://nodejs.org/api/async_context.html#class-asynclocalstorage)
|
|
255
|
+
|
|
256
|
+
## 总结
|
|
257
|
+
|
|
258
|
+
✅ 成功创建新架构的核心文件
|
|
259
|
+
✅ 移除 Dependency/HMR 依赖,简化架构
|
|
260
|
+
✅ 采用 AsyncLocalStorage 实现上下文管理
|
|
261
|
+
✅ 保持向后兼容,降低迁移成本
|
|
262
|
+
|
|
263
|
+
**当前状态**: 新架构已就绪,等待迁移和测试验证。
|
package/lib/adapter.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { Bot } from "./bot.js";
|
|
2
2
|
import { Plugin } from "./plugin.js";
|
|
3
|
+
import { EventEmitter } from "events";
|
|
4
|
+
import { Message } from "./message.js";
|
|
5
|
+
import { SendOptions } from "./types.js";
|
|
3
6
|
/**
|
|
4
7
|
* Adapter类:适配器抽象,管理多平台Bot实例。
|
|
5
8
|
* 负责根据配置启动/关闭各平台机器人,统一异常处理。
|
|
6
9
|
*/
|
|
7
|
-
export declare class Adapter<R extends Bot = Bot> {
|
|
8
|
-
|
|
9
|
-
name:
|
|
10
|
+
export declare abstract class Adapter<R extends Bot = Bot> extends EventEmitter<Adapter.Lifecycle> {
|
|
11
|
+
plugin: Plugin;
|
|
12
|
+
name: keyof Plugin.Contexts;
|
|
13
|
+
config: Adapter.BotConfig<R>[];
|
|
10
14
|
/** 当前适配器下所有Bot实例,key为bot名称 */
|
|
11
15
|
bots: Map<string, R>;
|
|
12
16
|
/**
|
|
@@ -14,28 +18,49 @@ export declare class Adapter<R extends Bot = Bot> {
|
|
|
14
18
|
* @param name 适配器名称(如 'process'、'qq' 等)
|
|
15
19
|
* @param botFactory Bot工厂函数或构造器
|
|
16
20
|
*/
|
|
17
|
-
constructor(name:
|
|
18
|
-
createBot(config: Adapter.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
mounted(plugin: Plugin): Promise<void>;
|
|
21
|
+
constructor(plugin: Plugin, name: keyof Plugin.Contexts, config: Adapter.BotConfig<R>[]);
|
|
22
|
+
abstract createBot(config: Adapter.BotConfig<R>): R;
|
|
23
|
+
get logger(): import("@zhin.js/logger").Logger;
|
|
24
|
+
binding(plugin: Plugin): void;
|
|
25
|
+
start(): Promise<void>;
|
|
24
26
|
/**
|
|
25
27
|
* 停止适配器,断开并移除所有Bot实例
|
|
26
28
|
* @param plugin 所属插件实例
|
|
27
29
|
*/
|
|
28
|
-
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export interface Adapters {
|
|
29
33
|
}
|
|
30
34
|
export declare namespace Adapter {
|
|
31
|
-
type
|
|
32
|
-
new (config:
|
|
33
|
-
} : {
|
|
34
|
-
new (config: Bot.Config): T;
|
|
35
|
+
type Factory<R extends Adapter = Adapter> = {
|
|
36
|
+
new (plugin: Plugin, name: string, config: Adapter.BotConfig<Adapter.InferBot<R>>[]): R;
|
|
35
37
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
interface Lifecycle {
|
|
39
|
+
'message.receive': [Message];
|
|
40
|
+
'message.private.receive': [Message];
|
|
41
|
+
'message.group.receive': [Message];
|
|
42
|
+
'message.channel.receive': [Message];
|
|
43
|
+
'call.recallMessage': [string, string];
|
|
44
|
+
'call.sendMessage': [string, SendOptions];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 适配器工厂注册表
|
|
48
|
+
* 灵感来源于 zhinjs/next 的 Adapter.Registry
|
|
49
|
+
*/
|
|
50
|
+
const Registry: Map<string, Factory<Adapter<Bot<{}, {}>>>>;
|
|
51
|
+
type InferBot<R extends Adapter = Adapter> = R extends Adapter<infer T> ? T : never;
|
|
52
|
+
type BotConfig<T extends Bot> = T extends Bot<infer R> ? R : never;
|
|
53
|
+
type BotMessage<T extends Bot> = T extends Bot<infer _L, infer R> ? R : never;
|
|
54
|
+
/**
|
|
55
|
+
* 注册适配器工厂
|
|
56
|
+
*
|
|
57
|
+
* @param name 适配器名称
|
|
58
|
+
* @param factory 适配器工厂函数
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* Adapter.register('icqq', IcqqAdapter);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
function register(name: string, factory: Factory): void;
|
|
40
65
|
}
|
|
41
66
|
//# sourceMappingURL=adapter.d.ts.map
|
package/lib/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAqB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,8BAAsB,OAAO,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;IAS/E,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM,MAAM,CAAC,QAAQ;IAC3B,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAVvC,8BAA8B;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAwB;IACnD;;;;OAIG;gBAEM,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,MAAM,CAAC,QAAQ,EAC3B,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAyBvC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,IAAI,MAAM,qCAGT;IACD,OAAO,CAAC,MAAM,EAAE,MAAM;IAGhB,KAAK;IAYX;;;OAGG;IACG,IAAI;CA6BX;AACD,MAAM,WAAW,QAAQ;CAAG;AAC5B,yBAAiB,OAAO,CAAC;IACvB,KAAY,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI;QACjD,KACA,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAChD,CAAC,CAAA;KACF,CAAC;IACF,UAAiB,SAAS;QACxB,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7B,yBAAyB,EAAE,CAAC,OAAO,CAAC,CAAC;QACrC,uBAAuB,EAAE,CAAC,OAAO,CAAC,CAAC;QACnC,yBAAyB,EAAE,CAAC,OAAO,CAAC,CAAC;QACrC,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;KAC3C;IACD;;;OAGG;IACI,MAAM,QAAQ,4CAA6B,CAAC;IACnD,KAAY,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAC,OAAO,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GACxE,CAAC,GACD,KAAK,CAAC;IACV,KAAY,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1E,KAAY,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,GACpE,CAAC,GACD,KAAK,CAAC;IACV;;;;;;;;;OASG;IACH,SAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,QAEtD;CACF"}
|