mm_os 4.1.2 → 4.1.4
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/com/db/drive.js +54 -53
- package/package.json +1 -1
- package/server.js +2 -2
- package/tcp.js +276 -0
package/com/db/drive.js
CHANGED
|
@@ -29,7 +29,7 @@ class Drive extends Item {
|
|
|
29
29
|
'fields': [
|
|
30
30
|
/* */
|
|
31
31
|
],
|
|
32
|
-
'index
|
|
32
|
+
'index': [],
|
|
33
33
|
// 主程序文件 - 默认为空
|
|
34
34
|
'main': ''
|
|
35
35
|
};
|
|
@@ -61,7 +61,7 @@ Drive.prototype._reset = function () {
|
|
|
61
61
|
this.get_not = ['password', 'salt', 'content'];
|
|
62
62
|
|
|
63
63
|
// 是否设置以下字段为getObj查对象SQL时不可见
|
|
64
|
-
this.
|
|
64
|
+
this.get_obj_not = ['password', 'salt', 'display'];
|
|
65
65
|
|
|
66
66
|
// 是否设置默认该表仅用户可访问
|
|
67
67
|
this.query_default_table = ['user'];
|
|
@@ -78,10 +78,10 @@ Drive.prototype._parseFieldType = function (type) {
|
|
|
78
78
|
var max = 0;
|
|
79
79
|
var decimal = 0;
|
|
80
80
|
if (len) {
|
|
81
|
-
max =
|
|
81
|
+
max = Number(len.left(',', true));
|
|
82
82
|
var d = len.right(',');
|
|
83
83
|
if (d) {
|
|
84
|
-
decimal =
|
|
84
|
+
decimal = Number(d);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
return { tp, max, decimal };
|
|
@@ -110,11 +110,11 @@ Drive.prototype._parseFieldNote = function (note, tp, max_length) {
|
|
|
110
110
|
if (range) {
|
|
111
111
|
var min_str = range.left(',', true);
|
|
112
112
|
if (min_str) {
|
|
113
|
-
min =
|
|
113
|
+
min = Number(min_str);
|
|
114
114
|
}
|
|
115
115
|
var max_str = range.right(',');
|
|
116
116
|
if (max_str) {
|
|
117
|
-
var n =
|
|
117
|
+
var n = Number(max_str);
|
|
118
118
|
if (tp === 'varchar') {
|
|
119
119
|
if (n < local_max_length) {
|
|
120
120
|
local_max_length = n;
|
|
@@ -126,8 +126,11 @@ Drive.prototype._parseFieldNote = function (note, tp, max_length) {
|
|
|
126
126
|
}
|
|
127
127
|
map = desc.between('(', ')');
|
|
128
128
|
}
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
let min_length = 0;
|
|
130
|
+
if (min > 0) {
|
|
131
|
+
min_length = min;
|
|
132
|
+
}
|
|
133
|
+
return { title, description, map, min, max, min_length, max_length: local_max_length };
|
|
131
134
|
};
|
|
132
135
|
|
|
133
136
|
/**
|
|
@@ -137,7 +140,7 @@ Drive.prototype._parseFieldNote = function (note, tp, max_length) {
|
|
|
137
140
|
* @param {number} max_length 最大长度
|
|
138
141
|
* @returns {number} 计算后的最大值
|
|
139
142
|
*/
|
|
140
|
-
Drive.prototype.
|
|
143
|
+
Drive.prototype._calcMaxValue = function (tp, max, max_length) {
|
|
141
144
|
var local_max = max;
|
|
142
145
|
if (local_max === 0) {
|
|
143
146
|
switch (tp) {
|
|
@@ -275,6 +278,7 @@ Drive.prototype.model = function (fields) {
|
|
|
275
278
|
map,
|
|
276
279
|
min,
|
|
277
280
|
max: parsedMax,
|
|
281
|
+
min_length,
|
|
278
282
|
max_length: parsedMaxLength
|
|
279
283
|
} = this._parseFieldNote(note, tp, max_length);
|
|
280
284
|
|
|
@@ -309,7 +313,7 @@ Drive.prototype.model = function (fields) {
|
|
|
309
313
|
* @property {string} o.Manager_comment 索引备注
|
|
310
314
|
* @returns {object} 返回索引模型
|
|
311
315
|
*/
|
|
312
|
-
Drive.prototype.
|
|
316
|
+
Drive.prototype.newIndexModel = function (o) {
|
|
313
317
|
return {
|
|
314
318
|
'name': o.Key_name,
|
|
315
319
|
'type': o.Non_unique ? 'unique' : 'index',
|
|
@@ -323,16 +327,16 @@ Drive.prototype.modelmanager = function (o) {
|
|
|
323
327
|
* @param {object} db 数据库管理器
|
|
324
328
|
* @returns {Array} 索引列表
|
|
325
329
|
*/
|
|
326
|
-
Drive.prototype.
|
|
330
|
+
Drive.prototype._updateFile = async function (db) {
|
|
327
331
|
var sql = 'SHOW INDEX FROM `' + this.config.table + '`';
|
|
328
|
-
var rows = db.run(sql);
|
|
332
|
+
var rows = await db.run(sql);
|
|
329
333
|
var dict = {};
|
|
330
334
|
for (var i = 0; i < rows.length; i++) {
|
|
331
335
|
var o = rows[i];
|
|
332
336
|
if (o.Key_name !== 'PRIMARY') {
|
|
333
337
|
if (!dict[o.Key_name]) {
|
|
334
338
|
dict[o.Key_name] = {
|
|
335
|
-
|
|
339
|
+
Column_name: []
|
|
336
340
|
};
|
|
337
341
|
}
|
|
338
342
|
dict[o.Key_name].Column_name.push(o.Column_name);
|
|
@@ -340,7 +344,7 @@ Drive.prototype.updateFilemanager = function (db) {
|
|
|
340
344
|
}
|
|
341
345
|
var list = [];
|
|
342
346
|
for (var k in dict) {
|
|
343
|
-
var m = this.
|
|
347
|
+
var m = this.newIndexModel(dict[k]);
|
|
344
348
|
list.push(m);
|
|
345
349
|
}
|
|
346
350
|
|
|
@@ -381,7 +385,7 @@ Drive.prototype.updateFile = async function (db, cover) {
|
|
|
381
385
|
list.push(field);
|
|
382
386
|
}
|
|
383
387
|
cg.fields = list;
|
|
384
|
-
cg.index = await this.
|
|
388
|
+
cg.index = await this._updateFile(db);
|
|
385
389
|
if (!cg.name) {
|
|
386
390
|
cg.name = cg.table;
|
|
387
391
|
}
|
|
@@ -392,14 +396,14 @@ Drive.prototype.updateFile = async function (db, cover) {
|
|
|
392
396
|
* 更新索引
|
|
393
397
|
* @param {object} db 数据库管理器
|
|
394
398
|
*/
|
|
395
|
-
Drive.prototype.
|
|
399
|
+
Drive.prototype._updateDb = async function (db) {
|
|
396
400
|
var cg = this.config;
|
|
397
401
|
let index = cg.index || [];
|
|
398
402
|
// 更新索引
|
|
399
403
|
if (index) {
|
|
400
404
|
var len = index.length;
|
|
401
405
|
for (var i = 0; i < len; i++) {
|
|
402
|
-
var o = index
|
|
406
|
+
var o = index[i];
|
|
403
407
|
var sql_start = '';
|
|
404
408
|
if (o.type === 'unique') {
|
|
405
409
|
sql_start = 'CREATE UNIQUE INDEX `';
|
|
@@ -470,7 +474,6 @@ Drive.prototype._generateFieldSql = function (o) {
|
|
|
470
474
|
var notnull = this._getNotNullSql(o);
|
|
471
475
|
var value = this._getValueSql(o);
|
|
472
476
|
var note = this._getNoteSql(o);
|
|
473
|
-
|
|
474
477
|
return this._buildFieldSql(o.name, type, notnull, value, note);
|
|
475
478
|
};
|
|
476
479
|
|
|
@@ -715,8 +718,7 @@ Drive.prototype._addOrUpdateField = async function (db, table, o, fields) {
|
|
|
715
718
|
*/
|
|
716
719
|
Drive.prototype.updateDb = async function (db) {
|
|
717
720
|
var cg = this.config;
|
|
718
|
-
|
|
719
|
-
var table = cg.table;
|
|
721
|
+
var table = cg.table + '';
|
|
720
722
|
var list = cg.fields;
|
|
721
723
|
|
|
722
724
|
var fields = await this._initTable(db, cg, list);
|
|
@@ -742,14 +744,14 @@ Drive.prototype.updateDb = async function (db) {
|
|
|
742
744
|
* @returns {object} 目录信息
|
|
743
745
|
* @private
|
|
744
746
|
*/
|
|
745
|
-
Drive.prototype.
|
|
747
|
+
Drive.prototype._deteDir = function (cg) {
|
|
748
|
+
var arr = cg.table.split('_');
|
|
749
|
+
var scope = arr[0];
|
|
746
750
|
var p = './app/'.fullname();
|
|
747
|
-
var
|
|
748
|
-
var
|
|
749
|
-
var
|
|
750
|
-
var
|
|
751
|
-
var db_dir = dir_api + '/db';
|
|
752
|
-
var config_file = db_dir.fullname() + cg.table.replace(scope + '_', '') + '.db.json';
|
|
751
|
+
var dir = ('./' + scope).fullname(p);
|
|
752
|
+
var dir_api = ('./plugin/server').fullname(dir);
|
|
753
|
+
var db_dir = ('./db').fullname(dir_api);
|
|
754
|
+
var config_file = ('./' + cg.table.replace(scope + '_', '') + '.db.json').fullname(db_dir);
|
|
753
755
|
|
|
754
756
|
return {
|
|
755
757
|
scope,
|
|
@@ -790,7 +792,7 @@ Drive.prototype._handleConfigFile = function (f, cover) {
|
|
|
790
792
|
delete o.description;
|
|
791
793
|
}
|
|
792
794
|
$.push(jobj, o, true);
|
|
793
|
-
f.saveText(JSON.stringify(jobj, null,
|
|
795
|
+
f.saveText(JSON.stringify(jobj, null, 2));
|
|
794
796
|
}
|
|
795
797
|
};
|
|
796
798
|
|
|
@@ -804,14 +806,12 @@ Drive.prototype.updateApp = async function (cover) {
|
|
|
804
806
|
var dir_api;
|
|
805
807
|
|
|
806
808
|
if (!this.config_file) {
|
|
807
|
-
var dirs = this.
|
|
808
|
-
|
|
809
|
+
var dirs = this._deteDir(cg);
|
|
809
810
|
this._ensureDir(dirs.dir);
|
|
810
811
|
this._ensureDir(dirs.dir + '/plugin');
|
|
811
812
|
this._ensureDir(dirs.dir_api);
|
|
812
813
|
this._ensureDir(dirs.db_dir);
|
|
813
|
-
|
|
814
|
-
this.dir = dirs.db_dir.fullname();
|
|
814
|
+
this._dir = dirs.db_dir;
|
|
815
815
|
this.config_file = dirs.config_file;
|
|
816
816
|
f = dirs.config_file;
|
|
817
817
|
dir_api = dirs.dir_api;
|
|
@@ -820,16 +820,10 @@ Drive.prototype.updateApp = async function (cover) {
|
|
|
820
820
|
}
|
|
821
821
|
|
|
822
822
|
if (f) {
|
|
823
|
-
|
|
824
|
-
this.dir = f.dirname();
|
|
825
|
-
if (!fs.existsSync(this.dir)) {
|
|
826
|
-
fs.mkdirSync(this.dir);
|
|
827
|
-
}
|
|
828
|
-
}
|
|
823
|
+
f.addDir();
|
|
829
824
|
if (!dir_api) {
|
|
830
|
-
dir_api =
|
|
825
|
+
dir_api = f.dirname().dirname();
|
|
831
826
|
}
|
|
832
|
-
|
|
833
827
|
this._handleConfigFile(f, cover);
|
|
834
828
|
this.updateApi(dir_api, cover);
|
|
835
829
|
}
|
|
@@ -855,9 +849,10 @@ Drive.prototype._ensureApiDir = function (dir) {
|
|
|
855
849
|
* @returns {string} 完整目录路径
|
|
856
850
|
* @private
|
|
857
851
|
*/
|
|
858
|
-
Drive.prototype.
|
|
852
|
+
Drive.prototype._getApiDir = function (dir, app, type, name) {
|
|
859
853
|
var l = $.slash;
|
|
860
|
-
|
|
854
|
+
let event_api = $.admin.event('api');
|
|
855
|
+
var o = event_api.getMod(app + '_' + type);
|
|
861
856
|
var api_dir;
|
|
862
857
|
|
|
863
858
|
if (o) {
|
|
@@ -888,8 +883,8 @@ Drive.prototype.updateApi = async function (dir, cover) {
|
|
|
888
883
|
}
|
|
889
884
|
var app = arr[0];
|
|
890
885
|
|
|
891
|
-
var client = this.
|
|
892
|
-
var manage = this.
|
|
886
|
+
var client = this._getApiDir(dir, app, 'client', name);
|
|
887
|
+
var manage = this._getApiDir(dir, app, 'manage', name);
|
|
893
888
|
|
|
894
889
|
this.newSql(client, manage, cover);
|
|
895
890
|
await this.newParam(client, manage, cover);
|
|
@@ -1050,7 +1045,7 @@ Drive.prototype._procFieldSel = function (field_name, field_type) {
|
|
|
1050
1045
|
if (this.isCan(field_name, this.get_not, field_type)) {
|
|
1051
1046
|
res.field += ',`' + field_name + '`';
|
|
1052
1047
|
}
|
|
1053
|
-
if (this.isCan(field_name, this.
|
|
1048
|
+
if (this.isCan(field_name, this.get_obj_not)) {
|
|
1054
1049
|
res.field_obj += ',`' + field_name + '`';
|
|
1055
1050
|
}
|
|
1056
1051
|
|
|
@@ -1104,7 +1099,7 @@ Drive.prototype._procNumberQuery = function (
|
|
|
1104
1099
|
update: { ...update_obj }
|
|
1105
1100
|
};
|
|
1106
1101
|
|
|
1107
|
-
if (!field_name.
|
|
1102
|
+
if (!field_name.endsWith('id')) {
|
|
1108
1103
|
query[field_name + '_min'] = '`' + field_name + '` >= {0}';
|
|
1109
1104
|
query[field_name + '_max'] = '`' + field_name + '` <= {0}';
|
|
1110
1105
|
res.update[field_name + '_add'] = '`' + field_name + '` = `' + field_name + '` + {0}';
|
|
@@ -1324,7 +1319,7 @@ Drive.prototype._saveClientConfig = function (client, base_model, orderby, uid,
|
|
|
1324
1319
|
if (orderby) {
|
|
1325
1320
|
oj.orderby_default = orderby;
|
|
1326
1321
|
}
|
|
1327
|
-
if (oj.query_default[uid] && table.indexOf('user_') !== -1) {
|
|
1322
|
+
if (oj.orderby_default && oj.query_default[uid] && table.indexOf('user_') !== -1) {
|
|
1328
1323
|
oj.filter = {
|
|
1329
1324
|
'table': 'table',
|
|
1330
1325
|
'page': 'page',
|
|
@@ -1351,7 +1346,7 @@ Drive.prototype._saveManageConfig = function (manage, base_model, cover) {
|
|
|
1351
1346
|
delete m.method;
|
|
1352
1347
|
m.field_hide = [];
|
|
1353
1348
|
m.name += 2;
|
|
1354
|
-
m.field_obj = m.field_obj.replace(',`time_create`', '').replace(',`time_update`', '')
|
|
1349
|
+
m.field_obj = (m.field_obj || '*').replace(',`time_create`', '').replace(',`time_update`', '')
|
|
1355
1350
|
.replace(',`create_time`', '').replace(',`update_time`', '');
|
|
1356
1351
|
delete m.query_default;
|
|
1357
1352
|
this.saveFile(manage + '/sql.json', m, cover);
|
|
@@ -1388,7 +1383,7 @@ Drive.prototype.newSql = async function (client, manage, cover) {
|
|
|
1388
1383
|
*/
|
|
1389
1384
|
Drive.prototype.saveFile = function (file, model, cover) {
|
|
1390
1385
|
if (!file.hasFile()) {
|
|
1391
|
-
file.saveText(JSON.stringify(model, null,
|
|
1386
|
+
file.saveText(JSON.stringify(model, null, 2));
|
|
1392
1387
|
} else if (cover) {
|
|
1393
1388
|
var jobj = file.loadJson();
|
|
1394
1389
|
for (var k in model) {
|
|
@@ -1398,7 +1393,7 @@ Drive.prototype.saveFile = function (file, model, cover) {
|
|
|
1398
1393
|
}
|
|
1399
1394
|
}
|
|
1400
1395
|
$.push(jobj, model, true);
|
|
1401
|
-
file.saveText(JSON.stringify(jobj, null,
|
|
1396
|
+
file.saveText(JSON.stringify(jobj, null, 2));
|
|
1402
1397
|
}
|
|
1403
1398
|
};
|
|
1404
1399
|
|
|
@@ -1408,7 +1403,7 @@ Drive.prototype.saveFile = function (file, model, cover) {
|
|
|
1408
1403
|
* @param {string} manage 管理端配置保存路径
|
|
1409
1404
|
* @param {boolean} cover 是否覆盖文件
|
|
1410
1405
|
*/
|
|
1411
|
-
Drive.prototype.
|
|
1406
|
+
Drive.prototype.newParam = async function (client, manage, cover) {
|
|
1412
1407
|
var cg = this.config;
|
|
1413
1408
|
var lt = cg.fields;
|
|
1414
1409
|
var cm = this._initParamConfig(cg);
|
|
@@ -1665,7 +1660,7 @@ Drive.prototype._addDateTimeRange = function (cm, m, n) {
|
|
|
1665
1660
|
*/
|
|
1666
1661
|
Drive.prototype._processNumberField = function (cm, m, o, n, cg) {
|
|
1667
1662
|
m.type = 'number';
|
|
1668
|
-
m.default =
|
|
1663
|
+
m.default = Number(o.default) + '';
|
|
1669
1664
|
m.number = {};
|
|
1670
1665
|
|
|
1671
1666
|
this._addNumberRange(m, o);
|
|
@@ -1738,7 +1733,7 @@ Drive.prototype._processNonPrimaryKey = function (cm, m, n) {
|
|
|
1738
1733
|
*/
|
|
1739
1734
|
Drive.prototype._processNonTinyInt = function (cm, m, n) {
|
|
1740
1735
|
var ne = n;
|
|
1741
|
-
if (!ne.
|
|
1736
|
+
if (!ne.endsWith('id')) {
|
|
1742
1737
|
this._addNumberRangeFields(cm, m, n);
|
|
1743
1738
|
} else {
|
|
1744
1739
|
cm.get.query.push(n);
|
|
@@ -1826,6 +1821,9 @@ Drive.prototype._saveParamFiles = function (cm, client, manage, cover) {
|
|
|
1826
1821
|
* @returns {boolean} 是否设置
|
|
1827
1822
|
*/
|
|
1828
1823
|
Drive.prototype.isSet = function (name, arr) {
|
|
1824
|
+
if (!arr) {
|
|
1825
|
+
return false;
|
|
1826
|
+
}
|
|
1829
1827
|
var bl = false;
|
|
1830
1828
|
for (var i = 0; i < arr.length; i++) {
|
|
1831
1829
|
if (name.indexOf(arr[i]) !== -1) {
|
|
@@ -1847,6 +1845,9 @@ Drive.prototype.isCan = function (name, arr, type) {
|
|
|
1847
1845
|
if (type === 'longtext') {
|
|
1848
1846
|
return false;
|
|
1849
1847
|
}
|
|
1848
|
+
if (!arr) {
|
|
1849
|
+
return false;
|
|
1850
|
+
}
|
|
1850
1851
|
var bl = false;
|
|
1851
1852
|
for (var i = 0; i < arr.length; i++) {
|
|
1852
1853
|
if (name.indexOf(arr[i]) !== -1) {
|
package/package.json
CHANGED
package/server.js
CHANGED
package/tcp.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
const {
|
|
2
|
+
Manager
|
|
3
|
+
} = require('mm_machine');
|
|
4
|
+
const {
|
|
5
|
+
Web
|
|
6
|
+
} = require('./adapter/web.js');
|
|
7
|
+
const {
|
|
8
|
+
Mqtt
|
|
9
|
+
} = require('./adapter/mqtt.js');
|
|
10
|
+
const {
|
|
11
|
+
Socket
|
|
12
|
+
} = require('./adapter/socket.js');
|
|
13
|
+
const {
|
|
14
|
+
WebSocket
|
|
15
|
+
} = require('./adapter/websocket.js');
|
|
16
|
+
|
|
17
|
+
const {
|
|
18
|
+
Middleware
|
|
19
|
+
} = require('./core/middleware/index.js');
|
|
20
|
+
const {
|
|
21
|
+
Notifier
|
|
22
|
+
} = require('./core/notifier/index.js');
|
|
23
|
+
const {
|
|
24
|
+
Pusher
|
|
25
|
+
} = require('./core/pusher/index.js');
|
|
26
|
+
const {
|
|
27
|
+
Sender
|
|
28
|
+
} = require('./core/sender/index.js');
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* TCP类
|
|
32
|
+
* 负责管理整个应用的服务端架构
|
|
33
|
+
*/
|
|
34
|
+
class TCP {
|
|
35
|
+
constructor(config, parent) {
|
|
36
|
+
this.getParent = function () {
|
|
37
|
+
return parent;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 获取适配器
|
|
44
|
+
*/
|
|
45
|
+
TCP.prototype.getAdapter = function () {
|
|
46
|
+
return this.getParent().adapter;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 获取管理器
|
|
51
|
+
*/
|
|
52
|
+
TCP.prototype.getManager = function () {
|
|
53
|
+
return this.getParent().manager;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 加载
|
|
58
|
+
*/
|
|
59
|
+
TCP.prototype.load = async function () {
|
|
60
|
+
// 初始化管理器
|
|
61
|
+
await this._initManager();
|
|
62
|
+
// 加载资源
|
|
63
|
+
await this._loadSources();
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 加载资源
|
|
68
|
+
*/
|
|
69
|
+
TCP.prototype._loadSources = async function () {
|
|
70
|
+
let manager = this.getManager();
|
|
71
|
+
await Promise.all([
|
|
72
|
+
manager.middleware.runAll('load'),
|
|
73
|
+
manager.notifier.runAll('load'),
|
|
74
|
+
manager.sender.runAll('load'),
|
|
75
|
+
manager.pusher.runAll('load')
|
|
76
|
+
]);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 初始化
|
|
81
|
+
*/
|
|
82
|
+
TCP.prototype.init = async function () {
|
|
83
|
+
// 初始化适配器
|
|
84
|
+
await this._initAdapter();
|
|
85
|
+
// 初始化管理器
|
|
86
|
+
await this._initManager();
|
|
87
|
+
// 初始化资源
|
|
88
|
+
await this._initSources();
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 初始化资源
|
|
93
|
+
*/
|
|
94
|
+
TCP.prototype._initSources = async function () {
|
|
95
|
+
let server = this.getParent();
|
|
96
|
+
let manager = server.manager;
|
|
97
|
+
let adapter = server.adapter;
|
|
98
|
+
await Promise.all([
|
|
99
|
+
manager.notifier.runAll('init', adapter, server.eventer, server.logger),
|
|
100
|
+
manager.sender.runAll('init', adapter, server.eventer, server.logger),
|
|
101
|
+
manager.pusher.runAll('init', adapter, server.eventer, server.logger),
|
|
102
|
+
manager.middleware.runWait('init', adapter, server.eventer, server.logger)
|
|
103
|
+
]);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 初始化适配器
|
|
108
|
+
*/
|
|
109
|
+
TCP.prototype._initAdapter = async function () {
|
|
110
|
+
let server = this.getParent();
|
|
111
|
+
let config = server.config;
|
|
112
|
+
// http服务器
|
|
113
|
+
var web = new Web(config.web);
|
|
114
|
+
let adapter = server.adapter;
|
|
115
|
+
adapter.web = web;
|
|
116
|
+
web.init(server);
|
|
117
|
+
if (config.web.socket) {
|
|
118
|
+
// websocket服务器 - 与web服务器共享同一个端口
|
|
119
|
+
adapter.ws = await new WebSocket(config.web).init(web);
|
|
120
|
+
}
|
|
121
|
+
if (config.mqtt && config.mqtt.state) {
|
|
122
|
+
// mqtt服务器
|
|
123
|
+
adapter.mqtt = await new Mqtt(config.mqtt).init(server);
|
|
124
|
+
}
|
|
125
|
+
if (config.socket && config.socket.state) {
|
|
126
|
+
// socket服务器
|
|
127
|
+
adapter.socket = await new Socket(config.socket || {}).init(server);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 初始化管理器
|
|
133
|
+
*/
|
|
134
|
+
TCP.prototype._initManager = async function () {
|
|
135
|
+
// console.time('[TIMING] _initManager');
|
|
136
|
+
// 管理器配置列表
|
|
137
|
+
var infos = [
|
|
138
|
+
{ name: 'middleware', title: '中间件', Module: Middleware },
|
|
139
|
+
{ name: 'notifier', title: '通知器', Module: Notifier },
|
|
140
|
+
{ name: 'sender', title: '消息发送器', Module: Sender },
|
|
141
|
+
{ name: 'pusher', title: '广播器', Module: Pusher }
|
|
142
|
+
];
|
|
143
|
+
|
|
144
|
+
// 管理器实例集合
|
|
145
|
+
var managers = [];
|
|
146
|
+
|
|
147
|
+
// 使用for循环初始化所有管理器
|
|
148
|
+
for (var i = 0; i < infos.length; i++) {
|
|
149
|
+
var config = infos[i];
|
|
150
|
+
var manager = this._createManager(config.name, config.title, config.Module);
|
|
151
|
+
managers.push(manager);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 并行执行所有管理器的初始化操作
|
|
155
|
+
var list = [];
|
|
156
|
+
for (var j = 0; j < managers.length; j++) {
|
|
157
|
+
list.push(managers[j].do('init'));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
await Promise.all(list);
|
|
161
|
+
// console.timeEnd('[TIMING] _initManager');
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 创建管理器实例
|
|
166
|
+
* @param {string} name 管理器名称
|
|
167
|
+
* @param {string} title 管理器标题
|
|
168
|
+
* @param {Function} cls 管理器类
|
|
169
|
+
* @returns {object} 管理器实例
|
|
170
|
+
*/
|
|
171
|
+
TCP.prototype._createManager = function (name, title, cls) {
|
|
172
|
+
let server = this.getParent();
|
|
173
|
+
var manager = new Manager(
|
|
174
|
+
{
|
|
175
|
+
name: name,
|
|
176
|
+
title: title,
|
|
177
|
+
filename: name + '.json',
|
|
178
|
+
tpl_dir: `./core/${name}/`.fullname(__dirname),
|
|
179
|
+
base_dir: `./common/${name}/`.fullname(__dirname),
|
|
180
|
+
dir: `./${name}`.fullname()
|
|
181
|
+
},
|
|
182
|
+
server,
|
|
183
|
+
server[name],
|
|
184
|
+
cls
|
|
185
|
+
);
|
|
186
|
+
// 设置到对应的管理器属性
|
|
187
|
+
server.manager[name] = manager;
|
|
188
|
+
return manager;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 启动
|
|
193
|
+
*/
|
|
194
|
+
TCP.prototype.start = async function () {
|
|
195
|
+
await this._startSources();
|
|
196
|
+
await this._startAdapter();
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 启动资源
|
|
201
|
+
*/
|
|
202
|
+
TCP.prototype._startSources = async function () {
|
|
203
|
+
let manager = this.getManager();
|
|
204
|
+
await Promise.all([
|
|
205
|
+
manager.middleware.runAll('start'),
|
|
206
|
+
manager.notifier.runAll('start'),
|
|
207
|
+
manager.sender.runAll('start'),
|
|
208
|
+
manager.pusher.runAll('start')
|
|
209
|
+
]);
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* 启动适配器
|
|
214
|
+
*/
|
|
215
|
+
TCP.prototype._startAdapter = async function () {
|
|
216
|
+
let list = [];
|
|
217
|
+
let adapter = this.getAdapter();
|
|
218
|
+
for (var k in adapter) {
|
|
219
|
+
try {
|
|
220
|
+
list.push(adapter[k].start());
|
|
221
|
+
} catch (error) {
|
|
222
|
+
this.log('error', '启动适配器失败:', error);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
await Promise.all(list);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* 停止
|
|
230
|
+
*/
|
|
231
|
+
TCP.prototype.stop = async function () {
|
|
232
|
+
// 停止适配器
|
|
233
|
+
await this._stopAdapter();
|
|
234
|
+
// 停止资源
|
|
235
|
+
await this._stopSources();
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 停止适配器
|
|
240
|
+
*/
|
|
241
|
+
TCP.prototype._stopAdapter = async function () {
|
|
242
|
+
for (var k in this.getAdapter()) {
|
|
243
|
+
try {
|
|
244
|
+
await this.getAdapter()[k].stop();
|
|
245
|
+
} catch (error) {
|
|
246
|
+
this.log('error', '停止适配器失败:', error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* 停止资源
|
|
253
|
+
*/
|
|
254
|
+
TCP.prototype._stopSources = async function () {
|
|
255
|
+
let manager = this.getManager();
|
|
256
|
+
await Promise.all([
|
|
257
|
+
manager.middleware.runAll('stop'),
|
|
258
|
+
manager.notifier.runAll('stop'),
|
|
259
|
+
manager.pusher.runAll('stop'),
|
|
260
|
+
manager.sender.runAll('stop')
|
|
261
|
+
]);
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* 运行
|
|
266
|
+
*/
|
|
267
|
+
TCP.prototype.run = async function () {
|
|
268
|
+
await this.load();
|
|
269
|
+
await this.init();
|
|
270
|
+
await this.start();
|
|
271
|
+
return this;
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
module.exports = {
|
|
275
|
+
TCP
|
|
276
|
+
};
|