/ lib / updater.ts
updater.ts
 1  import type { UpdateInfo } from './types';
 2  
 3  interface GitHubRelease {
 4    tag_name: string;
 5    html_url: string;
 6  }
 7  
 8  /** Compare two semver strings. Returns true if remote > local. */
 9  function isNewer(remote: string, local: string): boolean {
10    const r = remote.split('.').map(Number);
11    const l = local.split('.').map(Number);
12    for (let i = 0; i < 3; i++) {
13      const rv = r[i] ?? 0;
14      const lv = l[i] ?? 0;
15      if (rv > lv) return true;
16      if (rv < lv) return false;
17    }
18    return false;
19  }
20  
21  export async function checkForUpdate(currentVersion: string, token?: string): Promise<UpdateInfo | null> {
22    try {
23      const headers: Record<string, string> = { 'User-Agent': 'Gnosis-App' };
24      if (token) headers['Authorization'] = `token ${token}`;
25      const res = await fetch('https://api.github.com/repos/oddur/gnosis/releases/latest', { headers });
26      if (!res.ok) return null;
27  
28      const data = (await res.json()) as GitHubRelease;
29      const remoteVersion = data.tag_name.replace(/^v/, '');
30  
31      if (!isNewer(remoteVersion, currentVersion)) return null;
32  
33      return {
34        version: remoteVersion,
35        releaseUrl: data.html_url,
36      };
37    } catch {
38      return null;
39    }
40  }