electron-updater in the shell (packaged builds only; dev never updates). Checks at startup + every 24h, downloads silently, and the renderer shows a Restart banner once the update is staged (it installs on quit either way). Manual "Check for Updates..." under the app menu answers via dialog. Every updater event routes through the shell log and is caught - the updater can never take the app down (verified live: a feed failure logs three lines and the app runs on). LH_UPDATE_FEED overrides the baked GitHub feed with a generic local server - the pre-release drill: serve latest-mac.yml + zip + blockmap from localhost and a real installed copy updates itself, no release, no public repo. The asar allow-list re-includes electron-updater + its 16-package runtime tree explicitly (gitignore last-match-wins; asar verified at 2.1 MB). The banner rides the preload bridge (onUpdateStatus/installUpdate) and renders nothing in the browser. window.lh typing centralized in sidebar.tsx's declaration.
42 lines
1.9 KiB
JavaScript
42 lines
1.9 KiB
JavaScript
/*
|
|
* Preload (2026-09-17, narrow-window wave): the ONLY bridge between the
|
|
* sandboxed renderer and the main process. contextIsolation + sandbox are
|
|
* on (electron/main.cjs), so this file is the renderer's entire access to
|
|
* Electron — keep it a minimal, explicit API surface.
|
|
*
|
|
* window.lh.expandWindow() — widen the window to the sidebar auto-close
|
|
* threshold (928px) when the sidebar is opened below it. The main
|
|
* process clamps: no-op if the window is already wide enough.
|
|
*
|
|
* window.lh.onZoom(cb) / window.lh.getZoom() — the zoom truth (owner
|
|
* round 7, 2026-10-05): every ⌘±/⌘0 change arrives as "lh:zoom" with
|
|
* the new factor; getZoom covers the first-paint race. The renderer
|
|
* publishes it as --lh-zoom so physical-constant lengths (the traffic-
|
|
* light gutter) can divide by it.
|
|
*
|
|
* window.lh.onUpdateStatus(cb) / window.lh.installUpdate() — the
|
|
* auto-update channel (Wave C, 2026-10-10): "lh:update-status" pushes
|
|
* {status:"downloaded", version} once an update is staged; installUpdate
|
|
* asks main to kill the server and quit-and-install. Browser builds:
|
|
* both absent, the banner never renders.
|
|
*
|
|
* Channel names are mirrored in electron/main.cjs — keep them in sync.
|
|
*/
|
|
const { contextBridge, ipcRenderer } = require("electron");
|
|
|
|
contextBridge.exposeInMainWorld("lh", {
|
|
expandWindow: () => ipcRenderer.send("lh:expand-window"),
|
|
onZoom: (cb) => {
|
|
const listener = (_event, factor) => cb(factor);
|
|
ipcRenderer.on("lh:zoom", listener);
|
|
return () => ipcRenderer.removeListener("lh:zoom", listener);
|
|
},
|
|
getZoom: () => ipcRenderer.invoke("lh:zoom:get"),
|
|
onUpdateStatus: (cb) => {
|
|
const listener = (_event, status) => cb(status);
|
|
ipcRenderer.on("lh:update-status", listener);
|
|
return () => ipcRenderer.removeListener("lh:update-status", listener);
|
|
},
|
|
installUpdate: () => ipcRenderer.send("lh:update-install"),
|
|
});
|