fix(quota): raise Node's 250ms connect-attempt cap for provider fetches (#3404)
Node's happy-eyeballs default (autoSelectFamilyAttemptTimeout=250ms) aborts every connect attempt to provider endpoints whose TCP handshake exceeds 250ms, so quota fetches from Node processes fail with "fetch failed" while the Bun-based opencode CLI path succeeds (#3399). Raise the per-attempt cap to 5s via a shared applyConnectAttemptTimeout() helper called from the two Node entrypoints that host the quota module: the Electron main process and the openchamber CLI. Family autoselection stays enabled (::1 and IPv6→IPv4 fallback preserved); runtimes without the setter are a no-op.
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
import net from 'node:net';
|
||||
|
||||
import { applyConnectAttemptTimeout, CONNECT_ATTEMPT_TIMEOUT_MS } from './network-defaults.js';
|
||||
|
||||
describe('applyConnectAttemptTimeout', () => {
|
||||
it('raises the per-attempt connect timeout on runtimes that expose the setter', () => {
|
||||
const previous = net.getDefaultAutoSelectFamilyAttemptTimeout();
|
||||
try {
|
||||
expect(applyConnectAttemptTimeout()).toBe(true);
|
||||
expect(net.getDefaultAutoSelectFamilyAttemptTimeout()).toBe(CONNECT_ATTEMPT_TIMEOUT_MS);
|
||||
} finally {
|
||||
net.setDefaultAutoSelectFamilyAttemptTimeout(previous);
|
||||
}
|
||||
});
|
||||
|
||||
it('is a no-op on runtimes without the setter', () => {
|
||||
expect(applyConnectAttemptTimeout({})).toBe(false);
|
||||
});
|
||||
|
||||
it('survives a throwing setter', () => {
|
||||
const setDefaultAutoSelectFamilyAttemptTimeout = vi.fn(() => {
|
||||
throw new Error('not supported');
|
||||
});
|
||||
expect(applyConnectAttemptTimeout({ setDefaultAutoSelectFamilyAttemptTimeout })).toBe(false);
|
||||
});
|
||||
|
||||
it('leaves family autoselection itself untouched', () => {
|
||||
const setDefaultAutoSelectFamily = vi.fn();
|
||||
const setDefaultAutoSelectFamilyAttemptTimeout = vi.fn();
|
||||
applyConnectAttemptTimeout({ setDefaultAutoSelectFamily, setDefaultAutoSelectFamilyAttemptTimeout });
|
||||
expect(setDefaultAutoSelectFamilyAttemptTimeout).toHaveBeenCalledTimes(1);
|
||||
expect(setDefaultAutoSelectFamilyAttemptTimeout).toHaveBeenCalledWith(CONNECT_ATTEMPT_TIMEOUT_MS);
|
||||
expect(setDefaultAutoSelectFamily).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user