mm_os 4.2.4 → 4.2.7

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 (77) hide show
  1. package/README.md +1 -1
  2. package/README_EN.md +2 -2
  3. package/adapter/adapter.js +105 -52
  4. package/adapter/custom_persistence.js +32 -31
  5. package/adapter/mqtt.js +59 -79
  6. package/adapter/socket.js +188 -58
  7. package/adapter/web.js +92 -68
  8. package/adapter/websocket.js +43 -146
  9. package/com/api/drive.js +732 -708
  10. package/com/api/index.js +196 -198
  11. package/com/api/script.tpl.js +24 -24
  12. package/com/cmd/config.tpl.json +48 -122
  13. package/com/cmd/drive.js +176 -1548
  14. package/com/cmd/index.js +287 -1066
  15. package/com/cmd/job/config.json +66 -0
  16. package/com/cmd/job/index.js +241 -0
  17. package/com/cmd/job/test.js +188 -0
  18. package/com/cmd/script.tpl.js +12 -33
  19. package/com/db/drive.js +2206 -2019
  20. package/com/db/index.js +241 -242
  21. package/com/event/config.tpl.json +3 -1
  22. package/com/event/drive.js +3 -1
  23. package/com/event/index.js +73 -46
  24. package/com/event/script.tpl.js +22 -22
  25. package/com/mqtt/config.tpl.json +16 -8
  26. package/com/mqtt/drive.js +696 -676
  27. package/com/mqtt/index.js +1012 -822
  28. package/com/mqtt/index.test.js +503 -0
  29. package/com/mqtt/mm_mqtt.js +446 -420
  30. package/com/mqtt/script.tpl.js +3 -7
  31. package/com/nav/drive.js +7 -7
  32. package/com/nav/index.js +228 -231
  33. package/com/param/index.js +19 -17
  34. package/com/pendant/index.js +467 -441
  35. package/com/socket/drive.js +679 -651
  36. package/com/socket/index.js +94 -48
  37. package/com/sql/drive.js +1283 -1259
  38. package/com/sql/index.js +152 -150
  39. package/com/static/drive.js +1 -1
  40. package/com/static/index.js +232 -226
  41. package/com/static/script.tpl.js +25 -25
  42. package/com/task/drive.js +428 -405
  43. package/com/task/index.js +154 -148
  44. package/com/task/script.tpl.js +37 -34
  45. package/com/template/drive.js +1 -1
  46. package/com/template/index.js +141 -138
  47. package/com.js +87 -6
  48. package/common/middleware/web_after/index.js +5 -11
  49. package/common/middleware/web_base/index.js +1 -1
  50. package/common/middleware/web_cors/index.js +1 -1
  51. package/common/middleware/web_error/index.js +131 -119
  52. package/common/middleware/web_error/middleware.json +2 -1
  53. package/common/middleware/web_logger/index.js +1 -1
  54. package/common/middleware/web_main/index.js +2 -0
  55. package/common/middleware/web_static/index.js +2 -2
  56. package/common/middleware/web_waf/index.js +1 -1
  57. package/core/app/config.tpl.json +4 -4
  58. package/core/app/index.js +710 -534
  59. package/core/middleware/index.js +1 -9
  60. package/core/mod/config.tpl.json +1 -1
  61. package/core/model/config.tpl.json +1 -1
  62. package/core/plugin/config.tpl.json +15 -3
  63. package/core/plugin/index.js +31 -0
  64. package/core/pusher/index.js +158 -161
  65. package/core/scene/loop.js +1306 -1255
  66. package/core/store/index.js +1794 -1755
  67. package/core/store/sql.js +1488 -1464
  68. package/core/zone/bat/index.js +744 -728
  69. package/core/zone/config.tpl.json +3 -3
  70. package/core/zone/index.js +655 -616
  71. package/os.js +0 -4
  72. package/package.json +16 -16
  73. package/server.js +583 -427
  74. package/com/cmd/nlp.js +0 -525
  75. package/core/app/index copy.js +0 -611
  76. package/software.js +0 -194
  77. package/tcp.js +0 -279
@@ -1,5 +1,5 @@
1
- const Manager = require('mm_machine').Manager;
2
- const Drive = require('./drive');
1
+ const Manager = require("mm_machine").Manager;
2
+ const Drive = require("./drive");
3
3
 
4
4
  /**
5
5
  * Event事件类
@@ -16,22 +16,22 @@ class Event extends Manager {
16
16
  * 名称
17
17
  * @type {string}
18
18
  */
19
- name: '',
19
+ name: "",
20
20
  /**
21
21
  * 标题
22
22
  * @type {string}
23
23
  */
24
- title: '事件管理',
24
+ title: "事件管理",
25
25
  /**
26
26
  * 描述
27
27
  * @type {string}
28
28
  */
29
- description: '这是事件管理器',
29
+ description: "这是事件管理器",
30
30
  /**
31
31
  * 检索文件名
32
32
  * @type {string}
33
33
  */
34
- filename: 'event.json',
34
+ filename: "event.json",
35
35
  /**
36
36
  * 模板目录
37
37
  * @type {string}
@@ -41,17 +41,17 @@ class Event extends Manager {
41
41
  * 基础目录
42
42
  * @type {string}
43
43
  */
44
- base_dir: '../common/event'.fullname(__dirname),
44
+ base_dir: "../common/event".fullname(__dirname),
45
45
  /**
46
46
  * 自定义目录,加载项目自定义资源
47
47
  * @type {string}
48
48
  */
49
- dir: './app'.fullname(),
49
+ dir: "./app".fullname(),
50
50
  /**
51
51
  * 搜索模式 dir按目录搜索 | file按文件名搜索
52
52
  * @type {string}
53
53
  */
54
- search_way: 'dir',
54
+ search_way: "dir",
55
55
  /**
56
56
  * 是否懒加载
57
57
  * @type {boolean}
@@ -66,7 +66,7 @@ class Event extends Manager {
66
66
  * 5.热更新+重载模式,改变配置文件重新加载配置和脚本,执行完后重新加载脚本
67
67
  * @type {number}
68
68
  */
69
- mode: 3
69
+ mode: process.env.NODE_ENV === "production" ? 1 : 3,
70
70
  };
71
71
 
72
72
  /**
@@ -101,16 +101,42 @@ Event.prototype._preset = function () {
101
101
  */
102
102
  Event.prototype.Drive = Drive;
103
103
 
104
+ /**
105
+ * 更新配置,注册模块后重建事件列表
106
+ * @param {string} dir 检索路径
107
+ * @param {boolean} clear 是否清除缓存
108
+ */
109
+ Event.prototype.update = async function (dir, clear = true) {
110
+ try {
111
+ if (clear) {
112
+ this.clearMods();
113
+ }
114
+ var search_dir = dir || this.config.dir;
115
+ var files = await this._findFiles(search_dir);
116
+ this.regMods(files);
117
+ this.updateInfo();
118
+ if (!this.config.lazy_load) {
119
+ await this.loadMods();
120
+ }
121
+ this._is_loaded = true;
122
+ } catch (err) {
123
+ this.log("error", "更新配置失败", err);
124
+ }
125
+ };
126
+
104
127
  /**
105
128
  * 清除事件
106
129
  * @param {string} stage 阶段
107
130
  */
108
131
  Event.prototype.clear = function (stage) {
109
132
  if (stage) {
110
- if (this['list_' + stage]) {
111
- this['list_' + stage] = [];
133
+ if (this["list_" + stage]) {
134
+ this["list_" + stage] = [];
112
135
  } else {
113
- this.log('debug', '清空失败,事件发展阶段{0}不存在!'.replace('{0}', stage));
136
+ this.log(
137
+ "debug",
138
+ "清空失败,事件发展阶段{0}不存在!".replace("{0}", stage),
139
+ );
114
140
  }
115
141
  } else {
116
142
  this.list_before = [];
@@ -125,12 +151,20 @@ Event.prototype.clear = function (stage) {
125
151
  * 更新模块信息
126
152
  */
127
153
  Event.prototype.updateInfo = function () {
154
+ this._preset();
155
+ this.infos = [];
128
156
  for (let name in this.mods) {
129
157
  let o = this.mods[name];
130
- let info = this.newInfo(name, o.config.sort, o.config.state, o.config_file);
158
+ let info = {
159
+ name: o.config.name,
160
+ sort: o.config.sort,
161
+ state: o.config.state,
162
+ config_file: o.config_file,
163
+ };
164
+ this.infos.push(info);
131
165
  this.pushList(o.config.stage, info);
132
166
  }
133
- this.sort();
167
+ this._sort();
134
168
  };
135
169
 
136
170
  /**
@@ -140,19 +174,19 @@ Event.prototype.updateInfo = function () {
140
174
  */
141
175
  Event.prototype.pushList = function (stage, info) {
142
176
  switch (stage) {
143
- case 'before':
177
+ case "before":
144
178
  this.list_before.push(info);
145
179
  break;
146
- case 'check':
180
+ case "check":
147
181
  this.list_check.push(info);
148
182
  break;
149
- case 'main':
183
+ case "main":
150
184
  this.list_main.push(info);
151
185
  break;
152
- case 'render':
186
+ case "render":
153
187
  this.list_render.push(info);
154
188
  break;
155
- case 'after':
189
+ case "after":
156
190
  this.list_after.push(info);
157
191
  break;
158
192
  default:
@@ -176,7 +210,7 @@ Event.prototype._sort = function () {
176
210
  * @param {Array} list 列表
177
211
  */
178
212
  Event.prototype._sortSub = function (list) {
179
- var sort_key = this.config.sort_key || 'sort';
213
+ var sort_key = this.config.sort_key || "sort";
180
214
  list.sort((o1, o2) => {
181
215
  let s1 = o1[sort_key] || 100;
182
216
  let s2 = o2[sort_key] || 100;
@@ -194,18 +228,18 @@ Event.prototype._sortSub = function (list) {
194
228
 
195
229
  /**
196
230
  * 执行事件
197
- * @param {object} o 事件项
231
+ * @param {object} mod 模块
198
232
  * @param {object} ctx 请求上下文
199
233
  * @param {object} db 数据管理器
200
234
  * @returns {object} 执行结果
201
235
  */
202
- Event.prototype.doing = async function (o, ctx, db) {
203
- var ret = o.run(ctx, db);
204
- if (types.isPromise(ret)) {
205
- ret = await ret;
236
+ Event.prototype.doing = async function (mod, ctx, db) {
237
+ if (!mod.isLoaded()) {
238
+ await mod.do("load");
206
239
  }
240
+ var ret = await mod.run(ctx, db);
207
241
  if (this.mode > 4) {
208
- o.do('reload');
242
+ mod.do("reload");
209
243
  }
210
244
  return ret;
211
245
  };
@@ -219,18 +253,17 @@ Event.prototype.doing = async function (o, ctx, db) {
219
253
  Event.prototype.isMatch = function (str, pattern) {
220
254
  if (str === pattern) {
221
255
  return true;
222
- } else if (pattern.startsWith('*')) {
223
- let clean = pattern.replaceAll('*', '');
224
- if (pattern.endsWith('*')) {
256
+ } else if (pattern.startsWith("*")) {
257
+ let clean = pattern.replaceAll("*", "");
258
+ if (pattern.endsWith("*")) {
225
259
  return str.indexOf(clean) !== -1;
226
260
  } else {
227
261
  return str.endsWith(clean);
228
262
  }
229
- } else if (pattern.endsWith('*')) {
230
- let clean = pattern.replaceAll('*', '');
263
+ } else if (pattern.endsWith("*")) {
264
+ let clean = pattern.replaceAll("*", "");
231
265
  return str.startsWith(clean);
232
- }
233
- else {
266
+ } else {
234
267
  return false;
235
268
  }
236
269
  };
@@ -244,18 +277,12 @@ Event.prototype.isMatch = function (str, pattern) {
244
277
  * @returns {object} 执行结果
245
278
  */
246
279
  Event.prototype.runSub = async function (list, target, ctx, db) {
247
- for (var i = 0, info; info = list[i++];) {
280
+ for (var i = 0, info; (info = list[i++]);) {
248
281
  if (info.state === 1) {
249
282
  let mod = this.getMod(info.name);
250
283
  if (mod && this.isMatch(target, mod.config.target)) {
251
284
  try {
252
- if (!mod.isLoaded()) {
253
- await mod.call('loadScript');
254
- }
255
- var ret = await mod.run(ctx, db);
256
- if (this.mode > 4) {
257
- mod.do('reload');
258
- }
285
+ let ret = await this.doing(mod, ctx, db);
259
286
  if (ret) {
260
287
  db.ret = ret;
261
288
  if (mod.config.end) {
@@ -264,7 +291,7 @@ Event.prototype.runSub = async function (list, target, ctx, db) {
264
291
  }
265
292
  } catch (error) {
266
293
  // 事件执行异常时继续执行下一个事件
267
- this.log('error', `事件${info.name}执行失败`, error);
294
+ this.log("error", `事件${info.name}执行失败`, error);
268
295
  }
269
296
  }
270
297
  }
@@ -355,9 +382,9 @@ Event.prototype.run = async function (target, ctx, db = {}) {
355
382
  * @param {string} stage 阶段
356
383
  * @returns {object} 返回单项配置
357
384
  */
358
- Event.prototype.get = function (name, stage = 'main') {
385
+ Event.prototype.get = function (name, stage = "main") {
359
386
  var obj;
360
- var lt = this['list_' + stage];
387
+ var lt = this["list_" + stage];
361
388
  var len = lt.length;
362
389
  for (var i = 0; i < len; i++) {
363
390
  var o = lt[i];
@@ -388,7 +415,7 @@ if (!$.pool.event) {
388
415
  * @returns {object} 返回一个事件类
389
416
  */
390
417
  function eventAdmin(scope, title) {
391
- var sc = scope || $.val.scope + '';
418
+ var sc = scope || $.val.scope + "";
392
419
  var obj = $.pool.event[sc];
393
420
  if (!obj) {
394
421
  $.pool.event[sc] = new Event({
@@ -1,23 +1,23 @@
1
- // 使用api管理器
2
- var api = $.admin.api('${name}_api', '${title}客户端');
3
- // 首次启动更新api接口;
4
- api.call('update', 'app/');
1
+ exports = {
2
+ async init(options) {
3
+ // 使用api管理器
4
+ var api = $.admin.api('${name}_api', '${title}客户端');
5
+ // 首次启动更新api接口;
6
+ await api.call('update', 'app/');
7
+ },
8
+ /**
9
+ * 接口主函数
10
+ * @param {object} ctx HTTP上下文
11
+ * @param {object} db 数据管理器,如: { next: async function{}, ret: {} }
12
+ * @returns {object} 执行结果
13
+ */
14
+ async main(ctx, db) {
15
+ var sql = $.admin.sql('sys');
16
+ // 使用模板引擎
17
+ db.tpl = new $.Tpl();
5
18
 
6
-
7
- /**
8
- * 接口主函数
9
- * @param {object} ctx HTTP上下文
10
- * @param {object} db 数据管理器,如: { next: async function{}, ret: {} }
11
- * @returns {object} 执行结果
12
- */
13
- async function main(ctx, db) {
14
- var sql = $.admin.sql('sys');
15
- // 使用模板引擎
16
- db.tpl = new $.Tpl();
17
-
18
- // 在这定义要访问的数据库 (分布式开发时设置不同的数据库名)
19
- $.push(db, sql.db(), true);
20
- return api.run(ctx, db);
21
- };
22
-
23
- exports.main = main;
19
+ // 在这定义要访问的数据库 (分布式开发时设置不同的数据库名)
20
+ $.push(db, sql.db(), true);
21
+ return api.run(ctx, db);
22
+ }
23
+ };
@@ -7,12 +7,20 @@
7
7
  "description": "${description || '描述mqtt服务使用方法'}",
8
8
  // 状态 0未启用,1启用
9
9
  "state": 1,
10
- // 订阅的主题
11
- "topic": ["mqtt/face/#", "face/+/response", "mqtt/server/#"],
10
+ // 订阅的主题 {产品类型}/{设备ID}/{数据类型}/{子类型}
11
+ // 接收设备状态、事件、命令回复、设备请求
12
+ "topic": [
13
+ "face/+/status",
14
+ "face/+/event/recognition",
15
+ "face/+/cmd/+/response",
16
+ "face/+/request/+"
17
+ ],
12
18
  // 回复订阅主题
13
- "topic_receive": ["mqtt/face/${clientid}", "face/${clientid}/request"],
19
+ "topic_receive": [
20
+ "face/${clientid}/response/${method}"
21
+ ],
14
22
  // 给客户端推送的主题
15
- "topic_push": "mqtt/face/${clientid}",
23
+ "topic_push": "face/${clientid}/cmd/${method}",
16
24
  // 接收方式
17
25
  "qos": 2,
18
26
  // 保持接收
@@ -22,13 +30,13 @@
22
30
  // 客户端ID
23
31
  "clientid": "clientid",
24
32
  // 消息ID
25
- "msgid": "messageId",
33
+ "msgid": "msgid",
26
34
  // 请求方法
27
- "method": "operator",
35
+ "method": "method",
28
36
  // 参数
29
- "params": "info",
37
+ "params": "params",
30
38
  // 结果
31
39
  "result": "result",
32
40
  // 回复方法
33
- "method_receive": "${method}-Ack"
41
+ "method_receive": "${method}_ask"
34
42
  }