HTTP

CorsAdapter

Adapter per configurazione CORS cross-origin. Fornisce CorsConfig, ICorsAdapter, CorsAdapter e CorsAdapterFactory con preset per sviluppo.

Quando usarlo

CorsAdapter applica una policy CORS esplicita a un'istanza Axios e fornisce messaggi diagnostici quando le richieste cross-origin falliscono. Usalo quando:

  • l'applicazione chiama API ospitate su origin diversi;
  • vuoi un client Axios con withCredentials e Content-Type coerenti applicati via interceptor;
  • ti serve un messaggio d'errore più chiaro di "Network Error" generico in caso di problemi CORS.
CorsAdapter lavora su AxiosInstance. Per FetchHttpClient usa direttamente withCredentials: true nella baseConfig: la Fetch API gestisce nativamente CORS senza adapter aggiuntivi.

CorsConfig

interface CorsConfig {
  allowedOrigins: string[] | '*'
  allowedMethods: string[]
  allowedHeaders: string[]
  allowCredentials: boolean
  maxAge?: number
  exposedHeaders?: string[]
}
CampoTipoDescrizione
allowedOriginsstring[] | '*'Domini consentiti per le richieste cross-origin. '*' consente tutti i domini.
allowedMethodsstring[]Metodi HTTP consentiti (es. ['GET', 'POST', 'PUT', 'DELETE']). Non può essere vuoto.
allowedHeadersstring[]Headers consentiti nelle richieste (es. ['Content-Type', 'Authorization']). Non può essere vuoto.
allowCredentialsbooleanSe true, applica withCredentials: true su ogni richiesta.
maxAgenumberDurata cache del preflight in secondi (opzionale).
exposedHeadersstring[]Headers che il client può leggere dalla risposta (opzionale).

ICorsAdapter

interface ICorsAdapter {
  applyToConfig(config: AxiosRequestConfig): AxiosRequestConfig
  handleCorsError(error: AxiosError): never
  createCorsEnabledClient(baseConfig?: AxiosRequestConfig): AxiosInstance
}
MetodoSignatureDescrizione
applyToConfig(config: AxiosRequestConfig) => AxiosRequestConfigApplica withCredentials e Content-Type default su una singola config.
handleCorsError(error: AxiosError) => neverLancia errore con messaggio diagnostico CORS.
createCorsEnabledClient(baseConfig?: AxiosRequestConfig) => AxiosInstanceCrea un'istanza Axios con interceptors request/response che applicano la policy.

CorsAdapter

Implementazione concreta. Valida la CorsConfig nel costruttore.

class CorsAdapter implements ICorsAdapter {
  constructor(corsConfig: CorsConfig)
}
ParametroTipoDefaultDescrizione
corsConfigCorsConfigConfigurazione CORS. Lancia Error se allowedMethods o allowedHeaders sono vuoti.

Comportamento

  • applyToConfig: se Content-Type è in allowedHeaders, viene preservato l'esistente o impostato a application/json. withCredentials viene impostato se allowCredentials è true o se la config originale lo richiedeva.
  • handleCorsError: se l'errore ha una response HTTP, lo rilancia invariato. Se ha solo request (network error), lancia un errore con messaggio:

    Possibile errore CORS: <message>. Verifica che il server includa l'header 'Access-Control-Allow-Origin' e supporti il metodo <METHOD>.

  • createCorsEnabledClient: crea axios.create(baseConfig) e registra interceptors che applicano applyToConfig su ogni request e handleCorsError su ogni response error.

CorsAdapterFactory

Factory per creare adapter con configurazioni predefinite.

MetodoSignatureDescrizione
createDefaultAdapter() => ICorsAdapterAdapter permissivo per sviluppo: include window.location.origin e le porte dev comuni (3000, 5173, 8080) sia su localhost che 127.0.0.1. maxAge: 86400.
createCustomAdapter(config: CorsConfig) => ICorsAdapterAdapter con configurazione fornita esplicitamente.

Esempi

Single origin (produzione)

import { CorsAdapter } from '@pzeta/postgrest'

const adapter = new CorsAdapter({
  allowedOrigins: ['https://app.example.com'],
  allowedMethods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  allowCredentials: false,
  maxAge: 3600,
})

const client = adapter.createCorsEnabledClient({
  baseURL: 'https://api.example.com',
  timeout: 10000,
})

const { data } = await client.get('/users')

Multi-origin con credentials

import { CorsAdapterFactory } from '@pzeta/postgrest'

const adapter = CorsAdapterFactory.createCustomAdapter({
  allowedOrigins: [
    'https://app.example.com',
    'https://admin.example.com',
  ],
  allowedMethods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Request-Id'],
  allowCredentials: true,
  maxAge: 3600,
  exposedHeaders: ['X-Total-Count', 'X-Page-Count'],
})

const client = adapter.createCorsEnabledClient({ baseURL: '/api' })

Default per sviluppo

import { CorsAdapterFactory } from '@pzeta/postgrest'

// Permette automaticamente localhost:3000, :5173, :8080 (+ 127.0.0.1)
const adapter = CorsAdapterFactory.createDefaultAdapter()

const client = adapter.createCorsEnabledClient({
  baseURL: 'http://localhost:8000',
})
createDefaultAdapter è pensato per ambienti di sviluppo locali. In produzione usa sempre createCustomAdapter con una whitelist esplicita di origin trusted.

Integrazione con AxiosHttpClient

import { CorsAdapterFactory, AxiosHttpClient } from '@pzeta/postgrest'

const corsAdapter = CorsAdapterFactory.createCustomAdapter({
  allowedOrigins: ['https://app.example.com'],
  allowedMethods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  allowCredentials: true,
})

const axiosInstance = corsAdapter.createCorsEnabledClient({
  baseURL: 'https://api.example.com',
})

const httpClient = new AxiosHttpClient(axiosInstance)

Tipi correlati