Skip to content

Commit ff2e280

Browse files
committed
feat: support external browser + page in puppeteer options
allow passing a pre-existing `browser` and `page` via `options.puppeteer` so the Client can work with a browser you already control. when both are provided, the Client skips puppeteer.launch() and uses them directly. also uses browser.process() in destroy/logout to decide cleanup: close() for launched browsers, disconnect() for connected ones.
1 parent b0e8693 commit ff2e280

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

index.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,12 @@ declare namespace WAWebJS {
695695
evalOnNewDoc?: Function;
696696
/** Puppeteer launch options. View docs here: https://github.com/puppeteer/puppeteer/ */
697697
puppeteer?: puppeteer.PuppeteerNodeLaunchOptions &
698-
puppeteer.ConnectOptions;
698+
puppeteer.ConnectOptions & {
699+
/** Pre-existing browser instance to use instead of launching a new one */
700+
browser?: puppeteer.Browser;
701+
/** Pre-existing page instance to use */
702+
page?: puppeteer.Page;
703+
};
699704
/** Determines how to save and restore sessions. Will use LegacySessionAuth if options.session is set. Otherwise, NoAuth will be used. */
700705
authStrategy?: AuthStrategy;
701706
/** The version of WhatsApp Web to use. Use options.webVersionCache to configure how the version is retrieved. */

src/Client.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,11 @@ class Client extends EventEmitter {
442442
await this.authStrategy.beforeBrowserInitialized();
443443

444444
const puppeteerOpts = this.options.puppeteer;
445-
if (
445+
if (puppeteerOpts && puppeteerOpts.browser && puppeteerOpts.page) {
446+
// External browser + page provided by caller
447+
browser = puppeteerOpts.browser;
448+
page = puppeteerOpts.page;
449+
} else if (
446450
puppeteerOpts &&
447451
(puppeteerOpts.browserWSEndpoint || puppeteerOpts.browserURL)
448452
) {
@@ -1181,7 +1185,11 @@ class Client extends EventEmitter {
11811185
const browser = this.pupBrowser;
11821186
const isConnected = browser?.isConnected?.();
11831187
if (isConnected) {
1184-
await browser.close();
1188+
if (browser.process()) {
1189+
await browser.close();
1190+
} else {
1191+
browser.disconnect();
1192+
}
11851193
}
11861194
await this.authStrategy.destroy();
11871195
}
@@ -1193,13 +1201,16 @@ class Client extends EventEmitter {
11931201
await this.pupPage.evaluate(() => {
11941202
return window.require('WAWebSocketModel').Socket.logout();
11951203
});
1196-
await this.pupBrowser.close();
1204+
if (this.pupBrowser.process()) {
1205+
await this.pupBrowser.close();
11971206

1198-
let maxDelay = 0;
1199-
while (this.pupBrowser.isConnected() && maxDelay < 10) {
1200-
// waits a maximum of 1 second before calling the AuthStrategy
1201-
await new Promise((resolve) => setTimeout(resolve, 100));
1202-
maxDelay++;
1207+
let maxDelay = 0;
1208+
while (this.pupBrowser.isConnected() && maxDelay < 10) {
1209+
await new Promise((resolve) => setTimeout(resolve, 100));
1210+
maxDelay++;
1211+
}
1212+
} else {
1213+
this.pupBrowser.disconnect();
12031214
}
12041215

12051216
await this.authStrategy.logout();

0 commit comments

Comments
 (0)