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.
- package/README.md +1 -1
- package/README_EN.md +2 -2
- package/adapter/adapter.js +105 -52
- package/adapter/custom_persistence.js +32 -31
- package/adapter/mqtt.js +59 -79
- package/adapter/socket.js +188 -58
- package/adapter/web.js +92 -68
- package/adapter/websocket.js +43 -146
- package/com/api/drive.js +732 -708
- package/com/api/index.js +196 -198
- package/com/api/script.tpl.js +24 -24
- package/com/cmd/config.tpl.json +48 -122
- package/com/cmd/drive.js +176 -1548
- package/com/cmd/index.js +287 -1066
- package/com/cmd/job/config.json +66 -0
- package/com/cmd/job/index.js +241 -0
- package/com/cmd/job/test.js +188 -0
- package/com/cmd/script.tpl.js +12 -33
- package/com/db/drive.js +2206 -2019
- package/com/db/index.js +241 -242
- package/com/event/config.tpl.json +3 -1
- package/com/event/drive.js +3 -1
- package/com/event/index.js +73 -46
- package/com/event/script.tpl.js +22 -22
- package/com/mqtt/config.tpl.json +16 -8
- package/com/mqtt/drive.js +696 -676
- package/com/mqtt/index.js +1012 -822
- package/com/mqtt/index.test.js +503 -0
- package/com/mqtt/mm_mqtt.js +446 -420
- package/com/mqtt/script.tpl.js +3 -7
- package/com/nav/drive.js +7 -7
- package/com/nav/index.js +228 -231
- package/com/param/index.js +19 -17
- package/com/pendant/index.js +467 -441
- package/com/socket/drive.js +679 -651
- package/com/socket/index.js +94 -48
- package/com/sql/drive.js +1283 -1259
- package/com/sql/index.js +152 -150
- package/com/static/drive.js +1 -1
- package/com/static/index.js +232 -226
- package/com/static/script.tpl.js +25 -25
- package/com/task/drive.js +428 -405
- package/com/task/index.js +154 -148
- package/com/task/script.tpl.js +37 -34
- package/com/template/drive.js +1 -1
- package/com/template/index.js +141 -138
- package/com.js +87 -6
- package/common/middleware/web_after/index.js +5 -11
- package/common/middleware/web_base/index.js +1 -1
- package/common/middleware/web_cors/index.js +1 -1
- package/common/middleware/web_error/index.js +131 -119
- package/common/middleware/web_error/middleware.json +2 -1
- package/common/middleware/web_logger/index.js +1 -1
- package/common/middleware/web_main/index.js +2 -0
- package/common/middleware/web_static/index.js +2 -2
- package/common/middleware/web_waf/index.js +1 -1
- package/core/app/config.tpl.json +4 -4
- package/core/app/index.js +710 -534
- package/core/middleware/index.js +1 -9
- package/core/mod/config.tpl.json +1 -1
- package/core/model/config.tpl.json +1 -1
- package/core/plugin/config.tpl.json +15 -3
- package/core/plugin/index.js +31 -0
- package/core/pusher/index.js +158 -161
- package/core/scene/loop.js +1306 -1255
- package/core/store/index.js +1794 -1755
- package/core/store/sql.js +1488 -1464
- package/core/zone/bat/index.js +744 -728
- package/core/zone/config.tpl.json +3 -3
- package/core/zone/index.js +655 -616
- package/os.js +0 -4
- package/package.json +16 -16
- package/server.js +583 -427
- package/com/cmd/nlp.js +0 -525
- package/core/app/index copy.js +0 -611
- package/software.js +0 -194
- package/tcp.js +0 -279
package/com/event/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const Manager = require(
|
|
2
|
-
const Drive = require(
|
|
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:
|
|
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:
|
|
44
|
+
base_dir: "../common/event".fullname(__dirname),
|
|
45
45
|
/**
|
|
46
46
|
* 自定义目录,加载项目自定义资源
|
|
47
47
|
* @type {string}
|
|
48
48
|
*/
|
|
49
|
-
dir:
|
|
49
|
+
dir: "./app".fullname(),
|
|
50
50
|
/**
|
|
51
51
|
* 搜索模式 dir按目录搜索 | file按文件名搜索
|
|
52
52
|
* @type {string}
|
|
53
53
|
*/
|
|
54
|
-
search_way:
|
|
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[
|
|
111
|
-
this[
|
|
133
|
+
if (this["list_" + stage]) {
|
|
134
|
+
this["list_" + stage] = [];
|
|
112
135
|
} else {
|
|
113
|
-
this.log(
|
|
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 =
|
|
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.
|
|
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
|
|
177
|
+
case "before":
|
|
144
178
|
this.list_before.push(info);
|
|
145
179
|
break;
|
|
146
|
-
case
|
|
180
|
+
case "check":
|
|
147
181
|
this.list_check.push(info);
|
|
148
182
|
break;
|
|
149
|
-
case
|
|
183
|
+
case "main":
|
|
150
184
|
this.list_main.push(info);
|
|
151
185
|
break;
|
|
152
|
-
case
|
|
186
|
+
case "render":
|
|
153
187
|
this.list_render.push(info);
|
|
154
188
|
break;
|
|
155
|
-
case
|
|
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 ||
|
|
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}
|
|
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 (
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
385
|
+
Event.prototype.get = function (name, stage = "main") {
|
|
359
386
|
var obj;
|
|
360
|
-
var lt = this[
|
|
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({
|
package/com/event/script.tpl.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//
|
|
4
|
-
api.
|
|
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
|
-
|
|
10
|
-
|
|
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
|
+
};
|
package/com/mqtt/config.tpl.json
CHANGED
|
@@ -7,12 +7,20 @@
|
|
|
7
7
|
"description": "${description || '描述mqtt服务使用方法'}",
|
|
8
8
|
// 状态 0未启用,1启用
|
|
9
9
|
"state": 1,
|
|
10
|
-
// 订阅的主题
|
|
11
|
-
|
|
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": [
|
|
19
|
+
"topic_receive": [
|
|
20
|
+
"face/${clientid}/response/${method}"
|
|
21
|
+
],
|
|
14
22
|
// 给客户端推送的主题
|
|
15
|
-
"topic_push": "
|
|
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": "
|
|
33
|
+
"msgid": "msgid",
|
|
26
34
|
// 请求方法
|
|
27
|
-
"method": "
|
|
35
|
+
"method": "method",
|
|
28
36
|
// 参数
|
|
29
|
-
"params": "
|
|
37
|
+
"params": "params",
|
|
30
38
|
// 结果
|
|
31
39
|
"result": "result",
|
|
32
40
|
// 回复方法
|
|
33
|
-
"method_receive": "${method}
|
|
41
|
+
"method_receive": "${method}_ask"
|
|
34
42
|
}
|