v0.10.0
✨ Added
- **Channel send result** —
toChannelSendResult/ChannelSendResult(sently/channel-result, also on the main barrel) maps email, SMS, WhatsApp, and push results to{ messageId, provider, accepted } - **Cross-channel decorators** —
RetryTransport,FallbackTransport, andWeightedFallbackTransportwrap SMS / WhatsApp / Push transports; SMS / WhatsApp / push senders wireonRetry/onFallbacklike email - **Unifonic SMS** —
sently/transports/unifonic(AppSid+ el.cloud REST send); webhook parser atsently/webhooks/unifonic - **FCM push** —
sently/transports/fcm(HTTP v1 + service-account JWT, zero Google SDK) - **Non-email webhooks** —
DeliveryEventplus parsers for Twilio SMS and WhatsApp Cloud (sently/webhooks/twilio-sms,whatsapp-cloud);toDeliveryEventmapsEmailEventinto the shared shape; Twilio and WhatsApp Cloud parsers exposeverifySignaturefor inbound authenticity - **Docs landing** — homepage transport marquee and channel cards include Unifonic and FCM
♻️ Changed
- **
PushOptions** — union ofWebPushOptions(subscription) andFcmPushOptions(token); Web Push and FCM transports reject the wrong shape - **SMS / WhatsApp / Push results** — optional
providerIndexwhen a fallback decorator handles the send
🐛 Fixed
- **Unifonic success parsing** — accept OpenAPI
success: "true"(string) in addition to booleantrue - **Unifonic
statusCallback** — reject non-HTTPS URLs at construction (el.cloud OpenAPI requires a public HTTPS callback) - **Empty FCM token** — reject blank
tokenbefore calling the FCM API - **Landing provider strip** — keep transport icons and labels on one vertical midline in the homepage marquee
🔒 Security
- **WhatsApp Cloud webhooks** —
verifySignatureforX-Hub-Signature-256(HMAC-SHA256 over the raw body with the Meta app secret) - **Twilio SMS webhooks** —
verifySignatureforX-Twilio-Signature(HMAC-SHA1 over URL + sorted form params with the Auth Token)