diff --git a/electron/addon/autoUpdater/index.js b/electron/addon/autoUpdater/index.js index e62a1184..63baf580 100644 --- a/electron/addon/autoUpdater/index.js +++ b/electron/addon/autoUpdater/index.js @@ -1,73 +1,170 @@ -const { Tray, Menu } = require('electron'); -const path = require('path'); -const Ps = require('ee-core/ps'); +const { app: electronApp } = require('electron'); +const { autoUpdater } = require("electron-updater"); +const is = require('ee-core/utils/is'); const Log = require('ee-core/log'); -const Electron = require('ee-core/electron'); -const CoreWindow = require('ee-core/electron/window'); const Conf = require('ee-core/config'); -const EE = require('ee-core/ee'); +const CoreWindow = require('ee-core/electron/window'); +const Electron = require('ee-core/electron'); /** - * 托盘插件 + * 自动升级插件 * @class */ -class TrayAddon { +class AutoUpdaterAddon { constructor() { - this.tray = null; } /** - * 创建托盘 + * 创建 */ create () { - // 开发环境,代码热更新开启时,会导致托盘中有残影 - if (Ps.isDev() && Ps.isHotReload()) return; - - Log.info('[addon:tray] load'); - const { CoreApp } = EE; - const cfg = Conf.getValue('addons.tray'); - const mainWindow = CoreWindow.getMainWindow(); + Log.info('[addon:autoUpdater] load'); + const cfg = Conf.getValue('addons.autoUpdater'); + if ((is.windows() && cfg.windows) + || (is.macOS() && cfg.macOS) + || (is.linux() && cfg.linux)) + { + // continue + } else { + return + } + + // 是否检查更新 + if (cfg.force) { + this.checkUpdate(); + } - // 托盘图标 - let iconPath = path.join(Ps.getHomeDir(), cfg.icon); + const status = { + error: -1, + available: 1, + noAvailable: 2, + downloading: 3, + downloaded: 4, + } + + const version = electronApp.getVersion(); + Log.info('[addon:autoUpdater] current version: ', version); + + // 设置下载服务器地址 + let server = cfg.options.url; + let lastChar = server.substring(server.length - 1); + server = lastChar === '/' ? server : server + "/"; + //Log.info('[addon:autoUpdater] server: ', server); + cfg.options.url = server; + + // 是否后台自动下载 + autoUpdater.autoDownload = cfg.force ? true : false; + + try { + autoUpdater.setFeedURL(cfg.options); + } catch (error) { + Log.error('[addon:autoUpdater] setFeedURL error : ', error); + } - // 托盘菜单功能列表 - let trayMenuTemplate = [ - { - label: '显示', - click: function () { - mainWindow.show(); - } - }, - { - label: '退出', - click: function () { - CoreApp.appQuit(); - } + autoUpdater.on('checking-for-update', () => { + //sendStatusToWindow('正在检查更新...'); + }) + autoUpdater.on('update-available', (info) => { + info.status = status.available; + info.desc = '有可用更新'; + this.sendStatusToWindow(info); + }) + autoUpdater.on('update-not-available', (info) => { + info.status = status.noAvailable; + info.desc = '没有可用更新'; + this.sendStatusToWindow(info); + }) + autoUpdater.on('error', (err) => { + let info = { + status: status.error, + desc: err } - ] + this.sendStatusToWindow(info); + }) + autoUpdater.on('download-progress', (progressObj) => { + let percentNumber = parseInt(progressObj.percent); + let totalSize = this.bytesChange(progressObj.total); + let transferredSize = this.bytesChange(progressObj.transferred); + let text = '已下载 ' + percentNumber + '%'; + text = text + ' (' + transferredSize + "/" + totalSize + ')'; - // 点击关闭,最小化到托盘 - mainWindow.on('close', (event) => { - if (Electron.extra.closeWindow == true) { - return; + let info = { + status: status.downloading, + desc: text, + percentNumber: percentNumber, + totalSize: totalSize, + transferredSize: transferredSize } - mainWindow.hide(); - event.preventDefault(); - }); - - // 实例化托盘 - this.tray = new Tray(iconPath); - this.tray.setToolTip(cfg.title); - const contextMenu = Menu.buildFromTemplate(trayMenuTemplate); - this.tray.setContextMenu(contextMenu); - // 左键单击的时候能够显示主窗口 - this.tray.on('click', () => { - mainWindow.show() + Log.info('[addon:autoUpdater] progress: ', text); + this.sendStatusToWindow(info); }) + autoUpdater.on('update-downloaded', (info) => { + info.status = status.downloaded; + info.desc = '下载完成'; + this.sendStatusToWindow(info); + + // 托盘插件默认会阻止窗口关闭,这里设置允许关闭窗口 + Electron.extra.closeWindow = true; + + autoUpdater.quitAndInstall(); + // const mainWindow = CoreWindow.getMainWindow(); + // if (mainWindow) { + // mainWindow.destroy() + // } + // electronApp.appQuit() + }); } + + /** + * 检查更新 + */ + checkUpdate () { + autoUpdater.checkForUpdates(); + } + + /** + * 下载更新 + */ + download () { + autoUpdater.downloadUpdate(); + } + + /** + * 向前端发消息 + */ + sendStatusToWindow(content = {}) { + const textJson = JSON.stringify(content); + const channel = 'app.updater'; + const win = CoreWindow.getMainWindow(); + win.webContents.send(channel, textJson); + } + + /** + * 单位转换 + */ + bytesChange (limit) { + let size = ""; + if(limit < 0.1 * 1024){ + size = limit.toFixed(2) + "B"; + }else if(limit < 0.1 * 1024 * 1024){ + size = (limit/1024).toFixed(2) + "KB"; + }else if(limit < 0.1 * 1024 * 1024 * 1024){ + size = (limit/(1024 * 1024)).toFixed(2) + "MB"; + }else{ + size = (limit/(1024 * 1024 * 1024)).toFixed(2) + "GB"; + } + + let sizeStr = size + ""; + let index = sizeStr.indexOf("."); + let dou = sizeStr.substring(index + 1 , index + 3); + if(dou == "00"){ + return sizeStr.substring(0, index) + sizeStr.substring(index + 3, index + 5); + } + + return size; + } } -TrayAddon.toString = () => '[class TrayAddon]'; -module.exports = TrayAddon; \ No newline at end of file +AutoUpdaterAddon.toString = () => '[class AutoUpdaterAddon]'; +module.exports = AutoUpdaterAddon; \ No newline at end of file