diff --git a/src/api/layers/host.layer.ts b/src/api/layers/host.layer.ts index 530446a09..0f42707f4 100644 --- a/src/api/layers/host.layer.ts +++ b/src/api/layers/host.layer.ts @@ -54,6 +54,8 @@ export class HostLayer { protected autoCloseInterval = null; protected autoCloseCalled = false; protected statusFind?: StatusFindCallback = null; + protected isInitialized = false; + protected isInjected = false; public onLoadingScreen?: LoadingScreenCallback = null; @@ -141,6 +143,8 @@ export class HostLayer { this.log('verbose', 'Page loaded', { type: 'page' }); this.afterPageLoad(); }); + + this.isInitialized = true; } protected async afterPageLoad() { @@ -162,12 +166,16 @@ export class HostLayer { options ); + this.isInjected = false; + await injectApi(this.page, this.onLoadingScreen) .then(() => { + this.isInjected = true; this.log('verbose', 'wapi.js injected'); this.afterPageScriptInjected(); }) .catch((e) => { + console.log(e); this.log('verbose', 'wapi.js failed'); }); } @@ -289,10 +297,11 @@ export class HostLayer { } public async waitForPageLoad() { - await this.page - .waitForFunction(`!document.querySelector('#initial_startup')`) - .catch(() => {}); - await getInterfaceStatus(this.page).catch(() => null); + while (!this.isInjected) { + await sleep(200); + } + + await this.page.waitForFunction(() => WPP.isReady).catch(() => {}); } public async waitForLogin( diff --git a/src/api/whatsapp.ts b/src/api/whatsapp.ts index 057d1de61..b86283e71 100644 --- a/src/api/whatsapp.ts +++ b/src/api/whatsapp.ts @@ -30,6 +30,7 @@ export class Whatsapp extends BusinessLayer { super(page, session, options); let connected = false; + let interval: any = null; const removeToken = async () => { this.log('info', 'Session Unpaired', { type: 'session' }); @@ -47,6 +48,7 @@ export class Whatsapp extends BusinessLayer { if (!connected) { await removeToken(); } + clearInterval(interval); }); page @@ -57,16 +59,17 @@ export class Whatsapp extends BusinessLayer { .catch(() => null); } - this.onStateChange(async (state) => { - connected = await page + interval = setInterval(async (state) => { + const newConnected = await page .evaluate(() => WPP.conn.isAuthenticated()) .catch(() => null); - if (connected === null) { + if (newConnected === null || newConnected === connected) { return; } - if (connected) { + if (newConnected) { + connected = newConnected; setTimeout(async () => { this.log('verbose', 'Updating session token', { type: 'token' }); const tokenData = await this.getSessionTokenBrowser(); @@ -85,18 +88,26 @@ export class Whatsapp extends BusinessLayer { } }, 1000); } else { + if (!newConnected && connected) { + setTimeout(async () => { + await page.evaluate(() => localStorage.clear()); + await page.reload(); + }, 1000); + } + connected = newConnected; + setTimeout(async () => { await removeToken(); // Fire only after a success connection and disconnection - if (connected && this.statusFind) { + if (newConnected && this.statusFind) { try { this.statusFind('desconnectedMobile', session); } catch (error) {} } }, 1000); } - }); + }, 1000); } /** diff --git a/src/controllers/auth.ts b/src/controllers/auth.ts index d3aea0048..2e5fe5294 100644 --- a/src/controllers/auth.ts +++ b/src/controllers/auth.ts @@ -160,10 +160,14 @@ export async function injectSessionToken( }; page.on('request', reqHandler); - await page.goto(puppeteerConfig.whatsappUrl); + await page.goto(puppeteerConfig.whatsappUrl + '?_=' + Date.now()); if (clear) { await page.evaluate((session) => { + if (document.title !== 'Initializing WhatsApp') { + return; + } + localStorage.clear(); window.indexedDB diff --git a/src/controllers/browser.ts b/src/controllers/browser.ts index 1816582e8..e4c15ce1f 100644 --- a/src/controllers/browser.ts +++ b/src/controllers/browser.ts @@ -57,8 +57,6 @@ export async function unregisterServiceWorker(page: Page) { * @param version Versão ou expressão semver */ export async function setWhatsappVersion(page: Page, version: string) { - await unregisterServiceWorker(page); - const body = waVersion.getPageContent(version); await page.setRequestInterception(true); @@ -89,6 +87,7 @@ export async function initWhatsapp( ) { await page.setUserAgent(useragentOverride); + await unregisterServiceWorker(page); // Auth with token await injectSessionToken(page, token, clear); @@ -117,16 +116,18 @@ export async function onLoadingScreen( return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }`); - await page.exposeFunction( - 'loadingScreen', - async (percent: number, message: string) => { - if (lastPercent !== percent || lastPercentMessage !== message) { - onLoadingScreenCallBack && onLoadingScreenCallBack(percent, message); - lastPercent = percent; - lastPercentMessage = message; + await page + .exposeFunction( + 'loadingScreen', + async (percent: number, message: string) => { + if (lastPercent !== percent || lastPercentMessage !== message) { + onLoadingScreenCallBack && onLoadingScreenCallBack(percent, message); + lastPercent = percent; + lastPercentMessage = message; + } } - } - ); + ) + .catch(() => null); await page.evaluate( function (selectors) { diff --git a/src/controllers/initializer.ts b/src/controllers/initializer.ts index 7c46ef2e4..ac4d1be80 100644 --- a/src/controllers/initializer.ts +++ b/src/controllers/initializer.ts @@ -32,6 +32,7 @@ import { defaultLogger } from '../utils/logger'; import * as path from 'path'; import * as fs from 'fs'; import sanitize from 'sanitize-filename'; +import { sleep } from '../utils/sleep'; process.on( 'unhandledRejection', @@ -241,10 +242,10 @@ export async function create( let waitLoginPromise = null; client.onStateChange(async (state) => { - if ( - state === SocketState.UNPAIRED || - state === SocketState.UNPAIRED_IDLE - ) { + const connected = await page.evaluate(() => WPP.conn.isAuthenticated()); + if (!connected) { + await sleep(2000); + if (!waitLoginPromise) { waitLoginPromise = client .waitForLogin(catchQR, statusFind)