alemonjs 2.1.0-alpha.20 → 2.1.0-alpha.22
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/lib/app/event-group.d.ts +11 -0
- package/lib/app/event-group.js +28 -0
- package/lib/app/event-middleware.js +3 -2
- package/lib/cbp/config.js +5 -1
- package/lib/cbp/index.js +181 -157
- package/lib/cbp/testone.js +18 -0
- package/lib/core/config.js +1 -1
- package/lib/global.d.ts +10 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +1 -0
- package/lib/main.js +1 -0
- package/lib/typing/event/index.d.ts +4 -2
- package/package.json +13 -12
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 定义一组标准执行导出
|
|
3
|
+
* @param calls
|
|
4
|
+
* @returns
|
|
5
|
+
*/
|
|
6
|
+
const onGroup = (...calls) => {
|
|
7
|
+
if (calls.length === 0) {
|
|
8
|
+
throw new Error('onGroup: 至少需要一个响应或中间件');
|
|
9
|
+
}
|
|
10
|
+
const firstItem = calls[0];
|
|
11
|
+
const baseSelects = firstItem.select;
|
|
12
|
+
// 把如果item是数组的,豆扁平起来。
|
|
13
|
+
const currents = calls.reduce((acc, item) => {
|
|
14
|
+
if (Array.isArray(item.current)) {
|
|
15
|
+
return acc.concat(item.current);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return acc.concat(item.current);
|
|
19
|
+
}
|
|
20
|
+
}, []);
|
|
21
|
+
return {
|
|
22
|
+
select: baseSelects,
|
|
23
|
+
current: currents
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
global.onGroup = onGroup;
|
|
27
|
+
|
|
28
|
+
export { onGroup };
|
|
@@ -36,8 +36,9 @@ global.onMiddleware = onMiddleware;
|
|
|
36
36
|
* @param callback
|
|
37
37
|
* @returns
|
|
38
38
|
*/
|
|
39
|
-
const OnMiddleware = (
|
|
40
|
-
return onMiddleware(
|
|
39
|
+
const OnMiddleware = (callback, select) => {
|
|
40
|
+
return onMiddleware(select, callback);
|
|
41
41
|
};
|
|
42
|
+
global.OnMiddleware = OnMiddleware;
|
|
42
43
|
|
|
43
44
|
export { OnMiddleware, onMiddleware };
|
package/lib/cbp/config.js
CHANGED
|
@@ -9,6 +9,10 @@ const fullClient = new Map();
|
|
|
9
9
|
const deviceId = v4();
|
|
10
10
|
// 连接类型
|
|
11
11
|
const USER_AGENT_HEADER = 'user-agent';
|
|
12
|
+
//
|
|
13
|
+
const USER_AGENT_HEADER_VALUE_MAP = {
|
|
14
|
+
platform: 'platform',
|
|
15
|
+
client: 'client'};
|
|
12
16
|
// 设备 ID
|
|
13
17
|
const DEVICE_ID_HEADER = 'x-device-id';
|
|
14
18
|
// 是否全量接收
|
|
@@ -34,4 +38,4 @@ const reconnectInterval = 1000 * 6; // 6秒
|
|
|
34
38
|
// 心跳间隔
|
|
35
39
|
const HEARTBEAT_INTERVAL = 1000 * 18; // 18秒
|
|
36
40
|
|
|
37
|
-
export { DEVICE_ID_HEADER, FULL_RECEIVE_HEADER, HEARTBEAT_INTERVAL, USER_AGENT_HEADER, actionResolves, actionTimeouts, apiResolves, apiTimeouts, childrenBind, childrenClient, deviceId, fullClient, generateUniqueId, platformClient, reconnectInterval, timeoutTime };
|
|
41
|
+
export { DEVICE_ID_HEADER, FULL_RECEIVE_HEADER, HEARTBEAT_INTERVAL, USER_AGENT_HEADER, USER_AGENT_HEADER_VALUE_MAP, actionResolves, actionTimeouts, apiResolves, apiTimeouts, childrenBind, childrenClient, deviceId, fullClient, generateUniqueId, platformClient, reconnectInterval, timeoutTime };
|
package/lib/cbp/index.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import Koa from 'koa';
|
|
2
2
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
3
3
|
import router from './router.js';
|
|
4
|
-
import koaStatic from 'koa-static';
|
|
5
4
|
import koaCors from '@koa/cors';
|
|
6
5
|
import { ResultCode } from '../core/code.js';
|
|
7
|
-
import { USER_AGENT_HEADER, DEVICE_ID_HEADER, FULL_RECEIVE_HEADER, platformClient,
|
|
6
|
+
import { USER_AGENT_HEADER, USER_AGENT_HEADER_VALUE_MAP, DEVICE_ID_HEADER, FULL_RECEIVE_HEADER, platformClient, fullClient, childrenClient, childrenBind } from './config.js';
|
|
8
7
|
import { getConfig } from '../core/config.js';
|
|
9
8
|
import * as flattedJSON from 'flatted';
|
|
9
|
+
import { connectionTestOne } from './testone.js';
|
|
10
10
|
|
|
11
11
|
const cbpServer = (port, listeningListener) => {
|
|
12
12
|
if (global.chatbotServer) {
|
|
13
13
|
delete global.chatbotServer;
|
|
14
14
|
}
|
|
15
|
+
// create
|
|
15
16
|
const app = new Koa();
|
|
17
|
+
// MessageRouter
|
|
16
18
|
app.use(router.routes());
|
|
17
19
|
app.use(router.allowedMethods());
|
|
18
|
-
//
|
|
19
|
-
app.use(koaStatic('/gui'));
|
|
20
|
-
// 允许跨域
|
|
20
|
+
// Cors
|
|
21
21
|
app.use(koaCors({
|
|
22
22
|
origin: '*', // 允许所有来源
|
|
23
23
|
allowMethods: ['GET', 'POST', 'PUT', 'DELETE'] // 允许的 HTTP 方法
|
|
@@ -43,6 +43,149 @@ const cbpServer = (port, listeningListener) => {
|
|
|
43
43
|
}
|
|
44
44
|
// 设置平台客户端
|
|
45
45
|
platformClient.set(originId, ws);
|
|
46
|
+
// 处理api
|
|
47
|
+
const handleApi = (DeviceId, message) => {
|
|
48
|
+
// 指定的设备 处理消费。终端有记录每个客户端是谁
|
|
49
|
+
if (childrenClient.has(DeviceId)) {
|
|
50
|
+
const clientWs = childrenClient.get(DeviceId);
|
|
51
|
+
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
52
|
+
// 发送消息到指定的子客户端
|
|
53
|
+
clientWs.send(message);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// 如果连接已关闭,删除该客户端
|
|
57
|
+
childrenClient.delete(DeviceId);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (fullClient.has(DeviceId)) {
|
|
61
|
+
const clientWs = fullClient.get(DeviceId);
|
|
62
|
+
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
63
|
+
// 发送消息到指定的全量客户端
|
|
64
|
+
clientWs.send(message);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// 如果连接已关闭,删除该客户端
|
|
68
|
+
fullClient.delete(DeviceId);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
// 处理 action
|
|
73
|
+
const handleAction = (DeviceId, message) => {
|
|
74
|
+
if (childrenClient.has(DeviceId)) {
|
|
75
|
+
const clientWs = childrenClient.get(DeviceId);
|
|
76
|
+
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
77
|
+
// 发送消息到指定的子客户端
|
|
78
|
+
clientWs.send(message);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// 如果连接已关闭,删除该客户端
|
|
82
|
+
childrenClient.delete(DeviceId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (fullClient.has(DeviceId)) {
|
|
86
|
+
const clientWs = fullClient.get(DeviceId);
|
|
87
|
+
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
88
|
+
// 发送消息到指定的全量客户端
|
|
89
|
+
clientWs.send(message);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// 如果连接已关闭,删除该客户端
|
|
93
|
+
fullClient.delete(DeviceId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
// 处理事件
|
|
98
|
+
const handleEvent = (message, ID) => {
|
|
99
|
+
// 全量客户端
|
|
100
|
+
fullClient.forEach((clientWs, clientId) => {
|
|
101
|
+
// 检查状态 并检查状态
|
|
102
|
+
if (clientWs.readyState === WebSocket.OPEN) {
|
|
103
|
+
clientWs.send(message);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// 如果连接已关闭,删除该客户端
|
|
107
|
+
childrenClient.delete(clientId);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// 根据所在群进行分流。
|
|
111
|
+
// 确保同一个频道的消息。都流向同一个客户端。
|
|
112
|
+
if (!ID) {
|
|
113
|
+
logger.error({
|
|
114
|
+
code: ResultCode.Fail,
|
|
115
|
+
message: '消息缺少标识符 ID',
|
|
116
|
+
data: null
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// 重新绑定并发送消息
|
|
121
|
+
const reBind = () => {
|
|
122
|
+
if (childrenClient.size === 0) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
else if (childrenClient.size === 1) {
|
|
126
|
+
// 只有一个客户端,直接绑定
|
|
127
|
+
const [bindId, clientWs] = childrenClient.entries().next().value;
|
|
128
|
+
childrenBind.set(ID, bindId);
|
|
129
|
+
clientWs.send(message);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// 有多个客户端,找到绑定最少的那个。
|
|
133
|
+
// 如果大家都一样。就拿最近的第一个直接绑定。
|
|
134
|
+
let minBindCount = Infinity;
|
|
135
|
+
let bindId = null;
|
|
136
|
+
childrenClient.forEach((_, id) => {
|
|
137
|
+
const count = Array.from(childrenBind.values()).filter(v => v === id).length;
|
|
138
|
+
if (count < minBindCount) {
|
|
139
|
+
minBindCount = count;
|
|
140
|
+
bindId = id;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
if (bindId) {
|
|
144
|
+
const clientWs = childrenClient.get(bindId);
|
|
145
|
+
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
146
|
+
// 进行绑定
|
|
147
|
+
childrenBind.set(ID, bindId);
|
|
148
|
+
// 发送消息到绑定的客户端
|
|
149
|
+
clientWs.send(message);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// 如果连接已关闭,删除该客户端
|
|
153
|
+
childrenClient.delete(bindId);
|
|
154
|
+
// 重新进行绑定
|
|
155
|
+
reBind();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
logger.error({
|
|
160
|
+
code: ResultCode.Fail,
|
|
161
|
+
message: '服务端出现意外,无法绑定客户端',
|
|
162
|
+
data: null
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
// 判断该id是否被分配过
|
|
167
|
+
if (!childrenBind.has(ID)) {
|
|
168
|
+
// 进行绑定
|
|
169
|
+
reBind();
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const bindId = childrenBind.get(ID);
|
|
173
|
+
if (!childrenClient.has(bindId)) {
|
|
174
|
+
// 出现意外。
|
|
175
|
+
// 重新进行绑定。
|
|
176
|
+
reBind();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const clientWs = childrenClient.get(bindId);
|
|
180
|
+
if (!clientWs || clientWs.readyState !== WebSocket.OPEN) {
|
|
181
|
+
// 如果连接已关闭,删除该客户端
|
|
182
|
+
childrenClient.delete(bindId);
|
|
183
|
+
// 重新进行绑定
|
|
184
|
+
reBind();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
clientWs.send(message);
|
|
188
|
+
};
|
|
46
189
|
// 得到平台客户端的消息
|
|
47
190
|
ws.on('message', (message) => {
|
|
48
191
|
try {
|
|
@@ -51,6 +194,7 @@ const cbpServer = (port, listeningListener) => {
|
|
|
51
194
|
// 1. 解析得到 actionId ,说明是消费行为请求。要广播告诉所有客户端。
|
|
52
195
|
// 2. 解析得到 name ,说明是一个事件请求。
|
|
53
196
|
// 3. 解析得到 apiId ,说明是一个接口请求。
|
|
197
|
+
// 4. 解析得到 testID ,说明是一个测试请求。
|
|
54
198
|
logger.debug({
|
|
55
199
|
code: ResultCode.Ok,
|
|
56
200
|
message: '服务端接收到消息',
|
|
@@ -59,146 +203,19 @@ const cbpServer = (port, listeningListener) => {
|
|
|
59
203
|
if (parsedMessage.apiId) {
|
|
60
204
|
// 指定的设备 处理消费。终端有记录每个客户端是谁
|
|
61
205
|
const DeviceId = parsedMessage.DeviceId;
|
|
62
|
-
|
|
63
|
-
const clientWs = childrenClient.get(DeviceId);
|
|
64
|
-
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
65
|
-
// 发送消息到指定的子客户端
|
|
66
|
-
clientWs.send(message);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
// 如果连接已关闭,删除该客户端
|
|
70
|
-
childrenClient.delete(DeviceId);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else if (fullClient.has(DeviceId)) {
|
|
74
|
-
const clientWs = fullClient.get(DeviceId);
|
|
75
|
-
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
76
|
-
// 发送消息到指定的全量客户端
|
|
77
|
-
clientWs.send(message);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
// 如果连接已关闭,删除该客户端
|
|
81
|
-
fullClient.delete(DeviceId);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
206
|
+
handleApi(DeviceId, message);
|
|
84
207
|
}
|
|
85
208
|
else if (parsedMessage?.actionId) {
|
|
86
209
|
// 指定的设备 处理消费。终端有记录每个客户端是谁
|
|
87
210
|
const DeviceId = parsedMessage.DeviceId;
|
|
88
|
-
|
|
89
|
-
const clientWs = childrenClient.get(DeviceId);
|
|
90
|
-
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
91
|
-
// 发送消息到指定的子客户端
|
|
92
|
-
clientWs.send(message);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
// 如果连接已关闭,删除该客户端
|
|
96
|
-
childrenClient.delete(DeviceId);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else if (fullClient.has(DeviceId)) {
|
|
100
|
-
const clientWs = fullClient.get(DeviceId);
|
|
101
|
-
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
102
|
-
// 发送消息到指定的全量客户端
|
|
103
|
-
clientWs.send(message);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
// 如果连接已关闭,删除该客户端
|
|
107
|
-
fullClient.delete(DeviceId);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
211
|
+
handleAction(DeviceId, message);
|
|
110
212
|
}
|
|
111
213
|
else if (parsedMessage?.name) {
|
|
112
|
-
// 全量客户端
|
|
113
|
-
fullClient.forEach((clientWs, clientId) => {
|
|
114
|
-
// 检查状态 并检查状态
|
|
115
|
-
if (clientWs.readyState === WebSocket.OPEN) {
|
|
116
|
-
clientWs.send(message);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
// 如果连接已关闭,删除该客户端
|
|
120
|
-
childrenClient.delete(clientId);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
// 根据所在群进行分流。
|
|
124
|
-
// 确保同一个频道的消息。都流向同一个客户端。
|
|
125
214
|
const ID = parsedMessage.ChannelId || parsedMessage.GuildId || parsedMessage.DeviceId;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
data: null
|
|
131
|
-
});
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
// 重新绑定并发送消息
|
|
135
|
-
const reBind = () => {
|
|
136
|
-
if (childrenClient.size === 0) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
else if (childrenClient.size === 1) {
|
|
140
|
-
// 只有一个客户端,直接绑定
|
|
141
|
-
const [bindId, clientWs] = childrenClient.entries().next().value;
|
|
142
|
-
childrenBind.set(ID, bindId);
|
|
143
|
-
clientWs.send(message);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
// 有多个客户端,找到绑定最少的那个。
|
|
147
|
-
// 如果大家都一样。就拿最近的第一个直接绑定。
|
|
148
|
-
let minBindCount = Infinity;
|
|
149
|
-
let bindId = null;
|
|
150
|
-
childrenClient.forEach((_, id) => {
|
|
151
|
-
const count = Array.from(childrenBind.values()).filter(v => v === id).length;
|
|
152
|
-
if (count < minBindCount) {
|
|
153
|
-
minBindCount = count;
|
|
154
|
-
bindId = id;
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
if (bindId) {
|
|
158
|
-
const clientWs = childrenClient.get(bindId);
|
|
159
|
-
if (clientWs && clientWs.readyState === WebSocket.OPEN) {
|
|
160
|
-
// 进行绑定
|
|
161
|
-
childrenBind.set(ID, bindId);
|
|
162
|
-
// 发送消息到绑定的客户端
|
|
163
|
-
clientWs.send(message);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
// 如果连接已关闭,删除该客户端
|
|
167
|
-
childrenClient.delete(bindId);
|
|
168
|
-
// 重新进行绑定
|
|
169
|
-
reBind();
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
logger.error({
|
|
174
|
-
code: ResultCode.Fail,
|
|
175
|
-
message: '服务端出现意外,无法绑定客户端',
|
|
176
|
-
data: null
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
// 判断该id是否被分配过
|
|
181
|
-
if (!childrenBind.has(ID)) {
|
|
182
|
-
// 进行绑定
|
|
183
|
-
reBind();
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
const bindId = childrenBind.get(ID);
|
|
187
|
-
if (!childrenClient.has(bindId)) {
|
|
188
|
-
// 出现意外。
|
|
189
|
-
// 重新进行绑定。
|
|
190
|
-
reBind();
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
const clientWs = childrenClient.get(bindId);
|
|
194
|
-
if (!clientWs || clientWs.readyState !== WebSocket.OPEN) {
|
|
195
|
-
// 如果连接已关闭,删除该客户端
|
|
196
|
-
childrenClient.delete(bindId);
|
|
197
|
-
// 重新进行绑定
|
|
198
|
-
reBind();
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
clientWs.send(message);
|
|
215
|
+
handleEvent(message, ID);
|
|
216
|
+
}
|
|
217
|
+
else if (parsedMessage?.testID) {
|
|
218
|
+
// 继续解析数据。测试请求。
|
|
202
219
|
}
|
|
203
220
|
}
|
|
204
221
|
catch (error) {
|
|
@@ -298,9 +315,14 @@ const cbpServer = (port, listeningListener) => {
|
|
|
298
315
|
};
|
|
299
316
|
// 处理客户端连接
|
|
300
317
|
global.chatbotServer.on('connection', (ws, request) => {
|
|
318
|
+
// 测试平台的连接
|
|
319
|
+
if (request.url === '/testone') {
|
|
320
|
+
connectionTestOne(ws);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
301
323
|
// 读取请求头中的 来源
|
|
302
324
|
const headers = request.headers;
|
|
303
|
-
const origin = headers[USER_AGENT_HEADER] ||
|
|
325
|
+
const origin = headers[USER_AGENT_HEADER] || USER_AGENT_HEADER_VALUE_MAP.client;
|
|
304
326
|
// 来源id
|
|
305
327
|
const originId = headers[DEVICE_ID_HEADER];
|
|
306
328
|
if (!originId) {
|
|
@@ -314,28 +336,30 @@ const cbpServer = (port, listeningListener) => {
|
|
|
314
336
|
data: null
|
|
315
337
|
});
|
|
316
338
|
// 根据来源进行分类
|
|
317
|
-
if (origin ===
|
|
339
|
+
if (origin === USER_AGENT_HEADER_VALUE_MAP.platform) {
|
|
318
340
|
setPlatformClient(originId, ws);
|
|
319
341
|
return;
|
|
320
342
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
343
|
+
else if (origin === USER_AGENT_HEADER_VALUE_MAP.client) {
|
|
344
|
+
// 连接时,需要给客户端发送主动消息
|
|
345
|
+
ws.send(flattedJSON.stringify({
|
|
346
|
+
active: 'sync',
|
|
347
|
+
payload: {
|
|
348
|
+
value: getConfig().value,
|
|
349
|
+
args: getConfig().argv,
|
|
350
|
+
package: {
|
|
351
|
+
version: getConfig().package?.version
|
|
352
|
+
},
|
|
353
|
+
env: {
|
|
354
|
+
login: process.env.login,
|
|
355
|
+
platform: process.env.platform,
|
|
356
|
+
port: process.env.port
|
|
357
|
+
}
|
|
329
358
|
},
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
},
|
|
336
|
-
// 主动消息
|
|
337
|
-
activeId: originId
|
|
338
|
-
}));
|
|
359
|
+
// 主动消息
|
|
360
|
+
activeId: originId
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
339
363
|
const isFullReceive = headers[FULL_RECEIVE_HEADER] === '1';
|
|
340
364
|
// 如果是全量接收
|
|
341
365
|
if (isFullReceive) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param ws
|
|
3
|
+
* @param request
|
|
4
|
+
*/
|
|
5
|
+
const connectionTestOne = (ws, request) => {
|
|
6
|
+
// 处理消息事件
|
|
7
|
+
ws.on('message', (message) => {
|
|
8
|
+
// 支持 读取 文件信息
|
|
9
|
+
logger.info(message.toString());
|
|
10
|
+
});
|
|
11
|
+
// 处理关闭事件
|
|
12
|
+
ws.on('close', () => {
|
|
13
|
+
logger.info('WebSocket connection closed');
|
|
14
|
+
// 可以在这里处理连接关闭的逻辑
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { connectionTestOne };
|
package/lib/core/config.js
CHANGED
package/lib/global.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OnResponseReversalFunc, OnResponseReversalFuncBack, OnMiddlewareReversalFunc, DefineChildrenFunc, OnSelectsFunc, OnDataFormatFunc } from './typing/event/index.js';
|
|
1
|
+
import { OnResponseReversalFunc, OnResponseReversalFuncBack, OnMiddlewareReversalFunc, OnMiddlewareReversalFuncBack, DefineChildrenFunc, OnSelectsFunc, OnDataFormatFunc, OnGroupFunc } from './typing/event/index.js';
|
|
2
2
|
import { StoreChildrenApp } from './typing/store/res.js';
|
|
3
3
|
import { StateSubscribeMap, SubscribeKeysMap } from './typing/subscribe/index.js';
|
|
4
4
|
import { LoggerUtils } from './typing/logger/index.js';
|
|
@@ -53,6 +53,11 @@ declare global {
|
|
|
53
53
|
* 定义中间件
|
|
54
54
|
*/
|
|
55
55
|
var onMiddleware: OnMiddlewareReversalFunc;
|
|
56
|
+
/**
|
|
57
|
+
* 定义中间件
|
|
58
|
+
* @deprecated
|
|
59
|
+
*/
|
|
60
|
+
var OnMiddleware: OnMiddlewareReversalFuncBack;
|
|
56
61
|
/**
|
|
57
62
|
* 定义一个子模块
|
|
58
63
|
*/
|
|
@@ -65,6 +70,10 @@ declare global {
|
|
|
65
70
|
* 定义数据格式
|
|
66
71
|
*/
|
|
67
72
|
var format: OnDataFormatFunc;
|
|
73
|
+
/**
|
|
74
|
+
* 定义一组标准执行
|
|
75
|
+
*/
|
|
76
|
+
var onGroup: OnGroupFunc;
|
|
68
77
|
namespace NodeJS {
|
|
69
78
|
interface ProcessEnv {
|
|
70
79
|
login?: string;
|
package/lib/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export { PublicEventMessageCreate, PublicEventMessageDelete, PublicEventMessageR
|
|
|
11
11
|
export { PrivateEventMessageCreate, PrivateEventMessageDelete, PrivateEventMessageUpdate } from './typing/event/message/private.message.js';
|
|
12
12
|
export { PrivateEventRequestFriendAdd, PrivateEventRequestGuildAdd } from './typing/event/request/index.js';
|
|
13
13
|
export { ActionsEventEnum } from './typing/event/actions.js';
|
|
14
|
-
export { Current, CurrentResult, CurrentResultValue, DefineChildrenCallback, DefineChildrenFunc, DefineChildrenValue, DefinePlatformCallback, DefinePlatformFunc, DefinePlatformValue, OnDataFormatFunc, OnMiddlewareFunc, OnMiddlewareReversalFunc, OnMiddlewareReversalFuncBack, OnMiddlewareValue, OnResponseFunc, OnResponseReversalFunc, OnResponseReversalFuncBack, OnResponseValue, OnSelectsFunc } from './typing/event/index.js';
|
|
14
|
+
export { Current, CurrentResult, CurrentResultValue, DefineChildrenCallback, DefineChildrenFunc, DefineChildrenValue, DefinePlatformCallback, DefinePlatformFunc, DefinePlatformValue, OnDataFormatFunc, OnGroupFunc, OnGroupItem, OnMiddlewareFunc, OnMiddlewareReversalFunc, OnMiddlewareReversalFuncBack, OnMiddlewareValue, OnResponseFunc, OnResponseReversalFunc, OnResponseReversalFuncBack, OnResponseValue, OnSelectsFunc } from './typing/event/index.js';
|
|
15
15
|
export { EventKeys, Events, EventsEnum, EventsMessageCreate, EventsMessageCreateEnum, EventsMessageCreateKeys } from './typing/event/map.js';
|
|
16
16
|
export { LoggerUtils } from './typing/logger/index.js';
|
|
17
17
|
export { ClientAPI, ClientAPIMessageResult } from './typing/client/index.js';
|
|
@@ -21,6 +21,7 @@ export { StateSubscribeMap, SubscribeKeysMap, SubscribeMap, SubscribeValue } fro
|
|
|
21
21
|
export { core, logger } from './global.js';
|
|
22
22
|
export { ConfigCore, getConfig, getConfigValue } from './core/config.js';
|
|
23
23
|
export { defineChildren } from './app/define-chidren.js';
|
|
24
|
+
export { onGroup } from './app/event-group.js';
|
|
24
25
|
export { OnMiddleware, onMiddleware } from './app/event-middleware.js';
|
|
25
26
|
export { OnProcessor, onProcessor } from './app/event-processor.js';
|
|
26
27
|
export { OnResponse, onResponse } from './app/event-response.js';
|
package/lib/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export { ActionsEventEnum } from './typing/event/actions.js';
|
|
|
2
2
|
export { core, logger } from './global.js';
|
|
3
3
|
export { ConfigCore, getConfig, getConfigValue } from './core/config.js';
|
|
4
4
|
export { defineChildren } from './app/define-chidren.js';
|
|
5
|
+
export { onGroup } from './app/event-group.js';
|
|
5
6
|
export { OnMiddleware, onMiddleware } from './app/event-middleware.js';
|
|
6
7
|
export { OnProcessor, onProcessor } from './app/event-processor.js';
|
|
7
8
|
export { OnResponse, onResponse } from './app/event-response.js';
|
package/lib/main.js
CHANGED
|
@@ -2,6 +2,7 @@ import { getConfig, getConfigValue } from './core/config.js';
|
|
|
2
2
|
import { loadChildren, loadChildrenFile } from './app/load.js';
|
|
3
3
|
import { getInputExportPath } from './core/utils.js';
|
|
4
4
|
import './app/define-chidren.js';
|
|
5
|
+
import './app/event-group.js';
|
|
5
6
|
import './app/event-middleware.js';
|
|
6
7
|
import './app/event-processor.js';
|
|
7
8
|
import './app/event-response.js';
|
|
@@ -42,7 +42,7 @@ type OnMiddlewareReversalFunc = <T extends EventKeys, C extends Current<T> | Cur
|
|
|
42
42
|
* 废弃
|
|
43
43
|
* @deprecated
|
|
44
44
|
*/
|
|
45
|
-
type OnMiddlewareReversalFuncBack = <
|
|
45
|
+
type OnMiddlewareReversalFuncBack = <C extends Current<T> | Current<T>[], T extends EventKeys>(callback: C, select: T | T[]) => OnMiddlewareValue<C, T>;
|
|
46
46
|
/**
|
|
47
47
|
*
|
|
48
48
|
*/
|
|
@@ -88,5 +88,7 @@ type OnSelectsFunc = <T extends EventKeys[] | EventKeys>(values: T) => T;
|
|
|
88
88
|
* 定义数据格式
|
|
89
89
|
*/
|
|
90
90
|
type OnDataFormatFunc = (...data: DataEnums[]) => DataEnums[];
|
|
91
|
+
type OnGroupItem<C = any, T extends EventKeys = EventKeys> = OnResponseValue<C, T> | OnMiddlewareValue<C, T>;
|
|
92
|
+
type OnGroupFunc = <C, T extends EventKeys, TFirst extends OnGroupItem<C, T>>(...calls: [TFirst, ...Array<TFirst>]) => TFirst;
|
|
91
93
|
|
|
92
|
-
export type { Current, CurrentResult, CurrentResultValue, DefineChildrenCallback, DefineChildrenFunc, DefineChildrenValue, DefinePlatformCallback, DefinePlatformFunc, DefinePlatformValue, OnDataFormatFunc, OnMiddlewareFunc, OnMiddlewareReversalFunc, OnMiddlewareReversalFuncBack, OnMiddlewareValue, OnResponseFunc, OnResponseReversalFunc, OnResponseReversalFuncBack, OnResponseValue, OnSelectsFunc };
|
|
94
|
+
export type { Current, CurrentResult, CurrentResultValue, DefineChildrenCallback, DefineChildrenFunc, DefineChildrenValue, DefinePlatformCallback, DefinePlatformFunc, DefinePlatformValue, OnDataFormatFunc, OnGroupFunc, OnGroupItem, OnMiddlewareFunc, OnMiddlewareReversalFunc, OnMiddlewareReversalFuncBack, OnMiddlewareValue, OnResponseFunc, OnResponseReversalFunc, OnResponseReversalFuncBack, OnResponseValue, OnSelectsFunc };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alemonjs",
|
|
3
|
-
"version": "2.1.0-alpha.
|
|
3
|
+
"version": "2.1.0-alpha.22",
|
|
4
4
|
"description": "bot script",
|
|
5
5
|
"author": "lemonade",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,29 +25,30 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
+
"@koa/cors": "^5.0.0",
|
|
29
|
+
"axios": "^1.10.0",
|
|
28
30
|
"chalk": "^5.3.0",
|
|
29
31
|
"commander": "^13.1.0",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
+
"file-type": "21.0.0",
|
|
33
|
+
"flatted": "^3.3.3",
|
|
32
34
|
"koa": "^2.15.3",
|
|
33
35
|
"koa-router": "^13.0.1",
|
|
34
36
|
"koa-static": "^5.0.0",
|
|
35
|
-
"
|
|
36
|
-
"ws": "^8.18.0",
|
|
37
|
-
"flatted": "^3.3.3",
|
|
38
|
-
"uuid": "11.1.0",
|
|
37
|
+
"log4js": "^6.9.1",
|
|
39
38
|
"public-ip": "^7.0.1",
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
39
|
+
"qrcode": "^1.5.4",
|
|
40
|
+
"uuid": "11.1.0",
|
|
41
|
+
"ws": "^8.18.0",
|
|
42
|
+
"yaml": "^2.5.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/uuid": "^10.0.0",
|
|
46
45
|
"@types/koa": "^2.15.0",
|
|
47
46
|
"@types/koa-bodyparser": "^4.3.12",
|
|
48
47
|
"@types/koa-mount": "^4.0.5",
|
|
49
48
|
"@types/koa-router": "^7.4.8",
|
|
50
|
-
"@types/koa-static": "^4.0.4"
|
|
49
|
+
"@types/koa-static": "^4.0.4",
|
|
50
|
+
"@types/koa__cors": "^5.0.0",
|
|
51
|
+
"@types/uuid": "^10.0.0"
|
|
51
52
|
},
|
|
52
53
|
"bin": {
|
|
53
54
|
"alemonc": "./bin/alemonc.js"
|