diff --git a/src/Signal/libsignal.ts b/src/Signal/libsignal.ts index 9bf2d2b2..f1d90df0 100644 --- a/src/Signal/libsignal.ts +++ b/src/Signal/libsignal.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth, @typescript-eslint/no-unused-vars */ /* @ts-ignore */ import { createHash } from 'crypto' import * as libsignal from 'libsignal' @@ -155,11 +154,13 @@ function extractIdentityFromPkmsg(ciphertext: Uint8Array, logger?: ILogger): Uin // Field 5 is identityKey if (fieldNumber === 5) { // Validate key length + // eslint-disable-next-line max-depth if (length !== IDENTITY_KEY_LENGTH) { logger?.debug({ length, expected: IDENTITY_KEY_LENGTH }, 'Invalid identity key length') return undefined } + // eslint-disable-next-line max-depth if (offset + length > ciphertext.length) { logger?.debug('Identity key extends beyond ciphertext bounds') return undefined @@ -168,6 +169,7 @@ function extractIdentityFromPkmsg(ciphertext: Uint8Array, logger?: ILogger): Uin const identityKey = ciphertext.slice(offset, offset + length) // Validate key type byte (must be 0x05 for Curve25519) + // eslint-disable-next-line max-depth if (identityKey[0] !== CURVE25519_KEY_TYPE) { logger?.debug({ type: identityKey[0], expected: CURVE25519_KEY_TYPE }, 'Invalid identity key type') return undefined @@ -350,6 +352,7 @@ export function makeLibSignalRepository( // Reset prekey circuit breaker since we identified the cause // Reset regardless of state (could be open, half-open, or closed with accumulated failures) + // eslint-disable-next-line max-depth if (preKeyCircuitBreaker) { preKeyCircuitBreaker.reset() logger.debug({ jid }, 'Reset prekey circuit breaker after identity key change detection') diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index 08926c1c..95f85d18 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth */ import NodeCache from '@cacheable/node-cache' import { Boom } from '@hapi/boom' import { LRUCache } from 'lru-cache' diff --git a/src/Socket/messages-send.ts b/src/Socket/messages-send.ts index 3b06d2d6..29ddf207 100644 --- a/src/Socket/messages-send.ts +++ b/src/Socket/messages-send.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth, @typescript-eslint/no-unused-vars, @typescript-eslint/no-floating-promises */ import NodeCache from '@cacheable/node-cache' import { Boom } from '@hapi/boom' import { proto } from '../../WAProto/index.js' @@ -43,7 +42,7 @@ import { import { logMessageSent } from '../Utils/baileys-logger' import { getUrlInfo } from '../Utils/link-preview' import { makeKeyedMutex } from '../Utils/make-mutex' -import { metrics, recordMessageFailure, recordMessageRetry, recordMessageSent } from '../Utils/prometheus-metrics' +import { metrics, recordMessageFailure, recordMessageSent } from '../Utils/prometheus-metrics' import { getMessageReportingToken, shouldIncludeReportingToken } from '../Utils/reporting-utils' import { areJidsSameUser, @@ -722,7 +721,8 @@ export const makeMessagesSocket = (config: SocketConfig) => { * Returns the attributes for the interactive binary node based on message type * For native_flow: returns { v: '4', name: '' } or special attributes for payment flows */ - const getButtonArgs = (message: proto.IMessage): BinaryNodeAttributes => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const _getButtonArgs = (message: proto.IMessage): BinaryNodeAttributes => { const buttonType = getButtonType(message) // For native_flow messages, check for special button types that need specific attributes @@ -880,6 +880,7 @@ export const makeMessagesSocket = (config: SocketConfig) => { delete message.viewOnceMessage message.listMessage = listMessage // Keep messageContextInfo if it was nested + // eslint-disable-next-line max-depth if (!message.messageContextInfo && innerMsg?.messageContextInfo) { message.messageContextInfo = innerMsg.messageContextInfo } @@ -940,7 +941,6 @@ export const makeMessagesSocket = (config: SocketConfig) => { const bytes = encodeNewsletterMessage(patched as proto.IMessage) binaryNodeContent.push({ tag: 'plaintext', - // eslint-disable-next-line @typescript-eslint/no-floating-promises attrs: {}, content: bytes }) diff --git a/src/Socket/socket.ts b/src/Socket/socket.ts index d9366618..eb287fe4 100644 --- a/src/Socket/socket.ts +++ b/src/Socket/socket.ts @@ -310,7 +310,6 @@ export const makeSocket = (config: SocketConfig) => { } } } - // eslint-disable-next-line @typescript-eslint/no-floating-promises /** send a query, and wait for its response. auto-generates message ID if not provided */ const queryInternal = async (node: BinaryNode, timeoutMs?: number) => { @@ -601,7 +600,6 @@ export const makeSocket = (config: SocketConfig) => { const keyEnc = noise.processHandshake(handshake, creds.noiseKey) let node: proto.IClientPayload - // eslint-disable-next-line @typescript-eslint/no-floating-promises if (!creds.me) { node = generateRegistrationNode(creds, config) logger.info({ node }, 'not logged in, attempting registration...') diff --git a/src/Utils/baileys-event-stream.ts b/src/Utils/baileys-event-stream.ts index e43e8285..f477d88f 100644 --- a/src/Utils/baileys-event-stream.ts +++ b/src/Utils/baileys-event-stream.ts @@ -310,7 +310,7 @@ export class BaileysEventStream extends EventEmitter { // Process if not paused if (!this.paused && !this.isProcessing) { - this.processNext() + void this.processNext() } return true @@ -598,7 +598,7 @@ export class BaileysEventStream extends EventEmitter { resume(): void { this.paused = false this.emit('resume') - this.processNext() + void this.processNext() } /** diff --git a/src/Utils/cache-utils.ts b/src/Utils/cache-utils.ts index 792fc90f..926a1103 100644 --- a/src/Utils/cache-utils.ts +++ b/src/Utils/cache-utils.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth, @typescript-eslint/no-unused-vars */ /** * Smart Cache System * @@ -469,7 +468,9 @@ export function cached(options: CacheOptions & { keyGenerator?: (...args: /** * Wrapper for function with cache */ -export function withCache unknown>( + +// eslint-disable-next-line prettier/prettier +export function withCache unknown>( fn: T, options: CacheOptions> & { keyGenerator?: (...args: Parameters) => string } = {} ): T { diff --git a/src/Utils/chat-utils.ts b/src/Utils/chat-utils.ts index 5ec13446..5072dfe7 100644 --- a/src/Utils/chat-utils.ts +++ b/src/Utils/chat-utils.ts @@ -216,7 +216,7 @@ export const decodeSyncdMutations = async ( // if it's a syncdmutation, get the operation property // otherwise, if it's only a record -- it'll be a SET mutation const operation = 'operation' in msgMutation ? msgMutation.operation : proto.SyncdMutation.SyncdOperation.SET - // eslint-disable-next-line eqeqeq + if (operation == null) { throw new Boom('Missing operation in mutation', { statusCode: 500 }) } @@ -343,7 +343,7 @@ export const decodeSyncdPatch = async ( } const msgVersion = msg.version?.version - // eslint-disable-next-line eqeqeq + if (msgVersion == null) { throw new Boom('Missing version in patch message', { statusCode: 500 }) } @@ -446,7 +446,7 @@ export const decodeSyncdSnapshot = async ( const newState = newLTHashState() const snapshotVersion = snapshot.version?.version - // eslint-disable-next-line eqeqeq + if (snapshotVersion == null) { throw new Boom('Missing version in snapshot', { statusCode: 500 }) } @@ -540,7 +540,6 @@ export const decodePatches = async ( const ver = version?.version if (ver == null) { - // eslint-disable-next-line eqeqeq throw new Boom('Missing version in patch', { statusCode: 500 }) } diff --git a/src/Utils/circuit-breaker.ts b/src/Utils/circuit-breaker.ts index 9707dd6d..ad9e01c0 100644 --- a/src/Utils/circuit-breaker.ts +++ b/src/Utils/circuit-breaker.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth */ /** * Circuit Breaker Pattern Implementation * @@ -625,6 +624,7 @@ export function circuitBreaker(options: Omit & { * ) * ``` */ +// eslint-disable-next-line space-before-function-paren export function withCircuitBreaker unknown>( fn: T, options: CircuitBreakerOptions diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index 3b21e9fa..065f50a9 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -1,4 +1,3 @@ -/* eslint-disable space-before-function-paren */ import { Boom } from '@hapi/boom' import { proto } from '../../WAProto/index.js' import type { WAMessage, WAMessageKey } from '../Types' @@ -412,6 +411,7 @@ export const decryptMessageNode = ( if (isCorrupted) { // Corrupted session errors are expected and auto-recovered // Only log as ERROR if retries exhausted, otherwise WARN on first attempt + // eslint-disable-next-line max-depth if (isRetryExhausted) { logger.error( errorContext, @@ -423,7 +423,9 @@ export const decryptMessageNode = ( } // Automatic cleanup of corrupted session (if enabled) + // eslint-disable-next-line max-depth if (autoCleanCorrupted) { + // eslint-disable-next-line max-depth try { const deletedCount = await cleanupCorruptedSession(decryptionJid, repository, logger) @@ -443,6 +445,7 @@ export const decryptMessageNode = ( } } else if (isSessionRecord) { // Session record errors are transient - retry should handle them + // eslint-disable-next-line max-depth if (isRetryExhausted) { logger.error(errorContext, `Failed to decrypt: No session record found after ${err.attempts} attempts`) } else { diff --git a/src/Utils/process-message.ts b/src/Utils/process-message.ts index 6f8cf6f4..5763c294 100644 --- a/src/Utils/process-message.ts +++ b/src/Utils/process-message.ts @@ -357,12 +357,14 @@ const processMessage = async ( // This is how WhatsApp Web learns mappings for chats with non-contacts if (data.lidPnMappings?.length) { logger?.debug({ count: data.lidPnMappings.length }, 'processing LID-PN mappings from history sync') + // eslint-disable-next-line max-depth try { const result = await signalRepository.lidMapping.storeLIDPNMappings(data.lidPnMappings) logger?.debug( { stored: result.stored, skipped: result.skipped, errors: result.errors }, 'stored LID-PN mappings from history sync' ) + // eslint-disable-next-line max-depth if (result.stored > 0) { logger?.info({ stored: result.stored }, 'fallback LID mappings are now available from history sync') } @@ -371,6 +373,7 @@ const processMessage = async ( } // Emit all mappings at once for better performance + // eslint-disable-next-line max-depth if (data.lidPnMappings.length > 0) { ev.emit('lid-mapping.update', data.lidPnMappings) } @@ -462,6 +465,7 @@ const processMessage = async ( const { placeholderMessageResendResponse: retryResponse } = result //eslint-disable-next-line max-depth if (retryResponse) { + // eslint-disable-next-line max-depth if (!retryResponse.webMessageInfoBytes) { continue } @@ -470,8 +474,10 @@ const processMessage = async ( // Merge cached metadata with decoded message // This ensures we don't lose critical information like pushName and LID mappings + // eslint-disable-next-line max-depth if (cachedData && typeof cachedData === 'object') { // Preserve pushName if not present in PDO response + // eslint-disable-next-line max-depth if (cachedData.pushName && !webMessageInfo.pushName) { webMessageInfo.pushName = cachedData.pushName logger?.debug({ msgId: webMessageInfo.key?.id }, 'CTWA: Restored pushName from cached metadata') @@ -479,8 +485,10 @@ const processMessage = async ( // Preserve participantAlt (LID) if not present in PDO response // This is critical for maintaining LID/PN mapping in groups + // eslint-disable-next-line max-depth if (cachedData.participantAlt && webMessageInfo.key) { const msgKey = webMessageInfo.key as WAMessageKey + // eslint-disable-next-line max-depth if (!msgKey.participantAlt) { msgKey.participantAlt = cachedData.participantAlt logger?.debug( @@ -491,6 +499,7 @@ const processMessage = async ( } // Preserve original participant if not in PDO response + // eslint-disable-next-line max-depth if (cachedData.participant && webMessageInfo.key && !webMessageInfo.key.participant) { webMessageInfo.key.participant = cachedData.participant logger?.debug({ msgId: webMessageInfo.key?.id }, 'CTWA: Restored participant from cached metadata') @@ -498,6 +507,7 @@ const processMessage = async ( // Only use cached timestamp if PDO response doesn't have one // PDO response timestamp is more authoritative if present + // eslint-disable-next-line max-depth if (!webMessageInfo.messageTimestamp && cachedData.messageTimestamp) { webMessageInfo.messageTimestamp = cachedData.messageTimestamp } diff --git a/src/Utils/prometheus-metrics.ts b/src/Utils/prometheus-metrics.ts index e9be92db..1b632e55 100644 --- a/src/Utils/prometheus-metrics.ts +++ b/src/Utils/prometheus-metrics.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth, @typescript-eslint/no-unused-vars */ /** * Prometheus Metrics Exposition - Enterprise Grade * @@ -100,6 +99,7 @@ export function getConfiguredPrefix(): string { /** * Check if a metric with the given name already exists in the custom registry */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars function metricExists(name: string): boolean { const fullName = getFullMetricName(name) try { @@ -113,6 +113,7 @@ function metricExists(name: string): boolean { /** * Get an existing metric from the custom registry */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars function getExistingMetric(name: string): T | undefined { const fullName = getFullMetricName(name) try { @@ -1926,7 +1927,8 @@ export function updateBufferStatistics(stats: { * Record a cache cleanup operation * Used by event-buffer.ts when LRU cleanup is performed */ -export function recordCacheCleanup(removedCount: number): void { +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function recordCacheCleanup(_removedCount: number): void { try { metrics.bufferCacheCleanup?.inc({}) } catch { diff --git a/src/Utils/retry-utils.ts b/src/Utils/retry-utils.ts index ed07ef4e..b656bfac 100644 --- a/src/Utils/retry-utils.ts +++ b/src/Utils/retry-utils.ts @@ -1,4 +1,3 @@ -/* eslint-disable prefer-const */ /** * Smart Retry Logic * @@ -452,6 +451,7 @@ export function withRetry(options: RetryOptions = {}) { /** * Wrapper for function with retry */ +// eslint-disable-next-line space-before-function-paren export function retryable unknown>( fn: T, options: RetryOptions = {} diff --git a/src/Utils/sticker-pack.ts b/src/Utils/sticker-pack.ts index 232b3b13..f8f21b85 100644 --- a/src/Utils/sticker-pack.ts +++ b/src/Utils/sticker-pack.ts @@ -1,11 +1,10 @@ -/* eslint-disable prefer-const, space-before-function-paren */ import { Boom } from '@hapi/boom' import { createHash } from 'crypto' import { zipSync } from 'fflate' import { promises as fs } from 'fs' import { proto } from '../../WAProto/index.js' import type { MediaType } from '../Defaults/index.js' -import type { Sticker, StickerPack, WAMediaUpload, WAMediaUploadFunction } from '../Types/Message.js' +import type { StickerPack, WAMediaUpload, WAMediaUploadFunction } from '../Types/Message.js' import { generateMessageIDV2 } from './generics.js' import type { ILogger } from './logger.js' import { encryptedStream, getImageProcessingLibrary } from './messages-media.js' @@ -466,6 +465,7 @@ export const prepareStickerPackMessage = async ( const buffer = await mediaToBuffer(sticker.data, `sticker ${i + 1}`) // Converte para WebP + // eslint-disable-next-line prefer-const let { webpBuffer, isAnimated } = await convertToWebP(buffer, logger) // ENHANCEMENT: Auto-compression if exceeds 1MB (try quality 70, then 50) @@ -485,6 +485,7 @@ export const prepareStickerPackMessage = async ( try { const compressed70 = await lib.sharp.default(buffer).webp({ quality: 70 }).toBuffer() + // eslint-disable-next-line max-depth if (compressed70.length <= MAX_STICKER_SIZE) { webpBuffer = compressed70 logger?.info( @@ -499,6 +500,7 @@ export const prepareStickerPackMessage = async ( // Try quality 50 const compressed50 = await lib.sharp.default(buffer).webp({ quality: 50 }).toBuffer() + // eslint-disable-next-line max-depth if (compressed50.length <= MAX_STICKER_SIZE) { webpBuffer = compressed50 logger?.info( diff --git a/src/Utils/structured-logger.ts b/src/Utils/structured-logger.ts index be9e59d3..57053172 100644 --- a/src/Utils/structured-logger.ts +++ b/src/Utils/structured-logger.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ /** * Structured Logging System for InfiniteAPI * @@ -321,7 +320,7 @@ class AsyncLogQueue { enqueue(task: () => void): void { if (this.destroyed) return this.queue.push(task) - this.processNext() + void this.processNext() } private async processNext(): Promise { diff --git a/src/Utils/trace-context.ts b/src/Utils/trace-context.ts index b5073e3c..f9bf69a5 100644 --- a/src/Utils/trace-context.ts +++ b/src/Utils/trace-context.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-floating-promises, space-before-function-paren */ /** * Request Tracing Context * @@ -320,7 +319,7 @@ export function setSpanError(span: Span, error: Error): void { span.attributes.error = true span.attributes.errorMessage = error.message span.attributes.errorName = error.name - // eslint-disable-next-line @typescript-eslint/no-floating-promises + if (error.stack) { span.attributes.errorStack = error.stack } @@ -382,6 +381,7 @@ export function traced(name?: string) { /** * Wrapper for tracing a function */ +// eslint-disable-next-line space-before-function-paren export function traceFunction unknown>(name: string, fn: T): T { return function (this: unknown, ...args: Parameters): ReturnType { const span = startSpan({ name }) diff --git a/src/Utils/unified-session.ts b/src/Utils/unified-session.ts index 273ef737..0ac9e469 100644 --- a/src/Utils/unified-session.ts +++ b/src/Utils/unified-session.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-depth */ /** * Unified Session Telemetry Implementation * diff --git a/src/__tests__/Signal/session-activity-tracker.test.ts b/src/__tests__/Signal/session-activity-tracker.test.ts index c15f312d..d6971dec 100644 --- a/src/__tests__/Signal/session-activity-tracker.test.ts +++ b/src/__tests__/Signal/session-activity-tracker.test.ts @@ -29,7 +29,6 @@ describe('SessionActivityTracker', () => { const tracker = makeSessionActivityTracker(mockKeys, logger, config) const jid = '5511999999999@s.whatsapp.net' - const beforeTime = Date.now() tracker.recordActivity(jid) diff --git a/src/__tests__/Signal/session-cleanup.test.ts b/src/__tests__/Signal/session-cleanup.test.ts index 5c207f28..871cf400 100644 --- a/src/__tests__/Signal/session-cleanup.test.ts +++ b/src/__tests__/Signal/session-cleanup.test.ts @@ -304,7 +304,8 @@ describe('SessionCleanup', () => { }) it('should handle null sessionActivityTracker gracefully', async () => { - const now = Date.now() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const _ = Date.now() // @ts-ignore mockKeys.get.mockResolvedValue({ diff --git a/src/__tests__/Utils/structured-logger.test.ts b/src/__tests__/Utils/structured-logger.test.ts index 8188013b..cba637e8 100644 --- a/src/__tests__/Utils/structured-logger.test.ts +++ b/src/__tests__/Utils/structured-logger.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ /** * Testes unitários para structured-logger.ts */ @@ -9,7 +8,6 @@ import { createTimer, getDefaultLogger, LOG_LEVEL_VALUES, - type LogLevel, setDefaultLogger, StructuredLogger } from '../../Utils/structured-logger.js'