@lemydev/client-ts
v0.1.0
Published
Cliente TypeScript tipado para el servicio Soporte. Para integrar desde RentAR, Ahorro, NutriGo o cualquier app del ecosistema Lemy.
Maintainers
Readme
@lemydev/client-ts
Cliente TypeScript tipado para integrar el servicio Soporte Lemy desde cualquier app del ecosistema.
Instalación
pnpm add @lemydev/client-tsUso básico (server-side)
Importante: usá el cliente server-side (Route Handler, API route, server action). No expongas la API key al browser.
import { createSupportClient, captureClientMetadata } from "@lemydev/client-ts";
const support = createSupportClient({
baseUrl: process.env.SOPORTE_API_URL!,
apiKey: process.env.SOPORTE_API_KEY!,
});
// Crear ticket
const ticket = await support.createTicket(
{
type: "bug",
subject: "No puedo iniciar sesión con Google",
description: "Pasa cuando intento desde el celular.",
files: [file],
metadata: captureClientMetadata(process.env.NEXT_PUBLIC_APP_VERSION),
},
{ userId: session.user.id, email: session.user.email },
);API
| Método | Descripción |
| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| createTicket(input, identity?) | Crea un ticket con hasta 3 archivos (PNG/JPG/WebP ≤ 5MB, MP4 ≤ 20MB). Requiere identity con userId y email. |
| getMyTickets({ cursor?, limit? }, identity?) | Lista paginada de tickets del reporter. Default limit=20, máx 100. |
| getTicket(id, identity?) | Detalle del ticket (con attachments y mensajes públicos). Solo si pertenece al reporter. |
| addMessage(ticketId, body, identity?) | Agrega un mensaje del usuario al hilo (siempre público). |
Podés pasar defaultIdentity al crear el cliente y omitirla en cada llamada.
Errores
Todos los métodos rechazan con SupportApiError:
import { SupportApiError } from "@lemydev/client-ts";
try {
await support.createTicket(input, identity);
} catch (err) {
if (err instanceof SupportApiError) {
switch (err.code) {
case "rate_limited": // Reintentar más tarde
case "file_too_large": // Mostrar mensaje al usuario
case "unsupported_format":
case "validation":
case "unauthorized": // Key revocada → notificar al equipo
case "network": // Sin conexión
case "server": // Bug del servicio
}
}
}Patrón recomendado: proxy en tu backend
// app/api/support/tickets/route.ts (Next.js)
import { createSupportClient } from "@lemydev/client-ts";
import { auth } from "@/lib/auth";
const support = createSupportClient({
baseUrl: process.env.SOPORTE_API_URL!,
apiKey: process.env.SOPORTE_API_KEY!, // server-side only
});
export async function POST(req: Request) {
const session = await auth();
if (!session) return new Response("Unauthorized", { status: 401 });
const fd = await req.formData();
const ticket = await support.createTicket(
{
type: fd.get("type") as "bug" | "improvement",
subject: String(fd.get("subject") ?? ""),
description: String(fd.get("description") ?? ""),
files: fd.getAll("files") as File[],
},
{ userId: session.user.id, email: session.user.email },
);
return Response.json(ticket);
}El cliente desde el browser hace fetch("/api/support/tickets", ...) sin saber nada de la API key.
Tipos exportados
Ticket, TicketSummary, PagedTickets, Attachment, Message, TicketType, TicketStatus, TicketPriority, Identity, CreateTicketInput, ListMyTicketsParams, ClientMetadata, SupportErrorCode.
