Skip to content

Commit 6ea8154

Browse files
chore: commit pending unoapi changes including jidmap ttl and mention remap
1 parent 30aff47 commit 6ea8154

7 files changed

Lines changed: 122 additions & 61 deletions

File tree

.github/workflows/main.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ jobs:
2121
test:
2222
runs-on: ubuntu-latest
2323
steps:
24-
- uses: actions/checkout@v4
25-
- uses: actions/setup-node@v4
24+
- uses: actions/checkout@v5
25+
- uses: actions/setup-node@v5
2626
with:
2727
node-version: 24
2828
cache: yarn
@@ -36,7 +36,7 @@ jobs:
3636
runs-on: ubuntu-latest
3737
steps:
3838
- name: Checkout
39-
uses: actions/checkout@v4
39+
uses: actions/checkout@v5
4040

4141
- name: Docker meta
4242
id: meta

.github/workflows/sync-upstream.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ jobs:
2222
contents: write
2323
pull-requests: write
2424
steps:
25-
- name: Checkout base branch
26-
uses: actions/checkout@v4
25+
- name: Checkout base branch
26+
uses: actions/checkout@v5
2727
with:
2828
ref: ${{ inputs.base_branch }}
2929

30-
- name: Setup Node.js
31-
uses: actions/setup-node@v4
30+
- name: Setup Node.js
31+
uses: actions/setup-node@v5
3232
with:
3333
node-version: '24'
3434
cache: yarn

.github/workflows/wiki-sync.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ jobs:
1313
WIKI_TOKEN: ${{ secrets.WIKI_TOKEN }}
1414
REPO: ${{ github.repository }}
1515
steps:
16-
- name: Checkout repo
17-
uses: actions/checkout@v4
16+
- name: Checkout repo
17+
uses: actions/checkout@v5
1818

1919
- name: Skip if no WIKI_TOKEN
2020
if: env.WIKI_TOKEN == ''

jest.config.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
/** @type {import('ts-jest').JestConfigWithTsJest} */
2-
module.exports = {
3-
preset: 'ts-jest',
4-
testEnvironment: 'node',
2+
module.exports = {
3+
preset: 'ts-jest',
4+
testEnvironment: 'node',
5+
globals: {
6+
'ts-jest': {
7+
diagnostics: false,
8+
},
9+
},
510
moduleNameMapper: {
611
'^baileys$': '<rootDir>/test-setup/baileys.mock.ts',
712
'^baileys/lib/Utils/logger$': '<rootDir>/test-setup/baileys-logger.mock.ts',

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "unoapi-cloud",
3-
"version": "3.0.46",
3+
"version": "3.0.47",
44
"description": "Unoapi Cloud Fork Viper Tec baileys 7",
55
"exports": "./dist/index.js",
66
"types": "./dist/index.d.ts",
@@ -85,7 +85,7 @@
8585
"@google-cloud/text-to-speech": "^5.2.0",
8686
"@redis/client": "^1.5.14",
8787
"@sentry/node": "^9.29.0",
88-
"@whiskeysockets/baileys": "github:ViperTecCorporation/Baileys#88bd4044b817fe5ca238aca60b27705068658291",
88+
"@whiskeysockets/baileys": "github:ViperTecCorporation/Baileys#2bc1e2daf6a4f5531b9d557d8c9abec9975dc13b",
8989
"amqplib": "^0.10.8",
9090
"audio-decode": "^2.2.3",
9191
"audio2textjs": "^1.0.5",
@@ -120,6 +120,6 @@
120120
"resolutions": {
121121
"libsignal": "https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/e81ecfc32eb74951d789ab37f7e341ab66d5fff1",
122122
"@whiskeysockets/libsignal-node": "https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/e81ecfc32eb74951d789ab37f7e341ab66d5fff1",
123-
"@whiskeysockets/baileys": "github:ViperTecCorporation/Baileys#88bd4044b817fe5ca238aca60b27705068658291"
123+
"@whiskeysockets/baileys": "github:ViperTecCorporation/Baileys#2bc1e2daf6a4f5531b9d557d8c9abec9975dc13b"
124124
}
125125
}

src/defaults.ts

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,19 @@ export const WEBHOOK_FORWARD_BUSINESS_ACCOUNT_ID = process.env.WEBHOOK_FORWARD_B
5454
export const WEBHOOK_FORWARD_TOKEN = process.env.WEBHOOK_FORWARD_TOKEN || ''
5555
export const WEBHOOK_FORWARD_VERSION = process.env.WEBHOOK_FORWARD_VERSION || 'v17.0'
5656
export const WEBHOOK_FORWARD_URL = process.env.WEBHOOK_FORWARD_URL || 'https://graph.facebook.com'
57-
export const WEBHOOK_FORWARD_TIMEOUT_MS = parseInt(process.env.WEBHOOK_TIMEOUT_MS || '6000')
57+
export const WEBHOOK_FORWARD_TIMEOUT_MS = parseInt(process.env.WEBHOOK_TIMEOUT_MS || '6000')
5858

5959
// comunication
6060
export const UNOAPI_URL = process.env.UNOAPI_URL || 'http://localhost:9876'
6161
export const WEBHOOK_URL_ABSOLUTE = process.env.WEBHOOK_URL_ABSOLUTE || ''
6262
export const WEBHOOK_URL = process.env.WEBHOOK_URL || 'http://localhost:9876/webhooks/fake'
6363
export const WEBHOOK_HEADER = process.env.WEBHOOK_HEADER || 'Authorization'
6464
export const WEBHOOK_TOKEN = process.env.WEBHOOK_TOKEN || UNOAPI_AUTH_TOKEN || '123abc'
65-
export const WEBHOOK_TIMEOUT_MS = parseInt(process.env.WEBHOOK_TIMEOUT_MS || '6000')
66-
export const FETCH_TIMEOUT_MS = parseInt(process.env.FETCH_TIMEOUT_MS || '6000')
65+
export const WEBHOOK_TIMEOUT_MS = parseInt(process.env.WEBHOOK_TIMEOUT_MS || '6000')
66+
export const FETCH_TIMEOUT_MS = parseInt(process.env.FETCH_TIMEOUT_MS || '6000')
6767
export const CONNECTION_TYPE = process.env.CONNECTION_TYPE || 'qrcode'
6868

69-
export const CONSUMER_TIMEOUT_MS = parseInt(process.env.CONSUMER_TIMEOUT_MS || '15000')
69+
export const CONSUMER_TIMEOUT_MS = parseInt(process.env.CONSUMER_TIMEOUT_MS || '15000')
7070
export const WEBHOOK_SEND_NEW_MESSAGES = process.env.WEBHOOK_SEND_NEW_MESSAGES == _undefined ? false : process.env.WEBHOOK_SEND_NEW_MESSAGES == 'true'
7171
export const WEBHOOK_SEND_INCOMING_MESSAGES = process.env.WEBHOOK_SEND_INCOMING_MESSAGES == _undefined ? true : process.env.WEBHOOK_SEND_INCOMING_MESSAGES == 'true'
7272
export const WEBHOOK_SEND_GROUP_MESSAGES = process.env.WEBHOOK_SEND_GROUP_MESSAGES == _undefined ? true : process.env.WEBHOOK_SEND_GROUP_MESSAGES == 'true'
@@ -89,13 +89,13 @@ export const WEBHOOK_SESSION = process.env.WEBHOOK_SESSION || ''
8989
// Webhook circuit breaker (fail fast when endpoints are offline)
9090
export const WEBHOOK_CB_ENABLED =
9191
process.env.WEBHOOK_CB_ENABLED == _undefined ? true : process.env.WEBHOOK_CB_ENABLED == 'true'
92-
export const WEBHOOK_CB_FAILURE_THRESHOLD = parseInt(process.env.WEBHOOK_CB_FAILURE_THRESHOLD || '1')
93-
export const WEBHOOK_CB_OPEN_MS = parseInt(process.env.WEBHOOK_CB_OPEN_MS || '120000')
94-
export const WEBHOOK_CB_FAILURE_TTL_MS = parseInt(process.env.WEBHOOK_CB_FAILURE_TTL_MS || '300000')
95-
export const WEBHOOK_CB_REQUEUE_DELAY_MS = parseInt(process.env.WEBHOOK_CB_REQUEUE_DELAY_MS || '300000')
96-
export const WEBHOOK_CB_LOCAL_CLEANUP_INTERVAL_MS = parseInt(process.env.WEBHOOK_CB_LOCAL_CLEANUP_INTERVAL_MS || '3600000')
97-
export const CONTACT_SYNC_ENABLED =
98-
process.env.CONTACT_SYNC_ENABLED == _undefined ? false : process.env.CONTACT_SYNC_ENABLED == 'true'
92+
export const WEBHOOK_CB_FAILURE_THRESHOLD = parseInt(process.env.WEBHOOK_CB_FAILURE_THRESHOLD || '1')
93+
export const WEBHOOK_CB_OPEN_MS = parseInt(process.env.WEBHOOK_CB_OPEN_MS || '120000')
94+
export const WEBHOOK_CB_FAILURE_TTL_MS = parseInt(process.env.WEBHOOK_CB_FAILURE_TTL_MS || '300000')
95+
export const WEBHOOK_CB_REQUEUE_DELAY_MS = parseInt(process.env.WEBHOOK_CB_REQUEUE_DELAY_MS || '300000')
96+
export const WEBHOOK_CB_LOCAL_CLEANUP_INTERVAL_MS = parseInt(process.env.WEBHOOK_CB_LOCAL_CLEANUP_INTERVAL_MS || '3600000')
97+
export const CONTACT_SYNC_ENABLED =
98+
process.env.CONTACT_SYNC_ENABLED == _undefined ? false : process.env.CONTACT_SYNC_ENABLED == 'true'
9999
export const CONTACT_SYNC_INTERVAL_MS = parseInt(process.env.CONTACT_SYNC_INTERVAL_MS || `${8 * 60 * 60 * 1000}`)
100100
export const CONTACT_SYNC_SCAN_COUNT = parseInt(process.env.CONTACT_SYNC_SCAN_COUNT || '500')
101101
export const CONTACT_SYNC_PENDING_TTL_SEC = parseInt(process.env.CONTACT_SYNC_PENDING_TTL_SEC || '900')
@@ -114,12 +114,12 @@ export const PROXY_URL = process.env.PROXY_URL
114114

115115
// behavior of unoapi
116116
export const UNOAPI_SERVER_NAME = process.env.UNOAPI_SERVER_NAME || 'server_1'
117-
export const CONNECTING_TIMEOUT_MS = parseInt(process.env.CONNECTING_TIMEOUT_MS || '180000')
118-
export const BAILEYS_IDLE_RECONNECT_ENABLED =
119-
process.env.BAILEYS_IDLE_RECONNECT_ENABLED === _undefined ? false : process.env.BAILEYS_IDLE_RECONNECT_ENABLED == 'true'
120-
export const BAILEYS_IDLE_RECONNECT_MS = parseInt(process.env.BAILEYS_IDLE_RECONNECT_MS || `${30 * 60 * 1000}`)
121-
export const BAILEYS_IDLE_RECONNECT_CHECK_MS = parseInt(process.env.BAILEYS_IDLE_RECONNECT_CHECK_MS || '60000')
122-
export const UNOAPI_RETRY_REQUEST_DELAY_MS = parseInt(process.env.UNOAPI_RETRY_REQUEST_DELAY || process.env.UNOAPI_RETRY_REQUEST_DELAY_MS || '5000')
117+
export const CONNECTING_TIMEOUT_MS = parseInt(process.env.CONNECTING_TIMEOUT_MS || '180000')
118+
export const BAILEYS_IDLE_RECONNECT_ENABLED =
119+
process.env.BAILEYS_IDLE_RECONNECT_ENABLED === _undefined ? false : process.env.BAILEYS_IDLE_RECONNECT_ENABLED == 'true'
120+
export const BAILEYS_IDLE_RECONNECT_MS = parseInt(process.env.BAILEYS_IDLE_RECONNECT_MS || `${30 * 60 * 1000}`)
121+
export const BAILEYS_IDLE_RECONNECT_CHECK_MS = parseInt(process.env.BAILEYS_IDLE_RECONNECT_CHECK_MS || '60000')
122+
export const UNOAPI_RETRY_REQUEST_DELAY_MS = parseInt(process.env.UNOAPI_RETRY_REQUEST_DELAY || process.env.UNOAPI_RETRY_REQUEST_DELAY_MS || '5000')
123123
// export const QR_TIMEOUT = parseInt(process.env.QR_TIMEOUT || '30000')
124124
// export const SLEEP_TIME = parseInt(process.env.SLEEP_TIME || '5000')
125125
// export const MAX_QRCODE_GENERATE = process.env.MAX_QRCODE_GENERATE || 6
@@ -152,12 +152,12 @@ export const UNOAPI_QUEUE_BULK_SENDER = `${UNOAPI_QUEUE_NAME}.bulk.sender`
152152
export const UNOAPI_QUEUE_BULK_STATUS = `${UNOAPI_QUEUE_NAME}.bulk.status`
153153
export const UNOAPI_QUEUE_BULK_REPORT = `${UNOAPI_QUEUE_NAME}.bulk.report`
154154
export const UNOAPI_QUEUE_BULK_WEBHOOK = `${UNOAPI_QUEUE_NAME}.bulk.webhook`
155-
export const UNOAPI_QUEUE_COMMANDER = `${UNOAPI_QUEUE_NAME}.commander`
156-
export const UNOAPI_QUEUE_INCOMING = `${UNOAPI_QUEUE_NAME}.incoming`
157-
export const UNOAPI_QUEUE_TRANSCRIBER = `${UNOAPI_QUEUE_NAME}.transcribe`
158-
export const RELOAD_PUBLISH_BROKER = process.env.RELOAD_PUBLISH_BROKER === _undefined ? false : process.env.RELOAD_PUBLISH_BROKER == 'true'
159-
export const RELOAD_BAILEYS_DEBOUNCE_MS = parseInt(process.env.RELOAD_BAILEYS_DEBOUNCE_MS || '15000')
160-
export const UNOAPI_MESSAGE_RETRY_LIMIT = parseInt(process.env.UNOAPI_MESSAGE_RETRY_LIMIT || '5')
155+
export const UNOAPI_QUEUE_COMMANDER = `${UNOAPI_QUEUE_NAME}.commander`
156+
export const UNOAPI_QUEUE_INCOMING = `${UNOAPI_QUEUE_NAME}.incoming`
157+
export const UNOAPI_QUEUE_TRANSCRIBER = `${UNOAPI_QUEUE_NAME}.transcribe`
158+
export const RELOAD_PUBLISH_BROKER = process.env.RELOAD_PUBLISH_BROKER === _undefined ? false : process.env.RELOAD_PUBLISH_BROKER == 'true'
159+
export const RELOAD_BAILEYS_DEBOUNCE_MS = parseInt(process.env.RELOAD_BAILEYS_DEBOUNCE_MS || '15000')
160+
export const UNOAPI_MESSAGE_RETRY_LIMIT = parseInt(process.env.UNOAPI_MESSAGE_RETRY_LIMIT || '5')
161161
export const UNOAPI_MESSAGE_RETRY_DELAY = parseInt(process.env.UNOAPI_MESSAGE_RETRY_DELAY || '10000')
162162
export const UNOAPI_DELAY_BETWEEN_MESSAGES_MS = parseInt(process.env.UNOAPI_DELAY_BETWEEN_MESSAGES_MS || '0')
163163
export const UNOAPI_DELAY_AFTER_FIRST_MESSAGE_MS = parseInt(process.env.UNOAPI_DELAY_AFTER_FIRST_MESSAGE_MS || '0')
@@ -235,19 +235,19 @@ export const CONFIG_SESSION_PHONE_CLIENT = process.env.CONFIG_SESSION_PHONE_CLIE
235235
export const CONFIG_SESSION_PHONE_NAME = process.env.CONFIG_SESSION_PHONE_NAME || 'Chrome'
236236
export const MESSAGE_CHECK_WAAPP = process.env.MESSAGE_CHECK_WAAPP || ''
237237
export const WHATSAPP_VERSION = process.env.WHATSAPP_VERSION ? JSON.parse(process.env.WHATSAPP_VERSION) as WAVersion : undefined
238-
export const AVAILABLE_LOCALES = JSON.parse(process.env.AVAILABLE_LOCALES || '["en", "pt_BR", "pt"]')
239-
export const BAILEYS_COUNTRY_CODE = (process.env.BAILEYS_COUNTRY_CODE || 'BR').toUpperCase()
240-
export const ONLY_HELLO_TEMPLATE: boolean = process.env.ONLY_HELLO_TEMPLATE === _undefined ? false : process.env.ONLY_HELLO_TEMPLATE == 'true'
241-
export const DEFAULT_BROWSER = [CONFIG_SESSION_PHONE_CLIENT, CONFIG_SESSION_PHONE_NAME, release()]
238+
export const AVAILABLE_LOCALES = JSON.parse(process.env.AVAILABLE_LOCALES || '["en", "pt_BR", "pt"]')
239+
export const BAILEYS_COUNTRY_CODE = (process.env.BAILEYS_COUNTRY_CODE || 'BR').toUpperCase()
240+
export const ONLY_HELLO_TEMPLATE: boolean = process.env.ONLY_HELLO_TEMPLATE === _undefined ? false : process.env.ONLY_HELLO_TEMPLATE == 'true'
241+
export const DEFAULT_BROWSER = [CONFIG_SESSION_PHONE_CLIENT, CONFIG_SESSION_PHONE_NAME, release()]
242242

243243
// Embedded Signup (WhatsApp Cloud)
244244
export const EMBEDDED_SIGNUP_APP_ID = process.env.EMBEDDED_SIGNUP_APP_ID || ''
245245
export const EMBEDDED_SIGNUP_APP_SECRET = process.env.EMBEDDED_SIGNUP_APP_SECRET || ''
246246
export const EMBEDDED_SIGNUP_REDIRECT_URI = process.env.EMBEDDED_SIGNUP_REDIRECT_URI || ''
247247
export const EMBEDDED_SIGNUP_GRAPH_VERSION = process.env.EMBEDDED_SIGNUP_GRAPH_VERSION || 'v24.0'
248-
export const QR_TIMEOUT_MS = parseInt(process.env.QR_TIMEOUT_MS || '60000')
249-
export const QR_POST_LOGIN_SUPPRESS_MS = parseInt(process.env.QR_POST_LOGIN_SUPPRESS_MS || '45000')
250-
export const STATUS_FAILED_WEBHOOK_URL = process.env.STATUS_FAILED_WEBHOOK_URL || ''
248+
export const QR_TIMEOUT_MS = parseInt(process.env.QR_TIMEOUT_MS || '60000')
249+
export const QR_POST_LOGIN_SUPPRESS_MS = parseInt(process.env.QR_POST_LOGIN_SUPPRESS_MS || '45000')
250+
export const STATUS_FAILED_WEBHOOK_URL = process.env.STATUS_FAILED_WEBHOOK_URL || ''
251251
// Status broadcast behavior
252252
export const STATUS_ALLOW_LID: boolean = process.env.STATUS_ALLOW_LID === _undefined ? true : process.env.STATUS_ALLOW_LID == 'true'
253253
// Enable/disable sending Status (status@broadcast). When disabled, outgoing status
@@ -301,14 +301,15 @@ export const GROUP_ONLY_DELIVERED_STATUS =
301301
export const RECEIPT_RETRY_ASSERT_COOLDOWN_MS = parseInt(process.env.RECEIPT_RETRY_ASSERT_COOLDOWN_MS || '15000')
302302
export const RECEIPT_RETRY_ASSERT_MAX_TARGETS = parseInt(process.env.RECEIPT_RETRY_ASSERT_MAX_TARGETS || '400')
303303

304-
// JID mapping cache (PN <-> LID)
305-
export const JIDMAP_CACHE_ENABLED = process.env.JIDMAP_CACHE_ENABLED === _undefined ? true : process.env.JIDMAP_CACHE_ENABLED == 'true'
306-
// Enable/disable jidmap list endpoint.
307-
export const JIDMAP_LIST_ENABLED = process.env.JIDMAP_LIST_ENABLED === _undefined ? true : process.env.JIDMAP_LIST_ENABLED == 'true'
304+
// JID mapping cache (PN <-> LID)
305+
export const JIDMAP_CACHE_ENABLED = process.env.JIDMAP_CACHE_ENABLED === _undefined ? true : process.env.JIDMAP_CACHE_ENABLED == 'true'
306+
// Enable/disable jidmap list endpoint.
307+
export const JIDMAP_LIST_ENABLED = process.env.JIDMAP_LIST_ENABLED === _undefined ? true : process.env.JIDMAP_LIST_ENABLED == 'true'
308308
// Enable/disable lookups against stored jidmap cache (unoapi-jidmap:*).
309-
export const JIDMAP_STORED_LOOKUP_ENABLED =
310-
process.env.JIDMAP_STORED_LOOKUP_ENABLED === _undefined ? false : process.env.JIDMAP_STORED_LOOKUP_ENABLED == 'true'
311-
export const JIDMAP_TTL_SECONDS = parseInt(process.env.JIDMAP_TTL_SECONDS || '604800') // 7 days
309+
export const JIDMAP_STORED_LOOKUP_ENABLED =
310+
process.env.JIDMAP_STORED_LOOKUP_ENABLED === _undefined ? true : process.env.JIDMAP_STORED_LOOKUP_ENABLED == 'true'
311+
// 0 or negative => do not expire mappings
312+
export const JIDMAP_TTL_SECONDS = parseInt(process.env.JIDMAP_TTL_SECONDS || '0')
312313

313314
// Self-heal: assert sessions when decrypt stub is detected in inbound messages
314315
export const SELFHEAL_ASSERT_ON_DECRYPT =
@@ -390,9 +391,9 @@ export const ONE_TO_ONE_ADDRESSING_MODE: 'lid' | 'pn' = (() => {
390391
return (v === 'lid' ? 'lid' : 'pn')
391392
})()
392393

393-
// Background resolver: try to map LIDs seen to PN asynchronously (accelerates JIDMAP population)
394-
export const LID_RESOLVER_ENABLED: boolean =
395-
process.env.LID_RESOLVER_ENABLED === _undefined ? true : process.env.LID_RESOLVER_ENABLED == 'true'
394+
// Background resolver: try to map LIDs seen to PN asynchronously (accelerates JIDMAP population)
395+
export const LID_RESOLVER_ENABLED: boolean =
396+
process.env.LID_RESOLVER_ENABLED === _undefined ? true : process.env.LID_RESOLVER_ENABLED == 'true'
396397
export const LID_RESOLVER_BACKOFF_MS: number[] = (() => {
397398
try {
398399
const raw = (process.env.LID_RESOLVER_BACKOFF_MS || '30000,120000,300000').toString()
@@ -405,8 +406,8 @@ export const LID_RESOLVER_MAX_PENDING = parseInt(process.env.LID_RESOLVER_MAX_PE
405406
// Enriquecimento do JIDMAP (PN<->LID) a partir do contact-info
406407
export const JIDMAP_ENRICH_ENABLED = process.env.JIDMAP_ENRICH_ENABLED === _undefined ? false : process.env.JIDMAP_ENRICH_ENABLED == 'true'
407408
export const JIDMAP_ENRICH_PER_SWEEP = parseInt(process.env.JIDMAP_ENRICH_PER_SWEEP || '20')
408-
// Espelhar periodicamente o cache interno (unoapi-auth:*:lid-mapping-*) no JIDMAP
409-
export const JIDMAP_ENRICH_AUTH_ENABLED = process.env.JIDMAP_ENRICH_AUTH_ENABLED === _undefined ? true : process.env.JIDMAP_ENRICH_AUTH_ENABLED == 'true'
409+
// Espelhar periodicamente o cache interno (unoapi-auth:*:lid-mapping-*) no JIDMAP
410+
export const JIDMAP_ENRICH_AUTH_ENABLED = process.env.JIDMAP_ENRICH_AUTH_ENABLED === _undefined ? true : process.env.JIDMAP_ENRICH_AUTH_ENABLED == 'true'
410411

411412
// Watchdog purge scan batch size (Redis SCAN COUNT per pattern)
412413
export const WATCHDOG_PURGE_SCAN_COUNT = parseInt(process.env.WATCHDOG_PURGE_SCAN_COUNT || '20')
@@ -422,10 +423,10 @@ export const ACK_RETRY_DELAYS_MS: number[] = (() => {
422423
return raw.split(',').map((s) => parseInt(s.trim())).filter((n) => Number.isFinite(n) && n > 0)
423424
} catch { return [8000, 30000, 60000] }
424425
})()
425-
// Optional hard cap for attempts; if set lower than delays length, it limits retries
426-
export const ACK_RETRY_MAX_ATTEMPTS: number = parseInt(process.env.ACK_RETRY_MAX_ATTEMPTS || '0') || 0
427-
// Enable/disable ACK-retry scheduling entirely (default true)
428-
export const ACK_RETRY_ENABLED: boolean = process.env.ACK_RETRY_ENABLED === _undefined ? false : process.env.ACK_RETRY_ENABLED == 'true'
426+
// Optional hard cap for attempts; if set lower than delays length, it limits retries
427+
export const ACK_RETRY_MAX_ATTEMPTS: number = parseInt(process.env.ACK_RETRY_MAX_ATTEMPTS || '0') || 0
428+
// Enable/disable ACK-retry scheduling entirely (default true)
429+
export const ACK_RETRY_ENABLED: boolean = process.env.ACK_RETRY_ENABLED === _undefined ? false : process.env.ACK_RETRY_ENABLED == 'true'
429430

430431
// Media send retry (ex.: presigned URL 403 enquanto objeto não ficou disponível)
431432
export const MEDIA_RETRY_ENABLED: boolean =

src/services/client_baileys.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,60 @@ const buildSendOkResponse = (to: string, keyId: string) => ({
142142
})
143143

144144
export class ClientBaileys implements Client {
145+
private async remapMentionsToLidForGroup(targetTo: string, content: any) {
146+
try {
147+
if (!targetTo || !isJidGroup(targetTo)) return
148+
const inputMentions: string[] = Array.isArray(content?.mentions) ? content.mentions : []
149+
if (!inputMentions.length) return
150+
151+
const remapped: string[] = []
152+
for (const raw of inputMentions) {
153+
const mention = `${raw || ''}`.trim()
154+
if (!mention) continue
155+
156+
// Keep LID mentions as-is.
157+
if (isLidUser(mention as any)) {
158+
remapped.push(jidNormalizedUser(mention as any) as string)
159+
continue
160+
}
161+
162+
// Normalize mention to PN JID first.
163+
let pnJid = ''
164+
if (isPnUser(mention as any)) {
165+
pnJid = jidNormalizedUser(mention as any) as string
166+
} else {
167+
const pn = ensurePn(mention.startsWith('@') ? mention.slice(1) : mention)
168+
if (pn) pnJid = phoneNumberToJid(pn)
169+
}
170+
171+
if (!pnJid) {
172+
remapped.push(mention)
173+
continue
174+
}
175+
176+
let lidJid: string | undefined
177+
try {
178+
lidJid = await this.store?.dataStore?.getLidForPn?.(this.phone, pnJid)
179+
} catch {}
180+
remapped.push(lidJid && isLidUser(lidJid as any) ? (jidNormalizedUser(lidJid as any) as string) : pnJid)
181+
}
182+
183+
const unique = Array.from(new Set(remapped.filter(Boolean)))
184+
const changed = unique.length !== inputMentions.length || unique.some((m, i) => m !== inputMentions[i])
185+
if (changed) {
186+
content.mentions = unique
187+
logger.info(
188+
'MENTION_UNO_REMAP to=%s before=%s after=%s',
189+
targetTo,
190+
JSON.stringify(inputMentions),
191+
JSON.stringify(unique),
192+
)
193+
}
194+
} catch (e) {
195+
logger.debug(e as any, 'Ignore mention remap error for %s', targetTo)
196+
}
197+
}
198+
145199
/**
146200
* High-level client that wraps Baileys send/receive operations for a single phone session.
147201
*
@@ -1056,6 +1110,7 @@ export class ClientBaileys implements Client {
10561110
)
10571111
} catch {}
10581112
content = toBaileysMessageContent(payload, this.config.customMessageCharactersFunction)
1113+
await this.remapMentionsToLidForGroup(targetTo, content as any)
10591114
try {
10601115
logger.info(
10611116
'MENTION_SEND content to=%s mentionAll=%s mentions=%s text="%s"',

0 commit comments

Comments
 (0)