94 lines
2.4 KiB
TypeScript
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 }
|