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,156 +1,245 @@
1
- const Koa = require('koa');
2
-
3
- /**
4
- * Web http 通讯类
5
- */
6
- class WEB {
7
- /**
8
- * 构造函数
9
- * @param {Object} config 配置参数
10
- */
11
- constructor(config) {
12
- /**
13
- * 配置参数
14
- */
15
- this.config = Object.assign({
16
- // 访问地址
17
- "host": "0.0.0.0",
18
- // 访问端口号
19
- "port": 5000,
20
- // 是否启用websocket
21
- "socket": true,
22
- // 是否启用压缩
23
- "compress": true,
24
- // 是否启用事件
25
- "event": true,
26
- // 是否启用事件
27
- "log": true,
28
- // 是否启用静态文件
29
- "static": true,
30
- // 静态文件路径
31
- "static_path": "./static".fullname($.runPath),
32
- // 代理转发
33
- "proxy": {}
34
- }, config);
35
-
36
- /**
37
- * web服务器
38
- */
39
- this.server = null;
40
- this.list = [];
41
- }
42
- }
43
-
44
- /**
45
- * 初始化
46
- * @param {Object} config
47
- */
48
- WEB.prototype.init = function(config) {
49
- if (config) {
50
- this.config = Object.assign(this.config, config);
51
- }
52
- this.server = new Koa();
53
-
54
- // 添加统一错误处理中间件(确保是第一个被注册的中间件)
55
- this.server.use(async (ctx, next) => {
56
- try {
57
- await next();
58
- // 处理404错误
59
- if (ctx.status === 404 && !ctx.body) {
60
- ctx.status = 404;
61
- ctx.body = { code: 404, message: 'Not Found' };
62
- }
63
- } catch (error) {
64
- // 统一错误处理逻辑
65
- const status = error.status || 500;
66
- const message = error.message || 'Internal Server Error';
67
-
68
- // 根据环境决定是否返回详细错误信息
69
- const errorInfo = process.env.NODE_ENV === 'production'
70
- ? { message }
71
- : { message, stack: error.stack };
72
-
73
- ctx.status = status;
74
- ctx.body = { code: status, ...errorInfo };
75
-
76
- // 记录错误日志
77
- if ($.log && $.log.error) {
78
- $.log.error(`请求错误 [${ctx.method} ${ctx.path}]:`, error);
79
- } else {
80
- console.error(`请求错误 [${ctx.method} ${ctx.path}]:`, error);
81
- }
82
- }
83
- });
84
-
85
- return this;
86
- };
87
-
88
- /**
89
- * 引用
90
- * @param {Function} 函数
91
- */
92
- WEB.prototype.use = function(func) {
93
- this.server.use(func);
94
- };
95
-
96
- /**
97
- * 运行主程序
98
- * @param {String} state 状态
99
- */
100
- WEB.prototype.main = function(state) {
101
- var cg = this.config;
102
- var host = cg.host;
103
- if (host == '0.0.0.0') {
104
- host = '127.0.0.1'
105
- }
106
-
107
- // 启动HTTP服务器
108
- const httpServer = this.server.listen(cg.port, cg.host, () => {
109
- console.info(`HTTP访问 http://${host}:${cg.port}`);
110
- });
111
-
112
- // 监听服务器错误事件
113
- httpServer.on('error', (error) => {
114
- if ($.log && $.log.error) {
115
- $.log.error('Web服务器错误:', error);
116
- } else {
117
- console.error('Web服务器错误:', error);
118
- }
119
- });
120
-
121
- // 保存服务器实例引用,方便后续操作
122
- this.httpServer = httpServer;
123
- };
124
-
125
- /**
126
- * 运行主程序前
127
- * @param {String} state 状态
128
- */
129
- WEB.prototype.before = async function(state) {
130
- var list = this.list;
131
- for (var i = 0; i < list.length; i++) {
132
- var o = list[i];
133
- o.func = require(o.func_file);
134
- if (o.func) {
135
- o.func(this.server, this.config);
136
- }
137
- }
138
- };
139
-
140
- /**
141
- * 运行主程序后
142
- * @param {String} state 状态
143
- */
144
- WEB.prototype.after = async function(state) {};
145
-
146
- /**
147
- * 运行
148
- * @param {String} state 状态
149
- */
150
- WEB.prototype.run = async function(state = 'start') {
151
- await this.before(state);
152
- await this.main(state);
153
- await this.after(state);
154
- };
155
-
156
- module.exports = WEB;
1
+ const Koa = require('koa');
2
+
3
+ /**
4
+ * Web http 通讯类
5
+ */
6
+ class WEB {
7
+ /**
8
+ * 构造函数
9
+ * @param {Object} config 配置参数
10
+ */
11
+ constructor(config) {
12
+ /**
13
+ * 配置参数
14
+ */
15
+ this.config = Object.assign({
16
+ // 访问地址
17
+ "host": "0.0.0.0",
18
+ // 访问端口号
19
+ "port": 5000,
20
+ // 是否启用websocket
21
+ "socket": true,
22
+ // 是否启用压缩
23
+ "compress": true,
24
+ // 是否启用事件
25
+ "event": true,
26
+ // 是否启用事件
27
+ "log": true,
28
+ // 是否启用静态文件
29
+ "static": true,
30
+ // 静态文件路径
31
+ "static_path": "./static".fullname($.runPath),
32
+ // 代理转发
33
+ "proxy": {}
34
+ }, config);
35
+
36
+ /**
37
+ * web服务器
38
+ */
39
+ this.server = null;
40
+ this.list = [];
41
+ }
42
+ }
43
+
44
+ /**
45
+ * 初始化
46
+ * @param {Object} config
47
+ */
48
+ WEB.prototype.init = function(config) {
49
+ if (config) {
50
+ this.config = Object.assign(this.config, config);
51
+ }
52
+ // 确保Koa实例正确创建
53
+ try {
54
+ this.server = new Koa();
55
+ if (!this.server) {
56
+ throw new Error('无法创建Koa服务器实例');
57
+ }
58
+ // console.log('[WEB] 成功创建Koa服务器实例');
59
+ } catch (error) {
60
+ console.error('[WEB] 创建Koa实例失败:', error);
61
+ // 即使创建失败也初始化一个空对象防止后续空引用错误
62
+ this.server = {};
63
+ }
64
+
65
+ // 添加统一错误处理中间件(确保是第一个被注册的中间件)
66
+ this.server.use(async (ctx, next) => {
67
+ try {
68
+ // console.log(`[WEB] 接收到请求: ${ctx.method} ${ctx.path}`);
69
+ // console.log(`[WEB] 请求头:`, ctx.headers);
70
+
71
+ // // 在请求开始时记录时间
72
+ // const startTime = Date.now();
73
+
74
+ // 执行后续中间件
75
+ await next();
76
+
77
+ // 计算响应时间
78
+ // const responseTime = Date.now() - startTime;
79
+ // console.log(`[WEB] 响应: ${ctx.status} ${responseTime}ms ${ctx.path}`);
80
+ // console.log(`[WEB] 响应头:`, ctx.response.headers);
81
+
82
+ // 处理404错误
83
+ if (ctx.status === 404 && !ctx.body) {
84
+ ctx.status = 404;
85
+ ctx.body = $.ret.error(404, 'Not Found');
86
+ }
87
+ } catch (error) {
88
+ // 统一错误处理逻辑
89
+ const status = error.status || 500;
90
+ const message = error.message || 'Internal Server Error';
91
+
92
+ // 根据环境决定是否返回详细错误信息
93
+ const errorInfo = process.env.NODE_ENV === 'production' ?
94
+ {
95
+ message
96
+ } :
97
+ {
98
+ message,
99
+ stack: error.stack
100
+ };
101
+
102
+ ctx.status = status;
103
+ var body = $.ret.error(status, message);
104
+ body.error.stack = errorInfo.stack;
105
+ ctx.body = body;
106
+
107
+ // 记录错误日志
108
+ if ($.log && $.log.error) {
109
+ $.log.error(`请求错误 [${ctx.method} ${ctx.path}]:`, error);
110
+ } else {
111
+ console.error(`请求错误 [${ctx.method} ${ctx.path}]:`, error);
112
+ }
113
+ }
114
+ });
115
+
116
+ return this;
117
+ };
118
+
119
+ /**
120
+ * 引用
121
+ * @param {Function} 函数
122
+ */
123
+ WEB.prototype.use = function(func) {
124
+ console.log(`[WEB] 注册中间件: ${func.name || '匿名函数'}`);
125
+ // 确保server实例和use方法存在
126
+ if (!this.server) {
127
+ console.error('[WEB] 服务器实例未初始化,尝试重新初始化');
128
+ this.server = new Koa();
129
+ }
130
+ if (typeof this.server.use === 'function') {
131
+ this.server.use(func);
132
+ console.log('[WEB] 中间件注册成功');
133
+ } else {
134
+ console.error('[WEB] 服务器实例缺少use方法');
135
+ }
136
+ return this; // 支持链式调用
137
+ };
138
+
139
+ /**
140
+ * 运行主程序
141
+ * @param {String} state 状态
142
+ */
143
+ WEB.prototype.main = function(state) {
144
+ var cg = this.config;
145
+ var host = cg.host;
146
+ if (host == '0.0.0.0') {
147
+ host = '127.0.0.1'
148
+ }
149
+
150
+ // 确保server实例初始化
151
+ if (!this.server) {
152
+ console.error('[WEB] 服务器实例未初始化,尝试重新初始化');
153
+ this.server = new Koa();
154
+ this.init();
155
+ }
156
+
157
+ // 启动HTTP服务器
158
+ const httpServer = this.server.listen(cg.port, cg.host, () => {
159
+ console.info(`HTTP访问 http://${host}:${cg.port}`);
160
+ });
161
+
162
+ // 监听服务器错误事件
163
+ httpServer.on('error', (error) => {
164
+ if ($.log && $.log.error) {
165
+ $.log.error('Web服务器错误:', error);
166
+ } else {
167
+ console.error('Web服务器错误:', error);
168
+ }
169
+ });
170
+
171
+ // 保存服务器实例引用,方便后续操作
172
+ this.httpServer = httpServer;
173
+ };
174
+
175
+ /**
176
+ * 运行主程序前
177
+ * @param {String} state 状态
178
+ */
179
+ WEB.prototype.before = async function(state) {
180
+ // 确保server实例初始化
181
+ if (!this.server) {
182
+ console.error('[WEB] 服务器实例未初始化,尝试重新初始化');
183
+ this.server = new Koa();
184
+ }
185
+
186
+ var list = this.list;
187
+ console.log(`[WEB] 准备加载中间件,共有 ${list ? list.length : 0} 个中间件`);
188
+ if (list && list.length > 0) {
189
+ // 按优先级顺序应用中间件
190
+ for (var i = 0; i < list.length; i++) {
191
+ var o = list[i];
192
+ try {
193
+ o.func = require(o.func_file);
194
+ if (o.func) {
195
+ // 检查中间件函数的参数个数,支持不同的调用方式
196
+ if (o.func.length === 1) {
197
+ o.func(this.server);
198
+ } else {
199
+ o.func(this.server, this.config);
200
+ }
201
+ // 记录中间件加载日志
202
+ if ($.log && $.log.info) {
203
+ $.log.info(`中间件已加载: ${o.name} (优先级: ${o.sort || 5})`);
204
+ }
205
+ }
206
+ } catch (error) {
207
+ // 记录中间件加载错误
208
+ if ($.log && $.log.error) {
209
+ $.log.error(`中间件加载失败: ${o.name}`, error);
210
+ } else {
211
+ console.error(`中间件加载失败: ${o.name}`, error);
212
+ }
213
+ }
214
+ }
215
+ }
216
+ };
217
+
218
+ /**
219
+ * 运行主程序后
220
+ * @param {String} state 状态
221
+ */
222
+ WEB.prototype.after = async function(state) {
223
+ // 可以在这里添加启动后的清理工作
224
+ };
225
+
226
+ /**
227
+ * 运行
228
+ * @param {String} state 状态
229
+ */
230
+ WEB.prototype.run = async function(state = 'start') {
231
+ try {
232
+ await this.before(state);
233
+ this.main(state);
234
+ await this.after(state);
235
+ } catch (error) {
236
+ // 记录运行错误
237
+ if ($.log && $.log.error) {
238
+ $.log.error('Web服务器运行错误:', error);
239
+ } else {
240
+ console.error('Web服务器运行错误:', error);
241
+ }
242
+ }
243
+ };
244
+
245
+ module.exports = WEB;
@@ -1,4 +1,4 @@
1
- ## 事件框架
2
- 通过事件机制,创造程序的优先执行顺序和并发规则,可以在不同的情况下触发不同的事件函数,
3
- 避免将所有函数写到同一个模块中,降低耦合度,提高并发率。
4
-
1
+ ## 事件框架
2
+ 通过事件机制,创造程序的优先执行顺序和并发规则,可以在不同的情况下触发不同的事件函数,
3
+ 避免将所有函数写到同一个模块中,降低耦合度,提高并发率。
4
+
@@ -1,4 +1,4 @@
1
- {
2
- "name": "事件管理器",
3
- "script": "./index.js"
1
+ {
2
+ "name": "事件管理器",
3
+ "script": "./index.js"
4
4
  }
@@ -1,18 +1,18 @@
1
- [{
2
- // 目标对象
3
- "target": "{1}",
4
- // 事件名称, 用于动态增删改
5
- "name": "{0}",
6
- // 标题, 用于开发者查看事件
7
- "title": "示例事件",
8
- // 描述, 用于介绍该事件是做什么用的
9
- "description": "描述事件使用方法",
10
- // 阶段, 分执行前before、验证check、主要main、渲染render、执行后after阶段
11
- "stage": "main",
12
- // 响应方法 GET请求、POST请求、ALL所有请求,如果非API事件可自定义
13
- "method": "ALL",
14
- // 函数文件, 当事件触发时执行指定的脚本
15
- "func_file": "./main.js",
16
- // 执行顺序, 数值越小越优先执行
17
- "sort": 100
18
- }]
1
+ [{
2
+ // 目标对象
3
+ "target": "{1}",
4
+ // 事件名称, 用于动态增删改
5
+ "name": "{0}",
6
+ // 标题, 用于开发者查看事件
7
+ "title": "示例事件",
8
+ // 描述, 用于介绍该事件是做什么用的
9
+ "description": "描述事件使用方法",
10
+ // 阶段, 分执行前before、验证check、主要main、渲染render、执行后after阶段
11
+ "stage": "main",
12
+ // 响应方法 GET请求、POST请求、ALL所有请求,如果非API事件可自定义
13
+ "method": "ALL",
14
+ // 函数文件, 当事件触发时执行指定的脚本
15
+ "func_file": "./main.js",
16
+ // 执行顺序, 数值越小越优先执行
17
+ "sort": 100
18
+ }]