Files
VidBee/src/main/ipc/services/update-service.ts

94 lines
2.4 KiB
TypeScript

import { app } from 'electron'
import { type IpcContext, IpcMethod, IpcService } from 'electron-ipc-decorator'
import { autoUpdater } from 'electron-updater'
import { settingsManager } from '../../settings'
const isNewerVersion = (latest: string, current: string): boolean => {
const toSegments = (version: string) =>
version.split(/[.-]/).map((segment) => {
const parsed = Number.parseInt(segment, 10)
return Number.isNaN(parsed) ? 0 : parsed
})
const latestSegments = toSegments(latest)
const currentSegments = toSegments(current)
const maxLength = Math.max(latestSegments.length, currentSegments.length)
for (let index = 0; index < maxLength; index += 1) {
const latestValue = latestSegments[index] ?? 0
const currentValue = currentSegments[index] ?? 0
if (latestValue > currentValue) {
return true
}
if (latestValue < currentValue) {
return false
}
}
return false
}
class UpdateService extends IpcService {
static readonly groupName = 'update'
@IpcMethod()
async checkForUpdates(
_context: IpcContext
): Promise<{ available: boolean; version?: string; error?: string }> {
try {
const currentVersion = app.getVersion()
const result = await autoUpdater.checkForUpdates()
const latestVersion = result?.updateInfo?.version
if (latestVersion && isNewerVersion(latestVersion, currentVersion)) {
return {
available: true,
version: latestVersion
}
}
return {
available: false,
version: latestVersion ?? currentVersion
}
} catch (error) {
return {
available: false,
error: error instanceof Error ? error.message : 'Unknown error'
}
}
}
@IpcMethod()
async downloadUpdate(_context: IpcContext): Promise<{ success: boolean; error?: string }> {
try {
await autoUpdater.downloadUpdate()
return { success: true }
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
}
}
}
@IpcMethod()
quitAndInstall(_context: IpcContext): void {
autoUpdater.quitAndInstall()
}
@IpcMethod()
getCurrentVersion(_context: IpcContext): string {
return app.getVersion()
}
@IpcMethod()
isAutoUpdateEnabled(_context: IpcContext): boolean {
return settingsManager.get('autoUpdate')
}
}
export { UpdateService }