customer_fwd.rb

 1# frozen_string_literal: true
 2
 3require "uri"
 4
 5class CustomerFwd
 6	def self.for(uri, timeout)
 7		timeout = Timeout.new(timeout)
 8		return if !uri || timeout.zero?
 9		URIS.fetch(uri.split(":", 2).first.to_sym) {
10			raise "Unknown forward URI: #{uri}"
11		}.new(uri, timeout)
12	end
13
14	class Timeout
15		def initialize(s)
16			@timeout = s.nil? || s.to_i.negative? ? 300 : s.to_i
17		end
18
19		def zero?
20			@timeout.zero?
21		end
22
23		def to_i
24			@timeout
25		end
26	end
27
28	def create_call_request
29		request = Bandwidth::ApiCreateCallRequest.new.tap do |cc|
30			cc.to = to
31			cc.call_timeout = timeout.to_i
32		end
33		yield request if block_given?
34		request
35	end
36
37	class Tel < CustomerFwd
38		attr_reader :timeout
39
40		def initialize(uri, timeout)
41			@tel = uri.sub(/^tel:/, "")
42			@timeout = timeout
43		end
44
45		def to
46			@tel
47		end
48	end
49
50	class SIP < CustomerFwd
51		attr_reader :timeout
52
53		def initialize(uri, timeout)
54			@uri = uri
55			@timeout = timeout
56		end
57
58		def to
59			@uri
60		end
61	end
62
63	class XMPP < CustomerFwd
64		attr_reader :timeout
65
66		def initialize(uri, timeout)
67			@jid = uri.sub(/^xmpp:/, "")
68			@timeout = timeout
69		end
70
71		def to
72			"sip:#{ERB::Util.url_encode(@jid)}@sip.cheogram.com"
73		end
74	end
75
76	URIS = {
77		tel: Tel,
78		sip: SIP,
79		xmpp: XMPP
80	}.freeze
81end