mm_os 4.1.2 → 4.1.3
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/package.json +1 -1
- package/server.js +2 -2
- package/tcp.js +276 -0
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
|
+
};
|