fix: validate serverUrl port before tmux pane spawn (fixes #2729)
This commit is contained in:
@@ -226,6 +226,29 @@ describe('TmuxSessionManager', () => {
|
|||||||
// then
|
// then
|
||||||
expect(manager).toBeDefined()
|
expect(manager).toBeDefined()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('falls back to default port when serverUrl has port 0', async () => {
|
||||||
|
// given
|
||||||
|
mockIsInsideTmux.mockReturnValue(true)
|
||||||
|
const { TmuxSessionManager } = await import('./manager')
|
||||||
|
const ctx = {
|
||||||
|
...createMockContext(),
|
||||||
|
serverUrl: new URL('http://127.0.0.1:0/'),
|
||||||
|
}
|
||||||
|
const config: TmuxConfig = {
|
||||||
|
enabled: true,
|
||||||
|
layout: 'main-vertical',
|
||||||
|
main_pane_size: 60,
|
||||||
|
main_pane_min_width: 80,
|
||||||
|
agent_pane_min_width: 40,
|
||||||
|
}
|
||||||
|
|
||||||
|
// when
|
||||||
|
const manager = new TmuxSessionManager(ctx, config, mockTmuxDeps)
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect((manager as any).serverUrl).toBe('http://localhost:4096')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('onSessionCreated', () => {
|
describe('onSessionCreated', () => {
|
||||||
|
|||||||
@@ -73,10 +73,18 @@ export class TmuxSessionManager {
|
|||||||
this.tmuxConfig = tmuxConfig
|
this.tmuxConfig = tmuxConfig
|
||||||
this.deps = deps
|
this.deps = deps
|
||||||
const defaultPort = process.env.OPENCODE_PORT ?? "4096"
|
const defaultPort = process.env.OPENCODE_PORT ?? "4096"
|
||||||
|
const fallbackUrl = `http://localhost:${defaultPort}`
|
||||||
try {
|
try {
|
||||||
this.serverUrl = ctx.serverUrl?.toString() ?? `http://localhost:${defaultPort}`
|
const raw = ctx.serverUrl?.toString()
|
||||||
|
if (raw) {
|
||||||
|
const parsed = new URL(raw)
|
||||||
|
const port = parsed.port || (parsed.protocol === 'https:' ? '443' : '80')
|
||||||
|
this.serverUrl = port === '0' ? fallbackUrl : raw
|
||||||
|
} else {
|
||||||
|
this.serverUrl = fallbackUrl
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
this.serverUrl = `http://localhost:${defaultPort}`
|
this.serverUrl = fallbackUrl
|
||||||
}
|
}
|
||||||
this.sourcePaneId = deps.getCurrentPaneId()
|
this.sourcePaneId = deps.getCurrentPaneId()
|
||||||
this.pollingManager = new TmuxPollingManager(
|
this.pollingManager = new TmuxPollingManager(
|
||||||
|
|||||||
Reference in New Issue
Block a user