wamp_client 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -26
  3. data/lib/{wamp_client.rb → wamp/client.rb} +8 -8
  4. data/lib/{wamp_client → wamp/client}/auth.rb +13 -11
  5. data/lib/wamp/client/check.rb +86 -0
  6. data/lib/wamp/client/connection.rb +249 -0
  7. data/lib/{wamp_client → wamp/client}/defer.rb +29 -27
  8. data/lib/wamp/client/message.rb +1322 -0
  9. data/lib/{wamp_client → wamp/client}/serializer.rb +26 -24
  10. data/lib/wamp/client/session.rb +1001 -0
  11. data/lib/wamp/client/transport/base.rb +152 -0
  12. data/lib/{wamp_client → wamp/client}/transport/event_machine_base.rb +19 -17
  13. data/lib/wamp/client/transport/faye_web_socket.rb +85 -0
  14. data/lib/wamp/client/transport/web_socket_event_machine.rb +88 -0
  15. data/lib/{wamp_client → wamp/client}/version.rb +5 -3
  16. data/scripts/gen_message.rb +54 -53
  17. data/spec/spec_helper.rb +3 -3
  18. data/spec/{auth_spec.rb → wamp/client/auth_spec.rb} +2 -2
  19. data/spec/{check_spec.rb → wamp/client/check_spec.rb} +2 -2
  20. data/spec/{connection_spec.rb → wamp/client/connection_spec.rb} +7 -7
  21. data/spec/{message_spec.rb → wamp/client/message_spec.rb} +298 -298
  22. data/spec/{session_spec.rb → wamp/client/session_spec.rb} +134 -134
  23. data/spec/{transport_spec.rb → wamp/client/transport_spec.rb} +4 -4
  24. data/wamp_client.gemspec +2 -2
  25. metadata +50 -50
  26. data/lib/wamp_client/check.rb +0 -84
  27. data/lib/wamp_client/connection.rb +0 -247
  28. data/lib/wamp_client/message.rb +0 -1348
  29. data/lib/wamp_client/session.rb +0 -1000
  30. data/lib/wamp_client/transport/base.rb +0 -151
  31. data/lib/wamp_client/transport/faye_web_socket.rb +0 -83
  32. data/lib/wamp_client/transport/web_socket_event_machine.rb +0 -86
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5401c514eb36f3adbfa52b9f2f5d218a3f884ee5
4
- data.tar.gz: fae4ea4045398f596d7f67262a121b29c754c724
3
+ metadata.gz: 461e1109df53efb8a73f4baa59154764499dc5b4
4
+ data.tar.gz: 20bfbab92bcfa98139f4eaa21b00da249cbb0e3b
5
5
  SHA512:
6
- metadata.gz: 833e3a42b79b5de4624fab8ecdc989a4af23db6aba17352ad399f7614e12754ced273cef8419dd257423cfcc736f5ea2ccfb2c4945158b02b07703f650b8736b
7
- data.tar.gz: 35ccc1c3bead4d40b9ff21c55caf44c69b1ca85474461f43fac9d9fc1777193be4147b2fba4d2e865af7de9b1f3c7879a5d37fc37ecba81c7b9d803d1f871a6f
6
+ metadata.gz: 92d7ade25879d7928d27aa83380d5f5196962fa241c325f556f4ae2da0fede72aa8198ef46a60f13d643c4121c4cc83d5bc7bc51fc5b3ee5ad8f8a79c5583335
7
+ data.tar.gz: 8da8ebf72fabfe7edf6a4700233d7ee076b7d7d4e89295c4c42748059c30ef423c15c70c94802a815d2f7b50d2741aa6b8059bd5efb88dc4c382318f67182a3c
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # WampClient
1
+ # Wamp::Client
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/wamp_client.svg)](https://badge.fury.io/rb/wamp_client)
4
4
  [![Circle CI](https://circleci.com/gh/ericchapman/ruby_wamp_client/tree/master.svg?&style=shield&circle-token=92813c17f9c9510c4c644e41683e7ba2572e0b2a)](https://circleci.com/gh/ericchapman/ruby_wamp_client/tree/master)
@@ -10,6 +10,8 @@ Please use [wamp_rails](https://github.com/ericchapman/ruby_wamp_rails) to integ
10
10
 
11
11
  ## Revision History
12
12
 
13
+ - v0.1.0:
14
+ - BREAKING CHANGE - Changed all of the namespaces to be "Wamp::Client"
13
15
  - v0.0.9:
14
16
  - Added support for transport override and 'faye-websocket' transport
15
17
  - Added "on(event)" callback (still support legacy methods)
@@ -65,14 +67,14 @@ is open
65
67
  A connection can be created as follows
66
68
 
67
69
  ```ruby
68
- require 'wamp_client'
70
+ require 'wamp/client'
69
71
 
70
72
  options = {
71
73
  uri: 'ws://127.0.0.1:8080/ws',
72
74
  realm: 'realm1',
73
75
  verbose: true
74
76
  }
75
- connection = WampClient::Connection.new(options)
77
+ connection = Wamp::Client::Connection.new(options)
76
78
 
77
79
  connection.on(:join) do |session, details|
78
80
  puts "Session Open"
@@ -159,7 +161,7 @@ Install the "faye-websocket" Gem:
159
161
  Override the transport by doing the following:
160
162
 
161
163
  ```ruby
162
- require 'wamp_client'
164
+ require 'wamp/client'
163
165
 
164
166
  options = {
165
167
  uri: 'ws://127.0.0.1:8080/ws',
@@ -168,10 +170,10 @@ options = {
168
170
  :origin => 'http://username:password@proxy.example.com',
169
171
  :headers => {'User-Agent' => 'ruby'}
170
172
  },
171
- transport: WampClient::Transport::FayeWebSocket
173
+ transport: Wamp::Client::Transport::FayeWebSocket
172
174
  }
173
175
 
174
- connection = WampClient::Connection.new(options)
176
+ connection = Wamp::Client::Connection.new(options)
175
177
 
176
178
  # More code
177
179
  ```
@@ -190,7 +192,7 @@ The library supports authentication. Here is how to perform the different metho
190
192
  To perform WAMP CRA, do the following
191
193
 
192
194
  ```ruby
193
- require 'wamp_client'
195
+ require 'wamp/client'
194
196
 
195
197
  options = {
196
198
  uri: 'ws://127.0.0.1:8080/ws',
@@ -198,12 +200,12 @@ options = {
198
200
  authid: 'joe',
199
201
  authmethods: ['wampcra']
200
202
  }
201
- connection = WampClient::Connection.new(options)
203
+ connection = Wamp::Client::Connection.new(options)
202
204
 
203
205
  connection.on(:challenge) do |authmethod, extra|
204
206
  puts 'Challenge'
205
207
  if authmethod == 'wampcra'
206
- WampClient::Auth::Cra.sign('secret', extra[:challenge])
208
+ Wamp::Client::Auth::Cra.sign('secret', extra[:challenge])
207
209
  else
208
210
  raise RuntimeError, "Unsupported auth method #{authmethod}"
209
211
  end
@@ -231,7 +233,7 @@ All handlers are called with the following parameters
231
233
  - args [Array] - Array of arguments
232
234
  - kwargs [Hash] - Hash of key/value arguments
233
235
  - details [Hash] - Hash containing some details about the call. Details include
234
- - session [WampClient::Session] - The session
236
+ - session [Wamp::Client::Session] - The session
235
237
  - etc.
236
238
 
237
239
  Some examples of this are shown below
@@ -261,7 +263,7 @@ All callbacks are called with the following parameters
261
263
  - error [Hash] - Hash containing "error", "args", and "kwargs" if an error occurred
262
264
  - details [Hash] - Hash containing some details about the call. Details include
263
265
  - type [String] - The type of message
264
- - session [WampClient::Session] - The session
266
+ - session [Wamp::Client::Session] - The session
265
267
  - etc.
266
268
 
267
269
  An example of this is shown below
@@ -503,9 +505,9 @@ Errors can either be raised OR returned as shown below
503
505
  handler = lambda do |args, kwargs, details|
504
506
  raise 'error'
505
507
  # OR
506
- raise WampClient::CallError.new('wamp.error', ['some error'], {details: true})
508
+ raise Wamp::Client::CallError.new('wamp.error', ['some error'], {details: true})
507
509
  # OR
508
- WampClient::CallError.new('wamp.error', ['some error'], {details: true})
510
+ Wamp::Client::CallError.new('wamp.error', ['some error'], {details: true})
509
511
  end
510
512
  session.register('com.example.procedure', handler)
511
513
  ```
@@ -518,7 +520,7 @@ caller. This is shown below
518
520
 
519
521
  ```ruby
520
522
  def add(args, kwargs, details)
521
- defer = WampClient::Defer::CallDefer.new
523
+ defer = Wamp::Client::Defer::CallDefer.new
522
524
  EM.add_timer(2) { # Something Async
523
525
  defer.succeed(args[0]+args[1])
524
526
  }
@@ -531,9 +533,9 @@ Errors are returned as follows
531
533
 
532
534
  ```ruby
533
535
  def add(args, kwargs, details)
534
- defer = WampClient::Defer::CallDefer.new
536
+ defer = Wamp::Client::Defer::CallDefer.new
535
537
  EM.add_timer(2) { # Something Async
536
- defer.fail(WampClient::CallError.new('test.error'))
538
+ defer.fail(Wamp::Client::CallError.new('test.error'))
537
539
  }
538
540
  defer
539
541
  end
@@ -559,15 +561,15 @@ end
559
561
 
560
562
  ```ruby
561
563
  def add(args, kwargs, details)
562
- defer = WampClient::Defer::ProgressiveCallDefer.new
564
+ defer = Wamp::Client::Defer::ProgressiveCallDefer.new
563
565
  EM.add_timer(2) { # Something Async
564
- defer.progress(WampClient::CallResult.new([1,2,3]))
566
+ defer.progress(Wamp::Client::CallResult.new([1,2,3]))
565
567
  }
566
568
  EM.add_timer(4) { # Something Async
567
- defer.progress(WampClient::CallResult.new([4,5,6]))
569
+ defer.progress(Wamp::Client::CallResult.new([4,5,6]))
568
570
  }
569
571
  EM.add_timer(6) { # Something Async
570
- defer.succeed(WampClient::CallResult.new)
572
+ defer.succeed(Wamp::Client::CallResult.new)
571
573
  }
572
574
  defer
573
575
  end
@@ -610,20 +612,20 @@ def interrupt_handler(request, mode)
610
612
  end
611
613
 
612
614
  def add(args, kwargs, details)
613
- defer = WampClient::Defer::ProgressiveCallDefer.new
615
+ defer = Wamp::Client::Defer::ProgressiveCallDefer.new
614
616
  EM.add_timer(2) { # Something Async
615
617
  if @interrupts[defer.request].nil?
616
- defer.progress(WampClient::CallResult.new([1,2,3]))
618
+ defer.progress(Wamp::Client::CallResult.new([1,2,3]))
617
619
  end
618
620
  }
619
621
  EM.add_timer(4) { # Something Async
620
622
  if @interrupts[defer.request].nil?
621
- defer.progress(WampClient::CallResult.new([4,5,6]))
623
+ defer.progress(Wamp::Client::CallResult.new([4,5,6]))
622
624
  end
623
625
  }
624
626
  EM.add_timer(6) { # Something Async
625
627
  if @interrupts[defer.request].nil?
626
- defer.succeed(WampClient::CallResult.new)
628
+ defer.succeed(Wamp::Client::CallResult.new)
627
629
  end
628
630
  @interrupts.delete(request)
629
631
  }
@@ -663,8 +665,8 @@ The *lib/wamp_client/message.rb* file and the *spec/message_spec.rb* file are au
663
665
 
664
666
  $ cd scripts
665
667
  $ ./gen_message.rb
666
- $ mv message.rb.tmp ../lib/wamp_client/message.rb
667
- $ mv message_spec.rb.tmp ../spec/message_spec.rb
668
+ $ mv message.rb.tmp ../lib/wamp/client/message.rb
669
+ $ mv message_spec.rb.tmp ../spec/wamp/client/message_spec.rb
668
670
 
669
671
  As I was writing the code for the messages I caught myself cutting and pasting allot and decided these would be
670
672
  better suited to be autogenerated.
@@ -1,6 +1,6 @@
1
1
  =begin
2
2
 
3
- Copyright (c) 2016 Eric Chapman
3
+ Copyright (c) 2018 Eric Chapman
4
4
 
5
5
  MIT License
6
6
 
@@ -25,10 +25,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
25
 
26
26
  =end
27
27
 
28
- require 'wamp_client/version'
29
- require 'wamp_client/message'
30
- require 'wamp_client/serializer'
31
- require 'wamp_client/connection'
32
- require 'wamp_client/session'
33
- require 'wamp_client/auth'
34
- require 'wamp_client/defer'
28
+ require 'wamp/client/version'
29
+ require 'wamp/client/message'
30
+ require 'wamp/client/serializer'
31
+ require 'wamp/client/connection'
32
+ require 'wamp/client/session'
33
+ require 'wamp/client/auth'
34
+ require 'wamp/client/defer'
@@ -1,6 +1,6 @@
1
1
  =begin
2
2
 
3
- Copyright (c) 2016 Eric Chapman
3
+ Copyright (c) 2018 Eric Chapman
4
4
 
5
5
  MIT License
6
6
 
@@ -28,18 +28,20 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
28
  require 'openssl'
29
29
  require 'base64'
30
30
 
31
- module WampClient
32
- module Auth
33
- module Cra
31
+ module Wamp
32
+ module Client
33
+ module Auth
34
+ module Cra
34
35
 
35
- # Generates the signature from the challenge
36
- # @param key [String]
37
- # @param challenge [String]
38
- def self.sign(key, challenge)
39
- hash = OpenSSL::HMAC.digest('sha256', key, challenge)
40
- Base64.encode64(hash).gsub(/\n/,'')
41
- end
36
+ # Generates the signature from the challenge
37
+ # @param key [String]
38
+ # @param challenge [String]
39
+ def self.sign(key, challenge)
40
+ hash = OpenSSL::HMAC.digest('sha256', key, challenge)
41
+ Base64.encode64(hash).gsub(/\n/,'')
42
+ end
42
43
 
44
+ end
43
45
  end
44
46
  end
45
47
  end
@@ -0,0 +1,86 @@
1
+ =begin
2
+
3
+ Copyright (c) 2018 Eric Chapman
4
+
5
+ MIT License
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ "Software"), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
+
26
+ =end
27
+
28
+ module Wamp
29
+ module Client
30
+ module Check
31
+
32
+ def self.included(base)
33
+ base.extend(ClassMethods)
34
+ end
35
+
36
+ module ClassMethods
37
+
38
+ def check_equal(name, expected, value)
39
+ raise ArgumentError, "The '#{name}' argument must have the value '#{expected}'. Instead the value was '#{value}'" unless value == expected
40
+ end
41
+
42
+ def check_gte(name, expected, value)
43
+ raise ArgumentError, "The '#{name}' argument must be greater than or equal to '#{expected}'. Instead the value was '#{value}'" unless value >= expected
44
+ end
45
+
46
+ def check_nil(name, param, nil_allowed)
47
+ raise ArgumentError, "The '#{name}' argument cannot be nil" if param.nil? and not nil_allowed
48
+ end
49
+
50
+ def check_int(name, param, nil_allowed=false)
51
+ check_nil(name, param, nil_allowed)
52
+ raise ArgumentError, "The '#{name}' argument must be an integer" unless param.nil? or param.is_a? Integer
53
+ end
54
+
55
+ def check_string(name, param, nil_allowed=false)
56
+ check_nil(name, param, nil_allowed)
57
+ raise ArgumentError, "The '#{name}' argument must be a string" unless param.nil? or param.is_a? String
58
+ end
59
+
60
+ def check_bool(name, param, nil_allowed=false)
61
+ check_nil(name, param, nil_allowed)
62
+ raise ArgumentError, "The '#{name}' argument must be a boolean" unless param.nil? or !!param == param
63
+ end
64
+
65
+ def check_dict(name, param, nil_allowed=false)
66
+ check_nil(name, param, nil_allowed)
67
+ raise ArgumentError, "The '#{name}' argument must be a hash" unless param.nil? or param.is_a? Hash
68
+ end
69
+
70
+ def check_list(name, param, nil_allowed=false)
71
+ check_nil(name, param, nil_allowed)
72
+ raise ArgumentError, "The '#{name}' argument must be an array" unless param.nil? or param.is_a? Array
73
+ end
74
+
75
+ def check_uri(name, param, nil_allowed=false)
76
+ check_string(name, param, nil_allowed)
77
+ end
78
+
79
+ def check_id(name, param, nil_allowed=false)
80
+ check_int(name, param, nil_allowed)
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,249 @@
1
+ =begin
2
+
3
+ Copyright (c) 2018 Eric Chapman
4
+
5
+ MIT License
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ "Software"), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
+
26
+ =end
27
+
28
+ require 'wamp/client/session'
29
+ require 'wamp/client/transport/web_socket_event_machine'
30
+ require 'wamp/client/transport/faye_web_socket'
31
+
32
+ module Wamp
33
+ module Client
34
+ class Connection
35
+ attr_accessor :options, :transport_class, :transport, :session, :verbose
36
+
37
+ @reconnect = true
38
+
39
+ @open = false
40
+ def is_open?
41
+ @open
42
+ end
43
+
44
+ # Called when the connection is established
45
+ @on_connect
46
+ def on_connect(&on_connect)
47
+ @on_connect = on_connect
48
+ end
49
+
50
+ # Called when the WAMP session is established
51
+ # @param session [WampClient::Session]
52
+ # @param details [Hash]
53
+ @on_join
54
+ def on_join(&on_join)
55
+ @on_join = on_join
56
+ end
57
+
58
+ # Called when the WAMP session presents a challenge
59
+ # @param authmethod [String]
60
+ # @param extra [Hash]
61
+ @on_challenge
62
+ def on_challenge(&on_challenge)
63
+ @on_challenge = on_challenge
64
+ end
65
+
66
+ # Called when the WAMP session is terminated
67
+ # @param reason [String] The reason the session left the router
68
+ # @param details [Hash] Object containing information about the left session
69
+ @on_leave
70
+ def on_leave(&on_leave)
71
+ @on_leave = on_leave
72
+ end
73
+
74
+ # Called when the connection is terminated
75
+ # @param reason [String] The reason the transport was disconnected
76
+ @on_disconnect
77
+ def on_disconnect(&on_disconnect)
78
+ @on_disconnect = on_disconnect
79
+ end
80
+
81
+ # Simple setter for callbacks
82
+ def on(event, &callback)
83
+ case event
84
+ when :connect
85
+ self.on_connect(&callback)
86
+ when :join
87
+ self.on_join(&callback)
88
+ when :challenge
89
+ self.on_challenge(&callback)
90
+ when :leave
91
+ self.on_leave(&callback)
92
+ when :disconnect
93
+ self.on_disconnect(&callback)
94
+ else
95
+ raise RuntimeError, "Unknown on(event) '#{event}'"
96
+ end
97
+ end
98
+
99
+ # @param options [Hash] The different options to pass to the connection
100
+ # @option options [String] :uri The uri of the WAMP router to connect to
101
+ # @option options [String] :proxy The proxy to get to the router
102
+ # @option options [String] :realm The realm to connect to
103
+ # @option options [String,nil] :protocol The protocol (default if wamp.2.json)
104
+ # @option options [String,nil] :authid The id to authenticate with
105
+ # @option options [Array, nil] :authmethods The different auth methods that the client supports
106
+ # @option options [Hash] :headers Custom headers to include during the connection
107
+ # @option options [WampClient::Serializer::Base] :serializer The serializer to use (default is json)
108
+ def initialize(options)
109
+ self.transport_class = options.delete(:transport) || Wamp::Client::Transport::WebSocketEventMachine
110
+ self.options = options || {}
111
+ self.verbose = options[:verbose] || false
112
+ end
113
+
114
+ # Opens the connection
115
+ def open
116
+
117
+ raise RuntimeError, 'The connection is already open' if self.is_open?
118
+
119
+ @reconnect = true
120
+ @retry_timer = 1
121
+ @retrying = false
122
+
123
+ self.transport_class.start_event_machine do
124
+ # Create the transport
125
+ self._create_transport
126
+ end
127
+
128
+ end
129
+
130
+ # Closes the connection
131
+ def close
132
+
133
+ raise RuntimeError, 'The connection is already closed' unless self.is_open?
134
+
135
+ # Leave the session
136
+ @reconnect = false
137
+ @retrying = false
138
+ session.leave
139
+
140
+ end
141
+
142
+ def _create_session
143
+ self.session = Wamp::Client::Session.new(self.transport, self.options)
144
+
145
+ # Setup session callbacks
146
+ self.session.on(:challenge) do |authmethod, extra|
147
+ self._finish_retry
148
+ @on_challenge.call(authmethod, extra) if @on_challenge
149
+ end
150
+
151
+ self.session.on(:join) do |details|
152
+ self._finish_retry
153
+ @on_join.call(self.session, details) if @on_join
154
+ end
155
+
156
+ self.session.on(:leave) do |reason, details|
157
+
158
+ unless @retrying
159
+ @on_leave.call(reason, details) if @on_leave
160
+ end
161
+
162
+ if @reconnect
163
+ # Retry
164
+ self._retry unless @retrying
165
+ else
166
+ # Close the transport
167
+ self.transport.disconnect
168
+ end
169
+ end
170
+
171
+ self.session.join(self.options[:realm])
172
+ end
173
+
174
+ def _create_transport
175
+
176
+ if self.transport
177
+ self.transport.disconnect
178
+ self.transport = nil
179
+ end
180
+
181
+ # Initialize the transport
182
+ self.transport = self.transport_class.new(self.options)
183
+
184
+ # Setup transport callbacks
185
+ self.transport.on(:open) do
186
+ puts "TRANSPORT OPEN" if self.verbose
187
+
188
+ # Call the callback
189
+ @on_connect.call if @on_connect
190
+
191
+ # Create the session
192
+ self._create_session
193
+
194
+ end
195
+
196
+ self.transport.on(:close) do |reason|
197
+ puts "TRANSPORT CLOSED: #{reason}" if self.verbose
198
+ @open = false
199
+
200
+ unless @retrying
201
+ @on_disconnect.call(reason) if @on_disconnect
202
+ end
203
+
204
+ # Nil out the session since the transport closed underneath it
205
+ self.session = nil
206
+
207
+ if @reconnect
208
+ # Retry
209
+ self._retry unless @retrying
210
+ else
211
+ # Stop the Event Machine
212
+ self.transport_class.stop_event_machine
213
+ end
214
+ end
215
+
216
+ self.transport.on(:error) do |message|
217
+ puts "TRANSPORT ERROR: #{message}"
218
+ end
219
+
220
+ @open = true
221
+
222
+ self.transport.connect
223
+
224
+ end
225
+
226
+ def _finish_retry
227
+ @retry_timer = 1
228
+ @retrying = false
229
+ end
230
+
231
+ def _retry
232
+
233
+ if self.session == nil or not self.session.is_open?
234
+ @retry_timer = 2*@retry_timer unless @retry_timer == 32
235
+ @retrying = true
236
+
237
+ self._create_transport
238
+
239
+ puts "Attempting Reconnect... Next attempt in #{@retry_timer} seconds" if self.verbose
240
+ self.transport_class.add_timer(@retry_timer*1000) do
241
+ self._retry if @retrying
242
+ end
243
+ end
244
+
245
+ end
246
+
247
+ end
248
+ end
249
+ end