mm_os 4.1.1 → 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 +4 -2
- package/server.js +2 -2
- package/software.js +191 -0
- package/tcp.js +276 -0
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.
|
|
4
|
+
"version": "4.1.3",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"AI",
|
|
@@ -77,6 +77,8 @@
|
|
|
77
77
|
"com/",
|
|
78
78
|
"common/",
|
|
79
79
|
"core/",
|
|
80
|
-
"ulits/"
|
|
80
|
+
"ulits/",
|
|
81
|
+
"tcp.js",
|
|
82
|
+
"software.js"
|
|
81
83
|
]
|
|
82
84
|
}
|
package/server.js
CHANGED
package/software.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
|
|
2
|
+
const {
|
|
3
|
+
Manager
|
|
4
|
+
} = require('mm_machine');
|
|
5
|
+
const {
|
|
6
|
+
App
|
|
7
|
+
} = require('./core/app/index.js');
|
|
8
|
+
const {
|
|
9
|
+
Game
|
|
10
|
+
} = require('./core/game/index.js');
|
|
11
|
+
const {
|
|
12
|
+
Mod
|
|
13
|
+
} = require('./core/mod/index.js');
|
|
14
|
+
|
|
15
|
+
class Software {
|
|
16
|
+
constructor(config, parent) {
|
|
17
|
+
this.getParent = function () {
|
|
18
|
+
return parent;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 获取适配器
|
|
25
|
+
*/
|
|
26
|
+
Software.prototype.getAdapter = function () {
|
|
27
|
+
return this.getParent().adapter;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 获取管理器
|
|
32
|
+
*/
|
|
33
|
+
Software.prototype.getManager = function () {
|
|
34
|
+
return this.getParent().manager;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 加载
|
|
39
|
+
*/
|
|
40
|
+
Software.prototype.load = async function () {
|
|
41
|
+
// 初始化管理器
|
|
42
|
+
await this._initManager();
|
|
43
|
+
// 加载资源
|
|
44
|
+
await this._loadSources();
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 加载资源
|
|
49
|
+
*/
|
|
50
|
+
Software.prototype._loadSources = async function () {
|
|
51
|
+
let manager = this.getManager();
|
|
52
|
+
// 加载无需依赖关系,所以可以同时加载,内部并行执行
|
|
53
|
+
await Promise.all([
|
|
54
|
+
manager.game.runAll('load'),
|
|
55
|
+
manager.app.runAll('load'),
|
|
56
|
+
manager.mod.runAll('load')
|
|
57
|
+
]);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 初始化
|
|
62
|
+
*/
|
|
63
|
+
Software.prototype.init = async function () {
|
|
64
|
+
await this._initSources();
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 初始化资源
|
|
69
|
+
*/
|
|
70
|
+
Software.prototype._initSources = async function () {
|
|
71
|
+
let server = this.getParent();
|
|
72
|
+
let manager = server.manager;
|
|
73
|
+
await Promise.all([
|
|
74
|
+
manager.game.runAll('init', server, server.eventer, server.logger),
|
|
75
|
+
manager.app.runAll('init', server, server.eventer, server.logger)
|
|
76
|
+
]);
|
|
77
|
+
await manager.mod.runAll('init', server, server.eventer, server.logger)
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 初始化管理器
|
|
82
|
+
*/
|
|
83
|
+
Software.prototype._initManager = async function () {
|
|
84
|
+
// console.time('[TIMING] _initManager');
|
|
85
|
+
// 管理器配置列表
|
|
86
|
+
var infos = [
|
|
87
|
+
{ name: 'game', title: '游戏', Module: Game },
|
|
88
|
+
{ name: 'app', title: '应用', Module: App },
|
|
89
|
+
{ name: 'mod', title: '模组', Module: Mod }
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
// 管理器实例集合
|
|
93
|
+
var managers = [];
|
|
94
|
+
|
|
95
|
+
// 使用for循环初始化所有管理器
|
|
96
|
+
for (var i = 0; i < infos.length; i++) {
|
|
97
|
+
var config = infos[i];
|
|
98
|
+
var manager = this._createManager(config.name, config.title, config.Module);
|
|
99
|
+
managers.push(manager);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 并行执行所有管理器的初始化操作
|
|
103
|
+
var list = [];
|
|
104
|
+
for (var j = 0; j < managers.length; j++) {
|
|
105
|
+
list.push(managers[j].do('init'));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
await Promise.all(list);
|
|
109
|
+
// console.timeEnd('[TIMING] _initManager');
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 创建管理器实例
|
|
114
|
+
* @param {string} name 管理器名称
|
|
115
|
+
* @param {string} title 管理器标题
|
|
116
|
+
* @param {Function} cls 管理器类
|
|
117
|
+
* @returns {object} 管理器实例
|
|
118
|
+
*/
|
|
119
|
+
Software.prototype._createManager = function (name, title, cls) {
|
|
120
|
+
let server = this.getParent();
|
|
121
|
+
var manager = new Manager(
|
|
122
|
+
{
|
|
123
|
+
name: name,
|
|
124
|
+
title: title,
|
|
125
|
+
filename: name + '.json',
|
|
126
|
+
tpl_dir: `./core/${name}/`.fullname(__dirname),
|
|
127
|
+
base_dir: '',
|
|
128
|
+
dir: `./${name}`.fullname()
|
|
129
|
+
},
|
|
130
|
+
server,
|
|
131
|
+
server[name],
|
|
132
|
+
cls
|
|
133
|
+
);
|
|
134
|
+
// 设置到对应的管理器属性
|
|
135
|
+
server.manager[name] = manager;
|
|
136
|
+
return manager;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 启动
|
|
141
|
+
*/
|
|
142
|
+
Software.prototype.start = async function () {
|
|
143
|
+
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 启动资源
|
|
148
|
+
*/
|
|
149
|
+
Software.prototype._startSources = async function () {
|
|
150
|
+
let manager = this.getManager();
|
|
151
|
+
// 启动无顺序,但需要等待所有启动完成,内部依次执行
|
|
152
|
+
await Promise.all([
|
|
153
|
+
manager.game.runAll('start'),
|
|
154
|
+
manager.app.runAll('start'),
|
|
155
|
+
manager.mod.runAll('start')
|
|
156
|
+
]);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 停止
|
|
161
|
+
*/
|
|
162
|
+
Software.prototype.stop = async function () {
|
|
163
|
+
// 停止资源
|
|
164
|
+
await this._stopSources();
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* 停止资源
|
|
169
|
+
*/
|
|
170
|
+
Software.prototype._stopSources = async function () {
|
|
171
|
+
let manager = this.getManager();
|
|
172
|
+
await Promise.all([
|
|
173
|
+
manager.game.runAll('stop'),
|
|
174
|
+
manager.app.runAll('stop'),
|
|
175
|
+
manager.mod.runAll('stop')
|
|
176
|
+
]);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 运行
|
|
181
|
+
*/
|
|
182
|
+
Software.prototype.run = async function () {
|
|
183
|
+
await this.load();
|
|
184
|
+
await this.init();
|
|
185
|
+
await this.start();
|
|
186
|
+
return this;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
module.exports = {
|
|
190
|
+
Software
|
|
191
|
+
};
|
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
|
+
};
|