fix: handle ambiguous prompt transport failures

This commit is contained in:
Bohdan Triapitsyn
2026-07-07 19:49:11 +03:00
parent c801c7a74b
commit 40dfff4a9a
12 changed files with 456 additions and 100 deletions
@@ -2,36 +2,56 @@ import { afterEach, describe, expect, it, vi } from 'vitest';
import { createOpenCodeNetworkRuntime } from './network-runtime.js';
const createRuntime = () => createOpenCodeNetworkRuntime({
const originalFetch = globalThis.fetch;
const createRuntime = (overrides = {}) => createOpenCodeNetworkRuntime({
state: {
openCodePort: 4096,
openCodeBaseUrl: null,
openCodeApiPrefix: '',
openCodeApiPrefixDetected: false,
openCodeApiDetectionTimer: null,
...overrides.state,
},
getOpenCodeAuthHeaders: () => ({}),
configuredOpenCodeHostname: overrides.configuredOpenCodeHostname,
});
describe('OpenCode network runtime', () => {
afterEach(() => {
vi.useRealTimers();
vi.unstubAllGlobals();
globalThis.fetch = originalFetch;
});
it('clears the probe abort timer when readiness fetch rejects', async () => {
vi.useFakeTimers();
vi.setSystemTime(0);
vi.stubGlobal('fetch', vi.fn(async () => {
it('returns false when readiness fetch rejects', async () => {
globalThis.fetch = vi.fn(async () => {
throw new Error('offline');
}));
});
const runtime = createRuntime();
const readyPromise = runtime.waitForReady('http://127.0.0.1:4096', 1);
await vi.advanceTimersByTimeAsync(100);
await expect(readyPromise).resolves.toBe(false);
});
expect(vi.getTimerCount()).toBe(0);
it('builds managed OpenCode URLs against IPv4 loopback by default', () => {
const runtime = createRuntime();
expect(runtime.buildOpenCodeUrl('/provider')).toBe('http://127.0.0.1:4096/provider');
});
it('keeps external OpenCode base URLs authoritative', () => {
const runtime = createRuntime({
state: { openCodeBaseUrl: 'http://remote.example:4096' },
});
expect(runtime.buildOpenCodeUrl('/provider')).toBe('http://remote.example:4096/provider');
});
it('normalizes wildcard and IPv6 OpenCode bind hosts for local connects', () => {
expect(createRuntime({ configuredOpenCodeHostname: '0.0.0.0' }).buildOpenCodeUrl('/provider'))
.toBe('http://127.0.0.1:4096/provider');
expect(createRuntime({ configuredOpenCodeHostname: '::1' }).buildOpenCodeUrl('/provider'))
.toBe('http://[::1]:4096/provider');
});
});