133 lines
3.8 KiB
JavaScript
133 lines
3.8 KiB
JavaScript
/**
|
|
* 应用商店后台模块
|
|
* - 用于进行下载、安装、卸载等后台操作
|
|
* create at: 2016/05/25
|
|
*/
|
|
|
|
let logger;
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const CONF = require('./config');
|
|
const UNZIP = require('extract-zip');
|
|
|
|
class PlugStore {
|
|
|
|
constructor(electron, app, mainWindow) {
|
|
logger = new electron.Logger('PlugStore');
|
|
this.listenDownload(mainWindow);
|
|
|
|
electron.ipcMain
|
|
.on('store-uninstall', (event, plugName) => {
|
|
logger.warn('UnInstall', plugName);
|
|
// 删除目录
|
|
this.rmdir(
|
|
path.join(CONF.plugPath, `${plugName}-master`)
|
|
).then((ret) => {
|
|
event.returnValue = ret;
|
|
// 重新加载插件列表
|
|
mainWindow.webContents.send('reloadPlug', true);
|
|
});
|
|
})
|
|
.on('store-uninstall-dev', (event, plugPath) => {
|
|
logger.warn('UnInstall.DEV', plugPath);
|
|
// 删除目录
|
|
this.rmdir(plugPath).then((ret) => {
|
|
event.returnValue = ret;
|
|
// 重新加载插件列表
|
|
mainWindow.webContents.send('reloadPlug', true);
|
|
});
|
|
})
|
|
// 获取插件路径
|
|
.on('store-config-plugPath', (event) => {
|
|
event.returnValue = CONF.plugPath;
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 监听下载
|
|
* @param {Object} mainWindow [description]
|
|
* @return {[type]} [description]
|
|
*/
|
|
listenDownload(mainWindow) {
|
|
mainWindow.webContents.session.on('will-download', (event, item, webContents) => {
|
|
let fileName = item.getFilename().replace(/\-master\.zip$/,'');
|
|
let downLink = item.getURL();
|
|
logger.info('down-store-plug', downLink);
|
|
// 判断是否下载为插件
|
|
if (downLink.indexOf('github.com/AntSword-Store') > 0) {
|
|
// 1. 设置插件存储目录
|
|
let savePath = path.join(CONF.tmpPath, `${fileName}.zip`);
|
|
item.setSavePath(savePath);
|
|
webContents.send('store-download-progress', {
|
|
file: fileName,
|
|
type: 'init',
|
|
total: item.getTotalBytes()
|
|
});
|
|
// 2. 插件下载进度更新
|
|
item.on('updated', () => {
|
|
webContents.send('store-download-progress', {
|
|
file: fileName,
|
|
type: 'downloading',
|
|
size: item.getReceivedBytes()
|
|
});
|
|
});
|
|
// 3. 插件下载完毕
|
|
item.on('done', (e, state) => {
|
|
webContents.send('store-download-progress', {
|
|
file: fileName,
|
|
path: savePath,
|
|
type: 'downloaded',
|
|
state: state
|
|
});
|
|
if (state !== 'completed') { return };
|
|
// 解压安装插件
|
|
UNZIP(savePath, {
|
|
dir: CONF.plugPath
|
|
}, (err) => {
|
|
webContents.send('store-download-progress', {
|
|
type: 'installed',
|
|
file: fileName
|
|
});
|
|
logger.info('Installed', fileName);
|
|
// 重新加载插件列表
|
|
mainWindow.webContents.send('reloadPlug', true);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 删除目录
|
|
* @param {String} dir 目录
|
|
* @return {[type]} [description]
|
|
*/
|
|
rmdir(dir) {
|
|
return new Promise((res, rej) => {
|
|
let ret = true;
|
|
// 循环删除目录
|
|
const _rmdir = (_dir) => {
|
|
if (!fs.existsSync(_dir)) { return }
|
|
fs.readdirSync(_dir).map((_) => {
|
|
// 生成完整路径
|
|
let _path = path.join(dir, _);
|
|
// 如果是目录,则继续循环,否则删除
|
|
if (fs.lstatSync(_path).isDirectory()) {
|
|
return this.rmdir(_path);
|
|
}
|
|
fs.unlinkSync(_path);
|
|
});
|
|
fs.rmdirSync(_dir);
|
|
}
|
|
try{
|
|
_rmdir(dir);
|
|
} catch (e) {
|
|
ret = e;
|
|
}
|
|
return res(ret);
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = PlugStore;
|