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