windmill-labs/windmill · warning
Recording upload failed: ${error.message}
Error message
Recording upload failed: ${error.message} What it means
The app dev recorder's upload endpoint listens for request errors; an aborted/cut-short upload (browser cancel, client disconnect, or server-side refusal after MAX_RECORDING_BYTES) triggers this warning instead of crashing the dev server.
Source
Thrown at cli/src/commands/app/dev.ts:793
if (error?.code !== "EEXIST") throw error;
}
}
throw new Error("Could not find a free recording file name");
}
function saveRecording(req: http.IncomingMessage, res: http.ServerResponse) {
if (!isOwnOrigin(req.headers.origin, req.headers.host)) {
sendJson(res, 403, { error: "Cross-origin recording upload refused" });
return;
}
const chunks: Buffer[] = [];
let size = 0;
let refused = false;
// An upload cut short (by the refusal below, or by the browser) raises
// 'error' on the request, which unhandled takes the dev server down.
req.on("error", (error: Error) => {
if (!refused) {
log.warn(colors.yellow(`Recording upload failed: ${error.message}`));
}
});
req.on("data", (chunk: Buffer) => {
if (refused) return;
size += chunk.length;
if (size > MAX_RECORDING_BYTES) {
refused = true;
// Torn down only once the 413 is on the wire: destroying the socket
// first loses the response the browser is waiting to read.
res.on("finish", () => req.destroy());
sendJson(res, 413, {
error: `Recording exceeds ${MAX_RECORDING_BYTES} bytes`,
});
return;
}
chunks.push(chunk);
});
req.on("end", async () => {View on GitHub (pinned to e474e8803c)
Solutions
- Retry the recording, keeping the session open until upload completes
- Reduce recording size/length so it stays under MAX_RECORDING_BYTES
- Verify no proxy/antivirus is interrupting localhost connections
- This is a logged warning, not a crash — check the dev server log for context
Example fix
null
Defensive patterns
Strategy: try-catch
Validate before calling
req.on('error', (error: Error) => {
if (!refused) log.warn(colors.yellow(`Recording upload failed: ${error.message}`));
}); Type guard
function isNodeReqError(e: unknown): e is NodeJS.ErrnoException {
return e instanceof Error && ('code' in e || 'errno' in e);
} Try / catch
req.on('error', (error: Error) => {
if (!refused) log.warn(colors.yellow(`Recording upload failed: ${error.message}`));
}); Prevention
- Keep the browser tab open until the recording upload finishes
- Keep recordings under MAX_RECORDING_BYTES
- Attach an 'error' handler on upload requests so the dev server never crashes
- Check proxies/firewalls that reset localhost connections
When it happens
Trigger: An HTTP request error on the recording upload: client closed the connection mid-upload, network drop, or the server refused the upload after the size limit was exceeded.
Common situations: Closing the browser tab while a recording uploads; recording larger than MAX_RECORDING_BYTES; flaky local network/proxy killing the connection.
Related errors
- body.error || res.statusText
- Failed to queue flow dependencies job: ${queueResponse.statu
- Couldn't fetch resource types from hub ${hubBaseUrl}: ${(awa
- Couldn't fetch resource types from public hub:
- GET assets/graph -> ${res.status}: ${await res.text()}
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/bb989be6509e4323.
Report an issue: GitHub.