Skip to content

Commit 350b2a4

Browse files
committed
feat(desktop): add local and wsl sidecar controller factories
1 parent 85e123f commit 350b2a4

2 files changed

Lines changed: 79 additions & 1 deletion

File tree

packages/desktop/src/main/sidecar/controller.test.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, test, vi } from "bun:test"
2-
import { BaseSidecarController } from "./types"
2+
import { BaseSidecarController, createLocalSidecarController, createWslSidecarController } from "./types"
33

44
describe("SidecarController Interface", () => {
55
test("manages sidecar lifecycle state transitions", async () => {
@@ -28,4 +28,44 @@ describe("SidecarController Interface", () => {
2828
expect(controller.getUrl()).rejects.toThrow("Failed to start server")
2929
expect(controller.status).toBe("failed")
3030
})
31+
32+
test("createLocalSidecarController wraps local server startup and stop", async () => {
33+
const stopMock = vi.fn().mockResolvedValue(undefined)
34+
const startMock = vi.fn().mockResolvedValue({
35+
url: "http://127.0.0.1:4096",
36+
listener: { stop: stopMock },
37+
})
38+
39+
const sidecar = createLocalSidecarController("local-main", startMock)
40+
expect(sidecar.kind).toBe("local")
41+
expect(sidecar.status).toBe("idle")
42+
43+
const url = await sidecar.getUrl()
44+
expect(url).toBe("http://127.0.0.1:4096")
45+
expect(sidecar.status).toBe("ready")
46+
47+
await sidecar.stop()
48+
expect(stopMock).toHaveBeenCalled()
49+
expect(sidecar.status).toBe("stopped")
50+
})
51+
52+
test("createWslSidecarController wraps WSL server startup and stop", async () => {
53+
const stopMock = vi.fn()
54+
const startMock = vi.fn().mockResolvedValue({
55+
url: "http://127.0.0.1:8080",
56+
listener: { stop: stopMock },
57+
})
58+
59+
const sidecar = createWslSidecarController("Ubuntu", startMock)
60+
expect(sidecar.kind).toBe("wsl")
61+
expect(sidecar.status).toBe("idle")
62+
63+
const url = await sidecar.getUrl()
64+
expect(url).toBe("http://127.0.0.1:8080")
65+
expect(sidecar.status).toBe("ready")
66+
67+
await sidecar.stop()
68+
expect(stopMock).toHaveBeenCalled()
69+
expect(sidecar.status).toBe("stopped")
70+
})
3171
})

packages/desktop/src/main/sidecar/types.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,41 @@ export class BaseSidecarController implements SidecarInstance {
4343
}
4444
}
4545
}
46+
47+
export function createLocalSidecarController(
48+
id: string,
49+
start: () => Promise<{ url: string; listener: { stop: () => Promise<void> } }>,
50+
): BaseSidecarController {
51+
let stopFn = async () => {}
52+
return new BaseSidecarController(
53+
id,
54+
"local",
55+
async () => {
56+
const res = await start()
57+
stopFn = () => res.listener.stop()
58+
return res.url
59+
},
60+
async () => {
61+
await stopFn()
62+
},
63+
)
64+
}
65+
66+
export function createWslSidecarController(
67+
distro: string,
68+
start: () => Promise<{ url: string; listener: { stop: () => void } }>,
69+
): BaseSidecarController {
70+
let stopFn = async () => {}
71+
return new BaseSidecarController(
72+
distro,
73+
"wsl",
74+
async () => {
75+
const res = await start()
76+
stopFn = async () => res.listener.stop()
77+
return res.url
78+
},
79+
async () => {
80+
await stopFn()
81+
},
82+
)
83+
}

0 commit comments

Comments
 (0)