L'SDK fornisce classi di errore tipizzate per diversi scenari, rendendo facile gestire casi specifici nella tua applicazione.
Tutte le classi di errore estendono ArubaApiError, che estende la classe nativa Error.
Classe base per tutti gli errori API.
class ArubaApiError extends Error {
readonly code: string; // Codice errore
readonly statusCode: number; // Codice stato HTTP
readonly details?: string; // Dettagli aggiuntivi
}
Esempio:
import { ArubaApiError } from '@fatturazione-elettronica-aruba/core';
try {
await invoices.upload({ dataFile });
} catch (error) {
if (error instanceof ArubaApiError) {
console.log(`Errore [${error.code}]: ${error.message}`);
console.log(`Stato HTTP: ${error.statusCode}`);
if (error.details) {
console.log(`Dettagli: ${error.details}`);
}
}
}
Lanciato quando l'autenticazione fallisce (401 Unauthorized).
class AuthenticationError extends ArubaApiError {
// code: 'AUTH_ERROR'
// statusCode: 401
}
Cause comuni:
Esempio:
import { AuthenticationError } from '@fatturazione-elettronica-aruba/core';
try {
await client.auth.signIn(username, password);
} catch (error) {
if (error instanceof AuthenticationError) {
console.log('Credenziali non valide o sessione scaduta');
}
}
Lanciato quando i limiti di richieste sono superati (429 Too Many Requests).
class RateLimitError extends ArubaApiError {
readonly retryAfter?: number; // Secondi da attendere prima del retry
// code: 'RATE_LIMIT'
// statusCode: 429
}
Limiti di rate:
| Endpoint | Limite |
|---|---|
| Autenticazione | 1 richiesta/minuto |
| Upload fatture | 30 richieste/minuto |
| Ricerca | 12 richieste/minuto |
Esempio:
import { RateLimitError } from '@fatturazione-elettronica-aruba/core';
try {
await invoices.upload({ dataFile });
} catch (error) {
if (error instanceof RateLimitError) {
console.log(`Rate limit. Riprova tra ${error.retryAfter} secondi`);
await sleep(error.retryAfter * 1000);
// Riprova la richiesta
}
}
Lanciato quando una richiesta va in timeout.
class TimeoutError extends ArubaApiError {
// code: 'TIMEOUT'
// statusCode: 408
}
Esempio:
import { TimeoutError } from '@fatturazione-elettronica-aruba/core';
try {
await invoices.findSent({ creationStartDate, creationEndDate });
} catch (error) {
if (error instanceof TimeoutError) {
console.log('Richiesta in timeout, riprova');
}
}
Lanciato quando si verifica un errore di rete (connessione fallita, errore DNS, ecc.).
class NetworkError extends ArubaApiError {
// code: 'NETWORK_ERROR'
// statusCode: 0
}
Esempio:
import { NetworkError } from '@fatturazione-elettronica-aruba/core';
try {
await client.auth.signIn(username, password);
} catch (error) {
if (error instanceof NetworkError) {
console.log('Errore di rete - controlla la connessione internet');
}
}
| Status | Descrizione | Comportamento SDK |
|---|---|---|
400 | Bad Request | Lancia ArubaApiError con dettagli validazione |
401 | Unauthorized | Tenta refresh token, poi lancia AuthenticationError |
403 | Forbidden | Lancia ArubaApiError (permessi mancanti) |
404 | Not Found | Lancia ArubaApiError (risorsa non trovata) |
413 | Payload Too Large | Lancia ArubaApiError (file > 5MB) |
429 | Too Many Requests | Auto-retry con backoff esponenziale, poi RateLimitError |
500 | Server Error | Retry automatico, poi lancia ArubaApiError |
Restituiti immediatamente dalle API durante le operazioni di upload:
| Codice | Descrizione | Azione |
|---|---|---|
0000 | Operazione effettuata | Successo |
0001 | Nome file già presente | Usa un nome file diverso |
0002 | Fattura duplicata | Fattura già inviata |
0003 | Superato limite spazio | Contatta Aruba per più spazio |
0004 | File non valido | Controlla formato XML |
0005 | Contenuto Base64 non valido | Ricodifica il file |
0006 | Tipo documento non valido | Controlla TipoDocumento |
0007 | Firma non valida | Rifirma la fattura |
0008 | Certificato scaduto | Rinnova certificato |
0009 | Certificato revocato | Usa certificato valido |
0010 | Certificato non attendibile | Usa CA approvata da Aruba |
0096 | Servizio non disponibile | Riprova più tardi |
0097 | Errore interno | Contatta supporto |
0098 | Timeout | Riprova la richiesta |
0099 | Errore generico | Controlla formato richiesta |
Ricevuti tramite notifica NS (Notifica di Scarto) dallo SDI:
| Codice | Descrizione | Azione |
|---|---|---|
FATRSM200 | File non conforme al formato | Valida XML contro schema FatturaPA |
FATRSM201 | Identificativo trasmissione non valido | Controlla formato progressivoInvio |
FATRSM212 | IdTrasmittente diverso da quello Aruba | Usa ID Aruba (01879020517) |
FATRSM213 | Codice destinatario non valido | Verifica codiceDestinatario |
FATRSM214 | PEC destinatario non valida | Verifica indirizzo PEC |
FATRSM215 | Formato trasmissione non supportato | Usa FPR12 o FPA12 |
import {
ArubaApiError,
AuthenticationError,
RateLimitError,
TimeoutError,
NetworkError,
} from '@fatturazione-elettronica-aruba/core';
async function uploadFatturaSicuro(invoices: InvoicesClient, dataFile: string) {
try {
const result = await invoices.upload({ dataFile });
return { success: true, data: result };
} catch (error) {
if (error instanceof AuthenticationError) {
// Sessione scaduta - ri-autenticare
return { success: false, error: 'AUTH_EXPIRED', message: 'Effettua nuovamente il login' };
}
if (error instanceof RateLimitError) {
// Rate limit - attendi e riprova
return {
success: false,
error: 'RATE_LIMITED',
retryAfter: error.retryAfter,
message: `Troppe richieste. Riprova tra ${error.retryAfter}s`,
};
}
if (error instanceof TimeoutError) {
// Timeout - può riprovare
return { success: false, error: 'TIMEOUT', message: 'Richiesta in timeout' };
}
if (error instanceof NetworkError) {
// Problema di rete - controlla connessione
return { success: false, error: 'NETWORK', message: 'Errore di rete' };
}
if (error instanceof ArubaApiError) {
// Errore API con codice
return {
success: false,
error: error.code,
message: error.message,
details: error.details,
};
}
// Errore sconosciuto
throw error;
}
}
Puoi usare instanceof per controllare i tipi di errore:
function isRetryable(error: unknown): boolean {
if (error instanceof RateLimitError) return true;
if (error instanceof TimeoutError) return true;
if (error instanceof NetworkError) return true;
if (error instanceof ArubaApiError && error.statusCode >= 500) return true;
return false;
}