mm_os
Version:
这是超级美眉服务端框架,用于快速构建应用程序。
211 lines (197 loc) • 4.25 kB
JavaScript
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;