fix: histsync LID improvements — raw_id mapping, prekeys, keepalive j… (#304)
* fix: histsync LID improvements — raw_id mapping, prekeys, keepalive jitter, CDN DELETE * fix: prekey pool strategy — 800 initial, top-up to 800 when below 200 - INITIAL_PREKEY_COUNT: 812 → 800 (rounded, matches WA Business ~812 from CDP capture) - MIN_PREKEY_COUNT: 25 → 200 (replenishment trigger threshold) - uploadPreKeysToServerIfRequired: top-up to INITIAL_PREKEY_COUNT instead of uploading a flat MIN_PREKEY_COUNT — restores full 800-key pool on each replenish - handleEncryptNotification: same top-up logic (INITIAL_PREKEY_COUNT - count) so server notification path also restores to 800, not just adds 200 uploadPreKeys(5) in error recovery path intentionally left unchanged.
This commit is contained in:
+19
-5
@@ -785,7 +785,7 @@ export const makeSocket = (config: SocketConfig) => {
|
||||
let count = 0
|
||||
const preKeyCount = await getAvailablePreKeysOnServer()
|
||||
if (preKeyCount === 0) count = INITIAL_PREKEY_COUNT
|
||||
else count = MIN_PREKEY_COUNT
|
||||
else count = Math.max(0, INITIAL_PREKEY_COUNT - preKeyCount)
|
||||
const { exists: currentPreKeyExists, currentPreKeyId } = await verifyCurrentPreKeyExists()
|
||||
|
||||
logger.info(`${preKeyCount} pre-keys found on server`)
|
||||
@@ -1151,7 +1151,7 @@ export const makeSocket = (config: SocketConfig) => {
|
||||
// Decrement active connections
|
||||
decrementActiveConnections()
|
||||
|
||||
clearInterval(keepAliveReq)
|
||||
clearTimeout(keepAliveReq)
|
||||
clearTimeout(qrTimer)
|
||||
|
||||
// Clear offline-buffer safety timer so its callback cannot call ev.flush()
|
||||
@@ -1262,8 +1262,16 @@ export const makeSocket = (config: SocketConfig) => {
|
||||
})
|
||||
}
|
||||
|
||||
const startKeepAliveRequest = () =>
|
||||
(keepAliveReq = setInterval(() => {
|
||||
const startKeepAliveRequest = () => {
|
||||
// Use recursive setTimeout with ±15% jitter to match WA Desktop behaviour
|
||||
// (WA Business Desktop: ~25-30s intervals with natural variance)
|
||||
const scheduleNextKeepAlive = () => {
|
||||
const jitter = keepAliveIntervalMs * 0.15
|
||||
const delay = keepAliveIntervalMs + Math.floor((Math.random() * 2 - 1) * jitter)
|
||||
keepAliveReq = setTimeout(onKeepAliveTick, delay)
|
||||
}
|
||||
|
||||
const onKeepAliveTick = () => {
|
||||
if (!lastDateRecv) {
|
||||
lastDateRecv = new Date()
|
||||
}
|
||||
@@ -1275,6 +1283,7 @@ export const makeSocket = (config: SocketConfig) => {
|
||||
*/
|
||||
if (diff > keepAliveIntervalMs + 5000) {
|
||||
void end(new Boom('Connection was lost', { statusCode: DisconnectReason.connectionLost }))
|
||||
return // connection closing — do not reschedule
|
||||
} else if (ws.isOpen) {
|
||||
// Send keep-alive ping via sendNode() (fire-and-forget) instead of query().
|
||||
// query() wraps the ping in the query circuit breaker — when that breaker is
|
||||
@@ -1297,7 +1306,12 @@ export const makeSocket = (config: SocketConfig) => {
|
||||
} else {
|
||||
logger.warn('keep alive called when WS not open')
|
||||
}
|
||||
}, keepAliveIntervalMs))
|
||||
|
||||
scheduleNextKeepAlive()
|
||||
}
|
||||
|
||||
scheduleNextKeepAlive()
|
||||
}
|
||||
/** i have no idea why this exists. pls enlighten me */
|
||||
const sendPassiveIq = (tag: 'passive' | 'active') =>
|
||||
query({
|
||||
|
||||
Reference in New Issue
Block a user