one switch for sidecar timeouts
SIDECAR_TIMEOUTS=1 puts the old behaviour back — Bun's built-in fetch ceiling outbound, and the inbound drop at whatever each plugin declared. unset, which is the default, means no ceiling on either leg. one constant in one file rather than a knob per plugin: turning it on or off should not mean remembering which of eight routers to edit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
@@ -85,3 +85,8 @@ PUBLIC_URL=http://localhost:9000
|
|||||||
|
|
||||||
# Immich (officer-photos) is configured from the app, not from here — Photos → Connection. Instances and
|
# Immich (officer-photos) is configured from the app, not from here — Photos → Connection. Instances and
|
||||||
# their API keys live encrypted in `photos_config`, so the platform never sees a key.
|
# their API keys live encrypted in `photos_config`, so the platform never sees a key.
|
||||||
|
|
||||||
|
# Put request timeouts back on sidecar proxies. Unset is the default and means NO timeout on either leg:
|
||||||
|
# long requests arrive from everywhere (transcribing a 42-minute recording, a from-scratch music reindex)
|
||||||
|
# and every ceiling is a number somebody guessed. Set to 1 only to restore the old behaviour.
|
||||||
|
# SIDECAR_TIMEOUTS=1
|
||||||
|
|||||||
@@ -94,6 +94,19 @@ export type SidecarProxy = {
|
|||||||
getWsUrl: () => string | null;
|
getWsUrl: () => string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The one switch for sidecar request timeouts.
|
||||||
|
*
|
||||||
|
* Off by default: no ceiling on either leg, because long requests arrive from everywhere and every
|
||||||
|
* ceiling is a number somebody guessed. Set `SIDECAR_TIMEOUTS=1` in `.env` and restart to put the old
|
||||||
|
* behaviour back — Bun's built-in fetch ceiling outbound, and the inbound drop at whatever each plugin
|
||||||
|
* declared (or the server's 60s default if it declared nothing).
|
||||||
|
*
|
||||||
|
* Here rather than per plugin so turning it on or off is one line in one file, and so nobody has to
|
||||||
|
* remember which of eight routers to edit.
|
||||||
|
*/
|
||||||
|
const TIMEOUTS_ON = process.env.SIDECAR_TIMEOUTS === '1';
|
||||||
|
|
||||||
export function createSidecarProxy({
|
export function createSidecarProxy({
|
||||||
name,
|
name,
|
||||||
prefix,
|
prefix,
|
||||||
@@ -142,10 +155,15 @@ export function createSidecarProxy({
|
|||||||
the 60s default drop.
|
the 60s default drop.
|
||||||
*/
|
*/
|
||||||
const server = ctx.env as { timeout?: (req: Request, seconds: number) => void } | undefined;
|
const server = ctx.env as { timeout?: (req: Request, seconds: number) => void } | undefined;
|
||||||
try {
|
// `0` disables the idle timeout. With the switch on, an undeclared plugin falls back to the server's
|
||||||
server?.timeout?.(ctx.req.raw, timeoutSeconds ?? 0);
|
// own 60s default by not being touched at all.
|
||||||
} catch {
|
const inbound = TIMEOUTS_ON ? timeoutSeconds : (timeoutSeconds ?? 0);
|
||||||
/* no per-request timeout available */
|
if (inbound !== undefined) {
|
||||||
|
try {
|
||||||
|
server?.timeout?.(ctx.req.raw, inbound);
|
||||||
|
} catch {
|
||||||
|
/* no per-request timeout available */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const method = ctx.req.method;
|
const method = ctx.req.method;
|
||||||
@@ -228,7 +246,7 @@ export function createSidecarProxy({
|
|||||||
headers,
|
headers,
|
||||||
body,
|
body,
|
||||||
duplex: 'half',
|
duplex: 'half',
|
||||||
timeout: false,
|
...(TIMEOUTS_ON ? {} : { timeout: false }),
|
||||||
};
|
};
|
||||||
|
|
||||||
let upstream: Response;
|
let upstream: Response;
|
||||||
|
|||||||
Reference in New Issue
Block a user