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/script.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
// 使用api管理器
|
|
2
|
-
var api = $.api_admin('{0}', '{0}');
|
|
3
|
-
// 首次启动更新api接口;
|
|
4
|
-
api.update();
|
|
5
|
-
|
|
6
|
-
// 使用mysql数据库管理器
|
|
7
|
-
var sql = $.mysql_admin('sys', __dirname);
|
|
8
|
-
// sql.setConfig($.config.mysql);
|
|
9
|
-
// sql.open();
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @description 接口主函数
|
|
13
|
-
* @param {Object} ctx HTTP上下文
|
|
14
|
-
* @param {Object} db 数据管理器,如: { next: async function{}, ret: {} }
|
|
15
|
-
* @return {Object} 执行结果
|
|
16
|
-
*/
|
|
17
|
-
async function main(ctx, db) {
|
|
18
|
-
// 使用模板引擎
|
|
19
|
-
db.tpl = new $.Tpl();
|
|
20
|
-
|
|
21
|
-
// 在这定义要访问的数据库 (分布式开发时设置不同的数据库名)
|
|
22
|
-
$.push(db, sql.db(), true);
|
|
23
|
-
return api.run(ctx, db);
|
|
24
|
-
};
|
|
25
|
-
|
|
1
|
+
// 使用api管理器
|
|
2
|
+
var api = $.api_admin('{0}', '{0}');
|
|
3
|
+
// 首次启动更新api接口;
|
|
4
|
+
api.update();
|
|
5
|
+
|
|
6
|
+
// 使用mysql数据库管理器
|
|
7
|
+
var sql = $.mysql_admin('sys', __dirname);
|
|
8
|
+
// sql.setConfig($.config.mysql);
|
|
9
|
+
// sql.open();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @description 接口主函数
|
|
13
|
+
* @param {Object} ctx HTTP上下文
|
|
14
|
+
* @param {Object} db 数据管理器,如: { next: async function{}, ret: {} }
|
|
15
|
+
* @return {Object} 执行结果
|
|
16
|
+
*/
|
|
17
|
+
async function main(ctx, db) {
|
|
18
|
+
// 使用模板引擎
|
|
19
|
+
db.tpl = new $.Tpl();
|
|
20
|
+
|
|
21
|
+
// 在这定义要访问的数据库 (分布式开发时设置不同的数据库名)
|
|
22
|
+
$.push(db, sql.db(), true);
|
|
23
|
+
return api.run(ctx, db);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
26
|
exports.main = main;
|
|
@@ -1,153 +1,154 @@
|
|
|
1
|
-
class Middleware {
|
|
2
|
-
/**
|
|
3
|
-
* 构造函数
|
|
4
|
-
* @param {Object} config 配置参数
|
|
5
|
-
*/
|
|
6
|
-
constructor(config) {
|
|
7
|
-
// 中间件列表
|
|
8
|
-
this.list = [];
|
|
9
|
-
|
|
10
|
-
this.config = {
|
|
11
|
-
path: "./middleware".fullname($.runPath),
|
|
12
|
-
file: "middleware.json",
|
|
13
|
-
mode: "web"
|
|
14
|
-
};
|
|
15
|
-
this.init(config);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
Middleware.prototype.init = function(config) {
|
|
20
|
-
if (config) {
|
|
21
|
-
Object.assign(this.config, config);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* 新建脚本
|
|
27
|
-
* @param {String} 文件
|
|
28
|
-
*/
|
|
29
|
-
Middleware.prototype.new_script = function(file) {
|
|
30
|
-
var fl = __dirname + "/script.js";
|
|
31
|
-
if (fl.hasFile()) {
|
|
32
|
-
var text = fl.loadText();
|
|
33
|
-
if (text) {
|
|
34
|
-
var l = $.slash;
|
|
35
|
-
if (file.indexOf('middleware' + l) !== -1) {
|
|
36
|
-
var name = file.between('middleware' + l, l);
|
|
37
|
-
text = text.replaceAll("{0}", name);
|
|
38
|
-
}
|
|
39
|
-
file.saveText(text);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 新建配置
|
|
46
|
-
* @param {String} 文件
|
|
47
|
-
*/
|
|
48
|
-
Middleware.prototype.new_config = function(file) {
|
|
49
|
-
var fl = __dirname + "/config.tpl.json";
|
|
50
|
-
if (fl.hasFile()) {
|
|
51
|
-
var text = fl.loadText();
|
|
52
|
-
if (text) {
|
|
53
|
-
var l = $.slash;
|
|
54
|
-
if (file.indexOf('middleware' + l) !== -1) {
|
|
55
|
-
var name = file.between('middleware' + l, l);
|
|
56
|
-
text = text.replaceAll("{0}", name);
|
|
57
|
-
}
|
|
58
|
-
file.saveText(text);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* 加载配置
|
|
65
|
-
* @param {String} file 配置文件路径
|
|
66
|
-
*/
|
|
67
|
-
Middleware.prototype.load_item = function(file) {
|
|
68
|
-
var config = file.loadJson();
|
|
69
|
-
if (config) {
|
|
70
|
-
var cg = this.list.getObj({
|
|
71
|
-
name: config.name
|
|
72
|
-
});
|
|
73
|
-
if (cg) {
|
|
74
|
-
$.push(cg, config, true);
|
|
75
|
-
} else {
|
|
76
|
-
cg = {
|
|
77
|
-
func_file: file.replace(this.config.file, 'index.js')
|
|
78
|
-
}
|
|
79
|
-
$.push(cg, config, true);
|
|
80
|
-
this.list.push(cg);
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
this.new_config(file);
|
|
84
|
-
}
|
|
85
|
-
var script_file = file.replace('middleware.json', 'index.js');
|
|
86
|
-
if (!script_file.hasFile()) {
|
|
87
|
-
this.new_script(script_file);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* 遍历加载配置
|
|
93
|
-
* @param {Object} path
|
|
94
|
-
*/
|
|
95
|
-
Middleware.prototype.update_config_all = function(path, accurate) {
|
|
96
|
-
if (path.hasDir()) {
|
|
97
|
-
var dirs = $.dir.getAll(path);
|
|
98
|
-
// 遍历目录路径
|
|
99
|
-
var file = this.config.file;
|
|
100
|
-
for (var i = 0; i < dirs.length; i++) {
|
|
101
|
-
var d = dirs[i];
|
|
102
|
-
this.load_item(d + file);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 排序
|
|
109
|
-
*/
|
|
110
|
-
Middleware.prototype.sort = function() {
|
|
111
|
-
return this.list.sortBy('asc', 'sort');
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* 清除接口缓存
|
|
116
|
-
*/
|
|
117
|
-
Middleware.prototype.clear = function() {
|
|
118
|
-
this.list = [];
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* 遍历加载配置
|
|
123
|
-
*/
|
|
124
|
-
Middleware.prototype.update_config = function(path, accurate = true, clear = true) {
|
|
125
|
-
if (clear) {
|
|
126
|
-
this.clear();
|
|
127
|
-
}
|
|
128
|
-
this.update_config_all("../../../middleware/".fullname(__dirname));
|
|
129
|
-
if (path) {
|
|
130
|
-
this.update_config_all(path);
|
|
131
|
-
}
|
|
132
|
-
this.update_config_all(this.config.path);
|
|
133
|
-
var p = "./middleware".fullname($.runPath);
|
|
134
|
-
if (this.config.path !== p) {
|
|
135
|
-
this.update_config_all(p);
|
|
136
|
-
}
|
|
137
|
-
this.sort();
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* 更新
|
|
142
|
-
* @param {String} dir 检索的路径
|
|
143
|
-
* @param {Boolean} loadJS 是否加载JS
|
|
144
|
-
*/
|
|
145
|
-
Middleware.prototype.update = function(dir, accurate = true, loadJS = true, clear = true) {
|
|
146
|
-
this.update_config(dir, accurate, clear);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (!$.middleware) {
|
|
150
|
-
$.middleware = new Middleware();
|
|
151
|
-
}
|
|
1
|
+
class Middleware {
|
|
2
|
+
/**
|
|
3
|
+
* 构造函数
|
|
4
|
+
* @param {Object} config 配置参数
|
|
5
|
+
*/
|
|
6
|
+
constructor(config) {
|
|
7
|
+
// 中间件列表
|
|
8
|
+
this.list = [];
|
|
9
|
+
|
|
10
|
+
this.config = {
|
|
11
|
+
path: "./middleware".fullname($.runPath),
|
|
12
|
+
file: "middleware.json",
|
|
13
|
+
mode: "web"
|
|
14
|
+
};
|
|
15
|
+
this.init(config);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
152
18
|
|
|
19
|
+
|
|
20
|
+
Middleware.prototype.init = function(config) {
|
|
21
|
+
if (config) {
|
|
22
|
+
Object.assign(this.config, config);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 新建脚本
|
|
28
|
+
* @param {String} 文件
|
|
29
|
+
*/
|
|
30
|
+
Middleware.prototype.new_script = function(file) {
|
|
31
|
+
var fl = __dirname + "/script.js";
|
|
32
|
+
if (fl.hasFile()) {
|
|
33
|
+
var text = fl.loadText();
|
|
34
|
+
if (text) {
|
|
35
|
+
var l = $.slash;
|
|
36
|
+
if (file.indexOf('middleware' + l) !== -1) {
|
|
37
|
+
var name = file.between('middleware' + l, l);
|
|
38
|
+
text = text.replaceAll("{0}", name);
|
|
39
|
+
}
|
|
40
|
+
file.saveText(text);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 新建配置
|
|
47
|
+
* @param {String} 文件
|
|
48
|
+
*/
|
|
49
|
+
Middleware.prototype.new_config = function(file) {
|
|
50
|
+
var fl = __dirname + "/config.tpl.json";
|
|
51
|
+
if (fl.hasFile()) {
|
|
52
|
+
var text = fl.loadText();
|
|
53
|
+
if (text) {
|
|
54
|
+
var l = $.slash;
|
|
55
|
+
if (file.indexOf('middleware' + l) !== -1) {
|
|
56
|
+
var name = file.between('middleware' + l, l);
|
|
57
|
+
text = text.replaceAll("{0}", name);
|
|
58
|
+
}
|
|
59
|
+
file.saveText(text);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 加载配置
|
|
66
|
+
* @param {String} file 配置文件路径
|
|
67
|
+
*/
|
|
68
|
+
Middleware.prototype.load_item = function(file) {
|
|
69
|
+
var config = file.loadJson();
|
|
70
|
+
if (config) {
|
|
71
|
+
var cg = this.list.getObj({
|
|
72
|
+
name: config.name
|
|
73
|
+
});
|
|
74
|
+
if (cg) {
|
|
75
|
+
$.push(cg, config, true);
|
|
76
|
+
} else {
|
|
77
|
+
cg = {
|
|
78
|
+
func_file: file.replace(this.config.file, 'index.js')
|
|
79
|
+
}
|
|
80
|
+
$.push(cg, config, true);
|
|
81
|
+
this.list.push(cg);
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
this.new_config(file);
|
|
85
|
+
}
|
|
86
|
+
var script_file = file.replace('middleware.json', 'index.js');
|
|
87
|
+
if (!script_file.hasFile()) {
|
|
88
|
+
this.new_script(script_file);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 遍历加载配置
|
|
94
|
+
* @param {Object} path
|
|
95
|
+
*/
|
|
96
|
+
Middleware.prototype.update_config_all = function(path, accurate) {
|
|
97
|
+
if (path.hasDir()) {
|
|
98
|
+
var dirs = $.dir.getAll(path);
|
|
99
|
+
// 遍历目录路径
|
|
100
|
+
var file = this.config.file;
|
|
101
|
+
for (var i = 0; i < dirs.length; i++) {
|
|
102
|
+
var d = dirs[i];
|
|
103
|
+
this.load_item(d + file);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 排序
|
|
110
|
+
*/
|
|
111
|
+
Middleware.prototype.sort = function() {
|
|
112
|
+
return this.list.sortBy('asc', 'sort');
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 清除接口缓存
|
|
117
|
+
*/
|
|
118
|
+
Middleware.prototype.clear = function() {
|
|
119
|
+
this.list = [];
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 遍历加载配置
|
|
124
|
+
*/
|
|
125
|
+
Middleware.prototype.update_config = function(path, accurate = true, clear = true) {
|
|
126
|
+
if (clear) {
|
|
127
|
+
this.clear();
|
|
128
|
+
}
|
|
129
|
+
this.update_config_all("../../../middleware/".fullname(__dirname));
|
|
130
|
+
if (path) {
|
|
131
|
+
this.update_config_all(path);
|
|
132
|
+
}
|
|
133
|
+
this.update_config_all(this.config.path);
|
|
134
|
+
var p = "./middleware".fullname($.runPath);
|
|
135
|
+
if (this.config.path !== p) {
|
|
136
|
+
this.update_config_all(p);
|
|
137
|
+
}
|
|
138
|
+
this.sort();
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* 更新
|
|
143
|
+
* @param {String} dir 检索的路径
|
|
144
|
+
* @param {Boolean} loadJS 是否加载JS
|
|
145
|
+
*/
|
|
146
|
+
Middleware.prototype.update = function(dir, accurate = true, loadJS = true, clear = true) {
|
|
147
|
+
this.update_config(dir, accurate, clear);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!$.middleware) {
|
|
151
|
+
$.middleware = new Middleware();
|
|
152
|
+
}
|
|
153
|
+
|
|
153
154
|
module.exports = Middleware;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
//
|
|
2
|
+
// websocket请求路由地址
|
|
3
3
|
"path": "/ws/{0}",
|
|
4
4
|
// 名称
|
|
5
5
|
"name": "{0}",
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"title": "示例websocket",
|
|
8
8
|
// 描述,用来介绍该websocket程序是做什么用的
|
|
9
9
|
"description": "用来测试",
|
|
10
|
-
//
|
|
10
|
+
// websocket调用的脚本文件
|
|
11
11
|
"func_file": "./index.js",
|
|
12
12
|
// 同步消息循环发送的时间间隔
|
|
13
13
|
"interval": 1000
|
package/core/com/socket/drive.js
CHANGED
|
@@ -336,7 +336,7 @@ Drive.prototype.run = async function(bodyStr, ctx, token) {
|
|
|
336
336
|
}
|
|
337
337
|
return await this.main(bodyStr, ws, request);
|
|
338
338
|
} catch (err) {
|
|
339
|
-
$.log.error("
|
|
339
|
+
$.log.error("websocket 错误", err);
|
|
340
340
|
return $.log.error(10000, "代码错误!原因:" + err.toString());
|
|
341
341
|
}
|
|
342
342
|
};
|
|
@@ -400,4 +400,4 @@ Drive.prototype.plugin = function(app, name) {
|
|
|
400
400
|
return plus
|
|
401
401
|
}
|
|
402
402
|
|
|
403
|
-
module.exports = Drive;
|
|
403
|
+
module.exports = Drive;
|
package/core/com/socket/index.js
CHANGED
|
@@ -32,7 +32,7 @@ Socket.prototype.run = async function(ctx, next) {
|
|
|
32
32
|
var list = this.list;
|
|
33
33
|
const path = ctx.path.toLocaleLowerCase();
|
|
34
34
|
for (var i = 0, o; o = list[i++];) {
|
|
35
|
-
// console.log("监听
|
|
35
|
+
// console.log("监听websocket路径是否正确", path === o.config.path);
|
|
36
36
|
if (path === o.config.path) {
|
|
37
37
|
o.add(ctx);
|
|
38
38
|
break;
|
package/core/com/sql/drive.js
CHANGED
|
@@ -592,10 +592,10 @@ Drive.prototype.get_params = async function(db, fields) {
|
|
|
592
592
|
var list = dt.config.fields;
|
|
593
593
|
for (var i = 0; i < list.length; i++) {
|
|
594
594
|
var o = list[i];
|
|
595
|
-
var name = o.replace(/`/g, '');
|
|
595
|
+
var name = o.name.replace(/`/g, '');
|
|
596
596
|
lt.push({
|
|
597
597
|
name,
|
|
598
|
-
title:
|
|
598
|
+
title: o.title
|
|
599
599
|
});
|
|
600
600
|
}
|
|
601
601
|
}
|
|
@@ -790,7 +790,7 @@ Drive.prototype.export_main = async function(db, query, body) {
|
|
|
790
790
|
var {
|
|
791
791
|
path,
|
|
792
792
|
file,
|
|
793
|
-
|
|
793
|
+
field
|
|
794
794
|
} = body;
|
|
795
795
|
var table = db.table || this.config.table;
|
|
796
796
|
var date = new Date();
|
|
@@ -806,17 +806,17 @@ Drive.prototype.export_main = async function(db, query, body) {
|
|
|
806
806
|
if (!file) {
|
|
807
807
|
file = this.save_dir + name;
|
|
808
808
|
}
|
|
809
|
-
if (!
|
|
809
|
+
if (!field) {
|
|
810
810
|
if (query.field) {
|
|
811
|
-
|
|
811
|
+
field = query.field;
|
|
812
812
|
} else {
|
|
813
813
|
var f = this.config.field_default;
|
|
814
814
|
if (f.length !== "*") {
|
|
815
|
-
|
|
815
|
+
field = f;
|
|
816
816
|
}
|
|
817
817
|
}
|
|
818
818
|
}
|
|
819
|
-
var params = await this.get_params(db,
|
|
819
|
+
var params = await this.get_params(db, field);
|
|
820
820
|
var format = await this.get_format(db);
|
|
821
821
|
file = file.fullname(path);
|
|
822
822
|
file.addDir();
|
package/core/com/static/index.js
CHANGED
|
@@ -117,7 +117,7 @@ Static.prototype.getObj = async function(dir) {
|
|
|
117
117
|
*/
|
|
118
118
|
Static.prototype.update_config_all = async function(path) {
|
|
119
119
|
if (!path) {
|
|
120
|
-
path =
|
|
120
|
+
path = './app'.fullname();
|
|
121
121
|
}
|
|
122
122
|
// 获取所有应用路径
|
|
123
123
|
var search_dir = "static";
|
package/index.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
// 增强版补丁:彻底解决util._extend API弃用警告
|
|
2
|
+
const util = require('util');
|
|
3
|
+
// 完全替换util._extend为Object.assign的包装函数,确保行为一致
|
|
4
|
+
util._extend = function(target, source) {
|
|
5
|
+
return Object.assign({}, target, source);
|
|
6
|
+
};
|
|
7
|
+
|
|
1
8
|
require('mm_logs');
|
|
2
9
|
require('mm_ret');
|
|
3
10
|
$.Tpl = require('mm_tpl');
|
|
@@ -73,6 +80,11 @@ class OS {
|
|
|
73
80
|
"database": "mm",
|
|
74
81
|
"user": "admin",
|
|
75
82
|
"password": "asd123"
|
|
83
|
+
},
|
|
84
|
+
"modules": {
|
|
85
|
+
"hotReload": true,
|
|
86
|
+
"watchInterval": 5000,
|
|
87
|
+
"autoLoad": true
|
|
76
88
|
}
|
|
77
89
|
};
|
|
78
90
|
this.init(config);
|
|
@@ -86,7 +98,7 @@ class OS {
|
|
|
86
98
|
OS.prototype.initData = function(config) {
|
|
87
99
|
var p = config.runPath;
|
|
88
100
|
if (!p) {
|
|
89
|
-
config.runPath = $.runPath
|
|
101
|
+
config.runPath = $.runPath;
|
|
90
102
|
} else if (p.substring(p.length - 1) !== $.slash) {
|
|
91
103
|
config.runPath += $.slash;
|
|
92
104
|
}
|
|
@@ -210,13 +222,32 @@ OS.prototype.init = function(config) {
|
|
|
210
222
|
*/
|
|
211
223
|
OS.prototype.initBase = function(cg) {
|
|
212
224
|
var middleware = $.middleware;
|
|
225
|
+
// 更新中间件配置,并且加载JS文件
|
|
213
226
|
middleware.update();
|
|
214
227
|
var mqtt, web;
|
|
215
228
|
if (cg.web && cg.web.state) {
|
|
216
229
|
web = new WEB(cg.web);
|
|
230
|
+
// 过滤出web模式的中间件
|
|
217
231
|
web.list = middleware.list.filter((o) => {
|
|
218
232
|
return !o.mode || o.mode == "web"
|
|
219
233
|
});
|
|
234
|
+
// 预加载中间件函数,确保list中的每个中间件都有func属性
|
|
235
|
+
if (web.list && web.list.length > 0) {
|
|
236
|
+
for (var i = 0; i < web.list.length; i++) {
|
|
237
|
+
var o = web.list[i];
|
|
238
|
+
try {
|
|
239
|
+
if (o.func_file && !o.func) {
|
|
240
|
+
o.func = require(o.func_file);
|
|
241
|
+
}
|
|
242
|
+
} catch (error) {
|
|
243
|
+
if ($.log && $.log.error) {
|
|
244
|
+
$.log.error(`预加载中间件失败: ${o.name}`, error);
|
|
245
|
+
} else {
|
|
246
|
+
console.error(`预加载中间件失败: ${o.name}`, error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
220
251
|
web.init();
|
|
221
252
|
this.web = web;
|
|
222
253
|
}
|
|
@@ -243,16 +274,14 @@ OS.prototype.main = async function(state) {
|
|
|
243
274
|
$.timer.run();
|
|
244
275
|
|
|
245
276
|
var cg = this.config;
|
|
246
|
-
var web_server = this.web_server;
|
|
247
|
-
var mqtt_server = this.mqtt_server;
|
|
248
277
|
var tip = "启动";
|
|
249
278
|
if (cg.web && cg.web.state) {
|
|
250
279
|
tip += " web";
|
|
251
280
|
if (cg.web.socket) {
|
|
252
281
|
tip += " socket";
|
|
253
282
|
}
|
|
254
|
-
var
|
|
255
|
-
|
|
283
|
+
var evt = $.event_admin('api');
|
|
284
|
+
evt.update();
|
|
256
285
|
this.web.run();
|
|
257
286
|
}
|
|
258
287
|
|