Repository navigation
feat: implement SignalWire SMS provider (US / Global) #53
Copy link
Copy link
Open
Description
Summary
Implement the SignalWire SMS provider inside src/SmsBridge/Providers/SignalWire/.
SignalWire provides SMS/MMS through its compatibility messaging API. This adds another US/global CPaaS provider, especially useful for teams already using SignalWire spaces and phone numbers.
Official docs:
- Messaging docs: https://developer.signalwire.com/messaging/
- Compatibility API docs: https://developer.signalwire.com/compatibility-api/
Files to create
src/SmsBridge/Providers/SignalWire/SignalWireSmsProvider.cssrc/SmsBridge/Providers/SignalWire/SignalWireSmsRequestMapper.cssrc/SmsBridge/Providers/SignalWire/SignalWireSmsResponseMapper.cssrc/SmsBridge/Options/SignalWireOptions.cs- Register
UseSignalWire()insrc/SmsBridge/DependencyInjection/SmsBridgeProviderBuilder.cs - Add
HttpClientNames.SignalWireinsrc/SmsBridge/Internal/Http/HttpClientNames.cs - Add
SmsProviderType.SignalWireto the enum
SignalWire API Details
- Base URL:
https://{SpaceName}.signalwire.com/api/laml/2010-04-01 - Send endpoint:
POST /Accounts/{ProjectId}/Messages.json - Auth: HTTP Basic Auth using Project ID and API token
- Request form fields:
From=+15551234567 To=+15557654321 Body=Hello from SMSBridge - Response is Twilio-compatible and includes fields such as
sid,status,to,from, andbody.
Options
public sealed class SignalWireOptions
{
public required string SpaceName { get; init; }
public required string ProjectId { get; init; }
public required string ApiToken { get; init; }
public required string From { get; init; }
}Implementation Notes
- Use form URL encoded requests, matching compatibility API expectations.
- Use
sidas the provider message id for accepted sends. - The response shape is close to Twilio, but keep a dedicated mapper to avoid coupling provider-specific status behavior.
- Support E.164 numbers.
Tests to add
tests/SmsBridge.ProviderTests/SignalWireResponseMapperTests.cstests/SmsBridge.ProviderTests/SignalWireProviderTests.cs
Acceptance Criteria
- Provider sends via
/Accounts/{ProjectId}/Messages.jsonusingIHttpClientFactory - Provider uses HTTP Basic Auth with
ProjectId:ApiToken - Request mapper emits
From,To, andBody - Response mapper maps
sidtoSmsSendResult.ProviderMessageId - Provider maps rejected statuses/errors to failed
SmsSendResult - Transient HTTP failures set
IsTransientFailure = true -
UseSignalWire()registers the provider in DI - All tests pass -
dotnet test -
dotnet buildhas 0 warnings
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity