1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-11-27 08:21:03 +02:00

Chore: Desktop: Seamless-Updates - creation of auto updater service (#10772)

This commit is contained in:
Alice 2024-07-28 14:09:30 +03:00 committed by GitHub
parent 0935b6f697
commit a6d6e70b3d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 170 additions and 17 deletions

View File

@ -1,5 +1,6 @@
import Logger, { LoggerWrapper } from '@joplin/utils/Logger';
import { PluginMessage } from './services/plugins/PluginRunner';
import AutoUpdaterService from './services/autoUpdater/AutoUpdaterService';
import shim from '@joplin/lib/shim';
import { isCallbackUrl } from '@joplin/lib/callbackUrlUtils';
@ -41,6 +42,7 @@ export default class ElectronAppWrapper {
private rendererProcessQuitReply_: RendererProcessQuitReply = null;
private pluginWindows_: PluginWindows = {};
private initialCallbackUrl_: string = null;
private updaterService_: AutoUpdaterService = null;
private customProtocolHandler_: CustomProtocolHandler = null;
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
@ -474,6 +476,11 @@ export default class ElectronAppWrapper {
this.createWindow();
if (!shim.isLinux) {
this.updaterService_ = new AutoUpdaterService();
this.updaterService_.startPeriodicUpdateCheck();
}
this.electronApp_.on('before-quit', () => {
this.willQuitApp_ = true;
});

View File

@ -59,7 +59,6 @@ const globalCommands = appCommands.concat(libCommands);
import editorCommandDeclarations from './gui/NoteEditor/editorCommandDeclarations';
import PerFolderSortOrderService from './services/sortOrder/PerFolderSortOrderService';
import ShareService from '@joplin/lib/services/share/ShareService';
import checkForUpdates from './checkForUpdates';
import { AppState } from './app.reducer';
import syncDebugLog from '@joplin/lib/services/synchronizer/syncDebugLog';
import eventManager, { EventName } from '@joplin/lib/eventManager';
@ -553,22 +552,6 @@ class Application extends BaseApplication {
value: Setting.value('flagOpenDevTools'),
});
// Note: Auto-update is a misnomer in the code.
// The code below only checks, if a new version is available.
// We only allow Windows and macOS users to automatically check for updates
if (shim.isWindows() || shim.isMac()) {
const runAutoUpdateCheck = () => {
if (Setting.value('autoUpdateEnabled')) {
void checkForUpdates(true, bridge().window(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
}
};
// Initial check on startup
shim.setTimeout(() => { runAutoUpdateCheck(); }, 5000);
// Then every x hours
shim.setInterval(() => { runAutoUpdateCheck(); }, 12 * 60 * 60 * 1000);
}
initializeUserFetcher();
shim.setInterval(() => { void userFetcher(); }, 1000 * 60 * 60);

View File

@ -161,6 +161,8 @@
"compare-versions": "6.1.0",
"countable": "3.0.1",
"debounce": "1.2.1",
"electron-log": "5.1.6",
"electron-updater": "6.2.1",
"electron-window-state": "5.0.3",
"formatcoords": "1.1.3",
"fs-extra": "11.2.0",

View File

@ -0,0 +1,108 @@
import { app } from 'electron';
import { autoUpdater, UpdateInfo } from 'electron-updater';
import log from 'electron-log';
import path = require('path');
import { setInterval } from 'timers';
export enum AutoUpdaterEvents {
CheckingForUpdate = 'checking-for-update',
UpdateAvailable = 'update-available',
UpdateNotAvailable = 'update-not-available',
Error = 'error',
DownloadProgress = 'download-progress',
UpdateDownloaded = 'update-downloaded',
}
const defaultUpdateInterval = 12 * 60 * 60 * 1000;
const initialUpdateStartup = 5 * 1000;
export interface AutoUpdaterServiceInterface {
startPeriodicUpdateCheck(interval?: number): void;
stopPeriodicUpdateCheck(): void;
checkForUpdates(): void;
}
export default class AutoUpdaterService implements AutoUpdaterServiceInterface {
private updatePollInterval_: ReturnType<typeof setInterval>|null = null;
public constructor() {
this.configureAutoUpdater();
}
public startPeriodicUpdateCheck = (interval: number = defaultUpdateInterval): void => {
this.stopPeriodicUpdateCheck();
this.updatePollInterval_ = setInterval(() => {
void this.checkForUpdates();
}, interval);
setTimeout(this.checkForUpdates, initialUpdateStartup);
};
public stopPeriodicUpdateCheck = (): void => {
if (this.updatePollInterval_) {
clearInterval(this.updatePollInterval_);
this.updatePollInterval_ = null;
}
};
public checkForUpdates = async (): Promise<void> => {
try {
await autoUpdater.checkForUpdates(); // Use async/await
} catch (error) {
log.error('Failed to check for updates:', error);
if (error.message.includes('ERR_CONNECTION_REFUSED')) {
log.info('Server is not reachable. Will try again later.');
}
}
};
private configureAutoUpdater = (): void => {
autoUpdater.logger = log;
log.transports.file.level = 'info';
if (this.electronIsDev()) {
log.info('Development mode: using dev-app-update.yml');
autoUpdater.updateConfigPath = path.join(__dirname, 'dev-app-update.yml');
autoUpdater.forceDevUpdateConfig = true;
}
autoUpdater.autoDownload = false;
autoUpdater.on(AutoUpdaterEvents.CheckingForUpdate, this.onCheckingForUpdate);
autoUpdater.on(AutoUpdaterEvents.UpdateNotAvailable, this.onUpdateNotAvailable);
autoUpdater.on(AutoUpdaterEvents.UpdateAvailable, this.onUpdateAvailable);
autoUpdater.on(AutoUpdaterEvents.DownloadProgress, this.onDownloadProgress);
autoUpdater.on(AutoUpdaterEvents.UpdateDownloaded, this.onUpdateDownloaded);
autoUpdater.on(AutoUpdaterEvents.Error, this.onError);
};
private electronIsDev = (): boolean => !app.isPackaged;
private onCheckingForUpdate = () => {
log.info('Checking for update...');
};
private onUpdateNotAvailable = (_info: UpdateInfo): void => {
log.info('Update not available.');
};
private onUpdateAvailable = (info: UpdateInfo): void => {
log.info(`Update available: ${info.version}.`);
};
private onDownloadProgress = (progressObj: { bytesPerSecond: number; percent: number; transferred: number; total: number }): void => {
log.info(`Download progress... ${progressObj.percent}% completed`);
};
private onUpdateDownloaded = (info: UpdateInfo): void => {
log.info('Update downloaded. It will be installed on restart.');
void this.promptUserToUpdate(info);
};
private onError = (error: Error): void => {
log.error('Error in auto-updater.', error);
};
private promptUserToUpdate = async (info: UpdateInfo): Promise<void> => {
log.info(`Update is available: ${info.version}.`);
};
}

View File

@ -0,0 +1,7 @@
# -- local sever
# provider: generic
# url: http://localhost:8080
# -- github releases
provider: github
owner: laurent22
repo: joplin

View File

@ -6783,6 +6783,8 @@ __metadata:
debounce: 1.2.1
electron: 29.1.0
electron-builder: 24.13.3
electron-log: 5.1.6
electron-updater: 6.2.1
electron-window-state: 5.0.3
formatcoords: 1.1.3
fs-extra: 11.2.0
@ -19959,6 +19961,13 @@ __metadata:
languageName: node
linkType: hard
"electron-log@npm:5.1.6":
version: 5.1.6
resolution: "electron-log@npm:5.1.6"
checksum: 57f01fd535a2d6654e2dcde96afb85e2bd7433100e220a183a90b9d83ccd23468178188a4c88b3b312c2b6146962f4277910502d8acf02d94841cb5b28c3c65e
languageName: node
linkType: hard
"electron-publish@npm:24.13.1":
version: 24.13.1
resolution: "electron-publish@npm:24.13.1"
@ -20016,6 +20025,22 @@ __metadata:
languageName: node
linkType: hard
"electron-updater@npm:6.2.1":
version: 6.2.1
resolution: "electron-updater@npm:6.2.1"
dependencies:
builder-util-runtime: 9.2.4
fs-extra: ^10.1.0
js-yaml: ^4.1.0
lazy-val: ^1.0.5
lodash.escaperegexp: ^4.1.2
lodash.isequal: ^4.5.0
semver: ^7.3.8
tiny-typed-emitter: ^2.1.0
checksum: 92a064610a3c9df747dce9c3eccd69c48adb2c8b37b9d7c13d1c39f7e2a9ffaef4e909ab50e6973d557566bde6de7ec9c64e2cc3a2cdef18b3220c5d91333e1c
languageName: node
linkType: hard
"electron-window-state@npm:5.0.3":
version: 5.0.3
resolution: "electron-window-state@npm:5.0.3"
@ -28797,6 +28822,13 @@ __metadata:
languageName: node
linkType: hard
"lodash.escaperegexp@npm:^4.1.2":
version: 4.1.2
resolution: "lodash.escaperegexp@npm:4.1.2"
checksum: 6d99452b1cfd6073175a9b741a9b09ece159eac463f86f02ea3bee2e2092923fce812c8d2bf446309cc52d1d61bf9af51c8118b0d7421388e6cead7bd3798f0f
languageName: node
linkType: hard
"lodash.flatten@npm:^4.4.0":
version: 4.4.0
resolution: "lodash.flatten@npm:4.4.0"
@ -28832,6 +28864,13 @@ __metadata:
languageName: node
linkType: hard
"lodash.isequal@npm:^4.5.0":
version: 4.5.0
resolution: "lodash.isequal@npm:4.5.0"
checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644
languageName: node
linkType: hard
"lodash.ismatch@npm:^4.4.0":
version: 4.4.0
resolution: "lodash.ismatch@npm:4.4.0"
@ -41471,6 +41510,13 @@ __metadata:
languageName: node
linkType: hard
"tiny-typed-emitter@npm:^2.1.0":
version: 2.1.0
resolution: "tiny-typed-emitter@npm:2.1.0"
checksum: 709bca410054e08df4dc29d5ea0916328bb2900d60245c6a743068ea223887d9fd2c945b6070eb20336275a557a36c2808e5c87d2ed4b60633458632be4a3e10
languageName: node
linkType: hard
"tiny-warning@npm:^1.0.0":
version: 1.0.3
resolution: "tiny-warning@npm:1.0.3"