puppeteer-lambda-starter-kit icon indicating copy to clipboard operation
puppeteer-lambda-starter-kit copied to clipboard

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

Open newsroomdev opened this issue 6 years ago • 6 comments

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.

newsroomdev avatar Oct 10 '18 20:10 newsroomdev

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.

chiqomar avatar Oct 13 '18 04:10 chiqomar

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

ramesh82 avatar Oct 18 '18 01:10 ramesh82

Same here.

PunkHaz4rd avatar Dec 10 '18 09:12 PunkHaz4rd

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

Sediug avatar Jan 31 '19 08:01 Sediug

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

mhawila avatar Sep 27 '19 19:09 mhawila

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

paulbjensen avatar Mar 23 '20 15:03 paulbjensen