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 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.getobj_not = ['password', 'salt', 'display'];
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 = number(len.left(',', true));
81
+ max = Number(len.left(',', true));
82
82
  var d = len.right(',');
83
83
  if (d) {
84
- decimal = number(d);
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 = number(min_str);
113
+ min = Number(min_str);
114
114
  }
115
115
  var max_str = range.right(',');
116
116
  if (max_str) {
117
- var n = number(max_str);
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
- return { title, description, map, min, max, max_length: local_max_length };
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._calculateMaxValue = function (tp, max, max_length) {
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.modelmanager = function (o) {
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.updateFilemanager = function (db) {
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
- column_name: []
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.modelmanager(dict[k]);
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.updateFilemanager(db);
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.updateDbmanager = async function (db) {
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[i];
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
- db.table = cg.table + '';
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._deteDire = function (cg) {
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 dir_arr = cg.table.split('_');
748
- var scope = dir_arr[0];
749
- var dir = p + scope;
750
- var dir_api = dir + '/plugin/server';
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, 4));
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._deteDire(cg);
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
- if (!this.dir) {
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 = this.dir.dirname();
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._deteApiDir = function (dir, app, type, name) {
852
+ Drive.prototype._getApiDir = function (dir, app, type, name) {
859
853
  var l = $.slash;
860
- var o = $.pool.api[app + '_' + type];
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._deteApiDir(dir, app, 'client', name);
892
- var manage = this._deteApiDir(dir, app, 'manage', name);
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.getObj_not)) {
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.end('id')) {
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, 4));
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, 4));
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.new = async function (client, manage, cover) {
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 = number(o.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.end('id')) {
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mm_os",
3
3
  "description": "MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。",
4
- "version": "4.1.2",
4
+ "version": "4.1.4",
5
5
  "main": "index.js",
6
6
  "keywords": [
7
7
  "AI",
package/server.js CHANGED
@@ -12,8 +12,8 @@ const {
12
12
  Config
13
13
  } = require('mm_config');
14
14
 
15
- const { TCP } = require('./tpc');
16
- const { Software } = require('./software');
15
+ const { TCP } = require('./tcp.js');
16
+ const { Software } = require('./software.js');
17
17
 
18
18
  const {
19
19
  Com
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
+ };