@nexa/http
Sin dependencias — cliente HTTP + capa de datos reactiva, para usar dentro de una isla o un handler.
createApi()
import { createApi } from "@nexa/http";
const api = createApi({ baseURL: "https://api.miapp.com" });
await api.get("/products");
await api.post("/products", { name: "..." });get/post/put/delete reales. Un status no-2xx lanza HttpError { status, message }.
query()
import { query } from "@nexa/http";
const users = query({ key: "users", fetch: () => api.get("/users") });
users.data.value;
users.refetch();data/loading/error como Signal de @nexa/reactivity. cachePolicy: cache-first (default) | network-first | stale-while-revalidate.
mutation()
import { mutation } from "@nexa/http";
const createUser = mutation({ execute: (nombre) => api.post("/users", { nombre }) });
await createUser.execute("Ana");Mismos Signal (data/loading/error) que query(), para una acción que el usuario dispara (crear, editar, borrar).
connectSSE()
import { connectSSE } from "@nexa/http";
const notifications = connectSSE({ url: "/events" });
notifications.data.value;Envoltorio delgado sobre EventSource nativo. data es el último mensaje, parseado como JSON si se puede.
connectSocket()
import { connectSocket } from "@nexa/http";
const chat = connectSocket({ url: "wss://miapp.com/chat" });
chat.send({ text: "hola" });Envoltorio sobre WebSocket nativo. status refleja el ciclo de vida real; send() serializa objetos como JSON automáticamente.
Reconexión con backoff
const chat = connectSocket({
url: "wss://miapp.com/chat",
reconnect: { maxAttempts: 10, baseDelayMs: 500, maxDelayMs: 15000 }
});reconnect: true (o un objeto para ajustar los valores) reconecta solo con backoff exponencial + jitter. status pasa por "reconnecting" mientras lo intenta.