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.
Files changed (56) hide show
  1. package/README.md +47 -1
  2. package/core/base/mqtt/index.js +1109 -1106
  3. package/core/base/web/index.js +245 -156
  4. package/core/com/event/README.md +4 -4
  5. package/core/com/event/com.json +3 -3
  6. package/core/com/event/config.tpl.json +18 -18
  7. package/core/com/event/drive.js +132 -132
  8. package/core/com/event/index.js +344 -344
  9. package/core/com/event/script.js +25 -25
  10. package/core/com/middleware/com.js +152 -151
  11. package/core/com/socket/config.tpl.json +2 -2
  12. package/core/com/socket/drive.js +2 -2
  13. package/core/com/socket/index.js +1 -1
  14. package/core/com/sql/drive.js +7 -7
  15. package/core/com/static/index.js +1 -1
  16. package/index.js +34 -5
  17. package/middleware/cors/index.js +112 -96
  18. package/middleware/cors/middleware.json +18 -7
  19. package/middleware/csrf/index.js +202 -0
  20. package/middleware/csrf/middleware.json +24 -0
  21. package/middleware/ip_firewall/index.js +476 -0
  22. package/middleware/ip_firewall/middleware.json +109 -0
  23. package/middleware/mqtt_base/middleware.json +2 -1
  24. package/middleware/security_audit/index.js +543 -0
  25. package/middleware/security_audit/middleware.json +48 -0
  26. package/middleware/waf/index.js +273 -7
  27. package/middleware/waf/middleware.json +2 -1
  28. package/middleware/waf_ddos/index.js +520 -0
  29. package/middleware/waf_ddos/middleware.json +38 -0
  30. package/middleware/waf_xss/index.js +269 -0
  31. package/middleware/waf_xss/middleware.json +18 -0
  32. package/middleware/web_after/middleware.json +2 -1
  33. package/middleware/web_base/middleware.json +2 -1
  34. package/middleware/web_before/middleware.json +3 -2
  35. package/middleware/web_check/middleware.json +2 -1
  36. package/middleware/web_main/middleware.json +2 -1
  37. package/middleware/web_proxy/middleware.json +2 -1
  38. package/middleware/web_render/middleware.json +2 -1
  39. package/middleware/web_socket/middleware.json +4 -3
  40. package/middleware/web_static/middleware.json +2 -1
  41. package/package.json +28 -15
  42. package/middleware/log/index.js +0 -32
  43. package/middleware/log/middleware.json +0 -9
  44. package/middleware/performance/index.js +0 -143
  45. package/middleware/performance/middleware.json +0 -16
  46. package/middleware/rate_limit/index.js +0 -112
  47. package/middleware/rate_limit/middleware.json +0 -10
  48. package/middleware/waf_ip/index.js +0 -168
  49. package/middleware/waf_ip/middleware.json +0 -10
  50. package/nodemon.json +0 -31
  51. package/package.txt +0 -1
  52. package/rps.bat +0 -3
  53. package/test.js +0 -10
  54. package/tps.bat +0 -3
  55. package/update.bat +0 -1
  56. 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
@@ -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
- // webscoket请求路由地址
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
- // webscoket调用的脚本文件
10
+ // websocket调用的脚本文件
11
11
  "func_file": "./index.js",
12
12
  // 同步消息循环发送的时间间隔
13
13
  "interval": 1000
@@ -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("webscoket 错误", err);
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;
@@ -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("监听webscoket路径是否正确", path === o.config.path);
35
+ // console.log("监听websocket路径是否正确", path === o.config.path);
36
36
  if (path === o.config.path) {
37
37
  o.add(ctx);
38
38
  break;
@@ -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: name
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
- fields
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 (!fields) {
809
+ if (!field) {
810
810
  if (query.field) {
811
- fields = query.field;
811
+ field = query.field;
812
812
  } else {
813
813
  var f = this.config.field_default;
814
814
  if (f.length !== "*") {
815
- fields = f;
815
+ field = f;
816
816
  }
817
817
  }
818
818
  }
819
- var params = await this.get_params(db, fields);
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();
@@ -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 = $.runPath + 'app' + $.slash;
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 eventer = $.event_admin('api');
255
- eventer.update();
283
+ var evt = $.event_admin('api');
284
+ evt.update();
256
285
  this.web.run();
257
286
  }
258
287