From a16f3b67fea673ea96bad4d2b97e9f3ce519f608 Mon Sep 17 00:00:00 2001 From: devlikepro Date: Tue, 30 Dec 2025 12:37:10 +0700 Subject: [PATCH] [core] Add device and browser config - WEBJS, GOWS, NOWEB fix #1109 --- src/core/engines/noweb/session.noweb.core.ts | 35 ++++++++++++++++++-- src/core/engines/webjs/session.webjs.core.ts | 10 ++++++ src/core/env.ts | 8 +++++ src/structures/sessions.dto.ts | 23 +++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/core/engines/noweb/session.noweb.core.ts b/src/core/engines/noweb/session.noweb.core.ts index 10c91a63..5484655d 100644 --- a/src/core/engines/noweb/session.noweb.core.ts +++ b/src/core/engines/noweb/session.noweb.core.ts @@ -1,4 +1,4 @@ -import type { WABrowserDescription } from '@adiwajshing/baileys'; +import { Browsers, WABrowserDescription } from '@adiwajshing/baileys'; import makeWASocket, { Chat, Contact, @@ -205,6 +205,10 @@ import { import { extractWALocation } from '@waha/core/engines/waproto/locaiton'; import { extractVCards } from '@waha/core/engines/waproto/vcards'; import { Activity } from '@waha/core/abc/activity'; +import { + WAHA_CLIENT_BROWSER_NAME, + WAHA_CLIENT_DEVICE_NAME, +} from '@waha/core/env'; // eslint-disable-next-line @typescript-eslint/no-var-requires const promiseRetry = require('promise-retry'); @@ -314,8 +318,35 @@ export class WhatsappSessionNoWebCore extends WhatsappSession { } getSocketConfig(agents: Agents | undefined, state): Partial { + // Detect browser + let browser = ['Ubuntu', 'Chrome', '22.04.4'] as WABrowserDescription; + let deviceName = + this.sessionConfig.client?.deviceName ?? WAHA_CLIENT_DEVICE_NAME; + let browserName = + this.sessionConfig.client?.browserName ?? WAHA_CLIENT_BROWSER_NAME; + if (browserName && !deviceName) { + browser = Browsers.appropriate(browserName); + } else if (browserName && deviceName) { + switch (deviceName) { + case 'Mac OS': + case 'MacOS': + case 'macos': + browser = Browsers.macOS(browserName); + break; + case 'ubuntu': + case 'Ubuntu': + browser = Browsers.ubuntu(browserName); + break; + case 'windows': + case 'Windows': + browser = Browsers.windows(browserName); + break; + default: + browser = [deviceName, browserName, '22.04.4']; + } + } + const fullSyncEnabled = this.sessionConfig?.noweb?.store?.fullSync || false; - const browser = ['Ubuntu', 'Chrome', '20.0.04'] as WABrowserDescription; let markOnlineOnConnect = this.sessionConfig?.noweb?.markOnline; if (markOnlineOnConnect == undefined) { markOnlineOnConnect = true; diff --git a/src/core/engines/webjs/session.webjs.core.ts b/src/core/engines/webjs/session.webjs.core.ts index 5bc21aac..5387531d 100644 --- a/src/core/engines/webjs/session.webjs.core.ts +++ b/src/core/engines/webjs/session.webjs.core.ts @@ -181,6 +181,10 @@ import { import { Activity } from '@waha/core/abc/activity'; import { CallData } from '@waha/structures/calls.dto'; import { Jid } from '@waha/core/engines/const'; +import { + WAHA_CLIENT_BROWSER_NAME, + WAHA_CLIENT_DEVICE_NAME, +} from '@waha/core/env'; export interface WebJSConfig { webVersion?: string; @@ -242,6 +246,10 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { // add at the start args.unshift(`--a-waha-timestamp=${new Date()}`); args.unshift(`--a-waha-session=${this.name}`); + const deviceName = + this.sessionConfig.client?.deviceName ?? WAHA_CLIENT_DEVICE_NAME; + const browserName = + this.sessionConfig.client?.browserName ?? WAHA_CLIENT_BROWSER_NAME; return { puppeteer: { protocolTimeout: 300_000, @@ -252,6 +260,8 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { }, userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36', + deviceName: deviceName, + browserName: browserName, webVersion: webVersion, webVersionCache: { type: cacheType, diff --git a/src/core/env.ts b/src/core/env.ts index 0d3ea8f3..2380ea9a 100644 --- a/src/core/env.ts +++ b/src/core/env.ts @@ -22,3 +22,11 @@ if (KNEX_SQLITE_CLIENT != 'sqlite3' && KNEX_SQLITE_CLIENT != 'better-sqlite3') { KNEX_SQLITE_CLIENT = 'sqlite3'; } export { KNEX_SQLITE_CLIENT }; + +// +// Client config +// +export const WAHA_CLIENT_DEVICE_NAME = + process.env.WAHA_CLIENT_DEVICE_NAME || null; +export const WAHA_CLIENT_BROWSER_NAME = + process.env.WAHA_CLIENT_BROWSER_NAME || null; diff --git a/src/structures/sessions.dto.ts b/src/structures/sessions.dto.ts index 8f663140..27abdb31 100644 --- a/src/structures/sessions.dto.ts +++ b/src/structures/sessions.dto.ts @@ -155,6 +155,16 @@ export class IgnoreConfig { broadcast?: boolean; } +export class ClientSessionConfig { + @IsString() + @IsOptional() + deviceName?: string; + + @IsString() + @IsOptional() + browserName?: string; +} + export class SessionConfig { @ValidateNested({ each: true }) @Type(() => WebhookConfig) @@ -204,6 +214,19 @@ export class SessionConfig { @IsOptional() ignore?: IgnoreConfig; + @ApiProperty({ + description: + "How connected session renders in device - in format 'Browser (Device)' - Firefox (MacOS)", + example: { + browserName: 'Firefox', + deviceName: 'MacOS', + }, + }) + @ValidateNested() + @Type(() => ClientSessionConfig) + @IsOptional() + client?: ClientSessionConfig; + @ApiProperty({ example: { store: {