cli icon indicating copy to clipboard operation
cli copied to clipboard

Netlify Dev intermittently crashes due to proxy. TypeError: res.writeHead is not a function

Open bdefore opened this issue 9 months ago • 2 comments

Describe the bug

I have for a year now intermittently gottten crashes from Netlify Dev. My initial comment on this is here: https://answers.netlify.com/t/netlify-dev-randomly-getting-typeerror-res-writehead-is-not-a-function-at-proxyserver/73639/12

As I mention there, I believe Netlify Dev's proxy implementation calls writeHead on the response when that function may not exist, such as if the response is via web socket. As a result, the dev server crashes, sometimes leaving other processes running. In my case, those processes are related to the create-react-app webpack server, for which I have to manually kill in order to properly restart Netlify Dev.

I notice that there was a couple days ago a substantial TypeScript migration, including to the proxy source file. In that update there is a note with a FIXME that looks related: https://github.com/netlify/cli/blob/main/src/utils/proxy.mts#L457 . I'll copy the related source here:

  proxy.on('error', (_, req, res) => {
    // @ts-expect-error TS(2339) FIXME: Property 'writeHead' does not exist on type 'Socke... Remove this comment to see the full error message
    res.writeHead(500, {
      'Content-Type': 'text/plain',
    })

    const message = isEdgeFunctionsRequest(req)
      ? 'There was an error with an Edge Function. Please check the terminal for more details.'
      : 'Could not proxy request.'

    res.end(message)
  })

A potential solution would be to skip adding the content-type header if writeHead does not exist on res.

Some related issues: https://github.com/netlify/cli/issues/5676 https://github.com/netlify/cli/issues/5917 https://github.com/netlify/cli/issues/6025

Here is the output I encounter from the dev server as it crashes:

 ›   Error: Netlify CLI has terminated unexpectedly
This is a problem with the Netlify CLI, not with your application.
If you recently updated the CLI, consider reverting to an older version by running:

npm install -g netlify-cli@VERSION

You can use any version from https://ntl.fyi/cli-versions.

Please report this problem at https://ntl.fyi/cli-error including the error details below.

TypeError: res.writeHead is not a function
    at ProxyServer.<anonymous> (file:///home/d4/.nvm/versions/node/v20.9.0/lib/node_modules/netlify-cli/src/utils/proxy.mjs:380:13)
    at ProxyServer.emit (/home/d4/.nvm/versions/node/v20.9.0/lib/node_modules/netlify-cli/node_modules/eventemitter3/index.js:204:33)
    at Socket.onOutgoingError (/home/d4/.nvm/versions/node/v20.9.0/lib/node_modules/netlify-cli/node_modules/http-proxy/lib/http-proxy/passes/ws-incoming.js:157:16)
    at Socket.emit (node:events:526:35)
    at Socket.emit (node:domain:488:12)
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at processTicksAndRejections (node:internal/process/task_queues:82:21)

  System:
    OS: Linux 6.5 Manjaro Linux
    CPU: (16) x64 AMD Ryzen 7 5800X3D 8-Core Processor
  Binaries:
    Node: 20.9.0 - ~/.nvm/versions/node/v20.9.0/bin/node
    Yarn: 1.22.21 - ~/.nvm/versions/node/v20.9.0/bin/yarn
    npm: 10.1.0 - ~/.nvm/versions/node/v20.9.0/bin/npm
  Browsers:
    Firefox: 119.0.1
  npmGlobalPackages:
    netlify-cli: 17.4.0

 ELIFECYCLE  Command failed with exit code 1.

Steps to reproduce

Unfortunately, I cannot share my source and cannot consistently reproduce the crash. I have not been able to reproduce in a minimal project from scratch. It appears to occur more frequently when I am calling particular Netlify Functions, but that may be unrelated.

Configuration

Partial netlify.toml:

[functions]
  node_bundler = "esbuild"

[dev]
  command = "pnpm start:dev" # Command to start your dev server
  targetPort = 8080 # The port for your application server, framework or site generator
  publish = "build/" # The path to your static content folder
  autoLaunch = false # a Boolean value that determines if Netlify Dev launches the local server address in your browser
  framework = "#custom" # https://cli.netlify.com/netlify-dev/#project-detection

  # to enable https local, see README for instructions
  [dev.https]
    certFile = ".cert/server.crt"
    keyFile = ".cert/server.key"

The pnpm start:dev command is calling react-scripts start

Environment

System: OS: Linux 6.5 Manjaro Linux CPU: (16) x64 AMD Ryzen 7 5800X3D 8-Core Processor Memory: 28.31 GB / 31.25 GB Container: Yes Shell: 5.2.15 - /bin/bash Binaries: Node: 20.9.0 - ~/.nvm/versions/node/v20.9.0/bin/node Yarn: 1.22.21 - ~/.nvm/versions/node/v20.9.0/bin/yarn npm: 10.1.0 - ~/.nvm/versions/node/v20.9.0/bin/npm pnpm: 8.10.5 - ~/.nvm/versions/node/v20.9.0/bin/pnpm npmGlobalPackages: netlify-cli: 17.4.0

bdefore avatar Nov 17 '23 18:11 bdefore

@ericapisani i believe the FIXME was not present until your recent TS migration https://github.com/netlify/cli/pull/6136 ... did you explore this or maybe have any insight?

bdefore avatar Nov 17 '23 18:11 bdefore

My main development is on a desktop with 32GB of RAM. I noticed that this issue occurred almost constantly on a laptop with half of that. I've today upgraded the desktop to 64GB of RAM and the error has yet to occur in the moments I would typically encounter it. Running top on the desktop shows that running my Netlify Dev uses up to 8GB, and alongside a TestCafe test runner can peak around 13GB.

This does not excuse the proxy error, but it does indicate that underprovisioned hardware may be more prone to experience the issue. To those who might be experiencing this, try either reducing memory usage or upgrading.

bdefore avatar Dec 28 '23 03:12 bdefore