Report the app version on /healthz
Build 116. /healthz has always carried a 'build' field, but it is a hash of the listener page's assets — a cache-busting token, not a version. So the only way to tell what a campus Mac was actually running was to install something and watch the hash move, which is how the last three updates were confirmed. With an updater in the field, what version a machine is on is the first question anyone asks. It now answers plainly: version and buildNumber, passed to the server child from the running bundle. Checking a campus is a single unauthenticated request. It found something immediately: this development Mac reported appBuild 112 while the source tree was at 115, because deploying loose files over an installed bundle leaves its package.json behind. A packaged install reports correctly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
4aa30699c9
commit
4ec0782489
@@ -440,6 +440,11 @@ function startServer() {
|
|||||||
execPath: nodeBin,
|
execPath: nodeBin,
|
||||||
env: Object.assign({}, process.env, {
|
env: Object.assign({}, process.env, {
|
||||||
CT_FFMPEG: ffmpegPathForChildren(),
|
CT_FFMPEG: ffmpegPathForChildren(),
|
||||||
|
/* So /healthz can report the APP’s version rather than only an asset
|
||||||
|
hash. A campus Mac’s build was otherwise unknowable from the network,
|
||||||
|
which made confirming an update a matter of inference. */
|
||||||
|
CT_APP_VERSION: appBuild().version,
|
||||||
|
CT_APP_BUILD: appBuild().build,
|
||||||
PORT: String(port),
|
PORT: String(port),
|
||||||
DATA_DIR: dataDir(),
|
DATA_DIR: dataDir(),
|
||||||
/* Where the spoken clips land, so the server can hand them to phones. */
|
/* Where the spoken clips land, so the server can hand them to phones. */
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
"name": "church-translate-engine",
|
"name": "church-translate-engine",
|
||||||
"productName": "Church Translate",
|
"productName": "Church Translate",
|
||||||
"version": "3.23.2",
|
"version": "3.23.2",
|
||||||
"buildNumber": 115,
|
"buildNumber": 116,
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Live sermon translation — self-contained: captures audio, transcribes, translates, and serves the congregation page itself",
|
"description": "Live sermon translation — self-contained: captures audio, transcribes, translates, and serves the congregation page itself",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"asar": false,
|
"asar": false,
|
||||||
"buildVersion": "115",
|
"buildVersion": "116",
|
||||||
"win": {
|
"win": {
|
||||||
"target": [
|
"target": [
|
||||||
{
|
{
|
||||||
|
|||||||
+16
-1
@@ -1095,7 +1095,22 @@ const server = http.createServer(async (req, res) => {
|
|||||||
}
|
}
|
||||||
if (req.method === 'OPTIONS') { res.writeHead(origin ? 204 : 405).end(); return; }
|
if (req.method === 'OPTIONS') { res.writeHead(origin ? 204 : 405).end(); return; }
|
||||||
|
|
||||||
if (p === '/healthz') { sendJSON(res, 200, { ok: true, live: state.live, build: BUILD }); return; }
|
/*
|
||||||
|
* The APP's version, plainly, to anyone who can reach this port.
|
||||||
|
*
|
||||||
|
* `build` here has always been a hash of the listener-page assets — a
|
||||||
|
* cache-busting token, not a version — so the only way to tell what a campus
|
||||||
|
* Mac was running was to install something and watch the hash move. With an
|
||||||
|
* updater in the field that is the first question anyone asks, so answer it.
|
||||||
|
*/
|
||||||
|
if (p === '/healthz') {
|
||||||
|
sendJSON(res, 200, {
|
||||||
|
ok: true, live: state.live, build: BUILD,
|
||||||
|
version: process.env.CT_APP_VERSION || '',
|
||||||
|
appBuild: process.env.CT_APP_BUILD || ''
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// --- Companion / Stream Deck control -------------------------------
|
// --- Companion / Stream Deck control -------------------------------
|
||||||
// GET or POST, token in ?key= or the X-Control-Token header.
|
// GET or POST, token in ?key= or the X-Control-Token header.
|
||||||
|
|||||||
Reference in New Issue
Block a user