Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 6x 27x 27x 27x 10x 17x 10x 7x 4x 3x 6x 10x 3x 7x 3x 3x 1x 6x | /** * Classifies errors to determine if provider should be reconnected */ export type ErrorType = 'auth' | 'network' | 'config' | 'unknown'; export interface ErrorClassification { type: ErrorType; shouldReconnect: boolean; message: string; } /** * Classify error and determine if reconnection should be attempted */ export function classifyError(error: unknown): ErrorClassification { const errorMessage = error instanceof Error ? error.message : String(error); const lowerMessage = errorMessage.toLowerCase(); // Authentication/Authorization errors - do not reconnect if ( lowerMessage.includes('unauthorized') || lowerMessage.includes('401') || lowerMessage.includes('forbidden') || lowerMessage.includes('403') || lowerMessage.includes('invalid token') || lowerMessage.includes('authentication failed') || lowerMessage.includes('access denied') || lowerMessage.includes('bad credentials') || lowerMessage.includes('token expired') ) { return { type: 'auth', shouldReconnect: false, message: `Authentication failed: ${errorMessage}`, }; } // Network/Connection errors - can reconnect if ( lowerMessage.includes('connection') || lowerMessage.includes('timeout') || lowerMessage.includes('network') || lowerMessage.includes('econnrefused') || lowerMessage.includes('enotfound') || lowerMessage.includes('socket') || lowerMessage.includes('dns') || lowerMessage.includes('502') || lowerMessage.includes('503') || lowerMessage.includes('504') ) { return { type: 'network', shouldReconnect: true, message: `Network error: ${errorMessage}`, }; } // Configuration errors - do not reconnect if ( (lowerMessage.includes('not found') && lowerMessage.includes('404')) || lowerMessage.includes('invalid configuration') || lowerMessage.includes('missing parameter') || (lowerMessage.includes('organization') && lowerMessage.includes('not found')) ) { return { type: 'config', shouldReconnect: false, message: `Configuration error: ${errorMessage}`, }; } // Unknown errors - can try to reconnect return { type: 'unknown', shouldReconnect: true, message: `Unknown error: ${errorMessage}`, }; } /** * Check if provider should be reconnected based on error count and time */ export function shouldAttemptReconnection( reconnectAttempts: number = 0, lastReconnectTime?: Date, maxAttempts: number = 3, cooldownMs: number = 30000, // 30 seconds ): boolean { // Too many attempts if (reconnectAttempts >= maxAttempts) { return false; } // Need to wait for cooldown period if (lastReconnectTime) { const timeSinceLastAttempt = Date.now() - lastReconnectTime.getTime(); if (timeSinceLastAttempt < cooldownMs) { return false; } } return true; } |