mm_os 3.2.9 → 3.3.1
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/README.md +47 -1
- package/core/base/mqtt/index.js +1109 -1106
- package/core/base/web/index.js +245 -156
- package/core/com/event/README.md +4 -4
- package/core/com/event/com.json +3 -3
- package/core/com/event/config.tpl.json +18 -18
- package/core/com/event/drive.js +132 -132
- package/core/com/event/index.js +344 -344
- package/core/com/event/script.js +25 -25
- package/core/com/middleware/com.js +152 -151
- package/core/com/socket/config.tpl.json +2 -2
- package/core/com/socket/drive.js +2 -2
- package/core/com/socket/index.js +1 -1
- package/core/com/sql/drive.js +7 -7
- package/core/com/static/index.js +1 -1
- package/index.js +34 -5
- package/middleware/cors/index.js +112 -96
- package/middleware/cors/middleware.json +18 -7
- package/middleware/csrf/index.js +202 -0
- package/middleware/csrf/middleware.json +24 -0
- package/middleware/ip_firewall/index.js +476 -0
- package/middleware/ip_firewall/middleware.json +109 -0
- package/middleware/mqtt_base/middleware.json +2 -1
- package/middleware/security_audit/index.js +543 -0
- package/middleware/security_audit/middleware.json +48 -0
- package/middleware/waf/index.js +273 -7
- package/middleware/waf/middleware.json +2 -1
- package/middleware/waf_ddos/index.js +520 -0
- package/middleware/waf_ddos/middleware.json +38 -0
- package/middleware/waf_xss/index.js +269 -0
- package/middleware/waf_xss/middleware.json +18 -0
- package/middleware/web_after/middleware.json +2 -1
- package/middleware/web_base/middleware.json +2 -1
- package/middleware/web_before/middleware.json +3 -2
- package/middleware/web_check/middleware.json +2 -1
- package/middleware/web_main/middleware.json +2 -1
- package/middleware/web_proxy/middleware.json +2 -1
- package/middleware/web_render/middleware.json +2 -1
- package/middleware/web_socket/middleware.json +4 -3
- package/middleware/web_static/middleware.json +2 -1
- package/package.json +28 -15
- package/middleware/log/index.js +0 -32
- package/middleware/log/middleware.json +0 -9
- package/middleware/performance/index.js +0 -143
- package/middleware/performance/middleware.json +0 -16
- package/middleware/rate_limit/index.js +0 -112
- package/middleware/rate_limit/middleware.json +0 -10
- package/middleware/waf_ip/index.js +0 -168
- package/middleware/waf_ip/middleware.json +0 -10
- package/nodemon.json +0 -31
- package/package.txt +0 -1
- package/rps.bat +0 -3
- package/test.js +0 -10
- package/tps.bat +0 -3
- package/update.bat +0 -1
- package//347/263/273/347/273/237/346/236/266/346/236/204/350/257/204/344/274/260/344/270/216/344/274/230/345/214/226/345/273/272/350/256/256.md +0 -599
package/core/com/event/index.js
CHANGED
|
@@ -1,345 +1,345 @@
|
|
|
1
|
-
const Index = require('mm_machine').Index;
|
|
2
|
-
const Drive = require('./drive');
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Event事件类
|
|
6
|
-
* @extends {Index}
|
|
7
|
-
* @class
|
|
8
|
-
*/
|
|
9
|
-
class Event extends Index {
|
|
10
|
-
/**
|
|
11
|
-
* 构造函数
|
|
12
|
-
* @param {Object} scope 作用域
|
|
13
|
-
* @param {String} title 标题
|
|
14
|
-
* @constructor
|
|
15
|
-
*/
|
|
16
|
-
constructor(scope, title) {
|
|
17
|
-
super(scope, __dirname);
|
|
18
|
-
this.Drive = Drive;
|
|
19
|
-
this.type = "event";
|
|
20
|
-
this.title = title;
|
|
21
|
-
// 默认启用热更新
|
|
22
|
-
this.mode = 3;
|
|
23
|
-
/* === 验证 === */
|
|
24
|
-
// 验证前
|
|
25
|
-
this.list_before = [];
|
|
26
|
-
// 验证
|
|
27
|
-
this.list_check = [];
|
|
28
|
-
// 执行
|
|
29
|
-
this.list_main = [];
|
|
30
|
-
// 渲染
|
|
31
|
-
this.list_render = [];
|
|
32
|
-
// 渲染后
|
|
33
|
-
this.list_after = [];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* 清除事件
|
|
39
|
-
* @param {String} stage 阶段
|
|
40
|
-
*/
|
|
41
|
-
Event.prototype.clear = function(stage) {
|
|
42
|
-
if (stage) {
|
|
43
|
-
if (this[stage]) {
|
|
44
|
-
this[stage] = [];
|
|
45
|
-
} else {
|
|
46
|
-
$.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
|
|
47
|
-
}
|
|
48
|
-
} else {
|
|
49
|
-
this.list_before = [];
|
|
50
|
-
this.list_check = [];
|
|
51
|
-
this.list_main = [];
|
|
52
|
-
this.list_render = [];
|
|
53
|
-
this.list_after = [];
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* 更新脚本子函数
|
|
60
|
-
*/
|
|
61
|
-
Event.prototype.update_script_sub = async function(list) {
|
|
62
|
-
for (var i = 0; i < list.length; i++) {
|
|
63
|
-
var o = list[i];
|
|
64
|
-
if (o.config.state === 1) {
|
|
65
|
-
await o.exec('load');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 更新脚本
|
|
72
|
-
*/
|
|
73
|
-
Event.prototype.update_script = async function() {
|
|
74
|
-
this.update_script_sub(this.list_before);
|
|
75
|
-
this.update_script_sub(this.list_check);
|
|
76
|
-
this.update_script_sub(this.list_main);
|
|
77
|
-
this.update_script_sub(this.list_render);
|
|
78
|
-
this.update_script_sub(this.list_after);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 加载项
|
|
83
|
-
* @param {String} dir 文件路径
|
|
84
|
-
* @param {Object} cg 配置参数
|
|
85
|
-
* @param {String} file 配置文件
|
|
86
|
-
*/
|
|
87
|
-
Event.prototype.load_item = async function(dir, cg, file) {
|
|
88
|
-
if (this.Drive) {
|
|
89
|
-
var drive = new this.Drive(dir, this.dir_base.fullname());
|
|
90
|
-
drive.mode = this.mode;
|
|
91
|
-
if (cg) {
|
|
92
|
-
await drive.exec('load_config', file, cg.name);
|
|
93
|
-
await drive.exec('set_config', cg);
|
|
94
|
-
} else {
|
|
95
|
-
await drive.exec('load_config', file);
|
|
96
|
-
}
|
|
97
|
-
var key = 'list_' + drive.config.stage;
|
|
98
|
-
var list = this[key];
|
|
99
|
-
if (!list) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
list.push(drive);
|
|
103
|
-
return drive;
|
|
104
|
-
} else {
|
|
105
|
-
var json = file.loadJson();
|
|
106
|
-
if (!json) {
|
|
107
|
-
var fl = this.dir_base + "/config.tpl.json";
|
|
108
|
-
if (fl.hasFile()) {
|
|
109
|
-
fl.copyFile(file);
|
|
110
|
-
json = file.loadJson();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (json) {
|
|
114
|
-
var key = 'list_' + json.stage;
|
|
115
|
-
var list = this[key];
|
|
116
|
-
if (!list) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
list.push(json);
|
|
120
|
-
}
|
|
121
|
-
return json;
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* 事件排序
|
|
127
|
-
* @param {String} list 列表
|
|
128
|
-
*/
|
|
129
|
-
Event.prototype.sort_sub = function(list) {
|
|
130
|
-
list.sort(function(o1, o2) {
|
|
131
|
-
var sort = o1.config.sort - o2.config.sort;
|
|
132
|
-
if (sort === 0) {
|
|
133
|
-
sort = o2.config.target.length - o1.config.target.length;
|
|
134
|
-
}
|
|
135
|
-
return sort;
|
|
136
|
-
});
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* 事件排序
|
|
141
|
-
* @param {String} stage 阶段
|
|
142
|
-
*/
|
|
143
|
-
Event.prototype.sort = function(stage) {
|
|
144
|
-
if (stage) {
|
|
145
|
-
if (this[stage]) {
|
|
146
|
-
this[stage] = [];
|
|
147
|
-
} else {
|
|
148
|
-
$.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
|
|
149
|
-
}
|
|
150
|
-
} else {
|
|
151
|
-
this.sort_sub(this.list_before);
|
|
152
|
-
this.sort_sub(this.list_check);
|
|
153
|
-
this.sort_sub(this.list_main);
|
|
154
|
-
this.sort_sub(this.list_render);
|
|
155
|
-
this.sort_sub(this.list_after);
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* 执行事件
|
|
161
|
-
*/
|
|
162
|
-
Event.prototype.doing = async function(o, ctx, db) {
|
|
163
|
-
var ret = o.run(ctx, db);
|
|
164
|
-
if (types.isPromise(ret)) {
|
|
165
|
-
ret = await ret;
|
|
166
|
-
}
|
|
167
|
-
if (this.mode > 4) {
|
|
168
|
-
o.exec('reload', o.filename);
|
|
169
|
-
}
|
|
170
|
-
return ret;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* 执行函数
|
|
175
|
-
* @param {Array} list 列表
|
|
176
|
-
* @param {String} target 目标
|
|
177
|
-
* @param {Object} ctx 请求上下文
|
|
178
|
-
* @param {Object} db 数据管理器
|
|
179
|
-
* @return {Object} 执行结果
|
|
180
|
-
*/
|
|
181
|
-
Event.prototype.run_sub = async function(list, target, ctx, db) {
|
|
182
|
-
for (var i = 0, o; o = list[i++];) {
|
|
183
|
-
if (o.config.state === 1 && target.has(o.config.target)) {
|
|
184
|
-
var ret = await o.run(ctx, db);
|
|
185
|
-
if (this.mode > 4) {
|
|
186
|
-
o.exec('reload', o.filename);
|
|
187
|
-
}
|
|
188
|
-
if (ret) {
|
|
189
|
-
db.ret = ret;
|
|
190
|
-
if (o.config.end) {
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return db.ret;
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* 之前
|
|
201
|
-
* @param {String} target 目标
|
|
202
|
-
* @param {Object} ctx 请求上下文
|
|
203
|
-
* @param {Object} db 数据管理器
|
|
204
|
-
* @return {Object} 执行结果
|
|
205
|
-
*/
|
|
206
|
-
Event.prototype.before = async function(target, ctx, db) {
|
|
207
|
-
return await this.run_sub(this.list_before, target, ctx, db);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* 验证
|
|
212
|
-
* @param {String} target 目标
|
|
213
|
-
* @param {Object} ctx 请求上下文
|
|
214
|
-
* @param {Object} db 数据管理器
|
|
215
|
-
* @return {Object} 执行结果
|
|
216
|
-
*/
|
|
217
|
-
Event.prototype.check = async function(target, ctx, db) {
|
|
218
|
-
return await this.run_sub(this.list_check, target, ctx, db);
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* 主要
|
|
223
|
-
* @param {String} target 目标
|
|
224
|
-
* @param {Object} ctx 请求上下文
|
|
225
|
-
* @param {Object} db 数据管理器
|
|
226
|
-
* @return {Object} 执行结果
|
|
227
|
-
*/
|
|
228
|
-
Event.prototype.main = async function(target, ctx, db) {
|
|
229
|
-
return await this.run_sub(this.list_main, target, ctx, db);
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* 渲染
|
|
234
|
-
* @param {String} target 目标
|
|
235
|
-
* @param {Object} ctx 请求上下文
|
|
236
|
-
* @param {Object} db 数据管理器
|
|
237
|
-
* @return {Object} 执行结果
|
|
238
|
-
*/
|
|
239
|
-
Event.prototype.render = async function(target, ctx, db) {
|
|
240
|
-
return await this.run_sub(this.list_render, target, ctx, db);
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* 之后
|
|
245
|
-
* @param {String} target 目标
|
|
246
|
-
* @param {Object} ctx 请求上下文
|
|
247
|
-
* @param {Object} db 数据管理器
|
|
248
|
-
* @return {Object} 执行结果
|
|
249
|
-
*/
|
|
250
|
-
Event.prototype.after = async function(target, ctx, db) {
|
|
251
|
-
return await this.run_sub(this.list_after, target, ctx, db);
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* 执行事件
|
|
256
|
-
* @param {String} target 目标
|
|
257
|
-
* @param {Object} ctx 请求上下文
|
|
258
|
-
* @param {Object} db 数据管理器
|
|
259
|
-
* @return {Object} 执行结果
|
|
260
|
-
*/
|
|
261
|
-
Event.prototype.run = async function(target, ctx, db) {
|
|
262
|
-
if (!db) {
|
|
263
|
-
db = {
|
|
264
|
-
ret: null
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
var ret = await this.before(target, ctx, db);
|
|
268
|
-
if (!ret) {
|
|
269
|
-
ret = await this.check(target, ctx, db);
|
|
270
|
-
if (!ret) {
|
|
271
|
-
ret = await this.main(target, ctx, db);
|
|
272
|
-
}
|
|
273
|
-
ret = await this.render(target, ctx, db);
|
|
274
|
-
if (ret) {
|
|
275
|
-
ret = await this.after(target, ctx, db);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return ret;
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* @description 获取事件
|
|
283
|
-
* @param {String} name 名称
|
|
284
|
-
* @param {String} event_type 事件类型
|
|
285
|
-
* @return {Object} 返回单项配置
|
|
286
|
-
*/
|
|
287
|
-
Event.prototype.get = function(name, event_type = 'main') {
|
|
288
|
-
var obj;
|
|
289
|
-
var lt = this['list_' + event_type];
|
|
290
|
-
var len = lt.length;
|
|
291
|
-
for (var i = 0; i < len; i++) {
|
|
292
|
-
var o = lt[i];
|
|
293
|
-
if (name === o.config.name) {
|
|
294
|
-
obj = o;
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
return obj;
|
|
299
|
-
};
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* @description 重载脚本和配置
|
|
303
|
-
* @param {String} file 文件名
|
|
304
|
-
* @return {String} 重载失败返回错误提示,重载成功返回null
|
|
305
|
-
*/
|
|
306
|
-
Event.prototype.reload = async function(name, event_type = 'main') {
|
|
307
|
-
var o = this.get(name, event_type);
|
|
308
|
-
if (o) {
|
|
309
|
-
await o.exec('reload');
|
|
310
|
-
return null;
|
|
311
|
-
}
|
|
312
|
-
return '没有找到模块';
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* @module 导出Event类
|
|
317
|
-
*/
|
|
318
|
-
module.exports = Event;
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Event事件池
|
|
322
|
-
*/
|
|
323
|
-
if (!$.pool.event) {
|
|
324
|
-
$.pool.event = {};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
function event_admin(scope, title) {
|
|
328
|
-
if (!scope) {
|
|
329
|
-
scope = $.val.scope + '';
|
|
330
|
-
}
|
|
331
|
-
var obj = $.pool.event[scope];
|
|
332
|
-
if (!obj) {
|
|
333
|
-
$.pool.event[scope] = new Event(scope, title);
|
|
334
|
-
obj = $.pool.event[scope];
|
|
335
|
-
}
|
|
336
|
-
return obj;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Event管理器,用于创建缓存
|
|
341
|
-
* @param {String} scope 作用域
|
|
342
|
-
* @param {string} title 标题
|
|
343
|
-
* @return {Object} 返回一个缓存类
|
|
344
|
-
*/
|
|
1
|
+
const Index = require('mm_machine').Index;
|
|
2
|
+
const Drive = require('./drive');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Event事件类
|
|
6
|
+
* @extends {Index}
|
|
7
|
+
* @class
|
|
8
|
+
*/
|
|
9
|
+
class Event extends Index {
|
|
10
|
+
/**
|
|
11
|
+
* 构造函数
|
|
12
|
+
* @param {Object} scope 作用域
|
|
13
|
+
* @param {String} title 标题
|
|
14
|
+
* @constructor
|
|
15
|
+
*/
|
|
16
|
+
constructor(scope, title) {
|
|
17
|
+
super(scope, __dirname);
|
|
18
|
+
this.Drive = Drive;
|
|
19
|
+
this.type = "event";
|
|
20
|
+
this.title = title;
|
|
21
|
+
// 默认启用热更新
|
|
22
|
+
this.mode = 3;
|
|
23
|
+
/* === 验证 === */
|
|
24
|
+
// 验证前
|
|
25
|
+
this.list_before = [];
|
|
26
|
+
// 验证
|
|
27
|
+
this.list_check = [];
|
|
28
|
+
// 执行
|
|
29
|
+
this.list_main = [];
|
|
30
|
+
// 渲染
|
|
31
|
+
this.list_render = [];
|
|
32
|
+
// 渲染后
|
|
33
|
+
this.list_after = [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 清除事件
|
|
39
|
+
* @param {String} stage 阶段
|
|
40
|
+
*/
|
|
41
|
+
Event.prototype.clear = function(stage) {
|
|
42
|
+
if (stage) {
|
|
43
|
+
if (this[stage]) {
|
|
44
|
+
this[stage] = [];
|
|
45
|
+
} else {
|
|
46
|
+
$.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
this.list_before = [];
|
|
50
|
+
this.list_check = [];
|
|
51
|
+
this.list_main = [];
|
|
52
|
+
this.list_render = [];
|
|
53
|
+
this.list_after = [];
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 更新脚本子函数
|
|
60
|
+
*/
|
|
61
|
+
Event.prototype.update_script_sub = async function(list) {
|
|
62
|
+
for (var i = 0; i < list.length; i++) {
|
|
63
|
+
var o = list[i];
|
|
64
|
+
if (o.config.state === 1) {
|
|
65
|
+
await o.exec('load');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 更新脚本
|
|
72
|
+
*/
|
|
73
|
+
Event.prototype.update_script = async function() {
|
|
74
|
+
this.update_script_sub(this.list_before);
|
|
75
|
+
this.update_script_sub(this.list_check);
|
|
76
|
+
this.update_script_sub(this.list_main);
|
|
77
|
+
this.update_script_sub(this.list_render);
|
|
78
|
+
this.update_script_sub(this.list_after);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 加载项
|
|
83
|
+
* @param {String} dir 文件路径
|
|
84
|
+
* @param {Object} cg 配置参数
|
|
85
|
+
* @param {String} file 配置文件
|
|
86
|
+
*/
|
|
87
|
+
Event.prototype.load_item = async function(dir, cg, file) {
|
|
88
|
+
if (this.Drive) {
|
|
89
|
+
var drive = new this.Drive(dir, this.dir_base.fullname());
|
|
90
|
+
drive.mode = this.mode;
|
|
91
|
+
if (cg) {
|
|
92
|
+
await drive.exec('load_config', file, cg.name);
|
|
93
|
+
await drive.exec('set_config', cg);
|
|
94
|
+
} else {
|
|
95
|
+
await drive.exec('load_config', file);
|
|
96
|
+
}
|
|
97
|
+
var key = 'list_' + drive.config.stage;
|
|
98
|
+
var list = this[key];
|
|
99
|
+
if (!list) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
list.push(drive);
|
|
103
|
+
return drive;
|
|
104
|
+
} else {
|
|
105
|
+
var json = file.loadJson();
|
|
106
|
+
if (!json) {
|
|
107
|
+
var fl = this.dir_base + "/config.tpl.json";
|
|
108
|
+
if (fl.hasFile()) {
|
|
109
|
+
fl.copyFile(file);
|
|
110
|
+
json = file.loadJson();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (json) {
|
|
114
|
+
var key = 'list_' + json.stage;
|
|
115
|
+
var list = this[key];
|
|
116
|
+
if (!list) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
list.push(json);
|
|
120
|
+
}
|
|
121
|
+
return json;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 事件排序
|
|
127
|
+
* @param {String} list 列表
|
|
128
|
+
*/
|
|
129
|
+
Event.prototype.sort_sub = function(list) {
|
|
130
|
+
list.sort(function(o1, o2) {
|
|
131
|
+
var sort = o1.config.sort - o2.config.sort;
|
|
132
|
+
if (sort === 0) {
|
|
133
|
+
sort = o2.config.target.length - o1.config.target.length;
|
|
134
|
+
}
|
|
135
|
+
return sort;
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 事件排序
|
|
141
|
+
* @param {String} stage 阶段
|
|
142
|
+
*/
|
|
143
|
+
Event.prototype.sort = function(stage) {
|
|
144
|
+
if (stage) {
|
|
145
|
+
if (this[stage]) {
|
|
146
|
+
this[stage] = [];
|
|
147
|
+
} else {
|
|
148
|
+
$.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
this.sort_sub(this.list_before);
|
|
152
|
+
this.sort_sub(this.list_check);
|
|
153
|
+
this.sort_sub(this.list_main);
|
|
154
|
+
this.sort_sub(this.list_render);
|
|
155
|
+
this.sort_sub(this.list_after);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 执行事件
|
|
161
|
+
*/
|
|
162
|
+
Event.prototype.doing = async function(o, ctx, db) {
|
|
163
|
+
var ret = o.run(ctx, db);
|
|
164
|
+
if (types.isPromise(ret)) {
|
|
165
|
+
ret = await ret;
|
|
166
|
+
}
|
|
167
|
+
if (this.mode > 4) {
|
|
168
|
+
o.exec('reload', o.filename);
|
|
169
|
+
}
|
|
170
|
+
return ret;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* 执行函数
|
|
175
|
+
* @param {Array} list 列表
|
|
176
|
+
* @param {String} target 目标
|
|
177
|
+
* @param {Object} ctx 请求上下文
|
|
178
|
+
* @param {Object} db 数据管理器
|
|
179
|
+
* @return {Object} 执行结果
|
|
180
|
+
*/
|
|
181
|
+
Event.prototype.run_sub = async function(list, target, ctx, db) {
|
|
182
|
+
for (var i = 0, o; o = list[i++];) {
|
|
183
|
+
if (o.config.state === 1 && target.has(o.config.target)) {
|
|
184
|
+
var ret = await o.run(ctx, db);
|
|
185
|
+
if (this.mode > 4) {
|
|
186
|
+
o.exec('reload', o.filename);
|
|
187
|
+
}
|
|
188
|
+
if (ret) {
|
|
189
|
+
db.ret = ret;
|
|
190
|
+
if (o.config.end) {
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return db.ret;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 之前
|
|
201
|
+
* @param {String} target 目标
|
|
202
|
+
* @param {Object} ctx 请求上下文
|
|
203
|
+
* @param {Object} db 数据管理器
|
|
204
|
+
* @return {Object} 执行结果
|
|
205
|
+
*/
|
|
206
|
+
Event.prototype.before = async function(target, ctx, db) {
|
|
207
|
+
return await this.run_sub(this.list_before, target, ctx, db);
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* 验证
|
|
212
|
+
* @param {String} target 目标
|
|
213
|
+
* @param {Object} ctx 请求上下文
|
|
214
|
+
* @param {Object} db 数据管理器
|
|
215
|
+
* @return {Object} 执行结果
|
|
216
|
+
*/
|
|
217
|
+
Event.prototype.check = async function(target, ctx, db) {
|
|
218
|
+
return await this.run_sub(this.list_check, target, ctx, db);
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 主要
|
|
223
|
+
* @param {String} target 目标
|
|
224
|
+
* @param {Object} ctx 请求上下文
|
|
225
|
+
* @param {Object} db 数据管理器
|
|
226
|
+
* @return {Object} 执行结果
|
|
227
|
+
*/
|
|
228
|
+
Event.prototype.main = async function(target, ctx, db) {
|
|
229
|
+
return await this.run_sub(this.list_main, target, ctx, db);
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* 渲染
|
|
234
|
+
* @param {String} target 目标
|
|
235
|
+
* @param {Object} ctx 请求上下文
|
|
236
|
+
* @param {Object} db 数据管理器
|
|
237
|
+
* @return {Object} 执行结果
|
|
238
|
+
*/
|
|
239
|
+
Event.prototype.render = async function(target, ctx, db) {
|
|
240
|
+
return await this.run_sub(this.list_render, target, ctx, db);
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* 之后
|
|
245
|
+
* @param {String} target 目标
|
|
246
|
+
* @param {Object} ctx 请求上下文
|
|
247
|
+
* @param {Object} db 数据管理器
|
|
248
|
+
* @return {Object} 执行结果
|
|
249
|
+
*/
|
|
250
|
+
Event.prototype.after = async function(target, ctx, db) {
|
|
251
|
+
return await this.run_sub(this.list_after, target, ctx, db);
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* 执行事件
|
|
256
|
+
* @param {String} target 目标
|
|
257
|
+
* @param {Object} ctx 请求上下文
|
|
258
|
+
* @param {Object} db 数据管理器
|
|
259
|
+
* @return {Object} 执行结果
|
|
260
|
+
*/
|
|
261
|
+
Event.prototype.run = async function(target, ctx, db) {
|
|
262
|
+
if (!db) {
|
|
263
|
+
db = {
|
|
264
|
+
ret: null
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
var ret = await this.before(target, ctx, db);
|
|
268
|
+
if (!ret) {
|
|
269
|
+
ret = await this.check(target, ctx, db);
|
|
270
|
+
if (!ret) {
|
|
271
|
+
ret = await this.main(target, ctx, db);
|
|
272
|
+
}
|
|
273
|
+
ret = await this.render(target, ctx, db);
|
|
274
|
+
if (ret) {
|
|
275
|
+
ret = await this.after(target, ctx, db);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return ret;
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* @description 获取事件
|
|
283
|
+
* @param {String} name 名称
|
|
284
|
+
* @param {String} event_type 事件类型
|
|
285
|
+
* @return {Object} 返回单项配置
|
|
286
|
+
*/
|
|
287
|
+
Event.prototype.get = function(name, event_type = 'main') {
|
|
288
|
+
var obj;
|
|
289
|
+
var lt = this['list_' + event_type];
|
|
290
|
+
var len = lt.length;
|
|
291
|
+
for (var i = 0; i < len; i++) {
|
|
292
|
+
var o = lt[i];
|
|
293
|
+
if (name === o.config.name) {
|
|
294
|
+
obj = o;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return obj;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @description 重载脚本和配置
|
|
303
|
+
* @param {String} file 文件名
|
|
304
|
+
* @return {String} 重载失败返回错误提示,重载成功返回null
|
|
305
|
+
*/
|
|
306
|
+
Event.prototype.reload = async function(name, event_type = 'main') {
|
|
307
|
+
var o = this.get(name, event_type);
|
|
308
|
+
if (o) {
|
|
309
|
+
await o.exec('reload');
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
return '没有找到模块';
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* @module 导出Event类
|
|
317
|
+
*/
|
|
318
|
+
module.exports = Event;
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Event事件池
|
|
322
|
+
*/
|
|
323
|
+
if (!$.pool.event) {
|
|
324
|
+
$.pool.event = {};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function event_admin(scope, title) {
|
|
328
|
+
if (!scope) {
|
|
329
|
+
scope = $.val.scope + '';
|
|
330
|
+
}
|
|
331
|
+
var obj = $.pool.event[scope];
|
|
332
|
+
if (!obj) {
|
|
333
|
+
$.pool.event[scope] = new Event(scope, title);
|
|
334
|
+
obj = $.pool.event[scope];
|
|
335
|
+
}
|
|
336
|
+
return obj;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Event管理器,用于创建缓存
|
|
341
|
+
* @param {String} scope 作用域
|
|
342
|
+
* @param {string} title 标题
|
|
343
|
+
* @return {Object} 返回一个缓存类
|
|
344
|
+
*/
|
|
345
345
|
$.event_admin = event_admin;
|