fix: sync pre-keys on socket start and add specific pre-key error approach (#1663)

* fix: sync prekeys when storage mismatch

* fix: verify if current pre-key exists instead of matching

* add: pre-keys error specific approach

* fix: lint

* fix: lint
This commit is contained in:
Gustavo Quadri
2025-09-07 08:11:50 -03:00
committed by GitHub
parent 0fbce52fd3
commit 8f21a67e4a
3 changed files with 148 additions and 19 deletions
+42 -6
View File
@@ -711,8 +711,11 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
updateSendMessageAgainCount(ids[0], key.participant)
logger.debug({ attrs, key }, 'recv retry request')
await sendMessagesAgain(key, ids, retryNode!)
} catch (error: any) {
logger.error({ key, ids, trace: error.stack }, 'error in sending message again')
} catch (error: unknown) {
logger.error(
{ key, ids, trace: error instanceof Error ? error.stack : 'Unknown error' },
'error in sending message again'
)
}
} else {
logger.info({ attrs, key }, 'recv retry for not fromMe message')
@@ -823,19 +826,52 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
return sendMessageAck(node, NACK_REASONS.ParsingError)
}
const errorMessage = msg?.messageStubParameters?.[0] || ''
const isPreKeyError = errorMessage.includes('PreKey')
console.debug(`[handleMessage] Attempting retry request for failed decryption`)
// Handle both pre-key and normal retries in single mutex
retryMutex.mutex(async () => {
if (ws.isOpen) {
if (getBinaryNodeChild(node, 'unavailable')) {
try {
if (!ws.isOpen) {
logger.debug({ node }, 'Connection closed, skipping retry')
return
}
if (getBinaryNodeChild(node, 'unavailable')) {
logger.debug('Message unavailable, skipping retry')
return
}
// Handle pre-key errors with upload and delay
if (isPreKeyError) {
logger.info({ error: errorMessage }, 'PreKey error detected, uploading and retrying')
try {
logger.debug('Uploading pre-keys for error recovery')
await uploadPreKeys(5)
logger.debug('Waiting for server to process new pre-keys')
await delay(1000)
} catch (uploadErr) {
logger.error({ uploadErr }, 'Pre-key upload failed, proceeding with retry anyway')
}
}
const encNode = getBinaryNodeChild(node, 'enc')
await sendRetryRequest(node, !encNode)
if (retryRequestDelayMs) {
await delay(retryRequestDelayMs)
}
} else {
logger.debug({ node }, 'connection closed, ignoring retry req')
} catch (err) {
logger.error({ err, isPreKeyError }, 'Failed to handle retry, attempting basic retry')
// Still attempt retry even if pre-key upload failed
try {
const encNode = getBinaryNodeChild(node, 'enc')
await sendRetryRequest(node, !encNode)
} catch (retryErr) {
logger.error({ retryErr }, 'Failed to send retry after error handling')
}
}
})
} else {