[core] NOWEB - fix the case when STARTING session fails the container
fix #821 fix #860 fix #869
This commit is contained in:
1 parent
c2372ce96e
commit
6a3823cdff
2 files changed
+47
-1
No files matched your search
@@ -154,6 +154,7 @@ import { sleep, waitUntil } from '@waha/utils/promiseTimeout';
|
||||
import { exclude } from '@waha/utils/reactive/ops/exclude';
|
||||
import { SingleDelayedJobRunner } from '@waha/utils/SingleDelayedJobRunner';
|
||||
import { SinglePeriodicJobRunner } from '@waha/utils/SinglePeriodicJobRunner';
|
||||
import { StatusTracker } from '@waha/utils/StatusTracker';
|
||||
import * as Buffer from 'buffer';
|
||||
import { Agent } from 'https';
|
||||
import * as lodash from 'lodash';
|
||||
@@ -216,6 +217,8 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
|
||||
store: INowebStore;
|
||||
private qr: QR;
|
||||
|
||||
private statusTracker = new StatusTracker();
|
||||
|
||||
public constructor(config) {
|
||||
super(config);
|
||||
this.shouldRestart = true;
|
||||
@@ -254,6 +257,15 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
|
||||
this.authNOWEBStore = null;
|
||||
}
|
||||
|
||||
protected set status(value: WAHASessionStatus) {
|
||||
this.statusTracker.track(value);
|
||||
super.status = value;
|
||||
}
|
||||
|
||||
public get status() {
|
||||
return super.status;
|
||||
}
|
||||
|
||||
async start() {
|
||||
this.status = WAHASessionStatus.STARTING;
|
||||
await this.buildClient().catch((err) => {
|
||||
@@ -419,6 +431,7 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
this.startDelayedJob.schedule(async () => {
|
||||
if (!this.shouldRestart) {
|
||||
this.logger.warn(
|
||||
@@ -443,12 +456,20 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
|
||||
this.resubscribeToKnownPresences();
|
||||
return;
|
||||
} else if (connection === 'close') {
|
||||
if (this.statusTracker.isStuckInStarting()) {
|
||||
this.logger.error(
|
||||
'Session stuck in STARTING status, force stopping the session.',
|
||||
);
|
||||
await this.failed();
|
||||
return;
|
||||
}
|
||||
|
||||
// reconnect if not logged out
|
||||
const shouldReconnect =
|
||||
// @ts-ignore: Property output does not exist on type 'Error'
|
||||
lastDisconnect.error?.output?.statusCode !==
|
||||
DisconnectReason.loggedOut;
|
||||
this.qr.save('');
|
||||
// reconnect if not logged out
|
||||
if (shouldReconnect) {
|
||||
if (lastDisconnect.error) {
|
||||
this.logger.info(
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import { WAHASessionStatus } from '../structures/enums.dto';
|
||||
|
||||
const STUCK_IN_STARTING_THRESHOLD = 20;
|
||||
|
||||
/**
|
||||
* Keeps track of session statuses (with timestamps) for the last `trackPeriodMs` milliseconds.
|
||||
*/
|
||||
export class StatusTracker {
|
||||
private numberOfStarting: number = 0;
|
||||
|
||||
public track(status: WAHASessionStatus): void {
|
||||
if (status == WAHASessionStatus.STARTING) {
|
||||
this.numberOfStarting += 1;
|
||||
} else {
|
||||
this.numberOfStarting = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the session has been continuously 'STARTING'
|
||||
*/
|
||||
public isStuckInStarting(): boolean {
|
||||
return this.numberOfStarting >= STUCK_IN_STARTING_THRESHOLD;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user