forked from Rosetta/landing
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
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<DownloadRelease[]> {
|
|
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);
|
|
});
|
|
}
|