diff --git a/lib/signalwire/rest/client.rb b/lib/signalwire/rest/client.rb index 7badd0c..75cbb39 100644 --- a/lib/signalwire/rest/client.rb +++ b/lib/signalwire/rest/client.rb @@ -4,12 +4,12 @@ module Signalwire::REST class Client < Twilio::REST::Client def initialize(username = nil, password = nil, account_sid = nil, region = nil, http_client = Twilio::HTTP::Client.new, **args) host = args.delete(:signalwire_space_url) + service_provider = args.delete(:service_provider) - unless host.nil? Signalwire::Sdk.configure do |config| - config.hostname = host + config.hostname = host if host + config.service_provider = service_provider if service_provider end - end super(username, password, account_sid, region, http_client) end diff --git a/lib/signalwire/sdk.rb b/lib/signalwire/sdk.rb index 2f66f7c..9e09162 100644 --- a/lib/signalwire/sdk.rb +++ b/lib/signalwire/sdk.rb @@ -14,10 +14,16 @@ module Signalwire module Sdk class << self + attr_accessor :configuration + def configuration @configuration ||= Configuration.new end + def reset + @configuration = Configuration.new + end + def configure yield(configuration) end diff --git a/lib/signalwire/sdk/configuration.rb b/lib/signalwire/sdk/configuration.rb index b5689a4..3835507 100644 --- a/lib/signalwire/sdk/configuration.rb +++ b/lib/signalwire/sdk/configuration.rb @@ -3,7 +3,22 @@ module Signalwire module Sdk class Configuration - attr_accessor :hostname + attr_accessor :hostname, :service_provider + + def initialize + @service_provider = 'signalwire' if self.service_provider.nil? + end + + def configure + yield self + end + + + def reset_config + configure do |config| + config.service_provider = 'signalwire' + end + end end end end diff --git a/lib/signalwire/sdk/domain.rb b/lib/signalwire/sdk/domain.rb index 2defb94..d8a5647 100644 --- a/lib/signalwire/sdk/domain.rb +++ b/lib/signalwire/sdk/domain.rb @@ -3,8 +3,37 @@ module Twilio module REST class Domain + attr_reader :client + + def initialize(client) + @client = client + @host = nil + @base_url = nil + @port = nil + end + def absolute_url(uri) - "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(%r{^/(api/)/}, '')}" + if Signalwire::Sdk.configuration.service_provider == 'twilio' + "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(/^\//, '')}" + else + "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(%r{^/(api/)/}, '')}" + end + end + + def request(method, uri, params = {}, data = {}, headers = {}, auth = nil, timeout = nil) + url = uri.match(/^http/) ? uri : absolute_url(uri) + + @client.request( + @base_url, + @port, + method, + url, + params, + data, + headers, + auth, + timeout + ) end end end diff --git a/lib/signalwire/sdk/twilio_set_fax.rb b/lib/signalwire/sdk/twilio_set_fax.rb index 5345539..4e5fb54 100644 --- a/lib/signalwire/sdk/twilio_set_fax.rb +++ b/lib/signalwire/sdk/twilio_set_fax.rb @@ -6,11 +6,14 @@ class Fax < Domain def initialize(twilio) super - @host = ENV['SIGNALWIRE_HOST'] || - Signalwire::Sdk.configuration.hostname || - raise(ArgumentError, - 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ + @host = if Signalwire::Sdk.configuration.service_provider == 'twilio' + 'fax.twilio.com' + else + ENV['SIGNALWIRE_HOST'] || Signalwire::Sdk.configuration.hostname || + raise(ArgumentError, + 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ 'SIGNALWIRE_HOST environment variable, or hostname in the configuration.') + end @base_url = "https://#{@host}" @port = 443 @@ -26,6 +29,10 @@ def hostname @host end + def service_provider + Signalwire::Sdk.configuration.service_provider + end + attr_reader :account_sid class V1 < Version diff --git a/lib/signalwire/sdk/twilio_set_host.rb b/lib/signalwire/sdk/twilio_set_host.rb index 5fe8e19..8197d0e 100644 --- a/lib/signalwire/sdk/twilio_set_host.rb +++ b/lib/signalwire/sdk/twilio_set_host.rb @@ -6,13 +6,15 @@ class Api < Domain def initialize(twilio) super - @host = ENV['SIGNALWIRE_HOST'] || - ENV['SIGNALWIRE_API_HOSTNAME'] || - Signalwire::Sdk.configuration.hostname || - raise(ArgumentError, - 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ + @host = if Signalwire::Sdk.configuration.service_provider == 'twilio' + 'api.twilio.com' + else + ENV['SIGNALWIRE_HOST'] || ENV['SIGNALWIRE_API_HOSTNAME'] || Signalwire::Sdk.configuration.hostname || + raise(ArgumentError, + 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ 'SIGNALWIRE_HOST or SIGNALWIRE_API_HOSTNAME environment variables, '\ 'or hostname in the configuration.') + end @base_url = "https://#{@host}" @port = 443 @@ -24,6 +26,10 @@ def initialize(twilio) def hostname @host end + + def service_provider + Signalwire::Sdk.configuration.service_provider + end end end end diff --git a/spec/signalwire/sdk/configuration_spec.rb b/spec/signalwire/sdk/configuration_spec.rb index 6c4c992..a54c0ce 100644 --- a/spec/signalwire/sdk/configuration_spec.rb +++ b/spec/signalwire/sdk/configuration_spec.rb @@ -5,8 +5,9 @@ module Signalwire RSpec.describe Sdk::Configuration do describe '#hostname' do - it 'there is no default' do + it 'there is no default hostname but is a default service provider' do expect(Sdk::Configuration.new.hostname).to eq nil + expect(Sdk::Configuration.new.service_provider).to eq 'signalwire' end end @@ -14,14 +15,17 @@ module Signalwire it 'can set value' do config = Sdk::Configuration.new config.hostname = 'test.signalwire.com' + config.service_provider = 'twilio' expect(config.hostname).to eq('test.signalwire.com') + expect(config.service_provider).to eq('twilio') end end describe 'setting up directly in the constructor' do it 'sets the configuration in the constructor' do - client = Signalwire::REST::Client.new 'xyz123-xyz123-xyz123', 'PTxyz123-xyz123-xyz123', signalwire_space_url: 'test.signalwire.com' + client = Signalwire::REST::Client.new 'xyz123-xyz123-xyz123', 'PTxyz123-xyz123-xyz123', signalwire_space_url: 'test.signalwire.com', service_provider: 'twilio' expect(Signalwire::Sdk.configuration.hostname).to eq('test.signalwire.com') + expect(Signalwire::Sdk.configuration.service_provider).to eq('twilio') end end end diff --git a/spec/signalwire/sdk_spec.rb b/spec/signalwire/sdk_spec.rb index 0a73ee3..161ba28 100644 --- a/spec/signalwire/sdk_spec.rb +++ b/spec/signalwire/sdk_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Signalwire::Sdk do describe '#configure' do - it 'returns the configured hostname' do + it 'returns the configured hostname for signalwire' do Signalwire::Sdk.configure do |config| config.hostname = 'demo.signalwire.com' end @@ -12,9 +12,23 @@ twilio_client = Twilio::REST::Client.new expect(twilio_client.api.hostname).to eq('demo.signalwire.com') expect(twilio_client.fax.hostname).to eq('demo.signalwire.com') + expect(twilio_client.api.service_provider).to eq('signalwire') end - it 'requires the hostname configuration to be set' do + it 'returns the configured hostname for twilio' do + Signalwire::Sdk.configure do |config| + # config.hostname = 'demo.signalwire.com' + config.service_provider = 'twilio' + end + + twilio_client = Twilio::REST::Client.new + expect(twilio_client.api.hostname).to eq('api.twilio.com') + expect(twilio_client.fax.hostname).to eq('fax.twilio.com') + expect(twilio_client.api.service_provider).to eq('twilio') + end + + + it 'requires the hostname configuration to be set for signalwire' do Signalwire::Sdk.configure do |config| config.hostname = nil end @@ -23,5 +37,20 @@ Twilio::REST::Client.new.api end.to raise_exception ArgumentError, /SignalWire Space URL is not configured/ end + + it 'does not require the hostname configuration to be set for twilio' do + Signalwire::Sdk.configure do |config| + config.hostname = nil + config.service_provider = 'twilio' + end + + expect do + Twilio::REST::Client.new.api + end.not_to raise_exception ArgumentError, /SignalWire Space URL is not configured/ + end + + after :each do + Signalwire::Sdk.reset + end end end