mm_os
Version:
MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。
194 lines (173 loc) • 4.24 kB
JavaScript
const {
Manager
} = require('mm_machine');
const {
App
} = require('./core/app/index.js');
const {
Game
} = require('./core/game/index.js');
const {
Mod
} = require('./core/mod/index.js');
class Software {
constructor(config, parent) {
this.getParent = function () {
return parent;
};
}
}
/**
* 获取适配器
* @returns {object} 适配器实例
*/
Software.prototype.getAdapter = function () {
return this.getParent().adapter;
};
/**
* 获取管理器
* @returns {object} 管理器实例
*/
Software.prototype.getManager = function () {
return this.getParent().manager;
};
/**
* 加载
*/
Software.prototype.load = async function () {
// 初始化管理器
await this._initManager();
// 加载资源
await this._loadSources();
};
/**
* 加载资源
*/
Software.prototype._loadSources = async function () {
let manager = this.getManager();
// 加载无需依赖关系,所以可以同时加载,内部并行执行
await Promise.all([
manager.game.runAll('load'),
manager.app.runAll('load'),
manager.mod.runAll('load')
]);
};
/**
* 初始化
*/
Software.prototype.init = async function () {
await this._initSources();
};
/**
* 初始化资源
*/
Software.prototype._initSources = async function () {
let server = this.getParent();
let manager = server.manager;
await Promise.all([
manager.game.runAll('init', server, server.eventer, server.logger),
manager.app.runAll('init', server, server.eventer, server.logger)
]);
await manager.mod.runAll('init', server, server.eventer, server.logger);
};
/**
* 初始化管理器
*/
Software.prototype._initManager = async function () {
// console.time('[TIMING] _initManager');
// 管理器配置列表
var infos = [
{ name: 'game', title: '游戏', Module: Game },
{ name: 'app', title: '应用', Module: App },
{ name: 'mod', title: '模组', Module: Mod }
];
// 管理器实例集合
var managers = [];
// 使用for循环初始化所有管理器
for (var i = 0; i < infos.length; i++) {
var config = infos[i];
var manager = this._createManager(config.name, config.title, config.Module);
managers.push(manager);
}
// 并行执行所有管理器的初始化操作
var list = [];
for (var j = 0; j < managers.length; j++) {
list.push(managers[j].do('init'));
}
await Promise.all(list);
// console.timeEnd('[TIMING] _initManager');
};
/**
* 创建管理器实例
* @param {string} name 管理器名称
* @param {string} title 管理器标题
* @param {Function} cls 管理器类
* @returns {object} 管理器实例
*/
Software.prototype._createManager = function (name, title, cls) {
let server = this.getParent();
var manager = new Manager(
{
name: name,
title: title,
filename: name + '.json',
tpl_dir: `./core/${name}/`.fullname(__dirname),
base_dir: '',
dir: `./${name}`.fullname()
},
server,
server[name],
cls
);
// 设置到对应的管理器属性
server.manager[name] = manager;
return manager;
};
/**
* 启动
*/
Software.prototype.start = async function () {
};
/**
* 启动资源
*/
Software.prototype._startSources = async function () {
let manager = this.getManager();
// 启动无顺序,但需要等待所有启动完成,内部依次执行
await Promise.all([
manager.game.runAll('start'),
manager.app.runAll('start'),
manager.mod.runAll('start')
]);
};
/**
* 停止
*/
Software.prototype.stop = async function () {
// 停止资源
await this._stopSources();
};
/**
* 停止资源
*/
Software.prototype._stopSources = async function () {
let manager = this.getManager();
await Promise.all([
manager.game.runAll('stop'),
manager.app.runAll('stop'),
manager.mod.runAll('stop')
]);
};
/**
* 运行
* @returns {object} 软件实例
*/
Software.prototype.run = async function () {
await this.load();
await this.init();
await this.start();
return this;
};
module.exports = {
Software
};