mirror of
https://github.com/lone-cloud/gerbil
synced 2026-06-03 09:33:10 -07:00
69 lines
1.9 KiB
TypeScript
69 lines
1.9 KiB
TypeScript
import type { GitHubRelease } from '@/types/electron';
|
|
import { GITHUB_API } from '@/constants';
|
|
|
|
export class GitHubService {
|
|
private lastApiCall = 0;
|
|
private apiCooldown = 60000;
|
|
private cachedRelease: GitHubRelease | null = null;
|
|
private cachedReleases: GitHubRelease[] = [];
|
|
|
|
async getLatestRelease(): Promise<GitHubRelease | null> {
|
|
const now = Date.now();
|
|
if (now - this.lastApiCall < this.apiCooldown && this.cachedRelease) {
|
|
return this.cachedRelease;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(GITHUB_API.LATEST_RELEASE_URL);
|
|
|
|
if (!response.ok) {
|
|
if (response.status === 403) {
|
|
console.warn(
|
|
'GitHub API rate limit reached, using cached data if available'
|
|
);
|
|
return this.cachedRelease;
|
|
}
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
this.lastApiCall = now;
|
|
this.cachedRelease = (await response.json()) as GitHubRelease;
|
|
return this.cachedRelease;
|
|
} catch (error) {
|
|
console.error('Error fetching latest release:', error);
|
|
return this.cachedRelease;
|
|
}
|
|
}
|
|
|
|
async getAllReleases(): Promise<GitHubRelease[]> {
|
|
const now = Date.now();
|
|
|
|
if (
|
|
now - this.lastApiCall < this.apiCooldown &&
|
|
this.cachedReleases.length > 0
|
|
) {
|
|
return this.cachedReleases;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(GITHUB_API.ALL_RELEASES_URL);
|
|
|
|
if (!response.ok) {
|
|
if (response.status === 403) {
|
|
console.warn(
|
|
'GitHub API rate limit reached, using cached data if available'
|
|
);
|
|
return this.cachedReleases;
|
|
}
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
this.lastApiCall = now;
|
|
this.cachedReleases = (await response.json()) as GitHubRelease[];
|
|
return this.cachedReleases;
|
|
} catch (error) {
|
|
console.error('Error fetching releases:', error);
|
|
return this.cachedReleases;
|
|
}
|
|
}
|
|
}
|