basic-electron-updater
Version:
A secure, cross-platform auto-update library for Electron Forge apps using GitHub Releases.
74 lines (73 loc) • 2.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GitHubProvider = void 0;
/**
* GitHubProvider fetches release data from the GitHub API for the configured repo.
* Used internally by Updater.
*/
class GitHubProvider {
repo;
allowPrerelease;
channel;
/**
* Create a new GitHubProvider.
* @param options GitHub provider options
*/
constructor(options) {
this.repo = options.repo;
this.allowPrerelease = options.allowPrerelease ?? false;
this.channel = options.channel ?? "latest";
}
/**
* Fetches the latest release matching the config (channel, prerelease, etc).
* @returns GitHubReleaseResult if available, otherwise null
* @throws Error if the GitHub API request fails
*/
async getLatestRelease() {
const url = `https://api.github.com/repos/${this.repo}/releases`;
let res;
try {
res = await fetch(url, {
headers: {
Accept: "application/vnd.github+json",
"User-Agent": "basic-electron-updater"
},
});
}
catch (error) {
throw new Error(`Network error accessing GitHub API: ${error instanceof Error ? error.message : String(error)}`);
}
if (!res.ok) {
const errorText = await res.text().catch(() => 'Unknown error');
throw new Error(`GitHub API error: ${res.status} ${res.statusText} - ${errorText}`);
}
let releases;
try {
releases = await res.json();
}
catch (error) {
throw new Error(`Invalid JSON response from GitHub API: ${error instanceof Error ? error.message : String(error)}`);
}
if (!Array.isArray(releases)) {
throw new Error("GitHub API returned invalid data format");
}
const filtered = releases.filter((r) => !r.draft &&
(this.allowPrerelease || !r.prerelease) &&
(this.channel === "latest" || r.tag_name.includes(this.channel)));
if (!filtered.length)
return null;
const release = filtered[0];
return {
version: release.tag_name,
releaseName: release.name,
releaseNotes: release.body,
assets: release.assets.map((a) => ({
name: a.name,
url: a.browser_download_url,
sha256: a.sha256,
gpgSignatureUrl: a.gpgSignatureUrl,
})),
};
}
}
exports.GitHubProvider = GitHubProvider;