desktop-electon: handle latest version update check properly

This commit is contained in:
Brendan Allan
2026-03-05 17:00:13 +08:00
parent 6ddd13c6ac
commit 6531cfc521
+29 -15
View File
@@ -1,14 +1,18 @@
import { app, BrowserWindow, dialog } from "electron"
import type { Event } from "electron"
import pkg from "electron-updater"
import { randomUUID } from "node:crypto" import { randomUUID } from "node:crypto"
import { EventEmitter } from "node:events" import { EventEmitter } from "node:events"
import { existsSync } from "node:fs" import { existsSync } from "node:fs"
import { createServer } from "node:net"
import { homedir } from "node:os" import { homedir } from "node:os"
import { join } from "node:path" import { join } from "node:path"
import { createServer } from "node:net" import type { Event } from "electron"
import { app, type BrowserWindow, dialog } from "electron"
import pkg from "electron-updater"
const APP_NAMES: Record<string, string> = { dev: "OpenCode Dev", beta: "OpenCode Beta", prod: "OpenCode" } const APP_NAMES: Record<string, string> = {
dev: "OpenCode Dev",
beta: "OpenCode Beta",
prod: "OpenCode",
}
const APP_IDS: Record<string, string> = { const APP_IDS: Record<string, string> = {
dev: "ai.opencode.desktop.dev", dev: "ai.opencode.desktop.dev",
beta: "ai.opencode.desktop.beta", beta: "ai.opencode.desktop.beta",
@@ -18,7 +22,9 @@ app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
app.setPath("userData", join(app.getPath("appData"), app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev")) app.setPath("userData", join(app.getPath("appData"), app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"))
const { autoUpdater } = pkg const { autoUpdater } = pkg
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
import { checkAppExists, resolveAppPath, wslPath } from "./apps" import { checkAppExists, resolveAppPath, wslPath } from "./apps"
import type { CommandChild } from "./cli"
import { installCli, syncCli } from "./cli" import { installCli, syncCli } from "./cli"
import { CHANNEL, UPDATER_ENABLED } from "./constants" import { CHANNEL, UPDATER_ENABLED } from "./constants"
import { registerIpcHandlers, sendDeepLinks, sendMenuCommand, sendSqliteMigrationProgress } from "./ipc" import { registerIpcHandlers, sendDeepLinks, sendMenuCommand, sendSqliteMigrationProgress } from "./ipc"
@@ -37,9 +43,6 @@ import {
} from "./server" } from "./server"
import { createLoadingWindow, createMainWindow, setDockIcon } from "./windows" import { createLoadingWindow, createMainWindow, setDockIcon } from "./windows"
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
import type { CommandChild } from "./cli"
type ServerConnection = type ServerConnection =
| { variant: "existing"; url: string } | { variant: "existing"; url: string }
| { | {
@@ -56,16 +59,19 @@ const initEmitter = new EventEmitter()
let initStep: InitStep = { phase: "server_waiting" } let initStep: InitStep = { phase: "server_waiting" }
let mainWindow: BrowserWindow | null = null let mainWindow: BrowserWindow | null = null
let loadingWindow: BrowserWindow | null = null const loadingWindow: BrowserWindow | null = null
let sidecar: CommandChild | null = null let sidecar: CommandChild | null = null
let loadingComplete = defer<void>() const loadingComplete = defer<void>()
const pendingDeepLinks: string[] = [] const pendingDeepLinks: string[] = []
const serverReady = defer<ServerReadyData>() const serverReady = defer<ServerReadyData>()
const logger = initLogging() const logger = initLogging()
logger.log("app starting", { version: app.getVersion(), packaged: app.isPackaged }) logger.log("app starting", {
version: app.getVersion(),
packaged: app.isPackaged,
})
setupApp() setupApp()
@@ -162,7 +168,10 @@ async function initialize() {
const loadingTask = (async () => { const loadingTask = (async () => {
logger.log("setting up server connection") logger.log("setting up server connection")
const serverConnection = await setupServerConnection() const serverConnection = await setupServerConnection()
logger.log("server connection ready", { variant: serverConnection.variant, url: serverConnection.url }) logger.log("server connection ready", {
variant: serverConnection.variant,
url: serverConnection.url,
})
const cliHealthCheck = (() => { const cliHealthCheck = (() => {
if (serverConnection.variant == "cli") { if (serverConnection.variant == "cli") {
@@ -175,7 +184,10 @@ async function initialize() {
if (progress.type === "Done") sqliteDone?.resolve() if (progress.type === "Done") sqliteDone?.resolve()
}) })
await health.wait await health.wait
serverReady.resolve({ url: serverConnection.url, password: serverConnection.password }) serverReady.resolve({
url: serverConnection.url,
password: serverConnection.password,
})
} }
} else { } else {
serverReady.resolve({ url: serverConnection.url, password: null }) serverReady.resolve({ url: serverConnection.url, password: null })
@@ -370,8 +382,10 @@ async function checkUpdate() {
files: updateInfo?.files?.map((file) => file.url) ?? [], files: updateInfo?.files?.map((file) => file.url) ?? [],
}) })
const version = result?.updateInfo?.version const version = result?.updateInfo?.version
if (!version) { if (result?.isUpdateAvailable === false || !version) {
logger.log("no update available", { reason: "provider returned no newer version" }) logger.log("no update available", {
reason: "provider returned no newer version",
})
return { updateAvailable: false } return { updateAvailable: false }
} }
logger.log("update available", { version }) logger.log("update available", { version })