import { invoke, transformCallback } from "@tauri-apps/api/tauri"; interface CheckOptions { /** * Request headers */ headers?: Record; /** * Timeout in seconds */ timeout?: number; /** * Target identifier for the running application. This is sent to the backend. */ target?: string; } interface UpdateResponse { available: boolean; currentVersion: string; latestVersion: string; date?: string; body?: string; } // TODO: use channel from @tauri-apps/api on v2 class Channel { id: number; // @ts-expect-error field used by the IPC serializer private readonly __TAURI_CHANNEL_MARKER__ = true; #onmessage: (response: T) => void = () => { // no-op }; constructor() { this.id = transformCallback((response: T) => { this.#onmessage(response); }); } set onmessage(handler: (response: T) => void) { this.#onmessage = handler; } get onmessage(): (response: T) => void { return this.#onmessage; } toJSON(): string { return `__CHANNEL__:${this.id}`; } } type DownloadEvent = | { event: "Started"; data: { contentLength?: number } } | { event: "Progress"; data: { chunkLength: number } } | { event: "Finished" }; class Update { response: UpdateResponse; constructor(response: UpdateResponse) { this.response = response; } async downloadAndInstall( onEvent?: (progress: DownloadEvent) => void ): Promise { const channel = new Channel(); if (onEvent != null) { channel.onmessage = onEvent; } return invoke("plugin:updater|download_and_install", { onEvent: channel }); } } async function check(options?: CheckOptions): Promise { return invoke("plugin:updater|check", { ...options }).then( (response) => new Update(response) ); } export type { CheckOptions, UpdateResponse, DownloadEvent }; export { check, Update };