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

  1. Retry the recording, keeping the session open until upload completes
  2. Reduce recording size/length so it stays under MAX_RECORDING_BYTES
  3. Verify no proxy/antivirus is interrupting localhost connections
  4. 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

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


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/bb989be6509e4323. Report an issue: GitHub.