UNPKG

mm_os

Version:

这是超级美眉服务端框架,用于快速构建应用程序。

211 lines (197 loc) 4.25 kB
const compressing = require('compressing'); const Index = require('mm_machine').Index; const Drive = require('./drive.js'); /** * App应用类 * @extends {Index} * @class */ class App extends Index { /** * 构造函数 * @param {Object} scope 作用域 * @param {String} title 标题 * @constructor */ constructor(scope, title) { super(scope, __dirname); this.Drive = Drive; this.type = "app"; this.title = title; // 默认启用热更新 this.mode = 3; } } /** * 初始化应用 * @param {Object} option 配置参数 * @return {String} 执行结果 */ App.prototype.init = function(option) { var ret = ""; var lt = this.list; for (var i = 0, o; o = lt[i++];) { ret = o.exec('init', option); } return ret; }; /** * 加载应用 * @param {String} path 检索路径 * @param {Boolean} accurate 是否精确路径 */ App.prototype.update_config_all = async function(path, accurate) { var dir_app; if (accurate) { dir_app = path; } else { if (!path) { if (this.scope == "sys") { path = ""; } else { path = "/" + this.scope; } } dir_app = (path + "/app/").fullname(); dir_app.addDir(); } if (dir_app.hasDir()) { var list_scope = $.dir.get(dir_app); // 遍历目录路径 for (var i = 0, o; o = list_scope[i++];) { var file = './app.json'.fullname(o); if (file.hasFile()) { await this.load_file(file, true); } } } }; /** * 压缩应用 * @param {Object} name 应用名称 * @returns {Boolean} 返回压缩路径 */ App.prototype.zip = async function(name) { var plus = this.get(name); if (plus) { return await plus.zip(); } return null; } /** * 解压应用 * @param {Object} file 应用压缩文件 * @returns {Boolean} 返回解压结果 */ App.prototype.unzip = async function(file) { var name = file.basename().left("."); var dir = `/cache/app/${name}`.fullname(); dir.addDir(); var ret; try { await compressing.zip.uncompress(file, dir); ret = { file, dir }; } catch (err) { $.log.error("应用解压失败!", err); } return ret; } /** * 卸载应用 * @param {String} name 应用名称 * @returns {String} 返回卸载路径 */ App.prototype.uninstall = async function(name) { var plus = this.get(name); if (plus) { await plus.exec('uninstall'); var obj = this.del(name, true); if (obj) { var file = obj.filename; // 删除目录 file.dirname().delDir(); return file } } return null; } /** * 复制目录 * @param {String} dir_src 原路径 * @param {String} dir 新路径 * @returns {Object} 返回复制结果 */ App.prototype.copy_dir = function(dir_src, dir) { return new Promise((resolve, reject) => { $.dir.copy(dir_src, dir, () => { resolve({ dir_src, dir }); }); }); } /** * 安装应用 * @param {String} file 应用压缩文件 * @returns {Object} 返回解压结果 */ App.prototype.install = async function(file) { var ret = await this.unzip(file); if (ret) { var dirs = $.dir.get(ret.dir); if (dirs.length) { var dir_src = dirs[0]; var file = "./app.json".fullname(dir_src); var config = file.loadJson(); if (config) { var name = config.name; if (name) { var dir = `/app/${name}`; await this.copy_dir(dir_src, dir); var cs = $.pool.app[app]; if (cs) { await cs.update(`/app/`.fullname()); await cs.exec(name, 'install'); setTimeout(() => { ret.dir.delDir(); }, 3000) } return { name, dir_src, dir } } } } } } module.exports = App; /** * 创建全局管理器 */ if (!$.pool.app) { $.pool.app = {}; } function app_admin(scope, title) { if (!scope) { scope = $.val.scope + ''; } var obj = $.pool.app[scope]; if (!obj) { $.pool.app[scope] = new App(scope, title); obj = $.pool.app[scope]; } return obj; } /** * app管理器, 用于管理应用 * @param {string} scope 作用域 * @param {string} title 标题 * @return {Object} 返回一个缓存类 */ $.app_admin = app_admin;