puppeteer-lambda-starter-kit
puppeteer-lambda-starter-kit copied to clipboard
Error: WebSocket is not open: readyState 3 (CLOSED)
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.
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.
I am experiencing the same on the second and third invocation. Any fix? Please advise.
Same here.
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
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
This comment on this GitHub issue may help: https://github.com/puppeteer/puppeteer/issues/4428#issuecomment-500184469