export interface DownloadRelease { platform: string; arch: string; version: string; link: string; } interface UpdateItem { platform: string; arch: string; version: string; downloadUrl: string; } const PLATFORM_ORDER = ['darwin', 'linux', 'win32', 'android']; const ARCH_ORDER = ['arm64', 'x64', 'universal']; export async function fetchUpdates(signal?: AbortSignal): Promise { const response = await fetch('https://sdu.rosetta.im/updates/all', { signal }); if (!response.ok) { throw new Error(`Update server returned ${response.status}`); } const data = (await response.json()) as { items?: UpdateItem[] }; return (data.items || []) .map((item) => ({ platform: item.platform, arch: item.arch, version: item.version, link: new URL(item.downloadUrl, 'https://sdu.rosetta.im').toString(), })) .sort((a, b) => { const platformComparison = PLATFORM_ORDER.indexOf(a.platform) - PLATFORM_ORDER.indexOf(b.platform); if (platformComparison !== 0) { return platformComparison; } return ARCH_ORDER.indexOf(a.arch) - ARCH_ORDER.indexOf(b.arch); }); }