Upyo: una librería de email en JavaScript independiente del runtime y del proveedor

Fuentes: Email, decoupled from where and how: A cross-runtime, cross-provider email library for JavaScript and TypeScript

Upyo es una nueva librería de email para JavaScript y TypeScript diseñada para funcionar en cualquier entorno de ejecución —Node.js, Deno, Bun, Cloudflare Workers, Vercel Edge o Supabase Edge Functions— sin modificar el código de la aplicación. A diferencia de Nodemailer, que depende de módulos específicos de Node.js como node:net, node:tls y node:stream y se centra sobre todo en SMTP, Upyo se construye sobre APIs estándar de la plataforma web (fetch, Web Streams, Web Crypto) y ofrece una interfaz Transport uniforme para múltiples proveedores: SMTP, JMAP, Resend, SendGrid, Mailgun, Amazon SES, Plunk y Lettermint. Cambiar de proveedor solo requiere sustituir la instancia del transporte, sin tocar la lógica de envío.

La librería se organiza en paquetes modulares: @upyo/core define la interfaz Transport (send, sendMany y cancelación con AbortSignal) y el tipo Receipt como unión discriminada de éxito y fallo, con campos estructurados como retryable, category y retryAfterMilliseconds. Transportes adicionales como @upyo/retry y @upyo/pool aplican políticas de reintento y conmutación por prioridad o round-robin entre proveedores, y pueden combinarse entre sí. El paquete @upyo/logtape registra los mensajes en consola durante el desarrollo —útil, por ejemplo, para copiar enlaces mágicos de inicio de sesión sin abrir un buzón real— y @upyo/mock permite tests deterministas con aserciones sobre los mensajes enviados.

Entre las funciones avanzadas destacan SMTPUTF8 y notificaciones de estado de entrega (DSN) en el transporte SMTP, adjuntos transmitidos como streams, soporte para invitaciones de calendario mediante el campo Message.calendar y cabeceras de conversación (messageId, inReplyTo, references). El proyecto apuesta por dependencias mínimas: @upyo/ses implementa AWS Signature v4 directamente, sin recurrir al SDK de AWS, para mantener la compatibilidad con runtimes no node.