UNPKG

mm_os

Version:

MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。

194 lines (173 loc) 4.24 kB
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 };