/** * 应用商店后台模块 * - 用于进行下载、安装、卸载等后台操作 * 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;