sambaiz / puppeteer-lambda-starter-kit

Starter Kit for running Headless-Chrome by Puppeteer on AWS Lambda.
MIT License
580 stars 82 forks source link

Error: WebSocket is not open: readyState 3 (CLOSED) #39

Open newsroomdev opened 5 years ago

newsroomdev commented 5 years ago

setupLocalChrome is generating an error when I invoke the Lambda function more than once. Here's my trace.

Error: WebSocket is not open: readyState 3 (CLOSED)
    at WebSocket.send (/var/task/node_modules/ws/lib/websocket.js:314:19)
    at WebSocketTransport.send (/var/task/node_modules/puppeteer/lib/WebSocketTransport.js:57:14)
    at Connection.send (/var/task/node_modules/puppeteer/lib/Connection.js:71:21)
    at Browser._getVersion (/var/task/node_modules/puppeteer/lib/Browser.js:233:29)
    at Browser.version (/var/task/node_modules/puppeteer/lib/Browser.js:208:32)
    at Browser.<anonymous> (/var/task/node_modules/puppeteer/lib/helper.js:145:23)
    at isBrowserAvailable (/var/task/starter-kit/setup.js:31:19)
    at Object.exports.getBrowser (/var/task/starter-kit/setup.js:15:51)
    at exports.handler (/var/task/index.js:14:31)

Afterward, the function logs launch done: HeadlessChrome/67.0.3361.0 and runs the function as expected...Let me know if I can provide more information to help reproduce this error.

chiqomar commented 5 years ago

To add to this:

I have been getting the same error; I am only using the starter-kit for selecting an element and screenshotting it. I get two other errors including the one above:

{"errorMessage":"Protocol error (Target.createTarget): Target closed.","errorType":"Error","stackTrace":["Promise (/var/task/node_modules/puppeteer/lib/Connection.js:73:56)","new Promise (<anonymous>)","Connection.send (/var/task/node_modules/puppeteer/lib/Connection.js:72:12)","Browser._createPageInContext (/var/task/node_modules/puppeteer/lib/Browser.js:174:47)","BrowserContext.newPage (/var/task/node_modules/puppeteer/lib/Browser.js:325:26)","Browser.newPage (/var/task/node_modules/puppeteer/lib/Browser.js:166:33)","Browser.<anonymous> (/var/task/node_modules/puppeteer/lib/helper.js:145:23)","Object.exports.screenshot (/var/task/index.js:23:32)","exports.handler (/var/task/index.js:10:34)","<anonymous>","  -- ASYNC --","Browser.<anonymous> (/var/task/node_modules/puppeteer/lib/helper.js:144:27)","Object.exports.screenshot (/var/task/index.js:23:32)","exports.handler (/var/task/index.js:10:34)","<anonymous>","process._tickDomainCallback (internal/process/next_tick.js:228:7)"]}

and

{ Error: Protocol error (Browser.getVersion): Target closed.
    at Promise (/var/task/node_modules/puppeteer/lib/Connection.js:73:56)
    at new Promise (<anonymous>)
    at Connection.send (/var/task/node_modules/puppeteer/lib/Connection.js:72:12)
    at Browser._getVersion (/var/task/node_modules/puppeteer/lib/Browser.js:233:29)
    at Browser.version (/var/task/node_modules/puppeteer/lib/Browser.js:208:32)
    at Browser.<anonymous> (/var/task/node_modules/puppeteer/lib/helper.js:145:23)
    at isBrowserAvailable (/var/task/kit/setup.js:29:19)
    at Object.exports.getBrowser (/var/task/kit/setup.js:13:51)
    at exports.handler (/var/task/index.js:8:31)
  message: 'Protocol error (Browser.getVersion): Target closed.' }

These are the extent of the errors that I am getting. I will also provide more details if necessary.

ramesh82 commented 5 years ago

I am experiencing the same on the second and third invocation. Any fix? Please advise.

PunkHaz4rd commented 5 years ago

Same here.

Sediug commented 5 years ago

In this other library they have had an interesting discussion about the matter. They think it could be because the browser have been closed (it only close the websocket) but not shutted down (the browser is not getting shut down).

https://github.com/joelgriffith/browserless/issues/54

mhawila commented 4 years ago

Okay FWIW, I was facing this because I was registering the event handlers on callback passed to ws method as shown below.

app.ws('/websocket', (ws, req) => {
    console.log('Websocket connection');
    myEventEmitter.on('customEvent', (data) => {
        ws.send(JSON.stringify(data))
    })
})

This was causing the a new instance of listener to be registered everytime. However the old listener was still around but it was referring to an instance of ws that was already disconnected. As a consequence whenever the old listener was called this error was being thrown. I had to create another custom end event to signal end of the process in which I removed the listener (See below).

app.ws('/websocket', (ws, req) => {
    console.log('Websocket connection');
    console.log('Query string => ', req.query)
    myEventEmitter.on('customEvent', (data) => {
        ws.send(JSON.stringify(data))
    })

    myEventEmitter.on('endEvent', () => {
        // Remove all listeners.
       myEventEmitter.removeAllListeners('customEvent')
       ws.close()
    })
})

I was doing this using express-ws

paulbjensen commented 4 years ago

This comment on this GitHub issue may help: https://github.com/puppeteer/puppeteer/issues/4428#issuecomment-500184469