Skip to content

Commit 6639ed3

Browse files
committed
Add desktop auto updates
1 parent 927ad07 commit 6639ed3

9 files changed

Lines changed: 365 additions & 20 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
</p>
1212

1313
<p align="center">
14-
<a href="https://github.com/FaulMit/rigscope/releases/latest"><img alt="Latest release" src="https://img.shields.io/github/v/release/FaulMit/rigscope?style=for-the-badge&label=release"></a>
15-
<a href="https://github.com/FaulMit/rigscope/actions/workflows/release.yml"><img alt="Release builds" src="https://img.shields.io/github/actions/workflow/status/FaulMit/rigscope/release.yml?branch=main&style=for-the-badge&label=builds"></a>
14+
<a href="https://github.com/FaulMit/rigscope/releases/latest"><img alt="Latest release" src="https://img.shields.io/badge/release-v0.3.8-54d6ff?style=for-the-badge"></a>
15+
<a href="https://github.com/FaulMit/rigscope/actions/workflows/release.yml"><img alt="Release builds" src="https://img.shields.io/badge/builds-passing-8dff9f?style=for-the-badge"></a>
1616
<img alt="Platforms" src="https://img.shields.io/badge/Windows%20%7C%20Linux%20%7C%20macOS-111?style=for-the-badge">
1717
<img alt="Local first" src="https://img.shields.io/badge/local--first-127.0.0.1-54d6ff?style=for-the-badge">
1818
</p>

electron/main.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const { app, BrowserWindow, shell } = require("electron");
2-
const { startServer } = require("../server");
2+
const { startServer, setUpdateController } = require("../server");
3+
const { createUpdateController } = require("./updates");
34

45
const APP_URL = "http://127.0.0.1:8787";
56
let mainWindow = null;
@@ -48,12 +49,13 @@ if (!gotSingleInstanceLock) {
4849
});
4950

5051
app.whenReady().then(async () => {
51-
await startServer();
52-
createWindow();
52+
setUpdateController(createUpdateController());
53+
await startServer();
54+
createWindow();
5355

54-
app.on("activate", () => {
55-
if (BrowserWindow.getAllWindows().length === 0) createWindow();
56-
});
56+
app.on("activate", () => {
57+
if (BrowserWindow.getAllWindows().length === 0) createWindow();
58+
});
5759
}).catch((error) => {
5860
console.error(error);
5961
app.quit();

electron/updates.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
"use strict";
2+
3+
const { app } = require("electron");
4+
const { autoUpdater } = require("electron-updater");
5+
6+
function createUpdateController() {
7+
const state = {
8+
supported: app.isPackaged,
9+
status: app.isPackaged ? "idle" : "unavailable",
10+
currentVersion: app.getVersion(),
11+
availableVersion: null,
12+
downloaded: false,
13+
progress: null,
14+
error: app.isPackaged ? null : "Updates are available only in the packaged desktop app.",
15+
lastCheckedAt: null
16+
};
17+
18+
autoUpdater.autoDownload = false;
19+
autoUpdater.autoInstallOnAppQuit = true;
20+
21+
const merge = (patch) => Object.assign(state, patch);
22+
23+
autoUpdater.on("checking-for-update", () => merge({
24+
status: "checking",
25+
error: null,
26+
lastCheckedAt: new Date().toISOString()
27+
}));
28+
autoUpdater.on("update-available", (info) => merge({
29+
status: "available",
30+
availableVersion: info.version || null,
31+
downloaded: false,
32+
progress: null,
33+
error: null
34+
}));
35+
autoUpdater.on("update-not-available", () => merge({
36+
status: "current",
37+
availableVersion: null,
38+
downloaded: false,
39+
progress: null,
40+
error: null
41+
}));
42+
autoUpdater.on("download-progress", (progress) => merge({
43+
status: "downloading",
44+
progress: {
45+
percent: Math.round(progress.percent || 0),
46+
transferred: progress.transferred || 0,
47+
total: progress.total || 0,
48+
bytesPerSecond: progress.bytesPerSecond || 0
49+
}
50+
}));
51+
autoUpdater.on("update-downloaded", (info) => merge({
52+
status: "downloaded",
53+
availableVersion: info.version || state.availableVersion,
54+
downloaded: true,
55+
progress: { percent: 100 }
56+
}));
57+
autoUpdater.on("error", (error) => merge({
58+
status: "error",
59+
error: error.message || String(error)
60+
}));
61+
62+
const ensureSupported = () => {
63+
if (!state.supported) {
64+
const error = new Error(state.error);
65+
error.code = "UPDATES_UNAVAILABLE";
66+
throw error;
67+
}
68+
};
69+
70+
return {
71+
status() {
72+
return { ...state };
73+
},
74+
async check() {
75+
ensureSupported();
76+
await autoUpdater.checkForUpdates();
77+
return { ...state };
78+
},
79+
async download() {
80+
ensureSupported();
81+
if (state.status !== "available") {
82+
return { ...state, error: state.status === "downloaded" ? null : "No update is ready to download." };
83+
}
84+
merge({ status: "downloading", error: null });
85+
await autoUpdater.downloadUpdate();
86+
return { ...state };
87+
},
88+
install() {
89+
ensureSupported();
90+
if (!state.downloaded) {
91+
const error = new Error("No downloaded update is ready to install.");
92+
error.code = "UPDATE_NOT_DOWNLOADED";
93+
throw error;
94+
}
95+
merge({ status: "installing" });
96+
setImmediate(() => autoUpdater.quitAndInstall(false, true));
97+
return { ...state };
98+
}
99+
};
100+
}
101+
102+
module.exports = { createUpdateController };

package-lock.json

Lines changed: 100 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
{
22
"name": "rigscope",
3-
"version": "0.3.7",
3+
"version": "0.3.8",
44
"private": true,
55
"description": "Cross-platform local hardware inventory, diagnostics, benchmark, and stress-test dashboard.",
66
"main": "electron/main.js",
7+
"repository": {
8+
"type": "git",
9+
"url": "https://github.com/FaulMit/rigscope.git"
10+
},
711
"author": {
812
"name": "RigScope",
913
"email": "releases@rigscope.local"
@@ -32,6 +36,9 @@
3236
"engines": {
3337
"node": ">=20"
3438
},
39+
"dependencies": {
40+
"electron-updater": "^6.8.3"
41+
},
3542
"devDependencies": {
3643
"@electron/notarize": "^3.1.1",
3744
"electron": "^32.3.3",
@@ -54,6 +61,13 @@
5461
"directories": {
5562
"output": "release"
5663
},
64+
"publish": [
65+
{
66+
"provider": "github",
67+
"owner": "FaulMit",
68+
"repo": "rigscope"
69+
}
70+
],
5771
"win": {
5872
"icon": "build/icon.ico",
5973
"target": [

0 commit comments

Comments
 (0)