Selaa lähdekoodia

AutoUpdaterAddon

gaoshuaixing 1 vuosi sitten
vanhempi
commit
f435a37896
1 muutettua tiedostoa jossa 148 lisäystä ja 51 poistoa
  1. 148 51
      electron/addon/autoUpdater/index.js

+ 148 - 51
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;
+AutoUpdaterAddon.toString = () => '[class AutoUpdaterAddon]';
+module.exports = AutoUpdaterAddon;