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
No known key found for this signature in database
GPG Key ID: 41E835AEA046A32E

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 { EventEmitter } from "node:events"
import { existsSync } from "node:fs"
import { createServer } from "node:net"
import { homedir } from "node:os"
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> = {
dev: "ai.opencode.desktop.dev",
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"))
const { autoUpdater } = pkg
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
import { checkAppExists, resolveAppPath, wslPath } from "./apps"
import type { CommandChild } from "./cli"
import { installCli, syncCli } from "./cli"
import { CHANNEL, UPDATER_ENABLED } from "./constants"
import { registerIpcHandlers, sendDeepLinks, sendMenuCommand, sendSqliteMigrationProgress } from "./ipc"
@ -37,9 +43,6 @@ import {
} from "./server"
import { createLoadingWindow, createMainWindow, setDockIcon } from "./windows"
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
import type { CommandChild } from "./cli"
type ServerConnection =
| { variant: "existing"; url: string }
| {
@ -56,16 +59,19 @@ const initEmitter = new EventEmitter()
let initStep: InitStep = { phase: "server_waiting" }
let mainWindow: BrowserWindow | null = null
let loadingWindow: BrowserWindow | null = null
const loadingWindow: BrowserWindow | null = null
let sidecar: CommandChild | null = null
let loadingComplete = defer<void>()
const loadingComplete = defer<void>()
const pendingDeepLinks: string[] = []
const serverReady = defer<ServerReadyData>()
const logger = initLogging()
logger.log("app starting", { version: app.getVersion(), packaged: app.isPackaged })
logger.log("app starting", {
version: app.getVersion(),
packaged: app.isPackaged,
})
setupApp()
@ -162,7 +168,10 @@ async function initialize() {
const loadingTask = (async () => {
logger.log("setting up server connection")
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 = (() => {
if (serverConnection.variant == "cli") {
@ -175,7 +184,10 @@ async function initialize() {
if (progress.type === "Done") sqliteDone?.resolve()
})
await health.wait
serverReady.resolve({ url: serverConnection.url, password: serverConnection.password })
serverReady.resolve({
url: serverConnection.url,
password: serverConnection.password,
})
}
} else {
serverReady.resolve({ url: serverConnection.url, password: null })
@ -370,8 +382,10 @@ async function checkUpdate() {
files: updateInfo?.files?.map((file) => file.url) ?? [],
})
const version = result?.updateInfo?.version
if (!version) {
logger.log("no update available", { reason: "provider returned no newer version" })
if (result?.isUpdateAvailable === false || !version) {
logger.log("no update available", {
reason: "provider returned no newer version",
})
return { updateAvailable: false }
}
logger.log("update available", { version })