diff --git a/index.d.ts b/index.d.ts index 631d8bc1fe..c9ebf9e81e 100644 --- a/index.d.ts +++ b/index.d.ts @@ -698,7 +698,12 @@ declare namespace WAWebJS { evalOnNewDoc?: Function; /** Puppeteer launch options. View docs here: https://github.com/puppeteer/puppeteer/ */ puppeteer?: puppeteer.PuppeteerNodeLaunchOptions & - puppeteer.ConnectOptions; + puppeteer.ConnectOptions & { + /** Pre-existing browser instance to use instead of launching a new one */ + browser?: puppeteer.Browser; + /** Pre-existing page instance to use */ + page?: puppeteer.Page; + }; /** Determines how to save and restore sessions. Will use LegacySessionAuth if options.session is set. Otherwise, NoAuth will be used. */ authStrategy?: AuthStrategy; /** The version of WhatsApp Web to use. Use options.webVersionCache to configure how the version is retrieved. */ diff --git a/src/Client.js b/src/Client.js index ed2392db49..64ae8b1ec6 100644 --- a/src/Client.js +++ b/src/Client.js @@ -441,7 +441,11 @@ class Client extends EventEmitter { await this.authStrategy.beforeBrowserInitialized(); const puppeteerOpts = this.options.puppeteer; - if ( + if (puppeteerOpts && puppeteerOpts.browser && puppeteerOpts.page) { + // External browser + page provided by caller + browser = puppeteerOpts.browser; + page = puppeteerOpts.page; + } else if ( puppeteerOpts && (puppeteerOpts.browserWSEndpoint || puppeteerOpts.browserURL) ) { @@ -1204,7 +1208,11 @@ class Client extends EventEmitter { const browser = this.pupBrowser; const isConnected = browser?.isConnected?.(); if (isConnected) { - await browser.close(); + if (browser.process()) { + await browser.close(); + } else { + browser.disconnect(); + } } await this.authStrategy.destroy(); } @@ -1216,13 +1224,16 @@ class Client extends EventEmitter { await this.pupPage.evaluate(() => { return window.require('WAWebSocketModel').Socket.logout(); }); - await this.pupBrowser.close(); + if (this.pupBrowser.process()) { + await this.pupBrowser.close(); - let maxDelay = 0; - while (this.pupBrowser.isConnected() && maxDelay < 10) { - // waits a maximum of 1 second before calling the AuthStrategy - await new Promise((resolve) => setTimeout(resolve, 100)); - maxDelay++; + let maxDelay = 0; + while (this.pupBrowser.isConnected() && maxDelay < 10) { + await new Promise((resolve) => setTimeout(resolve, 100)); + maxDelay++; + } + } else { + this.pupBrowser.disconnect(); } await this.authStrategy.logout();