Skip to content

Commit

Permalink
feat: Improved QRCode re-scan (fix #1189)
Browse files Browse the repository at this point in the history
  • Loading branch information
edgardmessias committed Oct 18, 2022
1 parent bdfd9d9 commit 8ec5264
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 26 deletions.
17 changes: 13 additions & 4 deletions src/api/layers/host.layer.ts
Expand Up @@ -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;

Expand Down Expand Up @@ -141,6 +143,8 @@ export class HostLayer {
this.log('verbose', 'Page loaded', { type: 'page' });
this.afterPageLoad();
});

this.isInitialized = true;
}

protected async afterPageLoad() {
Expand All @@ -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');
});
}
Expand Down Expand Up @@ -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(
Expand Down
23 changes: 17 additions & 6 deletions src/api/whatsapp.ts
Expand Up @@ -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' });
Expand All @@ -47,6 +48,7 @@ export class Whatsapp extends BusinessLayer {
if (!connected) {
await removeToken();
}
clearInterval(interval);
});

page
Expand All @@ -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();
Expand All @@ -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);
}

/**
Expand Down
6 changes: 5 additions & 1 deletion src/controllers/auth.ts
Expand Up @@ -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
Expand Down
23 changes: 12 additions & 11 deletions src/controllers/browser.ts
Expand Up @@ -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);
Expand Down Expand Up @@ -89,6 +87,7 @@ export async function initWhatsapp(
) {
await page.setUserAgent(useragentOverride);

await unregisterServiceWorker(page);
// Auth with token
await injectSessionToken(page, token, clear);

Expand Down Expand Up @@ -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) {
Expand Down
9 changes: 5 additions & 4 deletions src/controllers/initializer.ts
Expand Up @@ -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',
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 8ec5264

Please sign in to comment.