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.
@@ -0,0 +1,11 @@
1
+ import { OnGroupFunc } from '../typing/event/index.js';
2
+ import '../global.js';
3
+
4
+ /**
5
+ * 定义一组标准执行导出
6
+ * @param calls
7
+ * @returns
8
+ */
9
+ declare const onGroup: OnGroupFunc;
10
+
11
+ export { onGroup };
@@ -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 = (select, callback) => {
40
- return onMiddleware(callback, select);
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, childrenClient, fullClient, childrenBind } from './config.js';
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
- // 读取静态文件夹 gui
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
- if (childrenClient.has(DeviceId)) {
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
- if (childrenClient.has(DeviceId)) {
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
- if (!ID) {
127
- logger.error({
128
- code: ResultCode.Fail,
129
- message: '消息缺少标识符 ID',
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] || 'client';
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 === 'platform') {
339
+ if (origin === USER_AGENT_HEADER_VALUE_MAP.platform) {
318
340
  setPlatformClient(originId, ws);
319
341
  return;
320
342
  }
321
- // 连接时,需要给客户端发送主动消息
322
- ws.send(flattedJSON.stringify({
323
- active: 'sync',
324
- payload: {
325
- value: getConfig().value,
326
- args: getConfig().argv,
327
- package: {
328
- version: getConfig().package?.version
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
- env: {
331
- login: process.env.login,
332
- platform: process.env.platform,
333
- port: process.env.port
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 };
@@ -161,6 +161,6 @@ const getConfig = () => {
161
161
  /**
162
162
  * @returns
163
163
  */
164
- const getConfigValue = () => getConfig()?.value;
164
+ const getConfigValue = () => getConfig()?.value || {};
165
165
 
166
166
  export { ConfigCore, getConfig, getConfigValue };
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 = <T extends EventKeys, C extends Current<T> | Current<T>[]>(callback: C, select: T | T[]) => OnMiddlewareValue<C, T>;
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.20",
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
- "log4js": "^6.9.1",
31
- "yaml": "^2.5.1",
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
- "@koa/cors": "^5.0.0",
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
- "axios": "^1.10.0",
41
- "file-type": "21.0.0",
42
- "qrcode": "^1.5.4"
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"