api-client/packages/hoppscotch-desktop/src/services/updater.client.ts
Shreyas f834cc87d3
feat(desktop): portable phase-3: instance manager (#5421)
Co-authored-by: James George <25279263+jamesgeorge007@users.noreply.github.com>
2025-11-25 18:09:18 +05:30

73 lines
1.8 KiB
TypeScript

import { invoke } from "@tauri-apps/api/core"
import { listen, type UnlistenFn } from "@tauri-apps/api/event"
export interface UpdateInfo {
available: boolean
currentVersion: string
latestVersion?: string
releaseNotes?: string
}
export interface DownloadProgress {
downloaded: number
total?: number
percentage: number
}
// TODO: Type safety just like `persistence.serivce.ts`?
export type UpdateEvent =
| { type: "CheckStarted" }
| { type: "CheckCompleted"; info: UpdateInfo }
| { type: "CheckFailed"; error: string }
| { type: "DownloadStarted"; totalBytes?: number }
| { type: "DownloadProgress"; progress: DownloadProgress }
| { type: "DownloadCompleted" }
| { type: "InstallStarted" }
| { type: "InstallCompleted" }
| { type: "RestartRequired" }
| { type: "UpdateCancelled" }
| { type: "Error"; message: string }
export class UpdaterClient {
private unlistenFn?: UnlistenFn
async checkForUpdates(showNativeDialog = false): Promise<UpdateInfo> {
return invoke("check_for_updates", { showNativeDialog })
}
async downloadAndInstall(): Promise<void> {
return invoke("download_and_install_update")
}
async restart(): Promise<void> {
return invoke("restart_application")
}
async cancel(): Promise<void> {
return invoke("cancel_update")
}
async getDownloadProgress(): Promise<DownloadProgress> {
return invoke("get_download_progress")
}
async isPortableMode(): Promise<boolean> {
return invoke("is_portable_mode")
}
async listenToUpdates(
callback: (event: UpdateEvent) => void
): Promise<UnlistenFn> {
this.unlistenFn = await listen("updater-event", (event) => {
callback(event.payload as UpdateEvent)
})
return this.unlistenFn
}
stopListening(): void {
if (this.unlistenFn) {
this.unlistenFn()
this.unlistenFn = undefined
}
}
}