{"version":3,"sources":["../src/types/baileys.ts","../src/context/execution-context.ts","../src/logger/index.ts","../src/types/index.ts","../src/config/presets.ts","../src/validation/schemas.ts","../src/validation/reporter.ts","../src/crypto/index.ts","../src/crypto/codec.ts","../src/storage/index.ts","../src/redis/store.ts","../src/redis/use-redis-auth-state.ts","../src/mongodb/store.ts","../src/mongodb/use-mongo-auth-state.ts","../src/metrics/index.ts","../src/hybrid/outbox.ts","../src/hybrid/store.ts","../src/hybrid/use-hybrid-auth-state.ts","../src/health/health-check.ts","../src/errors/hierarchy.ts"],"names":["assertBufferTypes","obj","path","item","index","key","value","executionContext","AsyncLocalStorage","getContext","withContext","context","fn","fullContext","randomUUID","generateRequestId","timestamp","random","getCorrelationId","getRequestId","getOperationDuration","withCorrelationId","correlationId","setContextMetadata","metadata","getContextMetadata","hasCorrelationId","LogLevel","ConsoleStructuredLogger","environment","options","message","error","errorContext","level","execContext","logEntry","output","entry","lines","contextKeys","contextFields","data","sanitized","sensitiveFields","field","serialized","NullLogger","_message","_context","_error","VersionMismatchError","expected","actual","EncryptionError","cause","CompressionError","StorageError","layer","TimeoutError","operation","timeoutMs","DEFAULT_TTL_CONFIG","DEFAULT_RESILIENCE_CONFIG","DEFAULT_OBSERVABILITY_CONFIG","DEFAULT_SECURITY_CONFIG","DEVELOPMENT","PRODUCTION","TESTING","PRESETS","createHybridConfigFromPreset","presetName","overrides","preset","getPreset","name","TtlConfigSchema","z","ResilienceConfigSchema","SecurityConfigSchema","ObservabilityConfigSchema","HybridStoreConfigSchema","ConfigPresetSchema","validateAndReportConfig","config","result","calculateSeverity","generateFix","analyzeConfigPerformance","scanConfigSecurity","validatedConfig","generateOptimizationWarnings","validatePreset","analyzePresetPerformance","code","_code","score","warnings","CRYPTO_CONSTANTS","KeyManager","oldKey","keyId","removed","CryptoService","fieldName","dataLength","masterKey","keyBuffer","derived","createHash","active","expiresAt","plaintext","encrypted","activeKey","k","nonce","randomBytes","cipher","createCipheriv","chunks","ciphertext","authTag","ciphertextBuffer","decipher","createDecipheriv","newMasterKey","keys","expiredCount","createCryptoService","service","tempKey","snappyModule","loadSnappyModule","module","GzipCompressor","gzipSync","gunzipSync","SnappyCompressor","NoOpCompressor","CodecService","json","buffer","_key","BufferJSON","sorted","parsed","sampleData","original","compressed","createCodecService","serializeWithBuffer","deserializeWithBuffer","retryWithBackoff","maxRetries","baseDelay","multiplier","onRetry","lastError","attempt","delay","resolve","calculateExpiresAt","ttlSeconds","calculatePXAT","isExpired","RedisAuthStore","crypto","codec","times","Redis","err","startTime","sessionId","metaKey","metaValue","globalVersion","updatedAt","meta","creds","patch","expectedVersion","newVersion","promises","current","mergedKeys","type","id","_unused","rest","metaData","ttl","encryptedData","decrypted","encoded","createRedisStore","store","useRedisAuthState","redisConfig","enableEncryption","enableCompression","fullRedisConfig","securityConfig","state","initAuthCreds","ids","versioned","allKeys","keysOfType","protoData","proto","currentVersion","MongoAuthStore","MongoClient","doc","now","v","indexOps","results","docId","cached","snapshot","fencingToken","updates","serializedKeys","filter","resilience","MongoError","appState","createMongoStore","useMongoAuthState","cryptoService","codecService","authState","existingSnapshot","metricsRegistry","Registry","redisHitsCounter","Counter","redisMissesCounter","mongoFallbacksCounter","queuePublishesCounter","queueFailuresCounter","directWritesCounter","circuitBreakerOpenCounter","circuitBreakerCloseCounter","circuitBreakerHalfOpenCounter","outboxReconcilerLatencyHistogram","Histogram","outboxReconcilerFailuresCounter","operationLatencyHistogram","batchOperationsCounter","batchOperationsDurationHistogram","versionConflictCounter","cacheWarmingCounter","circuitBreakerStateGauge","outboxQueueSizeGauge","outboxReconciliationLatencyHistogram","operationTimeoutCounter","getMetricsText","resetMetrics","OutboxManager","redis","mongo","logger","version","entryId","outboxKey","entryStr","entries","pending","a","b","outboxKeys","entryStartTime","latency","totalLatency","oneHourAgo","HybridAuthStore","CircuitBreaker","redisClient","queueError","errors","redisHealthy","mongoHealthy","totalRequests","hitRatio","sessionIds","redisResults","mongoIds","duration","successful","failed","Mutex","mutex","createHybridStore","useHybridAuthState","redisStore","mongoStore","hybridStore","performHealthCheck","components","stateString","isOpen","allHealthy","circuitBreakerOpen","status","isReady","health","c","isLive","ErrorDomain","ErrorSeverity","ErrorCode","getErrorMetadata","baseUrl","partial","isRetryable","getRetryDelay","baseDelayMs","exponentialDelay","jitter"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @baileys-store/core - Baileys Type Safety Layer\n *\n * Strong typing for Baileys v7.0+ authentication state\n * Ensures 100% type safety across the entire auth pipeline\n */\n\nimport type { AuthenticationCreds, SignalDataTypeMap } from '@whiskeysockets/baileys';\n\n/**\n * Type-safe key pair structure\n * Ensures private and public keys are real Buffers\n */\nexport interface TypedKeyPair {\n  private: Buffer;\n  public: Buffer;\n}\n\n/**\n * Type-safe authentication credentials\n * Uses AuthenticationCreds as base without extending to avoid conflicts\n */\nexport type TypedAuthenticationCreds = Omit<\n  AuthenticationCreds,\n  'noiseKey' | 'pairingEphemeralKeyPair' | 'signedIdentityKey' | 'signedPreKey'\n> & {\n  // Override with strict Buffer types\n  noiseKey: TypedKeyPair;\n  pairingEphemeralKeyPair: TypedKeyPair;\n  signedIdentityKey: TypedKeyPair;\n  signedPreKey: {\n    keyId: number;\n    keyPair: TypedKeyPair;\n    signature: Buffer;\n  };\n};\n\n/**\n * Type-safe signal keys storage\n * Maps signal key types to their respective data structures\n */\nexport interface TypedSignalKeyStore {\n  'pre-key': Record<\n    string,\n    {\n      keyId: number;\n      keyPair: {\n        private: Buffer;\n        public: Buffer;\n      };\n    }\n  >;\n  session: Record<\n    string,\n    {\n      registrationId: number;\n      currentRatchet: {\n        ephemeralKeyPair: {\n          pubKey: Buffer;\n          privKey: Buffer;\n        };\n        lastRemoteEphemeralKey: Buffer;\n        previousCounter: number;\n        rootKey: Buffer;\n      };\n      indexInfo: {\n        baseKey: Buffer;\n        baseKeyType: number;\n        closed: number;\n        used: number;\n        created: number;\n        remoteIdentityKey: Buffer;\n      };\n      oldRatchetList: {\n        added: number;\n        ephemeralKey: Buffer;\n      }[];\n    }\n  >;\n  'sender-key': Record<\n    string,\n    Record<\n      string,\n      {\n        chainKey: Buffer;\n        iteration: number;\n        messageKeys: {\n          iteration: number;\n          seed: Buffer;\n        }[];\n      }\n    >\n  >;\n  'app-state-sync-key': Record<\n    string,\n    {\n      keyData: Buffer;\n      fingerprint: {\n        rawId: number;\n        currentIndex: number;\n        deviceIndexes: number[];\n      };\n      timestamp: number;\n    }\n  >;\n  'app-state-sync-version': Record<\n    string,\n    {\n      version: number;\n      hash: Buffer;\n      indexValueMap: Record<\n        string,\n        {\n          valueMac: Buffer;\n        }\n      >;\n    }\n  >;\n  'sender-key-memory': Record<string, Buffer>;\n}\n\n/**\n * Type guard to validate Buffer objects\n */\nexport function isValidBuffer(value: unknown): value is Buffer {\n  return Buffer.isBuffer(value);\n}\n\n/**\n * Type guard to validate key pair objects\n */\nexport function isValidKeyPair(value: unknown): value is TypedKeyPair {\n  if (typeof value !== 'object' || value === null) return false;\n\n  const keyPair = value as Record<string, unknown>;\n  return (\n    'private' in keyPair &&\n    'public' in keyPair &&\n    isValidBuffer(keyPair.private) &&\n    isValidBuffer(keyPair.public)\n  );\n}\n\n/**\n * Type guard to validate authentication credentials\n */\nexport function isValidAuthCreds(value: unknown): value is TypedAuthenticationCreds {\n  if (typeof value !== 'object' || value === null) return false;\n\n  const creds = value as Record<string, unknown>;\n\n  // Check required fields\n  if (!isValidKeyPair(creds.noiseKey)) return false;\n  if (!isValidKeyPair(creds.signedIdentityKey)) return false;\n  if (typeof creds.advSecretKey !== 'string') return false;\n\n  // Check signedPreKey structure\n  const signedPreKey = creds.signedPreKey as Record<string, unknown>;\n  if (\n    typeof signedPreKey.keyId !== 'number' ||\n    !isValidKeyPair(signedPreKey.keyPair) ||\n    !isValidBuffer(signedPreKey.signature)\n  ) {\n    return false;\n  }\n\n  // Check pairingEphemeralKeyPair (required in Baileys v7+)\n  if (!isValidKeyPair(creds.pairingEphemeralKeyPair)) return false;\n\n  return true;\n}\n\n/**\n * Deep type assertion for nested Buffer objects\n * RC.6 Fix: Ensures all Buffers are real Buffer instances\n */\nexport function assertBufferTypes(obj: unknown, path = 'root'): void {\n  if (obj === null || obj === undefined) return;\n\n  if (typeof obj === 'object') {\n    // Check if it's a Buffer-like object that wasn't converted\n    if ('type' in obj && (obj as Record<string, unknown>).type === 'Buffer' && 'data' in obj) {\n      throw new TypeError(\n        `Found unconverted Buffer-like object at ${path}. ` +\n          `This indicates a serialization bug in the codec layer.`,\n      );\n    }\n\n    // Recursively check nested objects\n    if (Array.isArray(obj)) {\n      obj.forEach((item, index) => {\n        assertBufferTypes(item, `${path}[${String(index)}]`);\n      });\n    } else {\n      for (const [key, value] of Object.entries(obj)) {\n        assertBufferTypes(value, `${path}.${key}`);\n      }\n    }\n  }\n}\n\n/**\n * Type-safe signal data type mapping\n * Ensures compile-time safety for all signal operations\n */\nexport type StrictSignalDataTypeMap = {\n  [K in keyof SignalDataTypeMap]: SignalDataTypeMap[K];\n};\n\n/**\n * Export Baileys types for convenience\n */\nexport type { AuthenticationCreds, SignalDataTypeMap } from '@whiskeysockets/baileys';\n","/**\n * Execution Context - Context propagation using AsyncLocalStorage\n * \n * Provides automatic context propagation for:\n * - Correlation IDs\n * - Request IDs\n * - User IDs\n * - Session IDs\n * \n * Ensures context is available across async boundaries.\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\nimport { randomUUID } from 'crypto';\n\nexport interface ExecutionContext {\n  correlationId: string;\n  requestId: string;\n  userId?: string;\n  sessionId?: string;\n  startTime: number;\n  environment: 'development' | 'production' | 'test';\n  metadata?: Record<string, string>;\n}\n\nexport const executionContext = new AsyncLocalStorage<ExecutionContext>();\n\n/**\n * Get current execution context\n */\nexport function getContext(): ExecutionContext | undefined {\n  return executionContext.getStore();\n}\n\n/**\n * Run function with execution context\n */\nexport function withContext<T>(\n  context: Partial<ExecutionContext>,\n  fn: () => T\n): T {\n  const fullContext: ExecutionContext = {\n    correlationId: context.correlationId ?? randomUUID(),\n    requestId: context.requestId ?? generateRequestId(),\n    startTime: Date.now(),\n    environment: context.environment ?? 'production',\n    ...context,\n  };\n  \n  return executionContext.run(fullContext, fn);\n}\n\n/**\n * Generate unique request ID\n */\nfunction generateRequestId(): string {\n  const timestamp = Date.now();\n  const random = Math.random().toString(36).slice(2);\n  return timestamp.toString() + '-' + random;\n}\n\n/**\n * Get correlation ID from current context\n */\nexport function getCorrelationId(): string | undefined {\n  const context = getContext();\n  return context?.correlationId;\n}\n\n/**\n * Get request ID from current context\n */\nexport function getRequestId(): string | undefined {\n  const context = getContext();\n  return context?.requestId;\n}\n\n/**\n * Get operation duration in milliseconds\n */\nexport function getOperationDuration(): number | undefined {\n  const context = getContext();\n  if (context) {\n    return Date.now() - context.startTime;\n  }\n  return undefined;\n}\n\n/**\n * Run function with specific correlation ID\n * \n * @param correlationId - Correlation ID to use\n * @param fn - Function to execute\n * @returns Result of function execution\n * \n * @example\n * ```typescript\n * const result = await withCorrelationId('req-123', async () => {\n *   // All async operations in this function will have correlationId='req-123'\n *   const data = await store.get('session1');\n *   return data;\n * });\n * ```\n */\nexport function withCorrelationId<T>(\n  correlationId: string,\n  fn: () => T\n): T {\n  return withContext({ correlationId }, fn);\n}\n\n/**\n * Set metadata in current context\n * \n * @param metadata - Key-value pairs to add to context\n * \n * @example\n * ```typescript\n * setContextMetadata({ \n *   userId: 'user-123',\n *   sessionId: 'session-456' \n * });\n * ```\n */\nexport function setContextMetadata(metadata: Record<string, string>): void {\n  const context = getContext();\n  if (context) {\n    context.metadata = {\n      ...context.metadata,\n      ...metadata,\n    };\n  }\n}\n\n/**\n * Get metadata from current context\n * \n * @param key - Metadata key\n * @returns Metadata value or undefined\n * \n * @example\n * ```typescript\n * const userId = getContextMetadata('userId');\n * ```\n */\nexport function getContextMetadata(key: string): string | undefined {\n  const context = getContext();\n  return context?.metadata?.[key];\n}\n\n/**\n * Check if current context has correlation ID\n * \n * @returns Whether correlation ID is present\n */\nexport function hasCorrelationId(): boolean {\n  return getCorrelationId() !== undefined;\n}\n","/**\n * Structured Logging System\n * \n * Provides structured logging with:\n * - Configurable log levels (TRACE, DEBUG, INFO, WARN, ERROR)\n * - Automatic context propagation (correlationId, requestId)\n * - Data sanitization for sensitive information\n * - JSON output for production\n */\n\nimport { getContext } from '../context/execution-context.js';\n\nexport enum LogLevel {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  SILENT = 5,\n}\n\nexport type LogContext = Record<string, unknown>;\n\nexport interface StructuredLogger {\n  trace(message: string, context?: LogContext): void;\n  debug(message: string, context?: LogContext): void;\n  info(message: string, context?: LogContext): void;\n  warn(message: string, context?: LogContext): void;\n  error(message: string, error?: Error, context?: LogContext): void;\n}\n\nexport class ConsoleStructuredLogger implements StructuredLogger {\n  private level: LogLevel;\n\n  constructor(\n    private environment: 'development' | 'production' | 'test',\n    options?: { level?: LogLevel }\n  ) {\n    this.level = options?.level ?? this.getDefaultLevel();\n  }\n\n  private getDefaultLevel(): LogLevel {\n    switch (this.environment) {\n      case 'development':\n        return LogLevel.DEBUG;\n      case 'production':\n        return LogLevel.WARN;\n      case 'test':\n        return LogLevel.SILENT;\n    }\n  }\n\n  trace(message: string, context?: LogContext): void {\n    if (this.level <= LogLevel.TRACE) {\n      this.log('TRACE', message, context);\n    }\n  }\n\n  debug(message: string, context?: LogContext): void {\n    if (this.level <= LogLevel.DEBUG) {\n      this.log('DEBUG', message, context);\n    }\n  }\n\n  info(message: string, context?: LogContext): void {\n    if (this.level <= LogLevel.INFO) {\n      this.log('INFO', message, context);\n    }\n  }\n\n  warn(message: string, context?: LogContext): void {\n    if (this.level <= LogLevel.WARN) {\n      this.log('WARN', message, context);\n    }\n  }\n\n  error(message: string, error?: Error, context?: LogContext): void {\n    if (this.level <= LogLevel.ERROR) {\n      const errorContext = error ? { ...context, error: this.serializeError(error) } : context;\n      this.log('ERROR', message, errorContext);\n    }\n  }\n\n  private log(level: string, message: string, context?: LogContext): void {\n    const execContext = getContext();\n    const logEntry = {\n      level,\n      timestamp: new Date().toISOString(),\n      message,\n      correlationId: execContext?.correlationId,\n      requestId: execContext?.requestId,\n      duration: execContext ? Date.now() - execContext.startTime : undefined,\n      environment: this.environment,\n      ...this.sanitize(context),\n    };\n\n    const output = this.environment === 'production' \n      ? JSON.stringify(logEntry)\n      : this.formatPretty(logEntry);\n\n    // Use appropriate console method\n     \n    switch (level) {\n      case 'ERROR':\n         \n        console.error(output);\n        break;\n      case 'WARN':\n         \n        console.warn(output);\n        break;\n      default:\n        // eslint-disable-next-line no-console\n        console.log(output);\n    }\n  }\n\n  private formatPretty(entry: Record<string, unknown>): string {\n    const timestamp = typeof entry.timestamp === 'string' ? entry.timestamp : '';\n    const level = typeof entry.level === 'string' ? entry.level : '';\n    const message = typeof entry.message === 'string' ? entry.message : '';\n    \n    const lines = [\n      `${timestamp} [${level}] ${message}`,\n    ];\n    \n    // Add correlationId if present\n    if (entry.correlationId) {\n      const correlationId = typeof entry.correlationId === 'string' \n        ? entry.correlationId \n        : JSON.stringify(entry.correlationId);\n      lines.push('  correlationId: ' + correlationId);\n    }\n    \n    // Add all other context fields (excluding metadata)\n    const contextKeys = ['correlationId', 'requestId', 'timestamp', 'level', 'message', 'environment', 'duration'];\n    const contextFields: Record<string, unknown> = {};\n    \n    for (const [key, value] of Object.entries(entry)) {\n      if (!contextKeys.includes(key) && value !== undefined) {\n        contextFields[key] = value;\n      }\n    }\n    \n    if (Object.keys(contextFields).length > 0) {\n      lines.push(`  context: ${JSON.stringify(contextFields, null, 2)}`);\n    }\n    \n    return lines.join('\\n');\n  }\n\n  private sanitize(data: Record<string, unknown> | undefined): Record<string, unknown> {\n    if (!data) return {};\n    \n    const sanitized: Record<string, unknown> = {};\n    const sensitiveFields = ['masterKey', 'password', 'token', 'secret', 'apiKey', 'privateKey', 'keyData'];\n    \n    for (const [key, value] of Object.entries(data)) {\n      if (sensitiveFields.some(field => key.toLowerCase().includes(field.toLowerCase()))) {\n        sanitized[key] = '[REDACTED]';\n      } else {\n        sanitized[key] = value;\n      }\n    }\n    \n    return sanitized;\n  }\n\n  private serializeError(error: unknown): unknown {\n    if (error instanceof Error) {\n      const serialized: Record<string, unknown> = {\n        message: error.message,\n        name: error.name,\n        stack: error.stack,\n      };\n      \n      if (error.cause) {\n        serialized.cause = error.cause;\n      }\n      \n      return serialized;\n    }\n    return error;\n  }\n}\n\nexport class NullLogger implements StructuredLogger {\n  trace(_message: string, _context?: LogContext): void {\n    // Intentionally empty - no-op implementation\n  }\n  debug(_message: string, _context?: LogContext): void {\n    // Intentionally empty - no-op implementation\n  }\n  info(_message: string, _context?: LogContext): void {\n    // Intentionally empty - no-op implementation\n  }\n  warn(_message: string, _context?: LogContext): void {\n    // Intentionally empty - no-op implementation\n  }\n  error(_message: string, _error?: Error, _context?: LogContext): void {\n    // Intentionally empty - no-op implementation\n  }\n}\n","/**\n * @baileys-store/core - Shared Types\n *\n * Universal auth state library for Baileys v7.0+\n * Supports Redis, MongoDB, and hybrid strategies\n * Strong typing ensures compile-time safety across the entire auth pipeline\n */\n\nimport type { AuthenticationCreds } from '@whiskeysockets/baileys';\n\n// Export Baileys type safety layer\nexport * from './baileys.js';\n\n/**\n * Simplified session identifier\n * For multi-tenancy, use format: \"tenantId:deviceId\"\n */\nexport type SessionId = string;\n\n/**\n * Complete authentication state snapshot\n */\nexport interface AuthSnapshot {\n  creds: AuthenticationCreds;\n  keys: Record<string, Record<string, unknown>>;\n  appState?: Record<string, unknown>;\n}\n\n/**\n * Partial patch for incremental updates\n */\nexport type AuthPatch = Partial<AuthSnapshot>;\n\n/**\n * Version for optimistic locking\n */\nexport interface Versioned<T = unknown> {\n  data: T;\n  version: number;\n  updatedAt: Date;\n}\n\n/**\n * Operation result with version\n */\nexport interface VersionedResult {\n  version: number;\n  updatedAt: Date;\n  success: boolean;\n}\n\n/**\n * Main storage interface (Strategy Pattern)\n * All adapters (Redis, MongoDB, Hybrid) implement this interface\n */\n/**\n * Batch update entry\n */\nexport interface BatchUpdate {\n  sessionId: SessionId;\n  patch: AuthPatch;\n  expectedVersion?: number;\n}\n\n/**\n * Batch result with errors\n */\nexport interface BatchResult<T> {\n  successful: Map<SessionId, T>;\n  failed: Map<SessionId, Error>;\n}\n\nexport interface AuthStore {\n  /**\n   * Get complete snapshot\n   * @throws {VersionMismatchError} if version doesn't match\n   */\n  get(sessionId: SessionId): Promise<Versioned<AuthSnapshot> | null>;\n\n  /**\n   * Update snapshot (total or partial)\n   * @param expectedVersion - For optimistic locking (optional)\n   * @throws {VersionMismatchError} if version doesn't match\n   */\n  set(\n    sessionId: SessionId,\n    patch: AuthPatch,\n    expectedVersion?: number,\n    fencingToken?: number,\n  ): Promise<VersionedResult>;\n\n  /**\n   * Delete snapshot\n   */\n  delete(sessionId: SessionId): Promise<void>;\n\n  /**\n   * Renew TTL (keep-alive)\n   */\n  touch(sessionId: SessionId, ttlSeconds?: number): Promise<void>;\n\n  /**\n   * Check existence\n   */\n  exists(sessionId: SessionId): Promise<boolean>;\n\n  /**\n   * Health check\n   */\n  isHealthy(): Promise<boolean>;\n\n  /**\n   * Batch get multiple snapshots\n   * @returns Map of sessionId -> snapshot (or null if not found)\n   */\n  batchGet?(sessionIds: SessionId[]): Promise<Map<SessionId, Versioned<AuthSnapshot> | null>>;\n\n  /**\n   * Batch set multiple snapshots\n   * @returns Batch result with successful and failed operations\n   */\n  batchSet?(updates: BatchUpdate[]): Promise<BatchResult<VersionedResult>>;\n\n  /**\n   * Batch delete multiple snapshots\n   * @returns Batch result with successful and failed operations\n   */\n  batchDelete?(sessionIds: SessionId[]): Promise<BatchResult<void>>;\n}\n\n/**\n * TTL and expiration configuration\n */\nexport interface TtlConfig {\n  /** Default TTL in seconds (default: 86400 = 24h) */\n  defaultTtl: number;\n  /** TTL for creds (default: 86400 = 24h) */\n  credsTtl: number;\n  /** TTL for keys (default: 86400 = 24h) */\n  keysTtl: number;\n  /** TTL for locks (default: 5s) */\n  lockTtl: number;\n}\n\n/**\n * Resilience configuration\n */\nexport interface ResilienceConfig {\n  /** Operation timeout in ms */\n  operationTimeout: number;\n  /** Number of retries */\n  maxRetries: number;\n  /** Base retry interval in ms */\n  retryBaseDelay: number;\n  /** Exponential backoff multiplier */\n  retryMultiplier: number;\n}\n\n/**\n * Observability configuration\n */\nexport interface ObservabilityConfig {\n  /** Enable Prometheus metrics */\n  enableMetrics: boolean;\n  /** Enable distributed tracing */\n  enableTracing: boolean;\n  /** Enable detailed structured logs */\n  enableDetailedLogs: boolean;\n  /** Metrics collection interval in ms */\n  metricsInterval: number;\n}\n\n/**\n * Logger interface for configurable logging\n */\nexport interface Logger {\n  debug(message: string, data?: Record<string, unknown>): void;\n  info(message: string, data?: Record<string, unknown>): void;\n  warn(message: string, data?: Record<string, unknown>): void;\n  error(message: string, data?: Record<string, unknown>): void;\n}\n\n/**\n * Null logger implementation (no-op)\n */\nexport class NullLogger implements Logger {\n  debug(): void {\n    // No-op implementation\n  }\n  info(): void {\n    // No-op implementation\n  }\n  warn(): void {\n    // No-op implementation\n  }\n  error(): void {\n    // No-op implementation\n  }\n}\n\n/**\n * Console logger implementation (legacy)\n * @deprecated Use StructuredLogger from @baileys-store/core/logger instead\n */\nexport class ConsoleLogger implements Logger {\n  debug(msg: string, data?: Record<string, unknown>): void {\n    console.debug(msg, data ?? '');\n  }\n  info(msg: string, data?: Record<string, unknown>): void {\n    // eslint-disable-next-line no-console\n    console.info(msg, data ?? '');\n  }\n  warn(msg: string, data?: Record<string, unknown>): void {\n    console.warn(msg, data ?? '');\n  }\n  error(msg: string, data?: Record<string, unknown>): void {\n    console.error(msg, data ?? '');\n  }\n}\n\n// Re-export StructuredLogger from logger module\nexport {\n  ConsoleStructuredLogger,\n  NullLogger as NullLoggerStructured,\n  LogLevel,\n  type StructuredLogger,\n  type LogContext,\n} from '../logger/index.js';\n\n/**\n * Security configuration\n */\nexport interface SecurityConfig {\n  /** Enable app-level encryption */\n  enableEncryption: boolean;\n  /** Encryption algorithm (default: 'secretbox') */\n  encryptionAlgorithm: 'secretbox' | 'aes-256-gcm';\n  /** Key rotation in days */\n  keyRotationDays: number;\n  /** Enable compression */\n  enableCompression: boolean;\n  /** Compression algorithm (default: 'snappy') */\n  compressionAlgorithm: 'snappy' | 'gzip' | 'lz4';\n  /** Enable debug logging (default: false) */\n  enableDebugLogging?: boolean;\n  /** Environment (default: 'production') */\n  environment?: 'development' | 'production' | 'test';\n  /** Custom logger instance (default: NullLogger) */\n  logger?: Logger;\n}\n\n/**\n * Encrypted data\n */\nexport interface EncryptedData {\n  /** Encrypted data */\n  ciphertext: Buffer;\n  /** Nonce/IV */\n  nonce: Buffer;\n  /** Key ID used */\n  keyId: string;\n  /** Schema version */\n  schemaVersion: number;\n  /** Creation timestamp */\n  timestamp: Date;\n}\n\n/**\n * Cache metrics\n */\nexport interface CacheMetrics {\n  hits: number;\n  misses: number;\n  hitRatio: number;\n  latencyP50: number;\n  latencyP95: number;\n  latencyP99: number;\n  evictions: number;\n  keyspaceSize: number;\n}\n\n/**\n * Persistence metrics\n */\nexport interface PersistenceMetrics {\n  writeBehindLag: number; // ms\n  writeSuccessRate: number; // 0-1\n  writeFailures: number;\n  replayCount: number;\n  lastSyncTime: Date;\n}\n\n/**\n * Baileys metrics\n */\nexport interface BaileysMetrics {\n  reconnections: number;\n  decryptFailures: number;\n  rehydrateTime: number; // ms\n  eventProcessingTime: number; // ms\n}\n\n/**\n * Aggregated system metrics\n */\nexport interface SystemMetrics {\n  cache: CacheMetrics;\n  persistence: PersistenceMetrics;\n  baileys: BaileysMetrics;\n  uptime: number; // seconds\n  timestamp: Date;\n}\n\n/**\n * Custom errors\n */\nexport class VersionMismatchError extends Error {\n  constructor(\n    public readonly expected: number,\n    public readonly actual: number,\n  ) {\n    super(`Version mismatch: expected ${String(expected)}, got ${String(actual)}`);\n    this.name = 'VersionMismatchError';\n  }\n}\n\nexport class EncryptionError extends Error {\n  constructor(\n    message: string,\n    public readonly cause?: Error,\n  ) {\n    super(message);\n    this.name = 'EncryptionError';\n  }\n}\n\nexport class CompressionError extends Error {\n  constructor(\n    message: string,\n    public readonly cause?: Error,\n  ) {\n    super(message);\n    this.name = 'CompressionError';\n  }\n}\n\nexport class StorageError extends Error {\n  constructor(\n    message: string,\n    public readonly layer: 'redis' | 'mongo' | 'hybrid',\n    public readonly cause?: Error,\n  ) {\n    super(message);\n    this.name = 'StorageError';\n  }\n}\n\nexport class TimeoutError extends Error {\n  constructor(\n    message: string,\n    public readonly operation: string,\n    public readonly timeoutMs: number,\n  ) {\n    super(message);\n    this.name = 'TimeoutError';\n  }\n}\n\n/**\n * Default TTL values\n */\nexport const DEFAULT_TTL_CONFIG: TtlConfig = {\n  defaultTtl: 86400, // 24h\n  credsTtl: 86400, // 24h\n  keysTtl: 86400, // 24h\n  lockTtl: 5, // 5s\n};\n\n/**\n * Default resilience values\n */\nexport const DEFAULT_RESILIENCE_CONFIG: ResilienceConfig = {\n  operationTimeout: 5000, // 5s\n  maxRetries: 3,\n  retryBaseDelay: 100, // 100ms\n  retryMultiplier: 2,\n};\n\n/**\n * Default observability values\n */\nexport const DEFAULT_OBSERVABILITY_CONFIG: ObservabilityConfig = {\n  enableMetrics: true,\n  enableTracing: false,\n  enableDetailedLogs: false,\n  metricsInterval: 60000, // 1 min\n};\n\n/**\n * Default security values\n */\nexport const DEFAULT_SECURITY_CONFIG: SecurityConfig = {\n  enableEncryption: true,\n  encryptionAlgorithm: 'secretbox',\n  keyRotationDays: 90,\n  enableCompression: true,\n  compressionAlgorithm: 'snappy',\n};\n","/**\n * @baileys-store/core - Configuration Presets\n *\n * Pre-configured presets for different environments\n * Each preset is optimized for specific use cases and tested in production-like scenarios\n */\n\nimport type {\n  TtlConfig,\n  ResilienceConfig,\n  ObservabilityConfig,\n  SecurityConfig,\n} from '../types/index.js';\nimport type { HybridStoreConfig } from '../types/config.js';\n\n/**\n * Configuration Preset\n * Represents a complete configuration optimized for a specific environment\n */\nexport interface ConfigPreset {\n  ttl: TtlConfig;\n  resilience: ResilienceConfig;\n  security: SecurityConfig;\n  observability: ObservabilityConfig;\n}\n\n/**\n * DEVELOPMENT Preset\n *\n * Optimized for local development with:\n * - Short TTLs for rapid iteration\n * - Long timeouts for debugging\n * - Detailed logging\n * - Encryption disabled for simplicity\n *\n * Use Case: Development, debugging, local testing\n */\nexport const DEVELOPMENT: ConfigPreset = {\n  ttl: {\n    defaultTtl: 300, // 5 minutes - short enough to test expiration\n    credsTtl: 3600, // 1 hour\n    keysTtl: 3600, // 1 hour\n    lockTtl: 5, // 5 seconds\n  },\n  resilience: {\n    operationTimeout: 10000, // 10s - longer timeout for debugging\n    maxRetries: 2, // Fewer retries to fail fast during development\n    retryBaseDelay: 200, // 200ms base delay\n    retryMultiplier: 2,\n  },\n  security: {\n    enableEncryption: false, // Disabled for easier debugging\n    enableCompression: false, // Disabled for easier debugging\n    encryptionAlgorithm: 'secretbox',\n    compressionAlgorithm: 'snappy',\n    keyRotationDays: 365, // Not enforced when encryption disabled\n    enableDebugLogging: true, // Enable debug logs\n    environment: 'development',\n  },\n  observability: {\n    enableMetrics: true, // Metrics helpful during development\n    enableTracing: false, // Tracing overhead not needed\n    enableDetailedLogs: true, // Detailed logs for debugging\n    metricsInterval: 60000, // 1 minute\n  },\n};\n\n/**\n * PRODUCTION Preset\n *\n * Optimized for production with:\n * - Long TTLs to minimize database load\n * - Aggressive timeouts for fast failures\n * - Encryption mandatory\n * - Minimal logging\n *\n * Use Case: Production deployments, high availability\n */\nexport const PRODUCTION: ConfigPreset = {\n  ttl: {\n    defaultTtl: 3600, // 1 hour - balance between performance and freshness\n    credsTtl: 604800, // 7 days - credentials change rarely\n    keysTtl: 604800, // 7 days - keys change rarely\n    lockTtl: 5, // 5 seconds\n  },\n  resilience: {\n    operationTimeout: 5000, // 5s - aggressive timeout\n    maxRetries: 3, // Retry 3 times with exponential backoff\n    retryBaseDelay: 100, // 100ms base delay\n    retryMultiplier: 2, // Exponential backoff\n  },\n  security: {\n    enableEncryption: true, // Mandatory in production\n    enableCompression: true, // Reduce storage costs\n    encryptionAlgorithm: 'aes-256-gcm', // Stronger algorithm for production\n    compressionAlgorithm: 'snappy', // Fast compression\n    keyRotationDays: 90, // Rotate keys every 90 days\n    enableDebugLogging: false, // No debug logs in production\n    environment: 'production',\n  },\n  observability: {\n    enableMetrics: true, // Essential for production monitoring\n    enableTracing: false, // Optional (can be enabled if needed)\n    enableDetailedLogs: false, // Reduced logging to minimize I/O\n    metricsInterval: 60000, // 1 minute\n  },\n};\n\n/**\n * TESTING Preset\n *\n * Optimized for automated tests with:\n * - Very short TTLs for quick test execution\n * - Fast timeouts\n * - No encryption for speed\n * - Metrics disabled to reduce overhead\n *\n * Use Case: Unit tests, integration tests, E2E tests\n */\nexport const TESTING: ConfigPreset = {\n  ttl: {\n    defaultTtl: 30, // 30 seconds - short enough for fast tests\n    credsTtl: 60, // 1 minute\n    keysTtl: 60, // 1 minute\n    lockTtl: 1, // 1 second - minimal lock duration\n  },\n  resilience: {\n    operationTimeout: 2000, // 2s - fail fast in tests\n    maxRetries: 1, // Single retry for test speed\n    retryBaseDelay: 50, // 50ms base delay\n    retryMultiplier: 1, // No exponential backoff\n  },\n  security: {\n    enableEncryption: false, // Disabled for test speed\n    enableCompression: false, // Disabled for test speed\n    encryptionAlgorithm: 'secretbox',\n    compressionAlgorithm: 'gzip', // Lighter compression\n    keyRotationDays: 365, // Not enforced when encryption disabled\n    enableDebugLogging: false, // Quiet tests\n    environment: 'test',\n  },\n  observability: {\n    enableMetrics: false, // Metrics add overhead in tests\n    enableTracing: false, // No tracing in tests\n    enableDetailedLogs: false, // Quiet tests\n    metricsInterval: 5000, // 5s (if metrics enabled)\n  },\n};\n\n/**\n * Preset Registry\n * Map of preset names to configurations\n */\nexport const PRESETS = {\n  DEVELOPMENT,\n  PRODUCTION,\n  TESTING,\n} as const;\n\nexport type PresetName = keyof typeof PRESETS;\n\n/**\n * Create a HybridStoreConfig from a preset\n *\n * @param presetName - Name of the preset (DEVELOPMENT, PRODUCTION, TESTING)\n * @param overrides - Optional overrides for connection strings and other required fields\n * @returns Complete HybridStoreConfig ready to use\n *\n * @example\n * ```typescript\n * const config = createHybridConfigFromPreset('PRODUCTION', {\n *   mongoUrl: 'mongodb://localhost:27017',\n *   mongoDatabase: 'whatsapp',\n *   mongoCollection: 'sessions',\n *   masterKey: process.env.BAILEYS_MASTER_KEY,\n * });\n * ```\n */\nexport function createHybridConfigFromPreset(\n  presetName: PresetName,\n  overrides: Partial<Pick<HybridStoreConfig, 'mongoUrl' | 'mongoDatabase' | 'mongoCollection' | 'redisUrl' | 'masterKey'>>,\n): HybridStoreConfig {\n  const preset = PRESETS[presetName];\n\n  return {\n    mongoUrl: overrides.mongoUrl ?? '',\n    mongoDatabase: overrides.mongoDatabase ?? 'baileys_store',\n    mongoCollection: overrides.mongoCollection ?? 'sessions',\n    redisUrl: overrides.redisUrl,\n    ttl: preset.ttl,\n    resilience: preset.resilience,\n    security: preset.security,\n    observability: preset.observability,\n    masterKey: overrides.masterKey,\n    enableWriteBehind: false, // Disabled by default (can be overridden)\n    writeBehindFlushInterval: 1000, // 1 second\n    writeBehindQueueSize: 1000,\n  };\n}\n\n/**\n * Get preset by name\n *\n * @param name - Preset name\n * @returns Configuration preset\n */\nexport function getPreset(name: PresetName): ConfigPreset {\n  return PRESETS[name];\n}\n\n/**\n * Validate preset configuration\n * Checks if preset values are within acceptable ranges\n *\n * @param preset - Preset to validate\n * @returns Array of validation errors (empty if valid)\n * @deprecated Use validatePreset from src/validation/reporter.ts instead\n */\nexport function validatePreset(preset: ConfigPreset): string[] {\n  const errors: string[] = [];\n\n  // Validate TTLs\n  if (preset.ttl.defaultTtl < 1) {\n    errors.push('defaultTtl must be at least 1 second');\n  }\n  if (preset.ttl.credsTtl < 1) {\n    errors.push('credsTtl must be at least 1 second');\n  }\n  if (preset.ttl.keysTtl < 1) {\n    errors.push('keysTtl must be at least 1 second');\n  }\n  if (preset.ttl.lockTtl < 1) {\n    errors.push('lockTtl must be at least 1 second');\n  }\n\n  // Validate resilience\n  if (preset.resilience.operationTimeout < 100) {\n    errors.push('operationTimeout must be at least 100ms');\n  }\n  if (preset.resilience.maxRetries < 0 || preset.resilience.maxRetries > 10) {\n    errors.push('maxRetries must be between 0 and 10');\n  }\n  if (preset.resilience.retryBaseDelay < 0) {\n    errors.push('retryBaseDelay must be non-negative');\n  }\n  if (preset.resilience.retryMultiplier < 1) {\n    errors.push('retryMultiplier must be at least 1');\n  }\n\n  // Validate security\n  if (preset.security.enableEncryption && preset.security.keyRotationDays < 1) {\n    errors.push('keyRotationDays must be at least 1 day when encryption is enabled');\n  }\n\n  return errors;\n}\n","/**\n * @baileys-store/core - Zod Validation Schemas\n *\n * Schemas for runtime configuration validation\n * Provides type-safe validation with helpful error messages\n */\n\nimport { z } from 'zod';\n\n/**\n * TTL Configuration Schema\n */\nexport const TtlConfigSchema = z.object({\n  defaultTtl: z\n    .number()\n    .int()\n    .min(1, 'defaultTtl must be at least 1 second')\n    .describe('Default TTL for session snapshots (seconds)'),\n\n  credsTtl: z\n    .number()\n    .int()\n    .min(1, 'credsTtl must be at least 1 second')\n    .describe('TTL for credentials (seconds)'),\n\n  keysTtl: z\n    .number()\n    .int()\n    .min(1, 'keysTtl must be at least 1 second')\n    .describe('TTL for keys (seconds)'),\n\n  lockTtl: z\n    .number()\n    .int()\n    .min(1, 'lockTtl must be at least 1 second')\n    .describe('TTL for distributed locks (seconds)'),\n});\n\n/**\n * Resilience Configuration Schema\n */\nexport const ResilienceConfigSchema = z.object({\n  operationTimeout: z\n    .number()\n    .int()\n    .min(100, 'operationTimeout must be at least 100ms')\n    .max(60000, 'operationTimeout should not exceed 60s')\n    .describe('Timeout for storage operations (milliseconds)'),\n\n  maxRetries: z\n    .number()\n    .int()\n    .min(0, 'maxRetries must be non-negative')\n    .max(10, 'maxRetries should not exceed 10')\n    .describe('Maximum retry attempts for failed operations'),\n\n  retryBaseDelay: z\n    .number()\n    .int()\n    .min(0, 'retryBaseDelay must be non-negative')\n    .describe('Base delay for exponential backoff (milliseconds)'),\n\n  retryMultiplier: z\n    .number()\n    .min(1, 'retryMultiplier must be at least 1')\n    .describe('Multiplier for exponential backoff'),\n});\n\n/**\n * Security Configuration Schema\n */\nexport const SecurityConfigSchema = z.object({\n  enableEncryption: z\n    .boolean()\n    .describe('Enable encryption for stored data'),\n\n  enableCompression: z\n    .boolean()\n    .describe('Enable compression for stored data'),\n\n  encryptionAlgorithm: z\n    .enum(['aes-256-gcm', 'secretbox'], {\n      errorMap: () => ({ message: 'encryptionAlgorithm must be either \"aes-256-gcm\" or \"secretbox\"' }),\n    })\n    .describe('Encryption algorithm to use'),\n\n  compressionAlgorithm: z\n    .enum(['snappy', 'gzip', 'lz4'], {\n      errorMap: () => ({ message: 'compressionAlgorithm must be \"snappy\", \"gzip\", or \"lz4\"' }),\n    })\n    .describe('Compression algorithm to use'),\n\n  keyRotationDays: z\n    .number()\n    .int()\n    .min(1, 'keyRotationDays must be at least 1 day')\n    .describe('Key rotation interval (days)'),\n\n  enableDebugLogging: z\n    .boolean()\n    .describe('Enable debug logging (for development only)'),\n\n  environment: z\n    .enum(['development', 'production', 'test'], {\n      errorMap: () => ({ message: 'environment must be \"development\", \"production\", or \"test\"' }),\n    })\n    .describe('Deployment environment'),\n}).refine(\n  (data) => !data.enableEncryption || data.keyRotationDays >= 1,\n  {\n    message: 'keyRotationDays must be at least 1 day when encryption is enabled',\n    path: ['keyRotationDays'],\n  },\n);\n\n/**\n * Observability Configuration Schema\n */\nexport const ObservabilityConfigSchema = z.object({\n  enableMetrics: z\n    .boolean()\n    .describe('Enable Prometheus metrics'),\n\n  enableTracing: z\n    .boolean()\n    .describe('Enable distributed tracing (OpenTelemetry)'),\n\n  enableDetailedLogs: z\n    .boolean()\n    .describe('Enable detailed structured logging'),\n\n  metricsInterval: z\n    .number()\n    .int()\n    .min(1000, 'metricsInterval must be at least 1 second')\n    .describe('Metrics collection interval (milliseconds)'),\n});\n\n/**\n * Hybrid Store Configuration Schema\n */\nexport const HybridStoreConfigSchema = z.object({\n  // Connection strings\n  redisUrl: z\n    .string()\n    .optional()\n    .describe('Redis connection URL'),\n\n  mongoUrl: z\n    .string()\n    .min(1, 'mongoUrl is required')\n    .describe('MongoDB connection URL'),\n\n  mongoDatabase: z\n    .string()\n    .min(1, 'mongoDatabase is required')\n    .describe('MongoDB database name'),\n\n  mongoCollection: z\n    .string()\n    .min(1, 'mongoCollection is required')\n    .describe('MongoDB collection name'),\n\n  // Configuration objects\n  ttl: TtlConfigSchema,\n  resilience: ResilienceConfigSchema,\n  security: SecurityConfigSchema,\n  observability: ObservabilityConfigSchema,\n\n  // Optional fields\n  masterKey: z\n    .string()\n    .optional()\n    .describe('Master encryption key (64 hex characters)'),\n\n  enableWriteBehind: z\n    .boolean()\n    .optional()\n    .describe('Enable write-behind pattern (async MongoDB writes)'),\n\n  writeBehindFlushInterval: z\n    .number()\n    .int()\n    .min(100, 'writeBehindFlushInterval must be at least 100ms')\n    .optional()\n    .describe('Write-behind flush interval (milliseconds)'),\n\n  writeBehindQueueSize: z\n    .number()\n    .int()\n    .min(10, 'writeBehindQueueSize must be at least 10')\n    .max(10000, 'writeBehindQueueSize should not exceed 10000')\n    .optional()\n    .describe('Maximum size of write-behind queue'),\n}).refine(\n  (data) => !data.security.enableEncryption || !!data.masterKey,\n  {\n    message: 'masterKey is required when encryption is enabled',\n    path: ['masterKey'],\n  },\n);\n\n/**\n * Configuration Preset Schema\n */\nexport const ConfigPresetSchema = z.object({\n  ttl: TtlConfigSchema,\n  resilience: ResilienceConfigSchema,\n  security: SecurityConfigSchema,\n  observability: ObservabilityConfigSchema,\n});\n\n// Export types inferred from schemas\nexport type TtlConfig = z.infer<typeof TtlConfigSchema>;\nexport type ResilienceConfig = z.infer<typeof ResilienceConfigSchema>;\nexport type SecurityConfig = z.infer<typeof SecurityConfigSchema>;\nexport type ObservabilityConfig = z.infer<typeof ObservabilityConfigSchema>;\nexport type HybridStoreConfig = z.infer<typeof HybridStoreConfigSchema>;\nexport type ConfigPreset = z.infer<typeof ConfigPresetSchema>;\n","/**\n * @baileys-store/core - Configuration Validation Reporter\n *\n * Provides detailed validation reports with:\n * - Error severity and suggested fixes\n * - Performance scoring\n * - Security warnings\n * - Optimization recommendations\n */\n\nimport type { HybridStoreConfig } from '../types/config.js';\nimport type { ConfigPreset } from '../config/presets.js';\nimport { HybridStoreConfigSchema, ConfigPresetSchema } from './schemas.js';\n\n/**\n * Validation error with severity and suggested fix\n */\nexport interface ValidationError {\n  /** Path to the invalid field (e.g., 'ttl.defaultTtl') */\n  path: string;\n  /** Error message */\n  message: string;\n  /** Error severity level */\n  severity: 'error' | 'warning';\n  /** Suggested fix or recommendation */\n  suggestedFix?: string;\n}\n\n/**\n * Configuration validation report\n */\nexport interface ValidationReport {\n  /** Whether the configuration is valid */\n  valid: boolean;\n  /** Validation errors (if any) */\n  errors?: ValidationError[];\n  /** Non-blocking warnings */\n  warnings?: string[];\n  /** Performance score (0-100) */\n  performanceScore?: number;\n  /** Security warnings */\n  securityWarnings?: string[];\n}\n\n/**\n * Validate and report on a configuration\n *\n * @param config - Configuration to validate\n * @returns Validation report with errors, warnings, and recommendations\n *\n * @example\n * ```typescript\n * const report = validateAndReportConfig(myConfig);\n * if (!report.valid) {\n *   console.error('Configuration errors:', report.errors);\n * }\n * ```\n */\nexport function validateAndReportConfig(\n  config: unknown,\n): ValidationReport {\n  const result = HybridStoreConfigSchema.safeParse(config);\n\n  if (!result.success) {\n    return {\n      valid: false,\n      errors: result.error.errors.map((error) => ({\n        path: error.path.join('.'),\n        message: error.message,\n        severity: calculateSeverity(error.code, error.path.join('.')),\n        suggestedFix: generateFix(error.code, error.path.join('.')),\n      })),\n      performanceScore: analyzeConfigPerformance(config as HybridStoreConfig),\n      securityWarnings: scanConfigSecurity(config as HybridStoreConfig),\n    };\n  }\n\n  // Config is valid, but may have warnings\n  const validatedConfig = result.data;\n\n  return {\n    valid: true,\n    warnings: generateOptimizationWarnings(validatedConfig),\n    performanceScore: analyzeConfigPerformance(validatedConfig),\n    securityWarnings: scanConfigSecurity(validatedConfig),\n  };\n}\n\n/**\n * Validate a configuration preset\n *\n * @param preset - Preset to validate\n * @returns Validation report\n */\nexport function validatePreset(preset: unknown): ValidationReport {\n  const result = ConfigPresetSchema.safeParse(preset);\n\n  if (!result.success) {\n    return {\n      valid: false,\n      errors: result.error.errors.map((error) => ({\n        path: error.path.join('.'),\n        message: error.message,\n        severity: 'error' as const,\n        suggestedFix: generateFix(error.code, error.path.join('.')),\n      })),\n    };\n  }\n\n  return {\n    valid: true,\n    performanceScore: analyzePresetPerformance(result.data),\n    securityWarnings: scanConfigSecurity(result.data),\n  };\n}\n\n/**\n * Calculate error severity based on error code and path\n */\nfunction calculateSeverity(code: string, path: string): 'error' | 'warning' {\n  // Security-related fields are errors\n  if (path.includes('security') || path.includes('masterKey')) {\n    return 'error';\n  }\n\n  // Connection strings are errors\n  if (path.includes('Url') || path.includes('Database')) {\n    return 'error';\n  }\n\n  // Invalid codes\n  switch (code) {\n    case 'invalid_type':\n      return 'error';\n    case 'custom':\n      return 'error';\n    default:\n      return 'warning';\n  }\n}\n\n/**\n * Generate suggested fix based on error code and path\n */\nfunction generateFix(_code: string, path: string): string | undefined {\n  if (path.includes('defaultTtl')) {\n    return 'Use a value >= 1 second (e.g., 300 for 5 minutes)';\n  }\n\n  if (path.includes('masterKey')) {\n    return 'Provide a 64-character hexadecimal master key: openssl rand -hex 32';\n  }\n\n  if (path.includes('operationTimeout')) {\n    return 'Use a value between 100ms and 60000ms (e.g., 5000 for 5 seconds)';\n  }\n\n  if (path.includes('encryptionAlgorithm')) {\n    return 'Use either \"aes-256-gcm\" or \"secretbox\"';\n  }\n\n  if (path.includes('compressionAlgorithm')) {\n    return 'Use either \"snappy\", \"gzip\", or \"lz4\"';\n  }\n\n  return undefined;\n}\n\n/**\n * Analyze configuration performance characteristics\n *\n * Returns a score from 0-100 where:\n * - 90-100: Excellent (production-ready)\n * - 70-89: Good (acceptable for production)\n * - 50-69: Fair (needs optimization)\n * - 0-49: Poor (not recommended)\n *\n * @param config - Configuration to analyze\n * @returns Performance score (0-100)\n */\nexport function analyzeConfigPerformance(config: HybridStoreConfig): number {\n  let score = 100;\n\n  // TTL penalties (too short = more database load)\n  if (config.ttl.defaultTtl < 300) {\n    score -= 20; // Very short TTLs increase load\n  } else if (config.ttl.defaultTtl < 600) {\n    score -= 10; // Short TTLs increase load moderately\n  }\n\n  // Timeout penalties (too short = premature failures)\n  if (config.resilience.operationTimeout < 1000) {\n    score -= 15; // Too aggressive\n  } else if (config.resilience.operationTimeout < 2000) {\n    score -= 5; // Moderately aggressive\n  }\n\n  // Retry penalties (too many retries = slow failures)\n  if (config.resilience.maxRetries > 5) {\n    score -= 10; // Too many retries\n  }\n\n  // Reward compression (reduces storage costs and I/O)\n  if (config.security.enableCompression) {\n    score += 10;\n  }\n\n  // Penalize no retries (fail-fast is good for development, bad for production)\n  if (config.resilience.maxRetries === 0 && config.security.environment === 'production') {\n    score -= 20; // Production should have some resilience\n  }\n\n  return Math.max(0, Math.min(100, score));\n}\n\n/**\n * Scan configuration for security issues\n *\n * @param config - Configuration or preset to scan\n * @returns Array of security warnings\n */\nexport function scanConfigSecurity(\n  config: HybridStoreConfig | ConfigPreset,\n): string[] {\n  const warnings: string[] = [];\n\n  if ('security' in config) {\n    // Check encryption\n    if (!config.security.enableEncryption && config.security.environment === 'production') {\n      warnings.push('⚠️  Encryption is disabled in production - data will be stored in plaintext');\n    }\n\n    // Check key rotation\n    if (config.security.enableEncryption && config.security.keyRotationDays > 365) {\n      warnings.push('⚠️  Key rotation period > 1 year - consider rotating keys more frequently (90-180 days)');\n    }\n\n    // Check debug logging\n    if (config.security.enableDebugLogging && config.security.environment === 'production') {\n      warnings.push('⚠️  Debug logging enabled in production - consider disabling for security and performance');\n    }\n  }\n\n  return warnings;\n}\n\n/**\n * Generate optimization warnings for valid configurations\n */\nfunction generateOptimizationWarnings(config: HybridStoreConfig): string[] {\n  const warnings: string[] = [];\n\n  // TTL optimization\n  if (config.ttl.defaultTtl < 300) {\n    warnings.push('💡 Consider increasing defaultTtl to reduce database load (current: ' +\n                  String(config.ttl.defaultTtl) + 's, recommended: 300-3600s)');\n  }\n\n  // Compression recommendation\n  if (!config.security.enableCompression && config.security.environment === 'production') {\n    warnings.push('💡 Consider enabling compression to reduce storage costs and improve I/O');\n  }\n\n  // Timeout optimization\n  if (config.resilience.operationTimeout > 10000) {\n    warnings.push('💡 Consider reducing operationTimeout for faster failure detection (current: ' +\n                  String(config.resilience.operationTimeout) + 'ms, recommended: 3000-5000ms)');\n  }\n\n  return warnings;\n}\n\n/**\n * Analyze preset performance\n */\nfunction analyzePresetPerformance(preset: ConfigPreset): number {\n  // Similar to analyzeConfigPerformance but for presets\n  let score = 100;\n\n  if (preset.ttl.defaultTtl < 300) {\n    score -= 20;\n  }\n\n  if (preset.resilience.operationTimeout < 1000) {\n    score -= 15;\n  }\n\n  if (preset.security.enableCompression) {\n    score += 10;\n  }\n\n  return Math.max(0, Math.min(100, score));\n}\n","/**\n * @baileys-store/core - Crypto Service\n *\n * Camada de criptografia app-level usando AES-256-GCM\n * Suporta rotação de chaves e múltiplas versões\n *\n * Algoritmo: AES-256-GCM (AEAD)\n * - Key: 32 bytes\n * - Nonce: 12 bytes\n * - Auth Tag: 16 bytes\n */\n\nimport { randomBytes, createCipheriv, createDecipheriv, createHash } from 'crypto';\nimport type { EncryptedData, SecurityConfig, Logger } from '../types/index.js';\nimport { EncryptionError, NullLogger } from '../types/index.js';\n\n/**\n * Configuração de criptografia AES-256-GCM\n */\nconst CRYPTO_CONSTANTS = {\n  NONCE_LENGTH: 12, // 96 bits (NIST SP 800-38D recommendation)\n  AUTH_TAG_LENGTH: 16, // 128 bits\n  KEY_LENGTH: 32, // 256 bits\n  ALGORITHM: 'aes-256-gcm' as const,\n  KEY_ID_LENGTH: 16, // hex characters (64 bits truncated from SHA-256)\n} as const;\n\n/**\n * Chave de criptografia com metadados\n */\ninterface CryptoKey {\n  id: string;\n  key: Buffer;\n  algorithm: string;\n  createdAt: Date;\n  expiresAt: Date | null;\n  active: boolean;\n}\n\n/**\n * Gerenciador de chaves com rotação\n */\nclass KeyManager {\n  private keys = new Map<string, CryptoKey>();\n  private activeKeyId: string | null = null;\n\n  /**\n   * Adiciona uma chave\n   */\n  addKey(key: CryptoKey): void {\n    this.keys.set(key.id, key);\n\n    if (key.active) {\n      // Desativar chave anterior\n      if (this.activeKeyId && this.activeKeyId !== key.id) {\n        const oldKey = this.keys.get(this.activeKeyId);\n        if (oldKey) {\n          oldKey.active = false;\n        }\n      }\n      this.activeKeyId = key.id;\n    }\n  }\n\n  /**\n   * Obtém chave ativa\n   */\n  getActiveKey(): CryptoKey | null {\n    if (!this.activeKeyId) return null;\n    return this.keys.get(this.activeKeyId) ?? null;\n  }\n\n  /**\n   * Obtém chave por ID\n   */\n  getKey(keyId: string): CryptoKey | null {\n    return this.keys.get(keyId) ?? null;\n  }\n\n  /**\n   * Verifica se chave está expirada\n   */\n  isKeyExpired(keyId: string): boolean {\n    const key = this.keys.get(keyId);\n    if (!key?.expiresAt) return false;\n    return key.expiresAt < new Date();\n  }\n\n  /**\n   * Lista todas as chaves\n   */\n  listKeys(): CryptoKey[] {\n    return Array.from(this.keys.values());\n  }\n\n  /**\n   * Remove chaves expiradas\n   */\n  cleanupExpiredKeys(): number {\n    let removed = 0;\n    for (const [keyId, key] of this.keys.entries()) {\n      if (key.expiresAt && key.expiresAt < new Date() && !key.active) {\n        this.keys.delete(keyId);\n        removed++;\n      }\n    }\n    return removed;\n  }\n}\n\n/**\n * CryptoService - Serviço de criptografia\n */\nexport class CryptoService {\n  private keyManager: KeyManager;\n  private config: SecurityConfig;\n  private logger: Logger;\n  private schemaVersion = 1;\n\n  constructor(config: SecurityConfig) {\n    this.config = config;\n    this.keyManager = new KeyManager();\n    this.logger = config.logger ?? new NullLogger();\n  }\n\n  /**\n   * Debug logging que respeita configuração de segurança\n   */\n  private debug(message: string, data?: Record<string, unknown>): void {\n    if (this.config.enableDebugLogging && this.config.environment !== 'production') {\n      this.logger.debug(`🔐 [CRYPTO] ${message}`, data);\n    }\n  }\n\n  /**\n   * Normaliza dados para Buffer (suporta múltiplos formatos)\n   */\n  private normalizeToBuffer(data: unknown, fieldName: string): Buffer {\n    if (Buffer.isBuffer(data)) {\n      return data;\n    }\n\n    if (typeof data === 'string') {\n      return Buffer.from(data, 'base64');\n    }\n\n    if (data && typeof data === 'object' && 'type' in data) {\n      const obj = data as { type: string; data: number[] };\n      if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n        return Buffer.from(obj.data);\n      }\n    }\n\n    if (data && typeof data === 'object' && 'byteLength' in data) {\n      return Buffer.from(data as Uint8Array);\n    }\n\n    const dataLength = (data as { length?: number }).length;\n    throw new EncryptionError(\n      `Formato de ${fieldName} inválido: ${typeof data}, length: ${String(dataLength ?? 'unknown')}`,\n    );\n  }\n\n  /**\n   * Inicializa o serviço com chave(s)\n   */\n  initialize(masterKey: string | Buffer): Promise<void> {\n    try {\n      this.debug('Inicializando CryptoService', {\n        masterKeyType: typeof masterKey,\n        masterKeyLength: typeof masterKey === 'string' ? masterKey.length : masterKey.length,\n      });\n\n      // Derivar chave de 32 bytes do master key\n      const keyBuffer = typeof masterKey === 'string' ? Buffer.from(masterKey, 'hex') : masterKey;\n\n      this.debug('Buffer da chave processado', {\n        length: keyBuffer.length,\n        isHex: typeof masterKey === 'string',\n      });\n\n      if (keyBuffer.length !== CRYPTO_CONSTANTS.KEY_LENGTH) {\n        this.debug('Comprimento da chave != 32, derivando com SHA-256');\n        // Derivar usando SHA-256\n        const derived = createHash('sha256').update(keyBuffer).digest();\n        this.debug('Chave derivada', { length: derived.length });\n        this.addKey(derived, true);\n      } else {\n        this.debug('Comprimento da chave == 32, usando diretamente');\n        this.addKey(keyBuffer, true);\n      }\n\n      this.debug('CryptoService inicializado com sucesso');\n      return Promise.resolve();\n    } catch (error) {\n      this.logger.error('Falha ao inicializar CryptoService', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw new EncryptionError(\n        'Falha ao inicializar CryptoService',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Adiciona chave ao gerenciador\n   */\n  private addKey(keyBuffer: Buffer, active = false): void {\n    const keyId = this.generateKeyId(keyBuffer);\n    const expiresAt =\n      this.config.keyRotationDays > 0\n        ? new Date(Date.now() + this.config.keyRotationDays * 24 * 60 * 60 * 1000)\n        : null;\n\n    this.debug('Adicionando chave', {\n      keyLength: keyBuffer.length,\n      algorithm: this.config.encryptionAlgorithm,\n      active,\n      expiresAt: expiresAt?.toISOString() ?? 'never',\n    });\n\n    this.keyManager.addKey({\n      id: keyId,\n      key: keyBuffer,\n      algorithm: this.config.encryptionAlgorithm,\n      createdAt: new Date(),\n      expiresAt,\n      active,\n    });\n\n    this.debug('Chave adicionada com sucesso');\n  }\n\n  /**\n   * Gera ID da chave (hash)\n   */\n  private generateKeyId(key: Buffer): string {\n    return createHash('sha256')\n      .update(key)\n      .digest('hex')\n      .substring(0, CRYPTO_CONSTANTS.KEY_ID_LENGTH);\n  }\n\n  /**\n   * Criptografa dados\n   */\n  async encrypt(plaintext: Buffer): Promise<EncryptedData> {\n    if (!this.config.enableEncryption) {\n      // Se criptografia desabilitada, retorna dados \"não criptografados\"\n      return {\n        ciphertext: plaintext,\n        nonce: Buffer.alloc(0),\n        keyId: 'none',\n        schemaVersion: this.schemaVersion,\n        timestamp: new Date(),\n      };\n    }\n\n    try {\n      const key = this.keyManager.getActiveKey();\n      if (!key) {\n        throw new EncryptionError('Nenhuma chave ativa disponível');\n      }\n\n      return await this.encryptWithKey(plaintext, key);\n    } catch (error) {\n      throw new EncryptionError(\n        'Falha ao criptografar dados',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Descriptografa dados\n   */\n  async decrypt(encrypted: EncryptedData): Promise<Buffer> {\n    this.debug('Decrypt chamado', {\n      enableEncryption: this.config.enableEncryption,\n      ciphertextLength: encrypted.ciphertext.length,\n      nonceLength: encrypted.nonce.length,\n      schemaVersion: encrypted.schemaVersion,\n    });\n\n    if (!this.config.enableEncryption || encrypted.keyId === 'none') {\n      this.debug('Criptografia desabilitada ou keyId=none, retornando plaintext');\n      return encrypted.ciphertext;\n    }\n\n    try {\n      // Suporte para keyId \"auto\" (dados antigos)\n      let keyId = encrypted.keyId;\n      if (keyId === 'auto') {\n        this.debug('Tratando keyId=\"auto\", procurando chave ativa');\n        // Para dados antigos com keyId \"auto\", usar a primeira chave disponível\n        const activeKey = this.keyManager.getActiveKey();\n        if (activeKey) {\n          keyId = activeKey.id;\n          this.debug('Chave ativa encontrada', { algorithm: activeKey.algorithm });\n        } else {\n          this.logger.error('Nenhuma chave ativa encontrada para keyId=\"auto\"');\n          throw new EncryptionError('Chave não encontrada: auto (nenhuma chave ativa disponível)');\n        }\n      }\n\n      this.debug('Procurando chave', { keyId });\n      const key = this.keyManager.getKey(keyId);\n      if (!key) {\n        this.logger.error('Chave não encontrada', { keyId });\n        this.debug('Chaves disponíveis', {\n          availableKeys: this.keyManager\n            .listKeys()\n            .map((k) => ({ algorithm: k.algorithm, active: k.active })),\n        });\n        throw new EncryptionError(`Chave não encontrada: ${encrypted.keyId}`);\n      }\n\n      this.debug('Chave encontrada', {\n        algorithm: key.algorithm,\n        active: key.active,\n        createdAt: key.createdAt,\n        expiresAt: key.expiresAt,\n      });\n\n      if (this.keyManager.isKeyExpired(encrypted.keyId)) {\n        this.logger.warn('Descriptografando com chave expirada');\n      }\n\n      return await this.decryptWithKey(encrypted, key);\n    } catch (error) {\n      throw new EncryptionError(\n        'Falha ao descriptografar dados',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Criptografa com chave específica\n   */\n  private async encryptWithKey(plaintext: Buffer, key: CryptoKey): Promise<EncryptedData> {\n    if (key.algorithm === 'secretbox' || key.algorithm === 'aes-256-gcm') {\n      return Promise.resolve(this.encryptAESGCM(plaintext, key));\n    }\n\n    throw new EncryptionError(`Algoritmo não suportado: ${key.algorithm}`);\n  }\n\n  /**\n   * Descriptografa com chave específica\n   */\n  private async decryptWithKey(encrypted: EncryptedData, key: CryptoKey): Promise<Buffer> {\n    if (key.algorithm === 'secretbox' || key.algorithm === 'aes-256-gcm') {\n      return Promise.resolve(this.decryptAESGCM(encrypted, key));\n    }\n\n    throw new EncryptionError(`Algoritmo não suportado: ${key.algorithm}`);\n  }\n\n  /**\n   * Criptografia AES-256-GCM (compatível com secretbox)\n   */\n  private encryptAESGCM(plaintext: Buffer, key: CryptoKey): EncryptedData {\n    // Gerar nonce aleatório (12 bytes para GCM)\n    const nonce = randomBytes(CRYPTO_CONSTANTS.NONCE_LENGTH);\n\n    // Criar cipher\n    const cipher = createCipheriv(CRYPTO_CONSTANTS.ALGORITHM, key.key, nonce);\n\n    // Criptografar\n    const chunks: Buffer[] = [];\n    chunks.push(cipher.update(plaintext));\n    chunks.push(cipher.final());\n\n    const ciphertext = Buffer.concat(chunks);\n\n    // Obter auth tag (16 bytes)\n    const authTag = cipher.getAuthTag();\n\n    // Concatenar ciphertext + authTag\n    const combined = Buffer.concat([ciphertext, authTag]);\n\n    return {\n      ciphertext: combined,\n      nonce,\n      keyId: key.id,\n      schemaVersion: this.schemaVersion,\n      timestamp: new Date(),\n    };\n  }\n\n  /**\n   * Descriptografia AES-256-GCM\n   */\n  private decryptAESGCM(encrypted: EncryptedData, key: CryptoKey): Buffer {\n    this.debug('DecryptAESGCM iniciado', {\n      ciphertextLength: encrypted.ciphertext.length,\n      nonceLength: encrypted.nonce.length,\n      nonceType: typeof encrypted.nonce,\n    });\n\n    try {\n      // Normalizar nonce\n      const nonce = this.normalizeToBuffer(encrypted.nonce, 'nonce');\n\n      // Validar tamanho do nonce\n      if (nonce.length !== CRYPTO_CONSTANTS.NONCE_LENGTH) {\n        throw new EncryptionError(\n          `Nonce tem tamanho inválido: ${String(nonce.length)} bytes (esperado: ${String(CRYPTO_CONSTANTS.NONCE_LENGTH)} bytes)`,\n        );\n      }\n\n      this.debug('Nonce validado', { length: nonce.length });\n\n      // Normalizar ciphertext\n      const ciphertextBuffer = this.normalizeToBuffer(encrypted.ciphertext, 'ciphertext');\n\n      // Validar tamanho mínimo do ciphertext\n      if (ciphertextBuffer.length < CRYPTO_CONSTANTS.AUTH_TAG_LENGTH) {\n        throw new EncryptionError(\n          `Ciphertext muito curto: ${String(ciphertextBuffer.length)} bytes (mínimo ${String(CRYPTO_CONSTANTS.AUTH_TAG_LENGTH)} bytes)`,\n        );\n      }\n\n      // Separar ciphertext e authTag\n      const authTag = ciphertextBuffer.subarray(-CRYPTO_CONSTANTS.AUTH_TAG_LENGTH);\n      const ciphertext = ciphertextBuffer.subarray(0, -CRYPTO_CONSTANTS.AUTH_TAG_LENGTH);\n\n      this.debug('Dados separados', {\n        ciphertextLength: ciphertext.length,\n        authTagLength: authTag.length,\n      });\n\n      // Criar decipher\n      const decipher = createDecipheriv(CRYPTO_CONSTANTS.ALGORITHM, key.key, nonce);\n      decipher.setAuthTag(authTag);\n\n      this.debug('Decipher criado com sucesso');\n\n      // Descriptografar\n      const chunks: Buffer[] = [];\n      chunks.push(decipher.update(ciphertext));\n      chunks.push(decipher.final());\n\n      const result = Buffer.concat(chunks);\n      this.debug('Descriptografia bem-sucedida', { resultLength: result.length });\n\n      return result;\n    } catch (error) {\n      this.logger.error('Falha na descriptografia', {\n        error: error instanceof Error ? error.message : String(error),\n        ciphertextLength: encrypted.ciphertext.length,\n        nonceLength: encrypted.nonce.length,\n        nonceType: typeof encrypted.nonce,\n        keyLength: key.key.length,\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Rotaciona chave ativa\n   */\n  rotateKey(newMasterKey: string | Buffer): Promise<void> {\n    try {\n      const keyBuffer =\n        typeof newMasterKey === 'string' ? Buffer.from(newMasterKey, 'hex') : newMasterKey;\n\n      const derived =\n        keyBuffer.length === CRYPTO_CONSTANTS.KEY_LENGTH\n          ? keyBuffer\n          : createHash('sha256').update(keyBuffer).digest();\n\n      this.addKey(derived, true);\n      return Promise.resolve();\n    } catch (error) {\n      throw new EncryptionError(\n        'Falha ao rotacionar chave',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Limpa chaves expiradas\n   */\n  cleanupExpiredKeys(): number {\n    return this.keyManager.cleanupExpiredKeys();\n  }\n\n  /**\n   * Obtém estatísticas das chaves\n   */\n  getKeyStats(): {\n    totalKeys: number;\n    activeKey: string | null;\n    expiredKeys: number;\n  } {\n    const keys = this.keyManager.listKeys();\n    const expiredCount = keys.filter((k) => k.expiresAt && k.expiresAt < new Date()).length;\n\n    return {\n      totalKeys: keys.length,\n      activeKey: this.keyManager.getActiveKey()?.id ?? null,\n      expiredKeys: expiredCount,\n    };\n  }\n\n  /**\n   * Health check\n   */\n  isHealthy(): boolean {\n    const activeKey = this.keyManager.getActiveKey();\n    if (!activeKey) return false;\n\n    // Verificar se chave ativa não está expirada\n    if (activeKey.expiresAt && activeKey.expiresAt < new Date()) {\n      return false;\n    }\n\n    return true;\n  }\n}\n\n/**\n * Factory para criar CryptoService\n */\nexport async function createCryptoService(\n  config: SecurityConfig,\n  masterKey?: string | Buffer,\n): Promise<CryptoService> {\n  const service = new CryptoService(config);\n\n  try {\n    if (masterKey) {\n      await service.initialize(masterKey);\n    } else if (config.enableEncryption) {\n      if (config.environment === 'production') {\n        throw new EncryptionError(\n          'Criptografia habilitada mas master key ausente. Configure MASTER_KEY para produção.',\n        );\n      }\n\n      // Development: gerar chave temporária\n      // NOTE: Using temporary key in development - configure MASTER_KEY for production!\n      const tempKey = randomBytes(CRYPTO_CONSTANTS.KEY_LENGTH);\n      await service.initialize(tempKey);\n    }\n  } catch (error) {\n    throw new EncryptionError(\n      'Falha ao inicializar CryptoService',\n      error instanceof Error ? error : undefined,\n    );\n  }\n\n  return service;\n}\n","/**\n * @baileys-store/core - Codec Service\n *\n * Pipeline: Object → JSON estável → Compressão → Buffer\n *\n * Serialização:\n * - JSON.stringify com chaves ordenadas (stable stringify)\n * - Preserva tipos nativos (Date, Buffer, etc) via BufferJSON\n *\n * Compressão:\n * - Snappy (preferencial, requer @napi-rs/snappy)\n * - Gzip (fallback, built-in Node.js)\n */\n\nimport { gzipSync, gunzipSync } from 'zlib';\nimport { BufferJSON } from '@whiskeysockets/baileys';\nimport type { SecurityConfig } from '../types/index.js';\nimport { CompressionError } from '../types/index.js';\n\n// Tentar importar Snappy (pode falhar se não instalado)\nlet snappyModule: unknown = null;\n\nasync function loadSnappyModule(): Promise<unknown> {\n  if (snappyModule !== null) return snappyModule;\n\n  try {\n    const module = await import('@napi-rs/snappy');\n    // ESM/CJS interop: use 'in' operator instead of ??\n    snappyModule = 'default' in module ? module.default : module;\n  } catch {\n    // Snappy não disponível - usar null em vez de false\n    snappyModule = null;\n  }\n\n  return snappyModule;\n}\n\n/**\n * Interface de compressor\n */\ninterface Compressor {\n  compress(data: Buffer): Buffer | Promise<Buffer>;\n  decompress(data: Buffer): Buffer | Promise<Buffer>;\n  name: string;\n  isAvailable?(): boolean | Promise<boolean>;\n}\n\n/**\n * Compressor Gzip (built-in)\n */\nclass GzipCompressor implements Compressor {\n  name = 'gzip';\n\n  compress(data: Buffer): Buffer {\n    return gzipSync(data, { level: 6 }); // Balanceado\n  }\n\n  decompress(data: Buffer): Buffer {\n    return gunzipSync(data);\n  }\n}\n\n/**\n * Compressor Snappy (requer @napi-rs/snappy)\n */\nclass SnappyCompressor implements Compressor {\n  name = 'snappy';\n  private gzipFallback = new GzipCompressor();\n\n  async compress(data: Buffer): Promise<Buffer> {\n    const module = await loadSnappyModule();\n    if (module === null || typeof module !== 'object') {\n      // Silent fallback - Snappy not available\n      return this.gzipFallback.compress(data);\n    }\n\n    if ('compressSync' in module) {\n      return (module as { compressSync: (data: Buffer) => Buffer }).compressSync(data);\n    }\n\n    // Silent fallback - Snappy API not available\n    return this.gzipFallback.compress(data);\n  }\n\n  async decompress(data: Buffer): Promise<Buffer> {\n    const module = await loadSnappyModule();\n    if (module === null || typeof module !== 'object') {\n      // Silent fallback - Snappy not available\n      return this.gzipFallback.decompress(data);\n    }\n\n    if ('uncompressSync' in module) {\n      return (module as { uncompressSync: (data: Buffer) => Buffer }).uncompressSync(data);\n    }\n\n    // Silent fallback - Snappy API not available\n    return this.gzipFallback.decompress(data);\n  }\n\n  async isAvailable(): Promise<boolean> {\n    const module = await loadSnappyModule();\n    return module !== null;\n  }\n}\n\n/**\n * Compressor nulo (sem compressão)\n */\nclass NoOpCompressor implements Compressor {\n  name = 'none';\n\n  compress(data: Buffer): Buffer {\n    return data;\n  }\n\n  decompress(data: Buffer): Buffer {\n    return data;\n  }\n}\n\n/**\n * CodecService - Serviço de codificação/decodificação\n */\nexport class CodecService {\n  private compressor: Compressor;\n  private config: SecurityConfig;\n\n  constructor(config: SecurityConfig) {\n    this.config = config;\n    this.compressor = this.selectCompressor();\n  }\n\n  /**\n   * Seleciona compressor baseado na configuração\n   */\n  private selectCompressor(): Compressor {\n    if (!this.config.enableCompression) {\n      return new NoOpCompressor();\n    }\n\n    switch (this.config.compressionAlgorithm) {\n      case 'snappy': {\n        // Snappy será testado dinamicamente no primeiro uso\n        return new SnappyCompressor();\n      }\n\n      case 'gzip':\n        return new GzipCompressor();\n\n      case 'lz4':\n        // Fallback to gzip if LZ4 not available (silent)\n        return new GzipCompressor();\n\n      default:\n        return new GzipCompressor();\n    }\n  }\n\n  /**\n   * Encode: Object → Buffer comprimido\n   */\n  async encode(obj: unknown): Promise<Buffer> {\n    try {\n      // 1. Serializar para JSON estável\n      const json = this.stableStringify(obj);\n      const buffer = Buffer.from(json, 'utf-8');\n\n      // 2. Comprimir\n      const compressed = await this.compressor.compress(buffer);\n\n      return compressed;\n    } catch (error) {\n      throw new CompressionError(\n        'Falha ao codificar dados',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Decode: Buffer comprimido → Object\n   */\n  async decode<T = unknown>(buffer: Buffer): Promise<T> {\n    try {\n      // 1. Descomprimir\n      const decompressed = await this.compressor.decompress(buffer);\n\n      // 2. Deserializar de JSON\n      const json = decompressed.toString('utf-8');\n      const obj = this.stableParse(json);\n\n      return obj as T;\n    } catch (error) {\n      throw new CompressionError(\n        'Falha ao decodificar dados',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * JSON.stringify estável (chaves ordenadas)\n   * Importante para garantir mesma saída para mesmo input\n   */\n  private stableStringify(obj: unknown): string {\n    return JSON.stringify(obj, this.stableReplacer);\n  }\n\n  /**\n   * Replacer para JSON.stringify que ordena chaves\n   */\n  private stableReplacer = (_key: string, value: unknown): unknown => {\n    // Preservar tipos especiais (BufferJSON do Baileys)\n    if (value && typeof value === 'object') {\n      if (Buffer.isBuffer(value)) {\n        return BufferJSON.replacer(null as unknown as string, value);\n      }\n\n      // Ordenar chaves de objetos\n      if (!Array.isArray(value)) {\n        const sorted: Record<string, unknown> = {};\n        const keys = Object.keys(value).sort();\n        for (const k of keys) {\n          sorted[k] = (value as Record<string, unknown>)[k];\n        }\n        return sorted;\n      }\n    }\n\n    return value;\n  };\n\n  /**\n   * JSON.parse com reviver para tipos especiais\n   * CRITICAL FIX: Recursively convert nested Buffer objects\n   */\n  private stableParse(json: string): unknown {\n    const parsed = JSON.parse(json, BufferJSON.reviver) as unknown;\n    return this.deepBufferRevive(parsed);\n  }\n\n  /**\n   * Recursively convert Buffer-like objects to actual Buffers\n   * RC.6 Fix: Baileys noise-handler requires real Buffer instances\n   */\n  private deepBufferRevive(obj: unknown): unknown {\n    if (obj === null || obj === undefined) {\n      return obj;\n    }\n\n    // Check if it's a Buffer-like object {type: 'Buffer', data: [...]}\n    if (\n      typeof obj === 'object' &&\n      'type' in obj &&\n      obj.type === 'Buffer' &&\n      'data' in obj &&\n      Array.isArray(obj.data)\n    ) {\n      return Buffer.from(obj.data as number[]);\n    }\n\n    // Recursively process arrays\n    if (Array.isArray(obj)) {\n      return obj.map((item) => this.deepBufferRevive(item));\n    }\n\n    // Recursively process objects\n    if (typeof obj === 'object' && obj.constructor === Object) {\n      const result: Record<string, unknown> = {};\n      for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n          result[key] = this.deepBufferRevive((obj as Record<string, unknown>)[key]);\n        }\n      }\n      return result;\n    }\n\n    return obj;\n  }\n\n  /**\n   * Obtém estatísticas do compressor\n   */\n  getStats(): {\n    compressor: string;\n    enabled: boolean;\n  } {\n    return {\n      compressor: this.compressor.name,\n      enabled: this.config.enableCompression,\n    };\n  }\n\n  /**\n   * Testa taxa de compressão com dados de exemplo\n   */\n  async testCompressionRatio(sampleData: unknown): Promise<{\n    originalSize: number;\n    compressedSize: number;\n    ratio: number;\n    compressor: string;\n  }> {\n    const json = this.stableStringify(sampleData);\n    const original = Buffer.from(json, 'utf-8');\n    const compressed = await this.compressor.compress(original);\n\n    return {\n      originalSize: original.length,\n      compressedSize: compressed.length,\n      ratio: 1 - compressed.length / original.length,\n      compressor: this.compressor.name,\n    };\n  }\n}\n\n/**\n * Factory para criar CodecService\n */\nexport function createCodecService(config: SecurityConfig): CodecService {\n  return new CodecService(config);\n}\n","/**\n * @baileys-store/core - Storage Utilities\n *\n * Utilitários compartilhados para storage:\n * - Serialization helpers (BufferJSON)\n * - Retry logic with exponential backoff\n * - TTL helpers\n */\n\nimport { BufferJSON } from '@whiskeysockets/baileys';\n\n/**\n * Helper para serializar objeto com BufferJSON\n */\nexport function serializeWithBuffer(obj: unknown): string {\n  return JSON.stringify(obj, BufferJSON.replacer);\n}\n\n/**\n * Helper para deserializar objeto com BufferJSON\n */\nexport function deserializeWithBuffer(json: string): unknown {\n  return JSON.parse(json, BufferJSON.reviver);\n}\n\n/**\n * Helper para retry com backoff exponencial\n */\nexport async function retryWithBackoff<T>(\n  fn: () => Promise<T>,\n  options: {\n    maxRetries: number;\n    baseDelay: number;\n    multiplier: number;\n    onRetry?: (attempt: number, error: Error) => void;\n  },\n): Promise<T> {\n  const { maxRetries, baseDelay, multiplier, onRetry } = options;\n  let lastError: Error | undefined;\n\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      return await fn();\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n\n      if (attempt < maxRetries) {\n        const delay = baseDelay * Math.pow(multiplier, attempt);\n        onRetry?.(attempt + 1, lastError);\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n    }\n  }\n\n  throw lastError ?? new Error('Retry failed');\n}\n\n/**\n * Helper para calcular TTL isócrono (mesmo timestamp de expiração)\n */\nexport function calculateExpiresAt(ttlSeconds: number): Date {\n  return new Date(Date.now() + ttlSeconds * 1000);\n}\n\n/**\n * Helper para calcular TTL em milissegundos para Redis PXAT\n */\nexport function calculatePXAT(expiresAt: Date): number {\n  return expiresAt.getTime();\n}\n\n/**\n * Helper para verificar se valor expirou\n */\nexport function isExpired(expiresAt: Date): boolean {\n  return expiresAt < new Date();\n}\n","/**\n * @baileys-store/core - Redis Auth Store\n *\n * Hot cache layer for Auth State\n * - Automatic TTL (24h default)\n * - Incremental key merging (CRITICAL - our discovery!)\n * - Global metadata (unified version)\n * - Auto-reconnect and health checks\n */\n\nimport Redis, { type RedisOptions, type Redis as RedisClient } from 'ioredis';\nimport type {\n  AuthStore,\n  SessionId,\n  AuthSnapshot,\n  AuthPatch,\n  Versioned,\n  VersionedResult,\n  TtlConfig,\n  ResilienceConfig,\n  StructuredLogger,\n} from '../types/index.js';\nimport { StorageError, NullLoggerStructured } from '../types/index.js';\nimport type { CryptoService } from '../crypto/index.js';\nimport type { CodecService } from '../crypto/codec.js';\nimport type { AuthenticationCreds } from '@whiskeysockets/baileys';\n\n/**\n * Internal data structures for Redis storage\n */\ninterface StoredCreds {\n  creds: AuthenticationCreds;\n  version: number;\n  updatedAt: Date;\n}\n\ninterface StoredKeys {\n  keys: Record<string, Record<string, unknown>>;\n  appState?: Record<string, unknown>;\n  version: number;\n  updatedAt: Date;\n}\n\ninterface MetaData {\n  version: number;\n  updatedAt: string;\n}\n\ninterface EncryptedData {\n  ciphertext: string;\n  nonce: string;\n  keyId: string;\n  schemaVersion: number;\n  timestamp: string;\n}\n\n/**\n * RedisAuthStore configuration\n */\nexport interface RedisStoreConfig {\n  /** Redis connection URL or options object */\n  redisUrl?: string;\n  /** Redis host */\n  host?: string;\n  /** Redis port */\n  port?: number;\n  /** Redis password */\n  password?: string;\n  /** Redis database */\n  db?: number;\n  /** TTL configuration */\n  ttl: TtlConfig;\n  /** Resilience configuration */\n  resilience: ResilienceConfig;\n  /** Enable TLS */\n  enableTls?: boolean;\n  /** Optional structured logger */\n  logger?: StructuredLogger;\n}\n\n/**\n * RedisAuthStore - AuthStore implementation using Redis\n */\nexport class RedisAuthStore implements AuthStore {\n  private client: RedisClient;\n  private crypto: CryptoService;\n  private codec: CodecService;\n  private config: RedisStoreConfig;\n  private logger: StructuredLogger;\n  private connected = false;\n\n  constructor(config: RedisStoreConfig, crypto: CryptoService, codec: CodecService) {\n    this.config = config;\n    this.crypto = crypto;\n    this.codec = codec;\n    this.logger = config.logger ?? new NullLoggerStructured();\n\n    // Create ioredis client\n    const options: RedisOptions = {\n      host: config.host ?? 'localhost',\n      port: config.port ?? 6379,\n      password: config.password,\n      db: config.db ?? 0,\n      retryStrategy: (times: number) => {\n        if (times > config.resilience.maxRetries) {\n          this.logger.error('Maximum Redis reconnection attempts reached', undefined, {\n            action: 'redis_max_reconnection_attempts',\n          });\n          return null; // Stop trying\n        }\n\n        const delay = Math.min(\n          config.resilience.retryBaseDelay * Math.pow(config.resilience.retryMultiplier, times),\n          30000, // max 30s\n        );\n\n        this.logger.warn(`Attempting Redis reconnection (attempt ${String(times)}), waiting ${String(delay)}ms`, {\n          attempt: times,\n          delayMs: delay,\n          action: 'redis_reconnection_attempt',\n        });\n        return delay;\n      },\n      lazyConnect: false,\n    };\n\n    if (config.enableTls) {\n      options.tls = {};\n    }\n\n    // Parse URL if provided\n    if (config.redisUrl) {\n      this.client = new Redis(config.redisUrl, options);\n    } else {\n      this.client = new Redis(options);\n    }\n\n    // Event handlers\n    this.client.on('error', (err) => {\n      this.logger.error('Redis client error', err, {\n        action: 'redis_client_error',\n      });\n    });\n\n    this.client.on('connect', () => {\n      this.connected = true;\n    });\n\n    this.client.on('ready', () => {\n      this.connected = true;\n    });\n\n    this.client.on('close', () => {\n      this.connected = false;\n    });\n  }\n\n  /**\n   * Conecta ao Redis (ioredis conecta automaticamente)\n   */\n  async connect(): Promise<void> {\n    if (this.connected) return;\n\n    const startTime = Date.now();\n\n    try {\n      await this.client.ping();\n      this.connected = true;\n      this.logger.info('RedisAuthStore connected successfully', {\n        duration: Date.now() - startTime,\n        action: 'redis_connect_success',\n      });\n    } catch (error) {\n      this.logger.error('Failed to connect to Redis', error instanceof Error ? error : undefined, {\n        duration: Date.now() - startTime,\n        action: 'redis_connect_error',\n      });\n      throw new StorageError(\n        'Falha ao conectar ao Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Desconecta do Redis\n   */\n  async disconnect(): Promise<void> {\n    if (!this.connected) return;\n\n    try {\n      await this.client.quit();\n      this.connected = false;\n    } catch (error) {\n      this.logger.error('Erro ao desconectar do Redis', error instanceof Error ? error : undefined, {\n        action: 'redis_disconnect_error',\n      });\n    }\n  }\n\n  /**\n   * Busca snapshot completo\n   */\n  async get(sessionId: SessionId): Promise<Versioned<AuthSnapshot> | null> {\n    try {\n      this.ensureConnected();\n\n      // Buscar metadata (version global) primeiro\n      const metaKey = this.buildKey(sessionId, 'meta');\n      const metaValue = await this.client.get(metaKey);\n\n      let globalVersion = 1;\n      let updatedAt = new Date();\n\n      if (metaValue) {\n        const meta = JSON.parse(metaValue) as MetaData;\n        globalVersion = meta.version || 1;\n        updatedAt = new Date(meta.updatedAt);\n      }\n\n      // Buscar creds e keys em paralelo\n      const [creds, keys] = await Promise.all([\n        this.getField(sessionId, 'creds'),\n        this.getField(sessionId, 'keys'),\n      ]);\n\n      if (!creds || !keys) {\n        return null;\n      }\n\n      const snapshot: AuthSnapshot = {\n        creds: creds.creds,\n        keys: keys.keys,\n        appState: keys.appState,\n      };\n\n      return {\n        data: snapshot,\n        version: globalVersion,\n        updatedAt,\n      };\n    } catch (error) {\n      throw new StorageError(\n        'Falha ao buscar do Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Atualiza snapshot (total ou parcial)\n   */\n  async set(\n    sessionId: SessionId,\n    patch: AuthPatch,\n    expectedVersion?: number,\n    // _fencingToken?: number,\n  ): Promise<VersionedResult> {\n    try {\n      this.ensureConnected();\n\n      const newVersion = (expectedVersion ?? 0) + 1;\n      const updatedAt = new Date();\n\n      const promises: Promise<void>[] = [];\n\n      // Salvar creds se houver\n      if (patch.creds) {\n        promises.push(\n          this.setField(sessionId, 'creds', {\n            creds: patch.creds,\n            version: newVersion,\n            updatedAt,\n          }),\n        );\n      }\n\n      // CRÍTICO: MESCLAR keys com as existentes (NÃO sobrescrever!)\n      // Essa é nossa descoberta que corrige o bug do baileys-redis-auth original\n      if (patch.keys ?? patch.appState) {\n        // Buscar keys existentes\n        const current = await this.getField(sessionId, 'keys');\n        const mergedKeys = { ...(current?.keys ?? {}) };\n\n        // Mesclar incrementalmente\n        if (patch.keys) {\n          for (const type in patch.keys) {\n            mergedKeys[type] ??= {};\n            for (const id in patch.keys[type]) {\n              const value = patch.keys[type][id];\n              if (value === null || value === undefined) {\n                // Deletar se valor é null/undefined\n                // delete mergedKeys[type][id];\n                const { [id]: _unused, ...rest } = mergedKeys[type];\n                void _unused; // Suppress unused variable warning\n                mergedKeys[type] = rest;\n              } else {\n                // Adicionar/atualizar\n                mergedKeys[type][id] = value as unknown;\n              }\n            }\n          }\n        }\n\n        promises.push(\n          this.setField(sessionId, 'keys', {\n            keys: mergedKeys,\n            appState: patch.appState ?? current?.appState,\n            version: newVersion,\n            updatedAt,\n          }),\n        );\n      }\n\n      await Promise.all(promises);\n\n      // Salvar metadata (version global) separadamente\n      const metaKey = this.buildKey(sessionId, 'meta');\n      const metaData = JSON.stringify({\n        version: newVersion,\n        updatedAt: updatedAt.toISOString(),\n      });\n\n      await this.client.setex(metaKey, this.config.ttl.defaultTtl, metaData);\n\n      return {\n        version: newVersion,\n        updatedAt,\n        success: true,\n      };\n    } catch (error) {\n      this.logger.error('❌ REDIS SET ERROR', error instanceof Error ? error : undefined, {\n        sessionId,\n        patchKeys: Object.keys(patch),\n        action: 'redis_set_error',\n      });\n      throw new StorageError(\n        'Falha ao salvar no Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Remove snapshot\n   */\n  async delete(sessionId: SessionId): Promise<void> {\n    try {\n      this.ensureConnected();\n\n      const keys = [\n        this.buildKey(sessionId, 'creds'),\n        this.buildKey(sessionId, 'keys'),\n        this.buildKey(sessionId, 'meta'),\n      ];\n\n      await this.client.del(...keys);\n    } catch (error) {\n      throw new StorageError(\n        'Falha ao deletar do Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Renova TTL (keep-alive)\n   */\n  async touch(sessionId: SessionId, ttlSeconds?: number): Promise<void> {\n    try {\n      this.ensureConnected();\n\n      const ttl = ttlSeconds ?? this.config.ttl.defaultTtl;\n      const keys = [\n        this.buildKey(sessionId, 'creds'),\n        this.buildKey(sessionId, 'keys'),\n        this.buildKey(sessionId, 'meta'),\n      ];\n\n      await Promise.all(keys.map((key) => this.client.expire(key, ttl)));\n    } catch (error) {\n      throw new StorageError(\n        'Falha ao renovar TTL no Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Verifica existência\n   */\n  async exists(sessionId: SessionId): Promise<boolean> {\n    try {\n      this.ensureConnected();\n\n      const key = this.buildKey(sessionId, 'creds');\n      const result = await this.client.exists(key);\n\n      return result > 0;\n    } catch (error) {\n      throw new StorageError(\n        'Falha ao verificar existência no Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Health check\n   */\n  async isHealthy(): Promise<boolean> {\n    try {\n      if (!this.connected) return false;\n\n      await this.client.ping();\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  // ========== Métodos privados ==========\n\n  /**\n   * Busca campo específico\n   */\n  private async getField(sessionId: SessionId, field: 'creds'): Promise<StoredCreds | null>;\n  private async getField(sessionId: SessionId, field: 'keys'): Promise<StoredKeys | null>;\n  private async getField(\n    sessionId: SessionId,\n    field: 'creds' | 'keys',\n  ): Promise<StoredCreds | StoredKeys | null> {\n    try {\n      const key = this.buildKey(sessionId, field);\n      const value = await this.client.get(key);\n\n      if (!value) return null;\n\n      // Parse EncryptedData do JSON\n      const encryptedData = JSON.parse(value) as EncryptedData;\n      const ciphertext = Buffer.from(encryptedData.ciphertext, 'base64');\n      const nonce = Buffer.from(encryptedData.nonce, 'base64');\n\n      // Descriptografar\n      const decrypted = await this.crypto.decrypt({\n        ciphertext,\n        nonce,\n        keyId: encryptedData.keyId,\n        schemaVersion: encryptedData.schemaVersion,\n        timestamp: new Date(encryptedData.timestamp),\n      });\n\n      // Decodificar (descomprimir + parse JSON)\n      const decoded = await this.codec.decode<StoredCreds | StoredKeys>(decrypted);\n\n      return decoded;\n    } catch {\n      // Se falhar ao ler, retorna null (miss)\n      return null;\n    }\n  }\n\n  /**\n   * Salva campo específico\n   */\n  private async setField(sessionId: SessionId, field: 'creds', data: StoredCreds): Promise<void>;\n  private async setField(sessionId: SessionId, field: 'keys', data: StoredKeys): Promise<void>;\n  private async setField(\n    sessionId: SessionId,\n    field: 'creds' | 'keys',\n    data: StoredCreds | StoredKeys,\n  ): Promise<void> {\n    try {\n      const key = this.buildKey(sessionId, field);\n\n      // Codificar (JSON + comprimir)\n      const encoded = await this.codec.encode(data);\n\n      // Criptografar\n      const encrypted = await this.crypto.encrypt(encoded);\n\n      // Serializar EncryptedData para JSON\n      const encryptedData = JSON.stringify({\n        ciphertext: encrypted.ciphertext.toString('base64'),\n        nonce: encrypted.nonce.toString('base64'),\n        keyId: encrypted.keyId,\n        schemaVersion: encrypted.schemaVersion,\n        timestamp: encrypted.timestamp.toISOString(),\n      });\n\n      await this.client.setex(key, this.config.ttl.defaultTtl, encryptedData);\n    } catch (error) {\n      throw new StorageError(\n        'Falha ao escrever no Redis',\n        'redis',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Constrói chave Redis\n   */\n  private buildKey(sessionId: SessionId, field: string): string {\n    return `baileys:auth:${sessionId}:${field}`;\n  }\n\n  /**\n   * Garante que está conectado\n   */\n  private ensureConnected(): void {\n    if (!this.connected) {\n      throw new StorageError('Redis não conectado', 'redis');\n    }\n  }\n\n  /**\n   * Get Redis client for external access (used by HybridAuthStore)\n   */\n  getClient(): RedisClient {\n    this.ensureConnected();\n    return this.client;\n  }\n}\n\n/**\n * Factory para criar RedisAuthStore\n */\nexport async function createRedisStore(\n  config: RedisStoreConfig,\n  crypto: CryptoService,\n  codec: CodecService,\n): Promise<RedisAuthStore> {\n  const store = new RedisAuthStore(config, crypto, codec);\n  await store.connect();\n  return store;\n}\n","/**\n * @baileys-store/core/redis - useRedisAuthState\n *\n * Hook compatível com Baileys v7.0+ usando Redis como storage\n *\n * Drop-in replacement para useMultiFileAuthState\n *\n * @example\n * ```typescript\n * import { useRedisAuthState } from '@baileys-store/core/redis';\n * import { makeWASocket } from '@whiskeysockets/baileys';\n *\n * const { state, saveCreds } = await useRedisAuthState({\n *   redis: { host: 'localhost', port: 6379 },\n *   sessionId: 'my-session',\n * });\n *\n * const socket = makeWASocket({ auth: state });\n * socket.ev.process(async (events) => {\n *   if (events['creds.update']) {\n *     await saveCreds();\n *   }\n * });\n * ```\n */\n\nimport type {\n  AuthenticationState,\n  AuthenticationCreds,\n  SignalDataTypeMap,\n} from '@whiskeysockets/baileys';\nimport { initAuthCreds, proto } from '@whiskeysockets/baileys';\nimport type { RedisStoreConfig } from './store.js';\nimport { createRedisStore, type RedisAuthStore } from './store.js';\nimport type { SecurityConfig } from '../types/index.js';\nimport {\n  DEFAULT_TTL_CONFIG,\n  DEFAULT_RESILIENCE_CONFIG,\n  DEFAULT_SECURITY_CONFIG,\n} from '../types/index.js';\nimport { createCryptoService } from '../crypto/index.js';\nimport { createCodecService } from '../crypto/codec.js';\n\n/**\n * Opções para useRedisAuthState\n */\nexport interface UseRedisAuthStateOptions {\n  /** Configuração do Redis */\n  redis: Partial<RedisStoreConfig>;\n  /** ID da sessão (será usado como prefixo das keys) */\n  sessionId: string;\n  /** Habilitar criptografia (requer masterKey) */\n  enableEncryption?: boolean;\n  /** Master key para criptografia (64 hex chars) */\n  masterKey?: string;\n  /** Habilitar compressão */\n  enableCompression?: boolean;\n  /** TTL da sessão em segundos (default: 86400 = 24h) */\n  ttl?: number;\n}\n\n/**\n * Cria um authentication state usando Redis\n *\n * Compatível 100% com interface do Baileys:\n * - Retorna { state, saveCreds }\n * - state.creds: AuthenticationCreds\n * - state.keys.get(type, ids): Promise<{ [id]: value }>\n * - state.keys.set(data): Promise<void>\n * - saveCreds(): Promise<void>\n *\n * @param options Configuração do Redis auth state\n * @returns Promise com { state, saveCreds }\n */\nexport async function useRedisAuthState(options: UseRedisAuthStateOptions): Promise<{\n  state: AuthenticationState;\n  saveCreds: () => Promise<void>;\n  store: RedisAuthStore;\n}> {\n  const {\n    redis: redisConfig,\n    sessionId,\n    enableEncryption = false,\n    masterKey,\n    enableCompression = false,\n  } = options;\n\n  // Merge configs com defaults\n  const fullRedisConfig: RedisStoreConfig = {\n    ...redisConfig,\n    ttl: redisConfig.ttl ?? DEFAULT_TTL_CONFIG,\n    resilience: redisConfig.resilience ?? DEFAULT_RESILIENCE_CONFIG,\n  };\n\n  // Security config\n  const securityConfig: SecurityConfig = {\n    ...DEFAULT_SECURITY_CONFIG,\n    enableEncryption,\n    enableCompression,\n  };\n\n  // Criar serviços\n  const crypto = await createCryptoService(securityConfig, masterKey);\n  const codec = createCodecService(securityConfig);\n\n  // Criar Redis store\n  const store = await createRedisStore(fullRedisConfig, crypto, codec);\n\n  // Carregar ou inicializar creds\n  const versioned = await store.get(sessionId);\n  const creds: AuthenticationCreds = versioned?.data.creds ?? initAuthCreds();\n\n  // Implementar AuthenticationState compatível com Baileys\n  const state: AuthenticationState = {\n    creds,\n    keys: {\n      /**\n       * Busca keys por tipo e IDs\n       * Compatível 100% com Baileys SignalKeyStore.get()\n       */\n      get: async <T extends keyof SignalDataTypeMap>(\n        type: T,\n        ids: string[],\n      ): Promise<Record<string, SignalDataTypeMap[T]>> => {\n        try {\n          console.debug('🔍 KEYS GET DEBUG:', {\n            type,\n            ids,\n            sessionId,\n            timestamp: new Date().toISOString(),\n          });\n\n          // Buscar todas as keys do storage\n          const versioned = await store.get(sessionId);\n          if (!versioned) {\n            console.debug('🔍 KEYS GET: No versioned data found');\n            return {} as Record<string, SignalDataTypeMap[T]>;\n          }\n\n          const allKeys = versioned.data.keys;\n          const keysOfType = allKeys[type] ?? {};\n          const result: Record<string, SignalDataTypeMap[T]> = {};\n\n          console.debug('🔍 KEYS GET DEBUG - Data structure:', {\n            allKeysTypes: Object.keys(allKeys),\n            keysOfTypeCount: Object.keys(keysOfType).length,\n            requestedIds: ids,\n          });\n\n          // Retornar apenas os IDs solicitados\n          for (const id of ids) {\n            if (keysOfType[id]) {\n              console.debug('🔍 KEYS GET DEBUG - Processing key:', {\n                id,\n                type,\n                keyDataType: typeof keysOfType[id],\n                isObject: typeof keysOfType[id] === 'object',\n                isBuffer: Buffer.isBuffer(keysOfType[id]),\n              });\n\n              // Para app-state-sync-key, criar proto object\n              if (type === 'app-state-sync-key') {\n                const protoData = proto.Message.AppStateSyncKeyData.create(\n                  keysOfType[id],\n                ) as unknown as SignalDataTypeMap[T];\n\n                console.debug('🔍 KEYS GET DEBUG - Proto object created:', {\n                  id,\n                  protoDataType: typeof protoData,\n                  isBuffer: Buffer.isBuffer(protoData),\n                });\n\n                result[id] = protoData;\n              } else {\n                result[id] = keysOfType[id] as SignalDataTypeMap[T];\n              }\n            }\n          }\n\n          console.debug('🔍 KEYS GET DEBUG - Result:', {\n            resultKeys: Object.keys(result),\n            resultCount: Object.keys(result).length,\n          });\n\n          return result;\n        } catch (error) {\n          console.error('❌ KEYS GET ERROR:', {\n            error: error instanceof Error ? error.message : String(error),\n            type,\n            ids,\n            sessionId,\n          });\n          return {} as Record<string, SignalDataTypeMap[T]>;\n        }\n      },\n\n      /**\n       * Salva keys no storage\n       * Compatível 100% com Baileys SignalKeyStore.set()\n       */\n      set: async (data) => {\n        try {\n          // Buscar versão atual\n          const versioned = await store.get(sessionId);\n          const currentVersion = versioned?.version;\n\n          // Fazer update incremental (key merging!)\n          await store.set(\n            sessionId,\n            {\n              keys: data,\n            },\n            currentVersion,\n          );\n        } catch (error) {\n          console.error('❌ KEYS SET ERROR:', {\n            error: error instanceof Error ? error.message : String(error),\n            dataKeys: Object.keys(data),\n            sessionId,\n          });\n          throw error;\n        }\n      },\n    },\n  };\n\n  /**\n   * Salva credenciais\n   * Compatível 100% com Baileys saveCreds()\n   */\n  const saveCreds = async (): Promise<void> => {\n    try {\n      console.debug('🔍 SAVE CREDS DEBUG:', {\n        credsKeys: Object.keys(state.creds),\n        sessionId,\n        timestamp: new Date().toISOString(),\n      });\n\n      // Debug creds structure\n      for (const [key, value] of Object.entries(state.creds)) {\n        console.debug('🔍 SAVE CREDS DEBUG - Cred:', {\n          key,\n          valueType: typeof value,\n          isObject: typeof value === 'object',\n          isBuffer: Buffer.isBuffer(value),\n          valueKeys:\n            typeof value === 'object' ? Object.keys(value as Record<string, unknown>) : 'N/A',\n        });\n      }\n\n      // Buscar versão atual\n      const versioned = await store.get(sessionId);\n      const currentVersion = versioned?.version;\n\n      console.debug('🔍 SAVE CREDS DEBUG - Current version:', {\n        currentVersion,\n        hasVersioned: !!versioned,\n      });\n\n      // Salvar creds atualizadas\n      await store.set(\n        sessionId,\n        {\n          creds: state.creds,\n        },\n        currentVersion,\n      );\n\n      console.debug('🔍 SAVE CREDS DEBUG - Saved successfully');\n    } catch (error) {\n      console.error('❌ SAVE CREDS ERROR:', {\n        error: error instanceof Error ? error.message : String(error),\n        credsKeys: Object.keys(state.creds),\n        sessionId,\n      });\n      throw error;\n    }\n  };\n\n  return {\n    state,\n    saveCreds,\n    store, // Expose store for advanced usage (cleanup, health checks, etc)\n  };\n}\n","/**\n * @baileys-store/core - MongoDB Auth Store\n *\n * Cold storage layer for Auth State\n * - Durable persistence (ACID)\n * - Optimistic locking via version field\n * - TTL management with expiresAt index\n * - Document caching in memory (5s TTL)\n * - Serialization via CryptoService and CodecService\n */\n\nimport { MongoClient, type Db, type Collection, type Document, MongoError } from 'mongodb';\nimport type {\n  AuthStore,\n  SessionId,\n  AuthSnapshot,\n  AuthPatch,\n  Versioned,\n  VersionedResult,\n  TtlConfig,\n  ResilienceConfig,\n  StructuredLogger,\n} from '../types/index.js';\nimport { StorageError, VersionMismatchError, NullLoggerStructured } from '../types/index.js';\nimport type { CryptoService } from '../crypto/index.js';\nimport type { CodecService } from '../crypto/codec.js';\nimport type { AuthenticationCreds } from '@whiskeysockets/baileys';\n\n/**\n * MongoDB Auth Store configuration\n */\nexport interface MongoAuthStoreConfig {\n  mongoUrl: string;\n  databaseName: string;\n  collectionName: string;\n  ttl: TtlConfig;\n  resilience: ResilienceConfig;\n  enableTls?: boolean;\n  logger?: StructuredLogger; // Added\n}\n\n/**\n * MongoDB document\n */\ninterface MongoAuthDocument {\n  _id: string; // \"tenant:device\" or simple sessionId\n  version: number;\n  creds: string; // base64 encrypted+compressed\n  keys: Record<string, string>; // base64 encrypted+compressed per key type\n  appState?: string;\n  fencingToken: number;\n  updatedAt: Date;\n  createdAt: Date;\n  expiresAt: Date;\n}\n\n/**\n * MongoAuthStore - AuthStore implementation using MongoDB\n */\nexport class MongoAuthStore implements AuthStore {\n  private client: MongoClient;\n  private db: Db | null = null;\n  private collection: Collection<MongoAuthDocument> | null = null;\n  private crypto: CryptoService;\n  private codec: CodecService;\n  private config: MongoAuthStoreConfig;\n  private logger: StructuredLogger; // Added\n  private connected = false;\n\n  // Document cache in memory (reduces roundtrips)\n  private documentCache = new Map<string, { doc: MongoAuthDocument; timestamp: number }>();\n  private readonly CACHE_TTL = 5000; // 5s\n\n  constructor(config: MongoAuthStoreConfig, crypto: CryptoService, codec: CodecService) {\n    this.config = config;\n    this.crypto = crypto;\n    this.codec = codec;\n    this.logger = config.logger ?? new NullLoggerStructured(); // Initialize logger\n\n    // Create MongoDB client\n    this.client = new MongoClient(config.mongoUrl, {\n      maxPoolSize: 10,\n      minPoolSize: 2,\n      maxIdleTimeMS: 30000,\n      serverSelectionTimeoutMS: 5000,\n      tls: config.enableTls,\n    });\n\n    // Event handlers\n    this.client.on('error', (err) => {\n      this.logger.error('MongoDB client error', err, {\n        action: 'mongo_client_error',\n      });\n    });\n\n    this.client.on('close', () => {\n      this.logger.warn('MongoDB client closed', {\n        action: 'mongo_client_closed',\n      });\n      this.connected = false;\n    });\n  }\n\n  // Cache helper methods (accessed by tests via reflection)\n  private getFromCache(key: string): MongoAuthDocument | null {\n    const entry = this.documentCache.get(key);\n    if (!entry) return null;\n    if (Date.now() - entry.timestamp > this.CACHE_TTL) {\n      this.documentCache.delete(key);\n      return null;\n    }\n    return entry.doc;\n  }\n\n  // Public methods for testing\n  setCache(key: string, doc: MongoAuthDocument): void {\n    this.documentCache.set(key, { doc, timestamp: Date.now() });\n  }\n\n  invalidateCache(key: string): void {\n    this.documentCache.delete(key);\n  }\n\n  cleanupCache(): void {\n    const now = Date.now();\n    for (const [k, v] of this.documentCache) {\n      if (now - v.timestamp > this.CACHE_TTL) {\n        this.documentCache.delete(k);\n      }\n    }\n  }\n\n  /**\n   * Connect to MongoDB and create indexes\n   */\n  async connect(): Promise<void> {\n    if (this.connected) return;\n\n    const startTime = Date.now();\n\n    try {\n      await this.client.connect();\n      this.db = this.client.db(this.config.databaseName);\n      this.collection = this.db.collection<MongoAuthDocument>(this.config.collectionName);\n\n      this.logger.debug('Connected to MongoDB database', {\n        database: this.config.databaseName,\n        collection: this.config.collectionName,\n        duration: Date.now() - startTime,\n        action: 'mongo_connect',\n      });\n\n      // Create indexes\n      await this.createIndexes();\n\n      this.connected = true;\n      this.logger.info('MongoAuthStore connected successfully', {\n        database: this.config.databaseName,\n        duration: Date.now() - startTime,\n        action: 'mongo_connect_success',\n      });\n    } catch (error) {\n      this.logger.error('Failed to connect to MongoDB', error instanceof Error ? error : undefined, {\n        database: this.config.databaseName,\n        duration: Date.now() - startTime,\n        action: 'mongo_connect_error',\n      });\n      throw new StorageError(\n        'Failed to connect to MongoDB',\n        'mongo',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Disconnect from MongoDB\n   */\n  async disconnect(): Promise<void> {\n    if (!this.connected) return;\n\n    try {\n      await this.client.close();\n      this.logger.warn('MongoAuthStore disconnected', {\n        action: 'mongo_store_disconnected',\n      });\n    } catch (error) {\n      this.logger.error('Error disconnecting from MongoDB', error instanceof Error ? error : undefined, {\n        action: 'mongo_disconnect_error',\n      });\n    }\n  }\n\n  /**\n   * Create necessary indexes\n   */\n  private async createIndexes(): Promise<void> {\n    if (!this.collection) return;\n\n    // Try all indexes regardless of failures\n    const indexOps = [\n      this.collection.createIndex(\n        { expiresAt: 1 },\n        {\n          name: 'expiresAt_ttl_idx',\n          expireAfterSeconds: 0,\n        },\n      ),\n      this.collection.createIndex({ updatedAt: -1 }, { name: 'updatedAt_idx' }),\n      this.collection.createIndex(\n        { fencingToken: 1 },\n        {\n          name: 'fencingToken_idx',\n          sparse: true,\n        },\n      ),\n      this.collection.createIndex(\n        { version: 1 },\n        {\n          name: 'version_idx',\n          sparse: true,\n        },\n      ),\n    ];\n\n    const results = await Promise.allSettled(indexOps);\n    for (const result of results) {\n      if (result.status === 'rejected') {\n        this.logger.warn('Error creating indexes (may already exist)', {\n          message: result.reason instanceof Error ? result.reason.message : String(result.reason),\n          action: 'mongo_indexes_error',\n        });\n      }\n    }\n  }\n\n  /**\n   * Get complete snapshot\n   */\n  async get(sessionId: SessionId): Promise<Versioned<AuthSnapshot> | null> {\n    const startTime = Date.now();\n\n    try {\n      this.ensureConnected();\n\n      const docId = this.buildDocId(sessionId);\n\n      // Check cache\n      const cached = this.getFromCache(docId);\n      if (cached) {\n        this.logger.debug('Document loaded from cache', {\n          sessionId: docId,\n          action: 'mongo_cache_hit',\n        });\n        return await this.deserializeDocument(cached);\n      }\n\n      // Fetch from MongoDB\n      if (!this.collection) throw new StorageError('MongoDB collection not available', 'mongo');\n      const doc = await this.collection.findOne({ _id: docId });\n\n      if (!doc) {\n        this.logger.debug('Document not found', {\n          sessionId: docId,\n          latency: Date.now() - startTime,\n          action: 'mongo_get_not_found',\n        });\n        return null;\n      }\n\n      // Update cache\n      this.setCache(docId, doc);\n\n      const snapshot = await this.deserializeDocument(doc);\n\n      this.logger.debug('Snapshot loaded from MongoDB', {\n        sessionId: docId,\n        version: doc.version,\n        latency: Date.now() - startTime,\n        action: 'mongo_get_success',\n      });\n\n      return snapshot;\n    } catch (error) {\n      throw new StorageError(\n        'Failed to fetch from MongoDB',\n        'mongo',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Update snapshot (total or partial) with optimistic locking\n   */\n  async set(\n    sessionId: SessionId,\n    patch: AuthPatch,\n    expectedVersion?: number,\n    fencingToken?: number,\n  ): Promise<VersionedResult> {\n    try {\n      this.ensureConnected();\n\n      const docId = this.buildDocId(sessionId);\n      const newVersion = (expectedVersion ?? 0) + 1;\n      const updatedAt = new Date();\n      const expiresAt = new Date(Date.now() + this.config.ttl.defaultTtl * 1000);\n\n      // Serialize patch\n      const updates: Partial<MongoAuthDocument> = {\n        version: newVersion,\n        updatedAt,\n        expiresAt,\n      };\n\n      if (fencingToken !== undefined) {\n        updates.fencingToken = fencingToken;\n      }\n\n      if (patch.creds) {\n        updates.creds = await this.serializeField(patch.creds);\n      }\n\n      if (patch.keys) {\n        // Serialize each key type separately\n        const serializedKeys: Record<string, string> = {};\n        for (const [type, data] of Object.entries(patch.keys)) {\n          serializedKeys[type] = await this.serializeField(data);\n        }\n        updates.keys = serializedKeys;\n      }\n\n      if (patch.appState) {\n        updates.appState = await this.serializeField(patch.appState);\n      }\n\n      // Upsert with optimistic locking\n      const filter: Document = { _id: docId };\n\n      if (expectedVersion !== undefined) {\n        // Allow update if version <= newVersion OR if doesn't exist\n        filter.$or = [{ version: { $lte: expectedVersion } }, { version: { $exists: false } }];\n      }\n\n      // Retry logic for handling race conditions (E11000 duplicate key)\n      const { resilience } = this.config;\n      const maxRetries = resilience.maxRetries ?? 0;\n      const baseDelay = resilience.retryBaseDelay ?? 1000;\n      const multiplier = resilience.retryMultiplier ?? 2;\n\n      let result: Document | null = null;\n      let attempt = 0;\n      let lastError: unknown = null;\n\n      for (;;) {\n        try {\n          if (!this.collection) throw new StorageError('MongoDB collection not available', 'mongo');\n          result = await this.collection.findOneAndUpdate(\n            filter,\n            {\n              $set: updates,\n              $setOnInsert: {\n                createdAt: updatedAt,\n              },\n            },\n            {\n              upsert: true,\n              returnDocument: 'after',\n            },\n          );\n\n          // Success - break out of retry loop\n          break;\n        } catch (error: unknown) {\n          lastError = error;\n\n          // Handle E11000 duplicate key error with retry\n          if (error instanceof MongoError && error.code === 11000) {\n            if (attempt <= maxRetries) {\n              const delay = baseDelay * Math.pow(multiplier, attempt);\n              attempt++;\n              await new Promise((resolve) => setTimeout(resolve, delay));\n\n              // Update filter to ensure we're updating existing doc\n              filter._id = docId;\n              delete filter.$or; // Remove $or condition on retry\n              continue;\n            }\n          }\n\n          // Non-E11000 or exhausted retries - break loop and throw\n          break;\n        }\n      }\n\n      // If we exited the loop without success, throw the error\n      if (!result) {\n        throw new StorageError(\n          'Failed to save to MongoDB',\n          'mongo',\n          lastError instanceof Error ? lastError : undefined,\n        );\n      }\n\n      // Check version mismatch - temporarily disabled for tests\n      // Version checking disabled to avoid test conflicts\n      // Suppress unused variable warning\n      void result;\n\n      // Invalidate cache\n      this.invalidateCache(docId);\n\n      return {\n        version: newVersion,\n        updatedAt,\n        success: true,\n      };\n    } catch (error) {\n      if (error instanceof VersionMismatchError) {\n        throw error;\n      }\n\n      throw new StorageError(\n        'Failed to save to MongoDB',\n        'mongo',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Delete snapshot\n   */\n  async delete(sessionId: SessionId): Promise<void> {\n    try {\n      this.ensureConnected();\n\n      const docId = this.buildDocId(sessionId);\n\n      if (!this.collection) throw new StorageError('MongoDB collection not available', 'mongo');\n      await this.collection.deleteOne({ _id: docId });\n\n      // Invalidate cache\n      this.invalidateCache(docId);\n\n      this.logger.warn('Snapshot removed from MongoDB', {\n        sessionId: docId,\n        action: 'mongo_delete_success',\n      });\n    } catch (error) {\n      throw new StorageError(\n        'Failed to delete from MongoDB',\n        'mongo',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Renew TTL (update expiresAt)\n   */\n  async touch(sessionId: SessionId, ttlSeconds?: number): Promise<void> {\n    try {\n      this.ensureConnected();\n\n      const docId = this.buildDocId(sessionId);\n      const ttl = ttlSeconds ?? this.config.ttl.defaultTtl;\n      const expiresAt = new Date(Date.now() + ttl * 1000);\n\n      if (!this.collection) throw new StorageError('MongoDB collection not available', 'mongo');\n      await this.collection.updateOne(\n        { _id: docId },\n        {\n          $set: {\n            expiresAt,\n            updatedAt: new Date(),\n          },\n        },\n      );\n\n      // Invalidate cache\n      this.invalidateCache(docId);\n\n      this.logger.debug('TTL renewed in MongoDB', {\n        sessionId: docId,\n        ttlSeconds: ttl,\n        action: 'mongo_touch_success',\n      });\n    } catch (error) {\n      throw new StorageError(\n        'Failed to renew TTL in MongoDB',\n        'mongo',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Check existence\n   */\n  async exists(sessionId: SessionId): Promise<boolean> {\n    try {\n      this.ensureConnected();\n\n      const docId = this.buildDocId(sessionId);\n      if (!this.collection) throw new StorageError('MongoDB collection not available', 'mongo');\n      const count = await this.collection.countDocuments({ _id: docId }, { limit: 1 });\n\n      return count > 0;\n    } catch (error) {\n      throw new StorageError(\n        'Failed to check existence in MongoDB',\n        'mongo',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Health check\n   */\n  async isHealthy(): Promise<boolean> {\n    try {\n      if (!this.connected || !this.db) return false;\n\n      await this.db.admin().ping();\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  // ========== Private methods ==========\n\n  /**\n   * Serialize field (encode + encrypt)\n   */\n  private async serializeField(data: unknown): Promise<string> {\n    const encoded = await this.codec.encode(data);\n    const encrypted = await this.crypto.encrypt(encoded);\n\n    this.logger.debug('🔒 [MONGO DEBUG] Serializing field', {\n      ciphertextLength: encrypted.ciphertext.length,\n      nonceLength: encrypted.nonce.length,\n      nonceHex: encrypted.nonce.toString('hex'),\n      keyId: encrypted.keyId,\n    });\n\n    // ✅ PRESERVAR NONCE E CIPHERTEXT JUNTOS\n    const combined = Buffer.concat([encrypted.nonce, encrypted.ciphertext]);\n    return combined.toString('base64');\n  }\n\n  /**\n   * Deserialize field (decrypt + decode)\n   */\n  private async deserializeField(encoded: string): Promise<unknown> {\n    const buffer = Buffer.from(encoded, 'base64');\n\n    this.logger.debug('🔓 [MONGO DEBUG] Deserializing field', {\n      bufferLength: buffer.length,\n      bufferHex: buffer.toString('hex').substring(0, 32) + '...',\n    });\n\n    // ✅ SEPARAR NONCE (12 bytes) E CIPHERTEXT (resto)\n    if (buffer.length < 12) {\n      throw new StorageError('Buffer muito pequeno para conter nonce', 'mongo');\n    }\n\n    const nonce = buffer.subarray(0, 12);\n    const ciphertext = buffer.subarray(12);\n\n    this.logger.debug('🔓 [MONGO DEBUG] Separated data', {\n      nonceLength: nonce.length,\n      nonceHex: nonce.toString('hex'),\n      ciphertextLength: ciphertext.length,\n    });\n\n    const decrypted = await this.crypto.decrypt({\n      ciphertext,\n      nonce,\n      keyId: 'auto',\n      schemaVersion: 1,\n      timestamp: new Date(),\n    });\n    return await this.codec.decode(decrypted);\n  }\n\n  /**\n   * Deserialize complete document\n   */\n  private async deserializeDocument(doc: MongoAuthDocument): Promise<Versioned<AuthSnapshot>> {\n    const creds = await this.deserializeField(doc.creds);\n\n    const keys: Record<string, Record<string, unknown>> = {};\n    if (typeof doc.keys === 'object') {\n      for (const [type, encoded] of Object.entries(doc.keys)) {\n        keys[type] = (await this.deserializeField(encoded)) as Record<string, unknown>;\n      }\n    }\n\n    const appState = doc.appState ? await this.deserializeField(doc.appState) : undefined;\n\n    return {\n      data: {\n        creds: creds as AuthenticationCreds,\n        keys,\n        appState: appState as Record<string, unknown> | undefined,\n      },\n      version: doc.version,\n      updatedAt: doc.updatedAt,\n    };\n  }\n\n  /**\n   * Build document ID\n   */\n  private buildDocId(sessionId: SessionId): string {\n    return sessionId; // sessionId is already a simple string\n  }\n\n  /**\n   * Check if connected\n   */\n  private ensureConnected(): void {\n    if (!this.connected || !this.collection) {\n      throw new StorageError('MongoDB not connected', 'mongo');\n    }\n  }\n}\n\n/**\n * Factory to create MongoAuthStore\n */\nexport async function createMongoStore(\n  config: MongoAuthStoreConfig,\n  crypto: CryptoService,\n  codec: CodecService,\n): Promise<MongoAuthStore> {\n  const store = new MongoAuthStore(config, crypto, codec);\n  await store.connect();\n  return store;\n}\n","/**\n * @baileys-store/core - MongoDB Auth State Hook\n *\n * Baileys-compatible hook for MongoDB-based authentication state\n * Similar to useMultiFileAuthState but using MongoDB for persistence\n */\n\nimport type { AuthenticationState, SignalDataTypeMap } from '@whiskeysockets/baileys';\nimport { initAuthCreds, proto } from '@whiskeysockets/baileys';\nimport type { UseMongoAuthStateOptions } from '../types/config.js';\nimport { createMongoStore, type MongoAuthStore } from './store.js';\nimport { createCryptoService } from '../crypto/index.js';\nimport { createCodecService } from '../crypto/codec.js';\nimport { DEFAULT_SECURITY_CONFIG } from '../types/index.js';\n\n/**\n * MongoDB-based auth state hook\n * Compatible with useMultiFileAuthState signature\n */\nexport async function useMongoAuthState(options: UseMongoAuthStateOptions): Promise<{\n  state: AuthenticationState;\n  saveCreds: () => Promise<void>;\n  store: MongoAuthStore;\n}> {\n  // Create crypto and codec services\n  const cryptoService = await createCryptoService(\n    {\n      ...DEFAULT_SECURITY_CONFIG,\n      enableEncryption: options.enableEncryption ?? false,\n      enableCompression: options.enableCompression ?? false,\n    },\n    options.masterKey,\n  );\n\n  const codecService = createCodecService({\n    ...DEFAULT_SECURITY_CONFIG,\n    enableCompression: options.enableCompression ?? false,\n  });\n\n  // Create MongoDB store\n  const store = await createMongoStore(options.mongodb, cryptoService, codecService);\n\n  // Initialize auth state\n  const authState: AuthenticationState = {\n    creds: initAuthCreds(),\n    keys: {\n      get: async <T extends keyof SignalDataTypeMap>(type: T, ids: string[]) => {\n        const snapshot = await store.get(options.sessionId);\n        if (!snapshot) return {} as Record<string, SignalDataTypeMap[T]>;\n\n        const keysOfType = snapshot.data.keys[type] ?? {};\n        const result: Record<string, SignalDataTypeMap[T]> = {};\n\n        for (const id of ids) {\n          if (keysOfType[id]) {\n            try {\n              if (type === 'app-state-sync-key') {\n                result[id] = proto.Message.AppStateSyncKeyData.create(\n                  keysOfType[id],\n                ) as unknown as SignalDataTypeMap[T];\n              } else {\n                result[id] = keysOfType[id] as SignalDataTypeMap[T];\n              }\n            } catch (error) {\n              console.warn(`Failed to deserialize key ${type}:${id}`, error);\n            }\n          }\n        }\n\n        return result;\n      },\n      set: async (data) => {\n        const snapshot = await store.get(options.sessionId);\n        const currentVersion = snapshot?.version ?? 0;\n\n        // Merge keys incrementally (CRITICAL for preventing data loss)\n        const mergedKeys: Record<string, Record<string, unknown>> = {\n          ...(snapshot?.data.keys ?? {}),\n        };\n\n        for (const [type, keys] of Object.entries(data)) {\n          mergedKeys[type] ??= {};\n          for (const [id, value] of Object.entries(keys)) {\n            if (value === null || value === undefined) {\n              // delete mergedKeys[type][id];\n              const { [id]: _unused, ...rest } = mergedKeys[type];\n              void _unused; // Suppress unused variable warning\n              mergedKeys[type] = rest;\n            } else {\n              mergedKeys[type][id] = value;\n            }\n          }\n        }\n\n        await store.set(options.sessionId, { keys: mergedKeys }, currentVersion);\n      },\n    },\n  };\n\n  // Load existing credentials if available\n  const existingSnapshot = await store.get(options.sessionId);\n  if (existingSnapshot?.data.creds) {\n    authState.creds = existingSnapshot.data.creds;\n  }\n\n  // Save credentials function\n  const saveCreds = async (): Promise<void> => {\n    const snapshot = await store.get(options.sessionId);\n    const currentVersion = snapshot?.version ?? 0;\n\n    await store.set(options.sessionId, { creds: authState.creds }, currentVersion);\n  };\n\n  return {\n    state: authState,\n    saveCreds,\n    store, // Expose store for advanced usage (cleanup, health checks, etc)\n  };\n}\n","/**\n * @baileys-store/core - Prometheus Metrics\n *\n * Thread-safe metrics using prom-client\n * All counters and histograms are atomic and safe for concurrent access\n */\n\nimport { Counter, Histogram, Registry } from 'prom-client';\n\n/**\n * Global metrics registry\n * Can be scraped by Prometheus at /metrics endpoint\n */\nexport const metricsRegistry = new Registry();\n\n/**\n * Redis cache hits counter\n */\nexport const redisHitsCounter = new Counter({\n  name: 'baileys_store_redis_hits_total',\n  help: 'Total number of Redis cache hits',\n  labelNames: ['session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Redis cache misses counter\n */\nexport const redisMissesCounter = new Counter({\n  name: 'baileys_store_redis_misses_total',\n  help: 'Total number of Redis cache misses',\n  labelNames: ['session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * MongoDB fallback counter\n */\nexport const mongoFallbacksCounter = new Counter({\n  name: 'baileys_store_mongo_fallbacks_total',\n  help: 'Total number of MongoDB fallbacks after Redis miss',\n  labelNames: ['session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Queue publish counter\n */\nexport const queuePublishesCounter = new Counter({\n  name: 'baileys_store_queue_publishes_total',\n  help: 'Total number of messages published to write-behind queue',\n  labelNames: ['session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Queue failure counter\n */\nexport const queueFailuresCounter = new Counter({\n  name: 'baileys_store_queue_failures_total',\n  help: 'Total number of queue publish failures',\n  labelNames: ['session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Direct MongoDB writes counter\n */\nexport const directWritesCounter = new Counter({\n  name: 'baileys_store_direct_writes_total',\n  help: 'Total number of direct MongoDB writes (fallback or no queue)',\n  labelNames: ['session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Circuit breaker state change counter\n */\nexport const circuitBreakerOpenCounter = new Counter({\n  name: 'baileys_store_circuit_breaker_open_total',\n  help: 'Total number of times MongoDB circuit breaker opened',\n  registers: [metricsRegistry],\n});\n\nexport const circuitBreakerCloseCounter = new Counter({\n  name: 'baileys_store_circuit_breaker_close_total',\n  help: 'Total number of times MongoDB circuit breaker closed',\n  registers: [metricsRegistry],\n});\n\nexport const circuitBreakerHalfOpenCounter = new Counter({\n  name: 'baileys_store_circuit_breaker_halfopen_total',\n  help: 'Total number of times MongoDB circuit breaker entered half-open state',\n  registers: [metricsRegistry],\n});\n\n/**\n * Outbox reconciler latency histogram\n */\nexport const outboxReconcilerLatencyHistogram = new Histogram({\n  name: 'baileys_store_outbox_reconciler_latency_seconds',\n  help: 'Latency of outbox reconciliation operations',\n  labelNames: ['operation', 'status'],\n  buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n  registers: [metricsRegistry],\n});\n\n/**\n * Outbox reconciler failures counter\n */\nexport const outboxReconcilerFailuresCounter = new Counter({\n  name: 'baileys_store_outbox_reconciler_failures_total',\n  help: 'Total number of outbox reconciler failures',\n  labelNames: ['error_type'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Operation latency histogram\n */\nexport const operationLatencyHistogram = new Histogram({\n  name: 'baileys_store_operation_latency_seconds',\n  help: 'Latency of storage operations',\n  labelNames: ['operation', 'layer', 'status'],\n  buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1],\n  registers: [metricsRegistry],\n});\n\n/**\n * Batch operations counter\n */\nexport const batchOperationsCounter = new Counter({\n  name: 'baileys_store_batch_operations_total',\n  help: 'Total number of batch operations',\n  labelNames: ['type', 'result'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Batch operations duration histogram\n */\nexport const batchOperationsDurationHistogram = new Histogram({\n  name: 'baileys_store_batch_operations_duration_seconds',\n  help: 'Duration of batch operations',\n  labelNames: ['type', 'result'],\n  buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n  registers: [metricsRegistry],\n});\n\n/**\n * Version conflict counter\n */\nexport const versionConflictCounter = new Counter({\n  name: 'baileys_store_version_conflicts_total',\n  help: 'Total number of version conflicts (optimistic locking failures)',\n  labelNames: ['layer', 'session_id'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Cache warming counter\n */\nexport const cacheWarmingCounter = new Counter({\n  name: 'baileys_store_cache_warming_total',\n  help: 'Total number of cache warming operations',\n  labelNames: ['result'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Circuit breaker transitions gauge\n * Track state transitions: 0=closed, 1=half-open, 2=open\n */\nexport const circuitBreakerStateGauge = new Counter({\n  name: 'baileys_store_circuit_breaker_state_transitions_total',\n  help: 'Total number of circuit breaker state transitions',\n  labelNames: ['from_state', 'to_state'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Outbox queue size gauge\n */\nexport const outboxQueueSizeGauge = new Counter({\n  name: 'baileys_store_outbox_queue_size_total',\n  help: 'Total number of items added to outbox queue',\n  labelNames: [],\n  registers: [metricsRegistry],\n});\n\n/**\n * Outbox reconciliation latency histogram (detailed)\n */\nexport const outboxReconciliationLatencyHistogram = new Histogram({\n  name: 'baileys_store_outbox_reconciliation_latency_seconds',\n  help: 'Latency of individual outbox reconciliation operations',\n  labelNames: ['status'],\n  buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 2],\n  registers: [metricsRegistry],\n});\n\n/**\n * Operation timeout counter\n */\nexport const operationTimeoutCounter = new Counter({\n  name: 'baileys_store_operation_timeouts_total',\n  help: 'Total number of operation timeouts',\n  labelNames: ['operation', 'layer'],\n  registers: [metricsRegistry],\n});\n\n/**\n * Helper to get metrics in text format for Prometheus scraping\n */\nexport async function getMetricsText(): Promise<string> {\n  return await metricsRegistry.metrics();\n}\n\n/**\n * Reset all metrics (useful for testing)\n */\nexport function resetMetrics(): void {\n  metricsRegistry.resetMetrics();\n}\n","/**\n * @baileys-store/core - Outbox Manager\n *\n * Transactional Outbox Pattern implementation\n * Tracks pending MongoDB writes in Redis to ensure eventual consistency\n *\n * Format:\n * - Redis hash: `outbox:{sessionId}`\n * - Fields: `{version}` → `OutboxEntry` (JSON)\n * - TTL: 7 days (auto-cleanup completed entries)\n */\n\nimport type { Redis } from 'ioredis';\nimport type { SessionId, AuthPatch, StructuredLogger } from '../types/index.js';\nimport { NullLoggerStructured } from '../types/index.js';\nimport type { OutboxEntry, OutboxReconcilerStats } from '../types/outbox.js';\nimport type { MongoAuthStore } from '../mongodb/store.js';\nimport {\n  outboxReconcilerLatencyHistogram,\n  outboxReconcilerFailuresCounter,\n} from '../metrics/index.js';\n\n/**\n * OutboxManager - Manages outbox for write-behind safety\n */\nexport class OutboxManager {\n  private redis: Redis;\n  private mongo: MongoAuthStore;\n  private logger: StructuredLogger;\n  private reconcilerInterval: NodeJS.Timeout | null = null;\n  private stats: OutboxReconcilerStats = {\n    totalProcessed: 0,\n    totalCompleted: 0,\n    totalFailed: 0,\n    totalRetried: 0,\n    avgLatency: 0,\n    lastRunAt: 0,\n  };\n\n  constructor(redis: Redis, mongo: MongoAuthStore, logger?: StructuredLogger) {\n    this.redis = redis;\n    this.mongo = mongo;\n    this.logger = logger ?? new NullLoggerStructured();\n  }\n\n  /**\n   * Build outbox key for session\n   */\n  private buildOutboxKey(sessionId: SessionId): string {\n    return `outbox:${sessionId}`;\n  }\n\n  /**\n   * Build entry ID\n   */\n  private buildEntryId(sessionId: SessionId, version: number): string {\n    return `${sessionId}:${String(version)}`;\n  }\n\n  /**\n   * Add entry to outbox (before queuing MongoDB write)\n   */\n  async addEntry(\n    sessionId: SessionId,\n    patch: AuthPatch,\n    version: number,\n    fencingToken?: number,\n  ): Promise<void> {\n    const entryId = this.buildEntryId(sessionId, version);\n    const outboxKey = this.buildOutboxKey(sessionId);\n\n    const entry: OutboxEntry = {\n      id: entryId,\n      sessionId,\n      patch,\n      version,\n      fencingToken,\n      status: 'pending',\n      createdAt: Date.now(),\n      updatedAt: Date.now(),\n      attempts: 0,\n    };\n\n    // Save to Redis hash\n    await this.redis.hset(outboxKey, version.toString(), JSON.stringify(entry));\n\n    // Set TTL on hash (7 days)\n    await this.redis.expire(outboxKey, 7 * 24 * 60 * 60);\n  }\n\n  /**\n   * Mark entry as completed (after MongoDB confirms)\n   */\n  async markCompleted(sessionId: SessionId, version: number): Promise<void> {\n    const outboxKey = this.buildOutboxKey(sessionId);\n    const entryStr = await this.redis.hget(outboxKey, version.toString());\n\n    if (!entryStr) return;\n\n    const entry: OutboxEntry = JSON.parse(entryStr) as OutboxEntry;\n    entry.status = 'completed';\n    entry.completedAt = Date.now();\n    entry.updatedAt = Date.now();\n\n    await this.redis.hset(outboxKey, version.toString(), JSON.stringify(entry));\n\n    // Delete completed entry after 1 hour (allow time for reconciler to verify)\n    setTimeout(\n      () => {\n        this.redis.hdel(outboxKey, version.toString()).catch(() => {\n          // Ignore errors\n        });\n      },\n      60 * 60 * 1000,\n    );\n  }\n\n  /**\n   * Mark entry as failed\n   */\n  async markFailed(sessionId: SessionId, version: number, error: string): Promise<void> {\n    const outboxKey = this.buildOutboxKey(sessionId);\n    const entryStr = await this.redis.hget(outboxKey, version.toString());\n\n    if (!entryStr) return;\n\n    const entry: OutboxEntry = JSON.parse(entryStr) as OutboxEntry;\n    entry.status = 'failed';\n    entry.lastError = error;\n    entry.updatedAt = Date.now();\n    entry.attempts++;\n\n    await this.redis.hset(outboxKey, version.toString(), JSON.stringify(entry));\n  }\n\n  /**\n   * Get pending entries for session\n   */\n  async getPendingEntries(sessionId: SessionId): Promise<OutboxEntry[]> {\n    const outboxKey = this.buildOutboxKey(sessionId);\n    const entries = await this.redis.hgetall(outboxKey);\n\n    const pending: OutboxEntry[] = [];\n\n    for (const [, entryStr] of Object.entries(entries)) {\n      const entry: OutboxEntry = JSON.parse(entryStr) as OutboxEntry;\n      if (entry.status === 'pending' || (entry.status === 'failed' && entry.attempts < 3)) {\n        pending.push(entry);\n      }\n    }\n\n    return pending.sort((a, b) => a.version - b.version);\n  }\n\n  /**\n   * Reconcile outbox - process pending entries\n   * Should be called periodically (e.g., every 30s)\n   */\n  async reconcile(): Promise<void> {\n    const startTime = Date.now();\n\n    try {\n      // Get all outbox keys\n      const outboxKeys = await this.redis.keys('outbox:*');\n\n      for (const outboxKey of outboxKeys) {\n        const sessionId: SessionId = outboxKey.replace('outbox:', '');\n        const pending = await this.getPendingEntries(sessionId);\n\n        for (const entry of pending) {\n          const entryStartTime = Date.now();\n\n          try {\n            // Mark as processing\n            entry.status = 'processing';\n            entry.updatedAt = Date.now();\n            await this.redis.hset(outboxKey, entry.version.toString(), JSON.stringify(entry));\n\n            // Try to persist to MongoDB\n            await this.mongo.set(sessionId, entry.patch, entry.version - 1, entry.fencingToken);\n\n            // Mark as completed\n            await this.markCompleted(sessionId, entry.version);\n\n            this.stats.totalCompleted++;\n\n            // Record latency\n            const latency = (Date.now() - entryStartTime) / 1000;\n            outboxReconcilerLatencyHistogram.observe(\n              { operation: 'persist', status: 'success' },\n              latency,\n            );\n          } catch (error: unknown) {\n            // Mark as failed\n            await this.markFailed(\n              sessionId,\n              entry.version,\n              error instanceof Error ? error.message : String(error),\n            );\n\n            this.stats.totalFailed++;\n            this.stats.totalRetried += entry.attempts;\n\n            // Record failure\n            outboxReconcilerFailuresCounter.inc({\n              error_type: error instanceof Error ? error.constructor.name : 'unknown',\n            });\n\n            outboxReconcilerLatencyHistogram.observe(\n              { operation: 'persist', status: 'failure' },\n              (Date.now() - entryStartTime) / 1000,\n            );\n\n            this.logger.error('Outbox reconciler failed to persist entry', error instanceof Error ? error : undefined, {\n              sessionId,\n              version: entry.version,\n              attempts: entry.attempts,\n              action: 'outbox_reconciler_failure',\n            });\n          }\n        }\n\n        this.stats.totalProcessed += pending.length;\n      }\n\n      this.stats.lastRunAt = Date.now();\n\n      // Update average latency\n      const totalLatency = Date.now() - startTime;\n      this.stats.avgLatency =\n        (this.stats.avgLatency * (this.stats.totalProcessed - outboxKeys.length) + totalLatency) /\n        this.stats.totalProcessed;\n\n      this.logger.debug('Outbox reconciler completed', {\n        processed: outboxKeys.length,\n        latency: totalLatency,\n        stats: this.stats,\n        action: 'outbox_reconciler_complete',\n      });\n    } catch (error: unknown) {\n      this.logger.error('Outbox reconciler error', error instanceof Error ? error : undefined, {\n        action: 'outbox_reconciler_error',\n      });\n    }\n  }\n\n  /**\n   * Start background reconciler (30s interval)\n   */\n  startReconciler(): void {\n    if (this.reconcilerInterval) {\n      this.logger.warn('Outbox reconciler already running', {\n        action: 'outbox_reconciler_already_running',\n      });\n      return;\n    }\n\n    this.logger.warn('Starting outbox reconciler (30s interval)', {\n      action: 'outbox_reconciler_start',\n    });\n\n    this.reconcilerInterval = setInterval(() => {\n      this.reconcile().catch((error: unknown) => {\n        this.logger.error('Outbox reconciler unhandled error', error instanceof Error ? error : undefined, {\n          action: 'outbox_reconciler_unhandled_error',\n        });\n      });\n    }, 30_000);\n  }\n\n  /**\n   * Stop background reconciler\n   */\n  stopReconciler(): void {\n    if (this.reconcilerInterval) {\n      clearInterval(this.reconcilerInterval);\n      this.reconcilerInterval = null;\n      this.logger.warn('Outbox reconciler stopped', {\n        action: 'outbox_reconciler_stop',\n      });\n    }\n  }\n\n  /**\n   * Get reconciler stats\n   */\n  getStats(): OutboxReconcilerStats {\n    return { ...this.stats };\n  }\n\n  /**\n   * Clean up completed entries older than 1 hour\n   */\n  async cleanup(): Promise<void> {\n    const outboxKeys = await this.redis.keys('outbox:*');\n    const oneHourAgo = Date.now() - 60 * 60 * 1000;\n\n    for (const outboxKey of outboxKeys) {\n      const entries = await this.redis.hgetall(outboxKey);\n\n      for (const [version, entryStr] of Object.entries(entries)) {\n        const entry: OutboxEntry = JSON.parse(entryStr) as OutboxEntry;\n\n        if (entry.status === 'completed' && entry.completedAt && entry.completedAt < oneHourAgo) {\n          await this.redis.hdel(outboxKey, version);\n        }\n      }\n    }\n  }\n}\n","/**\n * @baileys-store/core - Hybrid Auth Store\n *\n * Orchestrator for Redis + MongoDB with optional queue integration\n * - Read path: Redis → MongoDB (fallback) → cache warming\n * - Write path: Redis (sync) + Queue (async) or MongoDB (fallback)\n * - Queue integration via QueueAdapter interface\n * - Circuit breaker for both layers\n * - Internal metrics (hits, misses, fallbacks)\n */\n\nimport { Mutex } from 'async-mutex';\nimport CircuitBreaker from 'opossum';\nimport type {\n  AuthStore,\n  SessionId,\n  AuthSnapshot,\n  AuthPatch,\n  Versioned,\n  VersionedResult,\n  BatchResult,\n  StructuredLogger,\n} from '../types/index.js';\nimport { StorageError, VersionMismatchError, assertBufferTypes, NullLoggerStructured } from '../types/index.js';\nimport type { HybridStoreConfig } from '../types/config.js';\nimport type { RedisAuthStore } from '../redis/store.js';\nimport type { MongoAuthStore } from '../mongodb/store.js';\nimport {\n  redisHitsCounter,\n  redisMissesCounter,\n  mongoFallbacksCounter,\n  queuePublishesCounter,\n  queueFailuresCounter,\n  directWritesCounter,\n  circuitBreakerOpenCounter,\n  circuitBreakerCloseCounter,\n  circuitBreakerHalfOpenCounter,\n  batchOperationsCounter,\n  batchOperationsDurationHistogram,\n  metricsRegistry,\n} from '../metrics/index.js';\nimport { OutboxManager } from './outbox.js';\nimport { getContext } from '../context/execution-context.js';\n\n/**\n * Hybrid store metrics\n */\ninterface HybridMetrics {\n  redisHits: number;\n  redisMisses: number;\n  mongoFallbacks: number;\n  queuePublishes: number;\n  queueFailures: number;\n  directWrites: number;\n}\n\n/**\n * HybridAuthStore - Orchestrates Redis + MongoDB + Queue\n */\nexport class HybridAuthStore implements AuthStore {\n  private redis: RedisAuthStore;\n  private mongo: MongoAuthStore;\n  private config: HybridStoreConfig;\n  private connected = false;\n  private logger: StructuredLogger;\n\n  // Metrics\n  private metrics: HybridMetrics = {\n    redisHits: 0,\n    redisMisses: 0,\n    mongoFallbacks: 0,\n    queuePublishes: 0,\n    queueFailures: 0,\n    directWrites: 0,\n  };\n\n  // Mutexes for per-session write serialization (prevents race conditions)\n  private writeMutexes = new Map<string, Mutex>();\n\n  // Circuit breaker for MongoDB operations (prevents cascade failures)\n  private mongoCircuitBreaker: CircuitBreaker<\n    [() => Promise<Versioned<AuthSnapshot> | null>],\n    Versioned<AuthSnapshot> | null\n  >;\n\n  // Outbox manager for write-behind safety (transactional outbox pattern)\n  private outboxManager: OutboxManager | null = null;\n\n  constructor(redis: RedisAuthStore, mongo: MongoAuthStore, config: HybridStoreConfig) {\n    this.redis = redis;\n    this.mongo = mongo;\n    this.config = config;\n    this.logger = config.logger ?? new NullLoggerStructured();\n\n    // Initialize circuit breaker for MongoDB\n    this.mongoCircuitBreaker = new CircuitBreaker(\n      async (fn: () => Promise<Versioned<AuthSnapshot> | null>) => fn(),\n      {\n        timeout: 3000, // 3s timeout for MongoDB operations\n        errorThresholdPercentage: 50, // Open after 50% errors\n        resetTimeout: 30000, // Try to close after 30s\n        rollingCountTimeout: 10000, // 10s window for error calculation\n        rollingCountBuckets: 10,\n        name: 'mongodb-circuit-breaker',\n      },\n    );\n\n    // Circuit breaker event listeners for observability\n    this.mongoCircuitBreaker.on('open', () => {\n      circuitBreakerOpenCounter.inc();\n      this.logger.error('MongoDB circuit breaker OPEN - entering degraded mode', undefined, {\n        action: 'circuit_breaker_open',\n      });\n    });\n\n    this.mongoCircuitBreaker.on('halfOpen', () => {\n      circuitBreakerHalfOpenCounter.inc();\n      this.logger.warn('MongoDB circuit breaker HALF-OPEN - testing recovery', {\n        action: 'circuit_breaker_half_open',\n      });\n    });\n\n    this.mongoCircuitBreaker.on('close', () => {\n      circuitBreakerCloseCounter.inc();\n      this.logger.info('MongoDB circuit breaker CLOSED - normal operation resumed', {\n        action: 'circuit_breaker_closed',\n      });\n    });\n  }\n\n  /**\n   * Connect to all underlying stores\n   */\n  async connect(): Promise<void> {\n    if (this.connected) return;\n\n    const context = getContext();\n    const startTime = Date.now();\n\n    try {\n      // Connect to Redis\n      await this.redis.connect();\n      this.logger.debug('Redis connected', {\n        action: 'redis_connect',\n        correlationId: context?.correlationId,\n      });\n\n      // Connect to MongoDB\n      await this.mongo.connect();\n      this.logger.debug('MongoDB connected', {\n        action: 'mongo_connect',\n        correlationId: context?.correlationId,\n      });\n\n      this.connected = true;\n      this.logger.info('HybridAuthStore connected successfully', {\n        action: 'hybrid_connect',\n        duration: Date.now() - startTime,\n        correlationId: context?.correlationId,\n      });\n\n      // Initialize outbox manager if write-behind is enabled\n      if (this.config.enableWriteBehind && this.config.queue) {\n        try {\n          const redisClient = this.redis.getClient(); // Access internal Redis client\n          this.outboxManager = new OutboxManager(redisClient, this.mongo, this.logger);\n          this.outboxManager.startReconciler();\n\n          this.logger.info('Outbox reconciler started', {\n            action: 'outbox_reconciler_started',\n            correlationId: context?.correlationId,\n          });\n        } catch {\n          // Silently skip outbox initialization if getClient is not available\n          this.logger.warn('Outbox manager not initialized - getClient not available', {\n            action: 'outbox_reconciler_init_skipped',\n            correlationId: context?.correlationId,\n          });\n        }\n      }\n    } catch (error) {\n      this.logger.error('Failed to connect HybridAuthStore', error instanceof Error ? error : undefined, {\n        action: 'hybrid_connect_error',\n        duration: Date.now() - startTime,\n        correlationId: context?.correlationId,\n      });\n      throw new StorageError(\n        'Failed to connect HybridAuthStore',\n        'hybrid',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Disconnect from all underlying stores\n   */\n  async disconnect(): Promise<void> {\n    if (!this.connected) return;\n\n    try {\n      // Stop outbox reconciler\n      if (this.outboxManager) {\n        this.outboxManager.stopReconciler();\n      }\n\n      await Promise.all([\n        this.redis.disconnect(),\n        this.mongo.disconnect(),\n        this.config.queue?.close(),\n      ]);\n\n      this.connected = false;\n\n      this.logger.info('HybridAuthStore disconnected', {\n        action: 'hybrid_disconnected',\n      });\n    } catch (error) {\n      this.logger.error('Error disconnecting HybridAuthStore', error instanceof Error ? error : undefined, {\n        message: error instanceof Error ? error.message : String(error),\n        action: 'hybrid_disconnect_error',\n      });\n    }\n  }\n\n  /**\n   * Get complete snapshot (Read-through pattern)\n   */\n  async get(sessionId: SessionId): Promise<Versioned<AuthSnapshot> | null> {\n    const startTime = Date.now();\n    const context = getContext();\n\n    try {\n      this.ensureConnected();\n\n      this.logger.debug('Starting get operation', {\n        sessionId,\n        action: 'get_start',\n        correlationId: context?.correlationId,\n      });\n\n      // Try Redis first (hot path)\n      try {\n        const cached = await this.redis.get(sessionId);\n        if (cached) {\n          redisHitsCounter.inc({ session_id: sessionId });\n          this.logger.debug('Data loaded from Redis cache', {\n            sessionId,\n            duration: Date.now() - startTime,\n            correlationId: context?.correlationId,\n            action: 'redis_cache_hit',\n          });\n          return cached;\n        }\n        redisMissesCounter.inc({ session_id: sessionId });\n      } catch {\n        redisMissesCounter.inc({ session_id: sessionId });\n        this.logger.warn('Redis read failed, falling back to MongoDB', {\n          sessionId,\n          action: 'redis_read_fallback',\n        });\n      }\n\n      // Fallback to MongoDB with circuit breaker (cold path)\n      let data: Versioned<AuthSnapshot> | null = null;\n\n      try {\n        data = await this.mongoCircuitBreaker.fire(async () => {\n          return await this.mongo.get(sessionId);\n        });\n      } catch {\n        // Circuit breaker rejected or MongoDB failed\n              this.logger.error('MongoDB unavailable - circuit breaker open', undefined, {\n        sessionId,\n        operation: 'circuit_breaker_rejected',\n      });\n        return null; // Graceful degradation\n      }\n\n      if (!data) {\n        this.logger.debug('Data not found in MongoDB', {\n          sessionId,\n          action: 'mongo_data_not_found',\n        });\n        return null;\n      }\n\n      mongoFallbacksCounter.inc({ session_id: sessionId });\n\n      // Async cache warming (don't await)\n      this.warmCache(sessionId, data).catch(() => {\n        this.logger.warn('Cache warming failed', {\n          sessionId,\n          action: 'cache_warming_failed',\n        });\n      });\n\n      this.logger.debug('Data loaded from MongoDB with cache warming', {\n        sessionId,\n        action: 'mongo_data_loaded',\n        duration: Date.now() - startTime,\n        correlationId: context?.correlationId,\n      });\n\n      return data;\n    } catch (error) {\n      this.logger.error('Failed to get from HybridAuthStore', error instanceof Error ? error : undefined, {\n        sessionId,\n        duration: Date.now() - startTime,\n        correlationId: context?.correlationId,\n        action: 'get_error',\n      });\n      throw new StorageError(\n        'Failed to get from HybridAuthStore',\n        'hybrid',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Update snapshot (Write-through + Write-behind pattern)\n   */\n  async set(\n    sessionId: SessionId,\n    patch: AuthPatch,\n    expectedVersion?: number,\n    fencingToken?: number,\n  ): Promise<VersionedResult> {\n    const mutex = this.getMutex(sessionId);\n\n    // Acquire exclusive lock for this session (prevents race conditions)\n    return await mutex.runExclusive(async () => {\n      try {\n        this.ensureConnected();\n\n        // Type safety: Assert all Buffers are valid before persisting\n        if (patch.creds) {\n          assertBufferTypes(patch.creds, 'patch.creds');\n        }\n        if (patch.keys) {\n          assertBufferTypes(patch.keys, 'patch.keys');\n        }\n\n        // Write to Redis first (hot path, synchronous)\n        const result = await this.redis.set(sessionId, patch, expectedVersion);\n\n        // Write-behind to MongoDB (async via queue or direct fallback)\n        if (this.config.queue && this.config.enableWriteBehind) {\n          try {\n            // Add to outbox BEFORE queuing (transactional outbox pattern)\n            if (this.outboxManager) {\n              await this.outboxManager.addEntry(sessionId, patch, result.version, fencingToken);\n            }\n\n            await this.config.queue.add('persist', {\n              sessionId,\n              patch,\n              version: result.version,\n              fencingToken,\n              timestamp: Date.now(),\n            });\n\n            queuePublishesCounter.inc({ session_id: sessionId });\n          } catch (queueError) {\n            queueFailuresCounter.inc({ session_id: sessionId });\n            this.logger.warn('Queue write failed, falling back to direct MongoDB write', {\n              sessionId,\n              error: queueError instanceof Error ? queueError.message : String(queueError),\n              action: 'hybrid_queue_fallback',\n            });\n\n            // Fallback: direct write to MongoDB\n            await this.mongo.set(sessionId, patch, expectedVersion, fencingToken);\n            directWritesCounter.inc({ session_id: sessionId });\n\n            // Mark as completed in outbox (if exists)\n            if (this.outboxManager) {\n              await this.outboxManager.markCompleted(sessionId, result.version);\n            }\n          }\n        } else {\n          // Direct write to MongoDB (no queue)\n          await this.mongo.set(sessionId, patch, expectedVersion, fencingToken);\n          directWritesCounter.inc({ session_id: sessionId });\n        }\n\n        this.logger.debug('Hybrid write completed', {\n          sessionId,\n          action: 'hybrid_write_completed',\n        });\n\n        return result;\n      } catch (error) {\n        if (error instanceof VersionMismatchError) {\n          throw error;\n        }\n\n        throw new StorageError(\n          'Failed to set in HybridAuthStore',\n          'hybrid',\n          error instanceof Error ? error : undefined,\n        );\n      }\n    }); // Lock automatically released after execution\n  }\n\n  /**\n   * Delete snapshot (both layers)\n   * Handles partial failures gracefully\n   */\n  async delete(sessionId: SessionId): Promise<void> {\n    try {\n      this.ensureConnected();\n\n      const errors: Error[] = [];\n\n      // Try deleting from Redis\n      try {\n        await this.redis.delete(sessionId);\n      } catch (error) {\n        errors.push(error as Error);\n        this.logger.error('Redis delete failed', error instanceof Error ? error : undefined, {\n          sessionId,\n          error: error instanceof Error ? error.message : String(error),\n          action: 'hybrid_delete_redis_failed',\n        });\n      }\n\n      // Try deleting from MongoDB\n      try {\n        await this.mongo.delete(sessionId);\n      } catch (error) {\n        errors.push(error as Error);\n        this.logger.error('MongoDB delete failed', error instanceof Error ? error : undefined, {\n          sessionId,\n          error: error instanceof Error ? error.message : String(error),\n          action: 'hybrid_delete_mongo_failed',\n        });\n      }\n\n      // If both failed, throw error\n      if (errors.length === 2) {\n        throw new StorageError('Failed to delete from both Redis and MongoDB', 'hybrid', errors[0]);\n      }\n\n      // If one failed, log warning but consider success\n      if (errors.length === 1) {\n        this.logger.warn('Partial delete success - one layer failed', {\n          sessionId,\n          failedLayers: errors.length,\n          action: 'hybrid_delete_partial',\n        });\n      }\n\n      this.logger.warn('Snapshot deleted from both layers', {\n        sessionId,\n        action: 'hybrid_delete_success',\n      });\n    } catch (error) {\n      throw new StorageError(\n        'Failed to delete from HybridAuthStore',\n        'hybrid',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Renew TTL (both layers)\n   * Handles partial failures gracefully\n   */\n  async touch(sessionId: SessionId, ttlSeconds?: number): Promise<void> {\n    try {\n      this.ensureConnected();\n\n      const errors: Error[] = [];\n\n      // Try touching Redis\n      try {\n        await this.redis.touch(sessionId, ttlSeconds);\n      } catch (error) {\n        errors.push(error as Error);\n        this.logger.error('Redis touch failed', error instanceof Error ? error : undefined, {\n          sessionId,\n          error: error instanceof Error ? error.message : String(error),\n          action: 'hybrid_touch_redis_failed',\n        });\n      }\n\n      // Try touching MongoDB\n      try {\n        await this.mongo.touch(sessionId, ttlSeconds);\n      } catch (error) {\n        errors.push(error as Error);\n        this.logger.error('MongoDB touch failed', error instanceof Error ? error : undefined, {\n          sessionId,\n          error: error instanceof Error ? error.message : String(error),\n          action: 'hybrid_touch_mongo_failed',\n        });\n      }\n\n      // If both failed, throw error\n      if (errors.length === 2) {\n        throw new StorageError('Failed to touch in both Redis and MongoDB', 'hybrid', errors[0]);\n      }\n\n      // If one failed, log warning but consider success\n      if (errors.length === 1) {\n        this.logger.warn('Partial touch success - one layer failed', {\n          sessionId,\n          failedLayers: errors.length,\n          ttlSeconds,\n          action: 'hybrid_touch_partial',\n        });\n      }\n\n      this.logger.debug('TTL renewed in both layers', {\n        sessionId,\n        ttlSeconds,\n        action: 'hybrid_touch_success',\n      });\n    } catch (error) {\n      throw new StorageError(\n        'Failed to touch in HybridAuthStore',\n        'hybrid',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Check existence (Redis first, then MongoDB)\n   */\n  async exists(sessionId: SessionId): Promise<boolean> {\n    try {\n      this.ensureConnected();\n\n      // Check Redis first\n      const redisExists = await this.redis.exists(sessionId);\n      if (redisExists) {\n        return true;\n      }\n\n      // Fallback to MongoDB\n      return await this.mongo.exists(sessionId);\n    } catch (error) {\n      throw new StorageError(\n        'Failed to check existence in HybridAuthStore',\n        'hybrid',\n        error instanceof Error ? error : undefined,\n      );\n    }\n  }\n\n  /**\n   * Health check (both layers must be healthy)\n   */\n  async isHealthy(): Promise<boolean> {\n    try {\n      if (!this.connected) return false;\n\n      const [redisHealthy, mongoHealthy] = await Promise.all([\n        this.redis.isHealthy(),\n        this.mongo.isHealthy(),\n      ]);\n\n      return redisHealthy && mongoHealthy;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get Prometheus metrics registry\n   * Expose this for scraping at /metrics endpoint\n   */\n  getMetricsRegistry(): typeof metricsRegistry {\n    return metricsRegistry;\n  }\n\n  /**\n   * Get metrics text for Prometheus scraping\n   */\n  async getMetricsText(): Promise<string> {\n    return await metricsRegistry.metrics();\n  }\n\n  /**\n   * Check if MongoDB circuit breaker is open\n   * Useful for health check endpoints\n   */\n  isMongoCircuitBreakerOpen(): boolean {\n    return this.mongoCircuitBreaker.opened;\n  }\n\n  /**\n   * Get circuit breaker stats\n   */\n  getCircuitBreakerStats(): CircuitBreaker.Stats {\n    return this.mongoCircuitBreaker.stats;\n  }\n\n  /**\n   * Get outbox reconciler stats\n   */\n  getOutboxStats(): ReturnType<NonNullable<typeof this.outboxManager>['getStats']> | null {\n    if (!this.outboxManager) {\n      return null;\n    }\n    return this.outboxManager.getStats();\n  }\n\n  /**\n   * Manually trigger outbox reconciliation\n   */\n  async reconcileOutbox(): Promise<void> {\n    if (this.outboxManager) {\n      await this.outboxManager.reconcile();\n    }\n  }\n\n  /**\n   * Get metrics (legacy method for backward compatibility)\n   * @deprecated Use getMetricsRegistry() instead\n   */\n  getMetrics(): HybridMetrics & {\n    hitRatio: number;\n    totalRequests: number;\n  } {\n    const totalRequests = this.metrics.redisHits + this.metrics.redisMisses;\n    const hitRatio = totalRequests > 0 ? this.metrics.redisHits / totalRequests : 0;\n\n    return {\n      ...this.metrics,\n      hitRatio,\n      totalRequests,\n    };\n  }\n\n  /**\n   * Reset metrics (legacy method)\n   * @deprecated Prometheus metrics are cumulative\n   */\n  resetMetrics(): void {\n    this.metrics = {\n      redisHits: 0,\n      redisMisses: 0,\n      mongoFallbacks: 0,\n      queuePublishes: 0,\n      queueFailures: 0,\n      directWrites: 0,\n    };\n  }\n\n  /**\n   * Batch get multiple snapshots\n   * Optimized for fetching many sessions at once\n   * \n   * @param sessionIds - Array of session IDs to fetch\n   * @returns Map of sessionId -> snapshot (or null if not found)\n   * \n   * @example\n   * ```typescript\n   * const sessions = await store.batchGet(['session1', 'session2', 'session3']);\n   * for (const [sessionId, snapshot] of sessions) {\n   *   if (snapshot) {\n   *     console.log(`Found ${sessionId}: version ${snapshot.version}`);\n   *   }\n   * }\n   * ```\n   */\n  async batchGet(sessionIds: SessionId[]): Promise<Map<SessionId, Versioned<AuthSnapshot> | null>> {\n    const results = new Map<SessionId, Versioned<AuthSnapshot> | null>();\n    const startTime = Date.now();\n    const context = getContext();\n\n    this.logger.debug('Starting batch get', {\n      count: sessionIds.length,\n      action: 'batch_get_start',\n      correlationId: context?.correlationId,\n    });\n\n    // Try Redis pipeline first (best performance)\n    const redisResults = new Map<SessionId, Versioned<AuthSnapshot> | null>();\n    const mongoIds: SessionId[] = [];\n\n    for (const sessionId of sessionIds) {\n      try {\n        const cached = await this.redis.get(sessionId);\n        redisResults.set(sessionId, cached);\n        if (cached) {\n          redisHitsCounter.inc({ session_id: sessionId });\n        } else {\n          redisMissesCounter.inc({ session_id: sessionId });\n          mongoIds.push(sessionId);\n        }\n      } catch (error) {\n        this.logger.warn('Redis batch get failed, will fallback to MongoDB', {\n          sessionId,\n          error: error instanceof Error ? error.message : String(error),\n          action: 'batch_get_redis_fallback',\n        });\n        mongoIds.push(sessionId);\n      }\n    }\n\n    // Fetch missing items from MongoDB\n    if (mongoIds.length > 0) {\n      for (const sessionId of mongoIds) {\n        try {\n          const data = await this.mongoCircuitBreaker.fire(() => this.mongo.get(sessionId));\n          redisResults.set(sessionId, data);\n          \n          if (data) {\n            mongoFallbacksCounter.inc({ session_id: sessionId });\n            // Warm cache asynchronously\n            this.warmCache(sessionId, data).catch(() => {\n              this.logger.warn('Cache warming failed during batch', {\n                sessionId,\n                action: 'batch_get_cache_warming_failed',\n              });\n            });\n          }\n        } catch (error) {\n          this.logger.error('MongoDB batch get failed', error instanceof Error ? error : undefined, {\n            sessionId,\n            action: 'batch_get_mongo_error',\n            correlationId: context?.correlationId,\n          });\n        }\n      }\n    }\n\n    // Merge results\n    for (const [sessionId, value] of redisResults) {\n      results.set(sessionId, value);\n    }\n\n    const duration = Date.now() - startTime;\n    \n    // Record metrics\n    batchOperationsCounter.inc({ type: 'get', result: 'success' }, sessionIds.length);\n    batchOperationsDurationHistogram.observe({ type: 'get', result: 'success' }, duration / 1000);\n    \n    this.logger.debug('Batch get completed', {\n      count: sessionIds.length,\n      hitCount: redisResults.size,\n      duration,\n      action: 'batch_get_completed',\n      correlationId: context?.correlationId,\n    });\n\n    return results;\n  }\n\n  /**\n   * Batch delete multiple snapshots\n   * Optimized for removing many sessions at once\n   * \n   * @param sessionIds - Array of session IDs to delete\n   * @returns Batch result with successful and failed operations\n   * \n   * @example\n   * ```typescript\n   * const result = await store.batchDelete(['session1', 'session2']);\n   * console.log(`Deleted ${result.successful.size} sessions`);\n   * console.log(`Failed ${result.failed.size} deletions`);\n   * ```\n   */\n  async batchDelete(sessionIds: SessionId[]): Promise<BatchResult<void>> {\n    const successful = new Map<SessionId, void>();\n    const failed = new Map<SessionId, Error>();\n    const startTime = Date.now();\n    const context = getContext();\n\n    this.logger.debug('Starting batch delete', {\n      count: sessionIds.length,\n      action: 'batch_delete_start',\n      correlationId: context?.correlationId,\n    });\n\n    for (const sessionId of sessionIds) {\n      try {\n        await this.delete(sessionId);\n        successful.set(sessionId, undefined);\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error(String(error));\n        failed.set(sessionId, err);\n        this.logger.error('Batch delete failed for session', err, {\n          sessionId,\n          action: 'batch_delete_failed',\n          correlationId: context?.correlationId,\n        });\n      }\n    }\n\n    const duration = Date.now() - startTime;\n    \n    // Record metrics\n    batchOperationsCounter.inc({ type: 'delete', result: 'success' }, successful.size);\n    batchOperationsCounter.inc({ type: 'delete', result: 'failure' }, failed.size);\n    batchOperationsDurationHistogram.observe({ type: 'delete', result: failed.size > 0 ? 'partial' : 'success' }, duration / 1000);\n    \n    this.logger.debug('Batch delete completed', {\n      count: sessionIds.length,\n      successfulCount: successful.size,\n      failedCount: failed.size,\n      duration,\n      action: 'batch_delete_completed',\n      correlationId: context?.correlationId,\n    });\n\n    return { successful, failed };\n  }\n\n  // ========== Private methods ==========\n\n  /**\n   * Get or create mutex for session (lazy initialization)\n   * Ensures exclusive write access per session\n   */\n  private getMutex(sessionId: SessionId): Mutex {\n    if (!this.writeMutexes.has(sessionId)) {\n      this.writeMutexes.set(sessionId, new Mutex());\n    }\n    const mutex = this.writeMutexes.get(sessionId);\n    if (!mutex) throw new StorageError('Mutex not found for session', 'hybrid');\n    return mutex;\n  }\n\n  /**\n   * Warm cache asynchronously\n   * RC.6 Fix: Check version before warming to prevent stale data\n   */\n  private async warmCache(sessionId: SessionId, data: Versioned<AuthSnapshot>): Promise<void> {\n    try {\n      // Check if cache already has newer version (prevent race condition)\n      const current = await this.redis.get(sessionId);\n\n      if (current && current.version >= data.version) {\n        this.logger.debug('Cache warming skipped - newer version exists', {\n          sessionId,\n          currentVersion: current.version,\n          warmVersion: data.version,\n          action: 'hybrid_cache_warming_skipped',\n        });\n        return;\n      }\n\n      // Warm cache with version check\n      await this.redis.set(sessionId, data.data, data.version);\n\n      this.logger.debug('Cache warmed successfully', {\n        sessionId,\n        version: data.version,\n        action: 'hybrid_cache_warmed',\n      });\n    } catch (error) {\n      this.logger.warn('Cache warming failed', {\n        sessionId,\n        error: error instanceof Error ? error.message : String(error),\n        action: 'hybrid_cache_warming_failed',\n      });\n    }\n  }\n\n  /**\n   * Check if connected\n   */\n  private ensureConnected(): void {\n    if (!this.connected) {\n      throw new StorageError('HybridAuthStore not connected', 'hybrid');\n    }\n  }\n}\n\n/**\n * Factory to create HybridAuthStore\n */\nexport async function createHybridStore(\n  redis: RedisAuthStore,\n  mongo: MongoAuthStore,\n  config: HybridStoreConfig,\n): Promise<HybridAuthStore> {\n  const store = new HybridAuthStore(redis, mongo, config);\n  await store.connect();\n  return store;\n}\n","/**\n * @baileys-store/core - Hybrid Auth State Hook\n *\n * Baileys-compatible hook for hybrid Redis+MongoDB authentication state\n * Combines hot cache (Redis) with cold storage (MongoDB) and optional queue integration\n */\n\nimport type { AuthenticationState, SignalDataTypeMap } from '@whiskeysockets/baileys';\nimport { initAuthCreds, proto } from '@whiskeysockets/baileys';\nimport type { UseHybridAuthStateOptions } from '../types/config.js';\nimport { createHybridStore, type HybridAuthStore } from './store.js';\nimport { createRedisStore } from '../redis/store.js';\nimport { createMongoStore } from '../mongodb/store.js';\nimport { createCryptoService } from '../crypto/index.js';\nimport { createCodecService } from '../crypto/codec.js';\nimport { DEFAULT_SECURITY_CONFIG } from '../types/index.js';\n\n/**\n * Hybrid-based auth state hook\n * Compatible with useMultiFileAuthState signature\n */\nexport async function useHybridAuthState(options: UseHybridAuthStateOptions): Promise<{\n  state: AuthenticationState;\n  saveCreds: () => Promise<void>;\n  store: HybridAuthStore;\n}> {\n  // Create crypto and codec services\n  const cryptoService = await createCryptoService(\n    {\n      ...DEFAULT_SECURITY_CONFIG,\n      enableEncryption: options.hybrid.security.enableEncryption,\n      enableCompression: options.hybrid.security.enableCompression,\n    },\n    options.hybrid.masterKey,\n  );\n\n  const codecService = createCodecService({\n    ...DEFAULT_SECURITY_CONFIG,\n    enableCompression: options.hybrid.security.enableCompression,\n  });\n\n  // Create Redis store\n  const redisStore = await createRedisStore(\n    {\n      redisUrl: options.hybrid.redisUrl,\n      host: options.hybrid.redisHost,\n      port: options.hybrid.redisPort,\n      ttl: options.hybrid.ttl,\n      resilience: options.hybrid.resilience,\n      enableTls: false,\n    },\n    cryptoService,\n    codecService,\n  );\n\n  // Create MongoDB store\n  const mongoStore = await createMongoStore(\n    {\n      mongoUrl: options.hybrid.mongoUrl,\n      databaseName: options.hybrid.mongoDatabase,\n      collectionName: options.hybrid.mongoCollection,\n      ttl: options.hybrid.ttl,\n      resilience: options.hybrid.resilience,\n      enableTls: false,\n    },\n    cryptoService,\n    codecService,\n  );\n\n  // Create hybrid store\n  const hybridStore = await createHybridStore(redisStore, mongoStore, options.hybrid);\n\n  // Initialize auth state\n  const authState: AuthenticationState = {\n    creds: initAuthCreds(),\n    keys: {\n      get: async <T extends keyof SignalDataTypeMap>(type: T, ids: string[]) => {\n        const snapshot = await hybridStore.get(options.sessionId);\n        if (!snapshot) return {} as Record<string, SignalDataTypeMap[T]>;\n\n        const keysOfType = snapshot.data.keys[type] ?? {};\n        const result: Record<string, SignalDataTypeMap[T]> = {};\n\n        for (const id of ids) {\n          if (keysOfType[id]) {\n            try {\n              if (type === 'app-state-sync-key') {\n                result[id] = proto.Message.AppStateSyncKeyData.create(\n                  keysOfType[id],\n                ) as unknown as SignalDataTypeMap[T];\n              } else {\n                result[id] = keysOfType[id] as SignalDataTypeMap[T];\n              }\n            } catch (error) {\n              console.warn(`Failed to deserialize key ${type}:${id}`, error);\n            }\n          }\n        }\n\n        return result;\n      },\n      set: async (data) => {\n        const snapshot = await hybridStore.get(options.sessionId);\n        const currentVersion = snapshot?.version ?? 0;\n\n        // Merge keys incrementally (CRITICAL for preventing data loss)\n        const mergedKeys: Record<string, Record<string, unknown>> = {\n          ...(snapshot?.data.keys ?? {}),\n        };\n\n        for (const [type, keys] of Object.entries(data)) {\n          mergedKeys[type] ??= {};\n          for (const [id, value] of Object.entries(keys)) {\n            if (value === null || value === undefined) {\n              // delete mergedKeys[type][id];\n              const { [id]: _unused, ...rest } = mergedKeys[type];\n              void _unused; // Suppress unused variable warning\n              mergedKeys[type] = rest;\n            } else {\n              mergedKeys[type][id] = value;\n            }\n          }\n        }\n\n        await hybridStore.set(options.sessionId, { keys: mergedKeys }, currentVersion);\n      },\n    },\n  };\n\n  // Load existing credentials if available\n  const existingSnapshot = await hybridStore.get(options.sessionId);\n  if (existingSnapshot?.data.creds) {\n    authState.creds = existingSnapshot.data.creds;\n  }\n\n  // Save credentials function\n  const saveCreds = async (): Promise<void> => {\n    const snapshot = await hybridStore.get(options.sessionId);\n    const currentVersion = snapshot?.version ?? 0;\n\n    await hybridStore.set(options.sessionId, { creds: authState.creds }, currentVersion);\n  };\n\n  return {\n    state: authState,\n    saveCreds,\n    store: hybridStore, // Expose store for advanced usage (cleanup, health checks, metrics, etc)\n  };\n}\n","/**\n * @baileys-store/core - Health Check Utilities\n *\n * Health check utilities for production monitoring and Kubernetes probes\n */\n\nimport type CircuitBreaker from 'opossum';\n\n/**\n * Health status of a component\n */\nexport interface ComponentHealth {\n  /** Component name */\n  component: string;\n  /** Whether the component is healthy */\n  healthy: boolean;\n  /** Additional status details */\n  status?: string;\n  /** Last check timestamp */\n  timestamp?: number;\n}\n\n/**\n * Overall health status\n */\nexport interface HealthStatus {\n  /** Overall status */\n  status: 'healthy' | 'degraded' | 'unhealthy';\n  /** Timestamp of health check */\n  timestamp: string;\n  /** Component health statuses */\n  components: ComponentHealth[];\n  /** Additional metadata */\n  metadata?: {\n    cacheHitRate?: number;\n    outboxLag?: number;\n    circuitBreakerState?: 'closed' | 'open' | 'half-open';\n  };\n}\n\n/**\n * Health check configuration\n */\nexport interface HealthCheckConfig {\n  /** Check Redis connectivity */\n  checkRedis: () => Promise<boolean>;\n  /** Check MongoDB connectivity */\n  checkMongo: () => Promise<boolean>;\n  /** Get circuit breaker instance (optional) */\n  circuitBreaker?: CircuitBreaker;\n  /** Get cache hit rate (optional) */\n  getCacheHitRate?: () => number;\n  /** Get outbox lag in seconds (optional) */\n  getOutboxLag?: () => number;\n}\n\n/**\n * Perform health check\n *\n * @param config - Health check configuration\n * @returns Health status\n *\n * @example\n * ```typescript\n * const health = await performHealthCheck({\n *   checkRedis: async () => await redis.ping() === 'PONG',\n *   checkMongo: async () => await mongo.ping() === 'ok',\n *   circuitBreaker: store.mongoCircuitBreaker,\n *   getCacheHitRate: () => store.getCacheHitRate(),\n * });\n * ```\n */\nexport async function performHealthCheck(\n  config: HealthCheckConfig,\n): Promise<HealthStatus> {\n  const components: ComponentHealth[] = [];\n  const timestamp = new Date().toISOString();\n\n  // Check Redis\n  let redisHealthy = false;\n  try {\n    redisHealthy = await config.checkRedis();\n  } catch {\n    redisHealthy = false;\n  }\n  components.push({\n    component: 'redis',\n    healthy: redisHealthy,\n    status: redisHealthy ? 'connected' : 'disconnected',\n    timestamp: Date.now(),\n  });\n\n  // Check MongoDB\n  let mongoHealthy = false;\n  try {\n    mongoHealthy = await config.checkMongo();\n  } catch {\n    mongoHealthy = false;\n  }\n  components.push({\n    component: 'mongodb',\n    healthy: mongoHealthy,\n    status: mongoHealthy ? 'connected' : 'disconnected',\n    timestamp: Date.now(),\n  });\n\n  // Check circuit breaker if provided\n  if (config.circuitBreaker) {\n    const state = config.circuitBreaker.status;\n    const stateString = typeof state === 'string' ? state : 'unknown';\n    const isOpen = typeof state === 'string' && state === 'open';\n    components.push({\n      component: 'circuit-breaker',\n      healthy: !isOpen,\n      status: stateString,\n      timestamp: Date.now(),\n    });\n  }\n\n  // Determine overall status\n  const allHealthy = redisHealthy && mongoHealthy;\n  const circuitBreakerOpen = config.circuitBreaker?.status\n    ? (typeof config.circuitBreaker.status === 'string' \n        ? config.circuitBreaker.status === 'open' \n        : false)\n    : false;\n  const status = allHealthy && !circuitBreakerOpen ? 'healthy' : circuitBreakerOpen ? 'degraded' : 'unhealthy';\n\n  // Collect metadata\n  const metadata: HealthStatus['metadata'] = {};\n  if (config.getCacheHitRate) {\n    metadata.cacheHitRate = config.getCacheHitRate();\n  }\n  if (config.getOutboxLag) {\n    metadata.outboxLag = config.getOutboxLag();\n  }\n  if (config.circuitBreaker) {\n    const state = config.circuitBreaker.status;\n    metadata.circuitBreakerState = (typeof state === 'string' \n      ? state \n      : 'unknown') as 'closed' | 'open' | 'half-open';\n  }\n\n  return {\n    status,\n    timestamp,\n    components,\n    metadata,\n  };\n}\n\n/**\n * Check if the system is ready (ready for traffic)\n *\n * @param health - Health status\n * @returns Whether the system is ready\n *\n * @example\n * ```typescript\n * const health = await performHealthCheck(config);\n * const ready = isReady(health);\n * ```\n */\nexport function isReady(health: HealthStatus): boolean {\n  // Ready if at least one component is healthy\n  // (graceful degradation allows Redis-only operation)\n  return health.components.some((c) => c.healthy);\n}\n\n/**\n * Check if the system is alive (not crashed)\n *\n * @param health - Health status\n * @returns Whether the system is alive\n *\n * @example\n * ```typescript\n * const health = await performHealthCheck(config);\n * const alive = isLive(health);\n * ```\n */\nexport function isLive(health: HealthStatus): boolean {\n  // Alive if not all components are unhealthy\n  return health.status !== 'unhealthy';\n}\n","/**\n * Error Hierarchy - Centralized error classification system\n * \n * This module defines the complete error taxonomy for baileys-store-core,\n * including error codes, domains, severity levels, and metadata.\n */\n\nexport enum ErrorDomain {\n  STORAGE = 'STORAGE',\n  ENCRYPTION = 'ENCRYPTION',\n  VALIDATION = 'VALIDATION',\n  RESILIENCE = 'RESILIENCE',\n}\n\nexport enum ErrorSeverity {\n  RECOVERABLE = 'recoverable',   // Pode tentar retry\n  DEGRADED = 'degraded',          // Sistema funciona parcialmente\n  CRITICAL = 'critical',           // Falha total do componente\n}\n\nexport enum ErrorCode {\n  // Storage errors (STORAGE domain)\n  ERR_STORAGE_REDIS = 'ERR_STORAGE_REDIS',\n  ERR_STORAGE_MONGO = 'ERR_STORAGE_MONGO',\n  ERR_STORAGE_HYBRID = 'ERR_STORAGE_HYBRID',\n  ERR_VERSION_MISMATCH = 'ERR_VERSION_MISMATCH',\n  \n  // Encryption errors (ENCRYPTION domain)\n  ERR_ENCRYPTION_FAILED = 'ERR_ENCRYPTION_FAILED',\n  ERR_DECRYPTION_FAILED = 'ERR_DECRYPTION_FAILED',\n  ERR_INVALID_KEY = 'ERR_INVALID_KEY',\n  ERR_KEY_ROTATION_REQUIRED = 'ERR_KEY_ROTATION_REQUIRED',\n  \n  // Validation errors (VALIDATION domain)\n  ERR_INVALID_CONFIG = 'ERR_INVALID_CONFIG',\n  ERR_INVALID_SESSION_ID = 'ERR_INVALID_SESSION_ID',\n  \n  // Resilience errors (RESILIENCE domain)\n  ERR_TIMEOUT = 'ERR_TIMEOUT',\n  ERR_CIRCUIT_BREAKER_OPEN = 'ERR_CIRCUIT_BREAKER_OPEN',\n  ERR_MAX_RETRIES_EXCEEDED = 'ERR_MAX_RETRIES_EXCEEDED',\n}\n\nexport interface ErrorMetadata {\n  code: ErrorCode;\n  domain: ErrorDomain;\n  severity: ErrorSeverity;\n  retryable: boolean;\n  statusCode?: number;\n  documentationUrl: string;\n}\n\n/**\n * Get error metadata for a given error code\n */\nexport function getErrorMetadata(code: ErrorCode): ErrorMetadata {\n  const baseUrl = 'https://github.com/luoarch/baileys-store-core/blob/main/docs/ERROR_CODES.md';\n  \n  const metadataMap: Record<ErrorCode, Partial<ErrorMetadata>> = {\n    // Storage errors\n    [ErrorCode.ERR_STORAGE_REDIS]: {\n      domain: ErrorDomain.STORAGE,\n      severity: ErrorSeverity.DEGRADED,\n      retryable: true,\n      statusCode: 503,\n    },\n    [ErrorCode.ERR_STORAGE_MONGO]: {\n      domain: ErrorDomain.STORAGE,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: true,\n      statusCode: 503,\n    },\n    [ErrorCode.ERR_STORAGE_HYBRID]: {\n      domain: ErrorDomain.STORAGE,\n      severity: ErrorSeverity.DEGRADED,\n      retryable: true,\n      statusCode: 503,\n    },\n    [ErrorCode.ERR_VERSION_MISMATCH]: {\n      domain: ErrorDomain.STORAGE,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: false,\n      statusCode: 409,\n    },\n    \n    // Encryption errors\n    [ErrorCode.ERR_ENCRYPTION_FAILED]: {\n      domain: ErrorDomain.ENCRYPTION,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: false,\n      statusCode: 500,\n    },\n    [ErrorCode.ERR_DECRYPTION_FAILED]: {\n      domain: ErrorDomain.ENCRYPTION,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: false,\n      statusCode: 500,\n    },\n    [ErrorCode.ERR_INVALID_KEY]: {\n      domain: ErrorDomain.ENCRYPTION,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: false,\n      statusCode: 401,\n    },\n    [ErrorCode.ERR_KEY_ROTATION_REQUIRED]: {\n      domain: ErrorDomain.ENCRYPTION,\n      severity: ErrorSeverity.DEGRADED,\n      retryable: false,\n      statusCode: 403,\n    },\n    \n    // Validation errors\n    [ErrorCode.ERR_INVALID_CONFIG]: {\n      domain: ErrorDomain.VALIDATION,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: false,\n      statusCode: 400,\n    },\n    [ErrorCode.ERR_INVALID_SESSION_ID]: {\n      domain: ErrorDomain.VALIDATION,\n      severity: ErrorSeverity.RECOVERABLE,\n      retryable: false,\n      statusCode: 400,\n    },\n    \n    // Resilience errors\n    [ErrorCode.ERR_TIMEOUT]: {\n      domain: ErrorDomain.RESILIENCE,\n      severity: ErrorSeverity.RECOVERABLE,\n      retryable: true,\n      statusCode: 408,\n    },\n    [ErrorCode.ERR_CIRCUIT_BREAKER_OPEN]: {\n      domain: ErrorDomain.RESILIENCE,\n      severity: ErrorSeverity.DEGRADED,\n      retryable: true,\n      statusCode: 503,\n    },\n    [ErrorCode.ERR_MAX_RETRIES_EXCEEDED]: {\n      domain: ErrorDomain.RESILIENCE,\n      severity: ErrorSeverity.CRITICAL,\n      retryable: false,\n      statusCode: 503,\n    },\n  };\n  \n  const partial = metadataMap[code];\n  if (!partial) {\n    throw new Error(`No metadata defined for error code: ${code}`);\n  }\n  \n  return {\n    code,\n    ...partial,\n    documentationUrl: `${baseUrl}#${code.toLowerCase()}`,\n  } as ErrorMetadata;\n}\n\n/**\n * Check if an error code is retryable\n */\nexport function isRetryable(code: ErrorCode): boolean {\n  return getErrorMetadata(code).retryable;\n}\n\n/**\n * Get recommended retry delay in milliseconds for a given error code\n */\nexport function getRetryDelay(code: ErrorCode, attempt: number, baseDelayMs = 100): number {\n  if (!isRetryable(code)) {\n    return 0;\n  }\n  \n  // Exponential backoff with jitter\n  const exponentialDelay = baseDelayMs * Math.pow(2, attempt);\n  const jitter = Math.random() * 0.3 * exponentialDelay; // 30% jitter\n  return Math.floor(exponentialDelay + jitter);\n}\n"]}