alemonjs 2.1.40 → 2.1.42

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 (80) hide show
  1. package/lib/app/define/define-children.d.ts +8 -0
  2. package/lib/app/define/define-children.js +25 -0
  3. package/lib/app/define/define-middleware.d.ts +2 -0
  4. package/lib/app/define/define-middleware.js +8 -0
  5. package/lib/app/define/define-platform.d.ts +13 -0
  6. package/lib/app/define/define-platform.js +40 -0
  7. package/lib/app/define/define-response.d.ts +2 -0
  8. package/lib/app/define/define-response.js +8 -0
  9. package/lib/app/define/define-router.d.ts +17 -0
  10. package/lib/app/define/define-router.js +34 -0
  11. package/lib/app/event/event-group.d.ts +9 -0
  12. package/lib/app/event/event-group.js +29 -0
  13. package/lib/app/event/event-middleware.d.ts +23 -0
  14. package/lib/app/event/event-middleware.js +44 -0
  15. package/lib/app/event/event-response.d.ts +16 -0
  16. package/lib/app/event/event-response.js +23 -0
  17. package/lib/app/event/event-selects.d.ts +13 -0
  18. package/lib/app/event/event-selects.js +15 -0
  19. package/lib/app/event-processor/event-processor-callHandler.d.ts +1 -0
  20. package/lib/app/event-processor/event-processor-callHandler.js +43 -0
  21. package/lib/app/event-processor/event-processor-cycle.d.ts +14 -0
  22. package/lib/app/event-processor/event-processor-cycle.js +97 -0
  23. package/lib/app/event-processor/event-processor-cycleFiles.d.ts +11 -0
  24. package/lib/app/event-processor/event-processor-cycleFiles.js +147 -0
  25. package/lib/app/event-processor/event-processor-cycleRoute.d.ts +10 -0
  26. package/lib/app/event-processor/event-processor-cycleRoute.js +133 -0
  27. package/lib/app/event-processor/event-processor-event.d.ts +24 -0
  28. package/lib/app/event-processor/event-processor-event.js +41 -0
  29. package/lib/app/event-processor/event-processor-middleware.d.ts +14 -0
  30. package/lib/app/event-processor/event-processor-middleware.js +31 -0
  31. package/lib/app/event-processor/event-processor-subscribe.d.ts +35 -0
  32. package/lib/app/event-processor/event-processor-subscribe.js +115 -0
  33. package/lib/app/event-processor/event-processor.d.ts +17 -0
  34. package/lib/app/event-processor/event-processor.js +207 -0
  35. package/lib/app/hook-use/hook-use-api.d.ts +6 -0
  36. package/lib/app/hook-use/hook-use-api.js +22 -0
  37. package/lib/app/hook-use/hook-use-channel.d.ts +8 -0
  38. package/lib/app/hook-use/hook-use-channel.js +33 -0
  39. package/lib/app/hook-use/hook-use-client.d.ts +7 -0
  40. package/lib/app/hook-use/hook-use-client.js +27 -0
  41. package/lib/app/hook-use/hook-use-me.d.ts +8 -0
  42. package/lib/app/hook-use/hook-use-me.js +45 -0
  43. package/lib/app/hook-use/hook-use-menber.d.ts +8 -0
  44. package/lib/app/hook-use/hook-use-menber.js +59 -0
  45. package/lib/app/hook-use/hook-use-mention.d.ts +23 -0
  46. package/lib/app/hook-use/hook-use-mention.js +105 -0
  47. package/lib/app/hook-use/hook-use-message.d.ts +29 -0
  48. package/lib/app/hook-use/hook-use-message.js +88 -0
  49. package/lib/app/hook-use/hook-use-state.d.ts +30 -0
  50. package/lib/app/hook-use/hook-use-state.js +101 -0
  51. package/lib/app/hook-use/hook-use-subscribe.d.ts +46 -0
  52. package/lib/app/hook-use/hook-use-subscribe.js +143 -0
  53. package/lib/app/hook-use-api.d.ts +11 -20
  54. package/lib/app/hook-use-api.js +88 -50
  55. package/lib/app/index.js +1 -1
  56. package/lib/app/message/message-api.d.ts +69 -0
  57. package/lib/app/message/message-api.js +105 -0
  58. package/lib/app/message/message-format-old.d.ts +143 -0
  59. package/lib/app/message/message-format-old.js +359 -0
  60. package/lib/app/message/message-format.d.ts +215 -0
  61. package/lib/app/message/message-format.js +382 -0
  62. package/lib/app/message-api.d.ts +13 -0
  63. package/lib/app/message-api.js +47 -1
  64. package/lib/app/message-format.old.d.ts +50 -0
  65. package/lib/app/message-format.old.js +217 -0
  66. package/lib/cbp/processor/handle.d.ts +3 -0
  67. package/lib/cbp/processor/handle.js +32 -0
  68. package/lib/index.js +1 -1
  69. package/lib/jsx/index.d.ts +105 -0
  70. package/lib/jsx/index.js +211 -0
  71. package/lib/jsx/jsx-dev-runtime.d.ts +2 -0
  72. package/lib/jsx/jsx-dev-runtime.js +1 -0
  73. package/lib/jsx/jsx-runtime.d.ts +18 -0
  74. package/lib/jsx/jsx-runtime.js +24 -0
  75. package/lib/process/client.js +109 -0
  76. package/lib/store/SinglyLinkedList.d.ts +22 -0
  77. package/lib/store/SinglyLinkedList.js +97 -0
  78. package/lib/store/store.d.ts +127 -0
  79. package/lib/store/store.js +443 -0
  80. package/package.json +1 -1
@@ -0,0 +1,443 @@
1
+ import { SinglyLinkedList } from './SinglyLinkedList.js';
2
+ import { mkdirSync } from 'node:fs';
3
+ import log4js from 'log4js';
4
+
5
+ /**
6
+ * 全部挂在全局变量上,
7
+ * 要求一个nodejs中,
8
+ * 出现不同位置的模块也读取同一个数据
9
+ * @description 存储器
10
+ */
11
+ /**
12
+ * @returns
13
+ */
14
+ const createLogger = () => {
15
+ if (process.env.BROWSER_ENV === 'browser') {
16
+ return {
17
+ // 开发调试
18
+ trace: console.trace.bind(console),
19
+ debug: console.debug.bind(console),
20
+ // 日常
21
+ info: console.info.bind(console),
22
+ mark: console.info.bind(console),
23
+ // 警告
24
+ warn: console.warn.bind(console),
25
+ // 错误
26
+ error: console.error.bind(console),
27
+ // 严重
28
+ fatal: console.error.bind(console)
29
+ };
30
+ }
31
+ const logDir = process.env?.LOG_PATH ?? `./logs/${process.env.LOG_NAME ?? ''}`;
32
+ mkdirSync(logDir, { recursive: true });
33
+ // 当环境被设置为 development 时。被视为 trace
34
+ const level = process.env.NODE_ENV === 'development' ? 'trace' : 'info';
35
+ const hideTime = process.env.LOGGER_TIME === 'false' ? true : false;
36
+ const hideLevel = process.env.LOGGER_LEVEL === 'false' ? true : false;
37
+ let pattern = '';
38
+ if (hideTime && hideLevel) {
39
+ pattern = '%m';
40
+ }
41
+ else if (hideTime && !hideLevel) {
42
+ pattern = '[%p] %m';
43
+ }
44
+ else if (!hideTime && hideLevel) {
45
+ pattern = '[%d{yyyy-MM-dd hh:mm:ss}] %m';
46
+ }
47
+ else {
48
+ pattern = '[%d{yyyy-MM-dd hh:mm:ss}][%p] %m';
49
+ }
50
+ log4js.configure({
51
+ appenders: {
52
+ console: {
53
+ type: 'console',
54
+ layout: {
55
+ type: 'pattern',
56
+ pattern: pattern
57
+ }
58
+ },
59
+ command: {
60
+ type: 'dateFile',
61
+ filename: `${logDir}/command`,
62
+ pattern: 'yyyy-MM-dd.log',
63
+ numBackups: 15,
64
+ alwaysIncludePattern: true,
65
+ layout: {
66
+ type: 'pattern',
67
+ pattern: pattern
68
+ }
69
+ },
70
+ error: {
71
+ type: 'dateFile',
72
+ filename: `${logDir}/error`,
73
+ pattern: 'yyyy-MM-dd.log',
74
+ numBackups: 15,
75
+ alwaysIncludePattern: true,
76
+ layout: {
77
+ type: 'pattern',
78
+ pattern: pattern
79
+ }
80
+ }
81
+ },
82
+ categories: {
83
+ default: { appenders: ['console'], level: level },
84
+ command: { appenders: ['console', 'command'], level: 'info' },
85
+ error: { appenders: ['console', 'command', 'error'], level: 'warn' }
86
+ }
87
+ });
88
+ const defaultLogger = log4js.getLogger('default');
89
+ const commandLogger = log4js.getLogger('command');
90
+ const errorLogger = log4js.getLogger('error');
91
+ return {
92
+ // 开发调试
93
+ trace: defaultLogger.trace.bind(defaultLogger),
94
+ debug: defaultLogger.debug.bind(defaultLogger),
95
+ // 日常
96
+ info: commandLogger.info.bind(commandLogger),
97
+ mark: commandLogger.mark.bind(commandLogger),
98
+ // 警告
99
+ warn: errorLogger.warn.bind(errorLogger),
100
+ // 错误
101
+ error: errorLogger.error.bind(errorLogger),
102
+ // 严重
103
+ fatal: errorLogger.fatal.bind(errorLogger)
104
+ };
105
+ };
106
+ class Logger {
107
+ #logger = null;
108
+ /**
109
+ * 创建一个 logger,如果未存在全局变量则赋值
110
+ * @returns
111
+ */
112
+ constructor() {
113
+ this.#logger = createLogger();
114
+ // 如果已经存在,就返回内部 logger
115
+ if (!global.logger) {
116
+ global.logger = this.#logger;
117
+ }
118
+ }
119
+ get value() {
120
+ return this.#logger;
121
+ }
122
+ }
123
+ class Core {
124
+ constructor() {
125
+ if (!global.alemonjsCore) {
126
+ global.alemonjsCore = {
127
+ storeState: {},
128
+ storeStateSubscribe: {},
129
+ storeSubscribeList: {
130
+ create: new Map(),
131
+ mount: new Map(),
132
+ unmount: new Map()
133
+ },
134
+ storeChildrenApp: {}
135
+ };
136
+ }
137
+ }
138
+ get value() {
139
+ return global.alemonjsCore;
140
+ }
141
+ }
142
+ // Store 版本计数器 — ChildrenApp 注册/卸载时递增,用于脏标记缓存
143
+ let _storeVersion = 0;
144
+ const bumpStoreVersion = () => {
145
+ _storeVersion++;
146
+ };
147
+ class Response {
148
+ #cache = null;
149
+ #cacheVersion = -1;
150
+ get value() {
151
+ if (this.#cacheVersion === _storeVersion && this.#cache !== null) {
152
+ return this.#cache;
153
+ }
154
+ const data = Object.keys(alemonjsCore.storeChildrenApp).map(key => {
155
+ return alemonjsCore.storeChildrenApp[key].response;
156
+ });
157
+ this.#cache = data.flat();
158
+ this.#cacheVersion = _storeVersion;
159
+ return this.#cache;
160
+ }
161
+ }
162
+ class ResponseMiddleware {
163
+ find(name, stateKey) {
164
+ if (typeof name !== 'string' || typeof stateKey !== 'string') {
165
+ return [];
166
+ }
167
+ if (!alemonjsCore.storeChildrenApp[name]) {
168
+ return [];
169
+ }
170
+ const app = alemonjsCore.storeChildrenApp[name];
171
+ if (!app.middlewareResponse) {
172
+ return [];
173
+ }
174
+ // 找根据
175
+ const state = stateKey.split(':');
176
+ // 慢慢的去掉最后一个。并识别是否存在对应的 middlewareResponse
177
+ const mr = [];
178
+ // main:response 不算
179
+ while (state.length > 1) {
180
+ const key = state.join(':');
181
+ if (app.middlewareResponse[key]) {
182
+ mr.push(app.middlewareResponse[key]);
183
+ }
184
+ state.pop();
185
+ }
186
+ return mr;
187
+ }
188
+ }
189
+ class ResponseRouter {
190
+ #cache = null;
191
+ #cacheVersion = -1;
192
+ get value() {
193
+ if (this.#cacheVersion === _storeVersion && this.#cache !== null) {
194
+ return this.#cache;
195
+ }
196
+ const data = Object.keys(alemonjsCore.storeChildrenApp).map(key => {
197
+ if (!alemonjsCore.storeChildrenApp[key].register) {
198
+ return [];
199
+ }
200
+ if (alemonjsCore.storeChildrenApp[key].register?.responseRouter) {
201
+ return alemonjsCore.storeChildrenApp[key].register?.responseRouter?.current ?? [];
202
+ }
203
+ if (alemonjsCore.storeChildrenApp[key].register?.response) {
204
+ return alemonjsCore.storeChildrenApp[key].register?.response?.current ?? [];
205
+ }
206
+ return [];
207
+ });
208
+ this.#cache = data.flat();
209
+ this.#cacheVersion = _storeVersion;
210
+ return this.#cache;
211
+ }
212
+ }
213
+ class MiddlewareRouter {
214
+ #cache = null;
215
+ #cacheVersion = -1;
216
+ get value() {
217
+ if (this.#cacheVersion === _storeVersion && this.#cache !== null) {
218
+ return this.#cache;
219
+ }
220
+ const data = Object.keys(alemonjsCore.storeChildrenApp).map(key => {
221
+ if (!alemonjsCore.storeChildrenApp[key].register) {
222
+ return [];
223
+ }
224
+ if (alemonjsCore.storeChildrenApp[key].register?.middlewareRouter) {
225
+ return alemonjsCore.storeChildrenApp[key].register?.middlewareRouter?.current ?? [];
226
+ }
227
+ if (alemonjsCore.storeChildrenApp[key].register?.middleware) {
228
+ return alemonjsCore.storeChildrenApp[key].register?.middleware?.current ?? [];
229
+ }
230
+ return [];
231
+ });
232
+ this.#cache = data.flat();
233
+ this.#cacheVersion = _storeVersion;
234
+ return this.#cache;
235
+ }
236
+ }
237
+ class Middleware {
238
+ #cache = null;
239
+ #cacheVersion = -1;
240
+ get value() {
241
+ if (this.#cacheVersion === _storeVersion && this.#cache !== null) {
242
+ return this.#cache;
243
+ }
244
+ const data = Object.keys(alemonjsCore.storeChildrenApp).map(key => {
245
+ return alemonjsCore.storeChildrenApp[key].middleware;
246
+ });
247
+ this.#cache = data.flat();
248
+ this.#cacheVersion = _storeVersion;
249
+ return this.#cache;
250
+ }
251
+ }
252
+ class SubscribeList {
253
+ #select;
254
+ #choice;
255
+ constructor(choice, select) {
256
+ this.#select = select;
257
+ this.#choice = choice;
258
+ // 如果不存在,则初始化
259
+ if (!alemonjsCore.storeSubscribeList[this.#choice].has(this.#select)) {
260
+ alemonjsCore.storeSubscribeList[this.#choice].set(this.#select, new SinglyLinkedList());
261
+ }
262
+ }
263
+ get value() {
264
+ return alemonjsCore.storeSubscribeList[this.#choice].get(this.#select);
265
+ }
266
+ }
267
+ /**
268
+ * 纯函数版 SubscribeList 访问 — 避免每次创建类实例的 GC 开销
269
+ */
270
+ const getSubscribeList = (choice, select) => {
271
+ if (!alemonjsCore.storeSubscribeList[choice].has(select)) {
272
+ alemonjsCore.storeSubscribeList[choice].set(select, new SinglyLinkedList());
273
+ }
274
+ return alemonjsCore.storeSubscribeList[choice].get(select);
275
+ };
276
+ class StateSubscribe {
277
+ #name = null;
278
+ constructor(name) {
279
+ this.#name = name;
280
+ if (!alemonjsCore.storeStateSubscribe[name]) {
281
+ alemonjsCore.storeStateSubscribe[name] = [];
282
+ }
283
+ }
284
+ on(callback) {
285
+ alemonjsCore.storeStateSubscribe[this.#name].push(callback);
286
+ }
287
+ un(callback) {
288
+ alemonjsCore.storeStateSubscribe[this.#name] = alemonjsCore.storeStateSubscribe[this.#name].filter(cb => cb !== callback);
289
+ }
290
+ get value() {
291
+ return alemonjsCore.storeStateSubscribe[this.#name];
292
+ }
293
+ }
294
+ /**
295
+ * @deprecated 废弃。指令管理可直接配置禁用正则
296
+ */
297
+ class StateProxy {
298
+ create(value = {}) {
299
+ return new Proxy(value, {
300
+ get(target, prop) {
301
+ return prop in target ? target[prop] : false;
302
+ },
303
+ set(target, prop, value) {
304
+ target[prop] = value;
305
+ // 通知所有订阅者
306
+ if (alemonjsCore.storeStateSubscribe[prop]) {
307
+ for (const callback of alemonjsCore.storeStateSubscribe[prop]) {
308
+ callback(value);
309
+ }
310
+ }
311
+ return true; // 表示设置成功
312
+ }
313
+ });
314
+ }
315
+ }
316
+ /**
317
+ * @deprecated 废弃。指令管理可直接配置禁用正则
318
+ */
319
+ class State {
320
+ #name = null;
321
+ /**
322
+ *
323
+ * @param name
324
+ * @param defaultValue 默认,允许匹配
325
+ */
326
+ constructor(name, defaultValue = true) {
327
+ this.#name = name;
328
+ // 不存在,需要初始化
329
+ if (!alemonjsCore.storeState) {
330
+ // 初始化全局状态
331
+ alemonjsCore.storeState = new StateProxy().create();
332
+ }
333
+ // 如果不存在则设置默认值
334
+ if (!(name in alemonjsCore.storeState)) {
335
+ alemonjsCore.storeState[name] = defaultValue;
336
+ }
337
+ }
338
+ get value() {
339
+ return alemonjsCore.storeState[this.#name];
340
+ }
341
+ set value(value) {
342
+ alemonjsCore.storeState[this.#name] = value;
343
+ }
344
+ }
345
+ class ChildrenApp {
346
+ // 名字
347
+ #name = null;
348
+ // 中间件
349
+ #middleware = [];
350
+ // 响应体
351
+ #response = [];
352
+ // 响应体下的中间件
353
+ #middlewareResponse = {};
354
+ // 周期
355
+ #cycle = null;
356
+ // create
357
+ constructor(name = 'main') {
358
+ this.#name = name;
359
+ }
360
+ #registerRes = {};
361
+ register(config) {
362
+ this.#registerRes = config;
363
+ }
364
+ /**
365
+ * 推送响应体
366
+ * @param data
367
+ */
368
+ pushResponse(data) {
369
+ this.#response = this.#response.concat(data);
370
+ }
371
+ /**
372
+ * 推送响应下的中间件
373
+ */
374
+ pushResponseMiddleware(data) {
375
+ this.#middlewareResponse = {
376
+ ...this.#middlewareResponse,
377
+ ...data
378
+ };
379
+ }
380
+ /**
381
+ * 推送中间件
382
+ * @param data
383
+ */
384
+ pushMiddleware(data) {
385
+ this.#middleware = this.#middleware.concat(data);
386
+ }
387
+ /**
388
+ * 推送周期
389
+ * @param data
390
+ */
391
+ pushCycle(data) {
392
+ this.#cycle = data;
393
+ }
394
+ /**
395
+ * 挂载
396
+ */
397
+ on() {
398
+ alemonjsCore.storeChildrenApp[this.#name] = {
399
+ name: this.#name,
400
+ middleware: this.#middleware,
401
+ middlewareResponse: this.#middlewareResponse,
402
+ response: this.#response,
403
+ cycle: this.#cycle,
404
+ register: this.#registerRes
405
+ };
406
+ bumpStoreVersion();
407
+ }
408
+ /**
409
+ * 卸载
410
+ */
411
+ un() {
412
+ // 清理
413
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
414
+ delete alemonjsCore.storeChildrenApp[this.#name];
415
+ bumpStoreVersion();
416
+ }
417
+ /**
418
+ * 获取
419
+ */
420
+ get value() {
421
+ if (!alemonjsCore.storeChildrenApp[this.#name]) {
422
+ this.on();
423
+ }
424
+ return alemonjsCore.storeChildrenApp[this.#name];
425
+ }
426
+ }
427
+ const ProcessorEventAutoClearMap = new Map();
428
+ const ProcessorEventUserAutoClearMap = new Map();
429
+ // 初始化日志
430
+ const logger = new Logger().value;
431
+ // 初始化核心数据
432
+ const core = new Core().value;
433
+ // 监听退出
434
+ ['SIGINT', 'SIGTERM', 'SIGQUIT', 'disconnect'].forEach(sig => {
435
+ process?.on?.(sig, () => {
436
+ setImmediate(() => process.exit(0));
437
+ });
438
+ });
439
+ process?.on?.('exit', code => {
440
+ logger.info?.(`[alemonjs][exit] 进程退出,code=${code}`);
441
+ });
442
+
443
+ export { ChildrenApp, Core, Logger, Middleware, MiddlewareRouter, ProcessorEventAutoClearMap, ProcessorEventUserAutoClearMap, Response, ResponseMiddleware, ResponseRouter, State, StateSubscribe, SubscribeList, bumpStoreVersion, core, getSubscribeList, logger };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alemonjs",
3
- "version": "2.1.40",
3
+ "version": "2.1.42",
4
4
  "description": "bot script",
5
5
  "author": "lemonade",
6
6
  "license": "MIT",