Skip to content

Commit a546e88

Browse files
authored
fix(desktop-electron): run JSON migration before spawning sidecar (#23396)
1 parent e998c9e commit a546e88

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

bun.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/desktop-electron/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"electron-store": "^10",
3131
"electron-updater": "^6",
3232
"electron-window-state": "^5.0.3",
33+
"drizzle-orm": "catalog:",
3334
"marked": "^15"
3435
},
3536
"devDependencies": {

packages/desktop-electron/src/main/index.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { parseMarkdown } from "./markdown"
4343
import { createMenu } from "./menu"
4444
import { getDefaultServerUrl, getWslConfig, setDefaultServerUrl, setWslConfig, spawnLocalServer } from "./server"
4545
import { createLoadingWindow, createMainWindow, setBackgroundColor, setDockIcon } from "./windows"
46+
import { drizzle } from "drizzle-orm/node-sqlite/driver"
4647
import type { Server } from "virtual:opencode-server"
4748

4849
const initEmitter = new EventEmitter()
@@ -139,15 +140,6 @@ async function initialize() {
139140
const url = `http://${hostname}:${port}`
140141
const password = randomUUID()
141142

142-
logger.log("spawning sidecar", { url })
143-
const { listener, health } = await spawnLocalServer(hostname, port, password)
144-
server = listener
145-
serverReady.resolve({
146-
url,
147-
username: "opencode",
148-
password,
149-
})
150-
151143
const loadingTask = (async () => {
152144
logger.log("sidecar connection started", { url })
153145

@@ -158,10 +150,32 @@ async function initialize() {
158150
if (progress.type === "Done") sqliteDone?.resolve()
159151
})
160152

153+
if (needsMigration) {
154+
const { Database, JsonMigration } = await import("virtual:opencode-server")
155+
await JsonMigration.run(drizzle({ client: Database.Client().$client }), {
156+
progress: (event: { current: number; total: number }) => {
157+
const percent = Math.round(event.current / event.total) * 100
158+
initEmitter.emit("sqlite", { type: "InProgress", value: percent })
159+
},
160+
})
161+
initEmitter.emit("sqlite", { type: "Done" })
162+
163+
sqliteDone?.resolve()
164+
}
165+
161166
if (needsMigration) {
162167
await sqliteDone?.promise
163168
}
164169

170+
logger.log("spawning sidecar", { url })
171+
const { listener, health } = await spawnLocalServer(hostname, port, password)
172+
server = listener
173+
serverReady.resolve({
174+
url,
175+
username: "opencode",
176+
password,
177+
})
178+
165179
await Promise.race([
166180
health.wait,
167181
delay(30_000).then(() => {

0 commit comments

Comments
 (0)