Skip to content
7 changes: 6 additions & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,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. */
Expand Down
27 changes: 19 additions & 8 deletions src/Client.js
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,11 @@ class Client extends EventEmitter {
await this.authStrategy.beforeBrowserInitialized();

const puppeteerOpts = this.options.puppeteer;
if (
if (puppeteerOpts && puppeteerOpts.browser) {
// External browser provided by caller
browser = puppeteerOpts.browser;
page = puppeteerOpts.page || (await browser.newPage());
} else if (
puppeteerOpts &&
(puppeteerOpts.browserWSEndpoint || puppeteerOpts.browserURL)
) {
Expand Down Expand Up @@ -1260,7 +1264,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();
}
Expand All @@ -1272,13 +1280,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();
Expand Down
Loading