electron-userland / electron-builder

A complete solution to package and build a ready for distribution Electron app with “auto update” support out of the box
https://www.electron.build
MIT License
13.72k stars 1.74k forks source link

download-progress event not firing #8659

Open remzany opened 3 weeks ago

remzany commented 3 weeks ago

package JSON

"dependencies": { "@capacitor-community/electron": "^5.0.0", "chokidar": "~3.5.3", "electron-is-dev": "~2.0.0", "electron-serve": "~1.1.0", "electron-unhandled": "~4.0.1", "electron-updater": "^5.3.0", "electron-window-state": "^5.0.3", "keytar": "^7.9.0", "electron-store": "^10.0.0" },

"scripts": { "electron:make:windows": "npm run build && electron-builder build --win -c ./electron-builder.config.json -p always" },

"build": {
"appId": "/",
"mac": {
  "target": "default",
  "arch": [
    "universal"
  ]
},
"nsis": {
  "perMachine": true,
  "oneClick": false,
  "allowToChangeInstallationDirectory": true,
  "artifactName": "${name}-${version}.${ext}"
}

},

---------------------- end ----------------------

index.ts - Logic

autoUpdater.setFeedURL({ provider: 'generic', url: 'https://custom_domain/releases/' });

// Automatically check for updates and notify
autoUpdater.checkForUpdatesAndNotify();

// Handle autoUpdater events
autoUpdater.on('update-available', (info) => {
  console.log('Update available:', info);
  const dialogOpts = {
    type: 'info' as const, // Ensure this is a specific string literal
    buttons: ['OK', 'Later'],
    title: 'Update Available',
    message: `Version ${info.version} is now available.`,
    detail: `A new version is available. For the application to work as it should you must download new version. Don't close the application when downloading.`,
  };
  dialog.showMessageBox(dialogOpts).then((result) => {
    if (result.response === 0) { // User clicked "OK"
      autoUpdater.downloadUpdate();
    }
  });
});

autoUpdater.on('download-progress', (progressObj) => {
  console.log('download progress event');
  // const progressMessage = `Download speed: ${(progressObj.bytesPerSecond / 1000).toFixed(2)} KB/s\n` +
  //                         `Downloaded ${Math.round(progressObj.percent)}% ` +
  //                         `(${(progressObj.transferred / (1024 * 1024)).toFixed(2)} MB / ${(progressObj.total / (1024 * 1024)).toFixed(2)} MB)`;

  const dialogOpts = {
    type: 'info' as const,
    buttons: ['OK', 'Later'],
    title: 'Downloading progress',
    message: `downloading happening`,
    detail: `Downloading now...`,
  };
  dialog.showMessageBox(dialogOpts)

  // dialog.showMessageBox({
  //   type: 'info',
  //   title: 'Downloading Update',
  //   message: progressMessage,
  //   detail: 'Please wait while the update is being downloaded.',
  //   buttons: ['OK']
  // });
});

autoUpdater.on('update-downloaded', () => {
  console.log('Update downloaded; will install now');
  const dialogOpts = {
    type: 'info' as const, // Ensure this is a specific string literal
    buttons: ['Restart', 'Later'],
    title: 'Install Update',
    message: 'A new version has been downloaded.',
    detail: 'The application will restart to install the update.',
  };
  dialog.showMessageBox(dialogOpts).then((result) => {
    if (result.response === 0) { // User clicked "Restart"
      autoUpdater.quitAndInstall();
    }
  });
});

autoUpdater.on('error', (error) => {
  console.error('Error in auto-updater:', error);
  dialog.showErrorBox('Update Error', `There was an error while updating the application:\n${error.message}`);
});

---------------------- end ----------------------

Question:

The download-progress event doesn't fire, all other events from the code above works just fine. But the download-progress is not. I have Content-Length in headers from the server (browser shows the download size). I'm trying on windows 11 Pro 23H2 version. Is there something else I'm missing? Thank you in advance.

peter-sanderson commented 1 week ago

Hello, I did a lot of digging and I think I have a smoking gun.

If the isUseMultipleRangeRequest=true then here the downloadInfoTransform is not created.

I think this is the root cause of this trouble.


On top of that, weirdly the autoUpdater.disableDifferentialDownload = true; is not working for me on Linux. It seems it is read only in the MacUpdater and in the NsisUpdater and nowhere else.

This issue I am trying to solve in this PR: https://github.com/electron-userland/electron-builder/pull/8695

peter-sanderson commented 1 week ago

It seems to me that solution is to pass downloadInfoTransform down the line into the multipleRangeDownloader and its doExecuteTasks function.

Here is PR just for demonstrative purpose. Here is the draft PR: https://github.com/electron-userland/electron-builder/pull/8697 Its is just an illustrative example.

I lack the knowledge to complate this PR.