wamp_client 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/LICENSE.txt +1 -1
- data/README.md +56 -14
- data/lib/wamp_client.rb +1 -2
- data/lib/wamp_client/connection.rb +43 -19
- data/lib/wamp_client/session.rb +17 -2
- data/lib/wamp_client/{transport.rb → transport/base.rb} +30 -49
- data/lib/wamp_client/transport/event_machine_base.rb +55 -0
- data/lib/wamp_client/transport/faye_web_socket.rb +83 -0
- data/lib/wamp_client/transport/web_socket_event_machine.rb +86 -0
- data/lib/wamp_client/version.rb +1 -1
- data/spec/connection_spec.rb +150 -0
- data/spec/session_spec.rb +7 -3
- data/spec/spec_helper.rb +105 -6
- data/spec/transport_spec.rb +200 -0
- data/wamp_client.gemspec +7 -4
- metadata +48 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5401c514eb36f3adbfa52b9f2f5d218a3f884ee5
|
4
|
+
data.tar.gz: fae4ea4045398f596d7f67262a121b29c754c724
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 833e3a42b79b5de4624fab8ecdc989a4af23db6aba17352ad399f7614e12754ced273cef8419dd257423cfcc736f5ea2ccfb2c4945158b02b07703f650b8736b
|
7
|
+
data.tar.gz: 35ccc1c3bead4d40b9ff21c55caf44c69b1ca85474461f43fac9d9fc1777193be4147b2fba4d2e865af7de9b1f3c7879a5d37fc37ecba81c7b9d803d1f871a6f
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -10,6 +10,10 @@ Please use [wamp_rails](https://github.com/ericchapman/ruby_wamp_rails) to integ
|
|
10
10
|
|
11
11
|
## Revision History
|
12
12
|
|
13
|
+
- v0.0.9:
|
14
|
+
- Added support for transport override and 'faye-websocket' transport
|
15
|
+
- Added "on(event)" callback (still support legacy methods)
|
16
|
+
- Increased Test Coverage for 'Transport' and 'Connection' classes
|
13
17
|
- v0.0.8:
|
14
18
|
- Exposed 'yield' publicly to allow higher level libraries to not use the 'defer'
|
15
19
|
- Removed library version dependency
|
@@ -70,7 +74,7 @@ options = {
|
|
70
74
|
}
|
71
75
|
connection = WampClient::Connection.new(options)
|
72
76
|
|
73
|
-
connection.
|
77
|
+
connection.on(:join) do |session, details|
|
74
78
|
puts "Session Open"
|
75
79
|
|
76
80
|
# Register for something
|
@@ -101,46 +105,84 @@ A connection is closed by simply calling "close"
|
|
101
105
|
connection.close
|
102
106
|
```
|
103
107
|
|
104
|
-
Note that the connection will still call "
|
108
|
+
Note that the connection will still call "on(:leave)" and "on(:disconnect)" as it closes the session and the transport
|
105
109
|
|
106
110
|
#### Callbacks
|
107
111
|
A connection has the following callbacks
|
108
112
|
|
109
|
-
**
|
113
|
+
**on(:connect)** - Called when the transport is opened
|
110
114
|
```ruby
|
111
|
-
connection.
|
115
|
+
connection.on(:connect) do
|
112
116
|
|
113
117
|
end
|
114
118
|
```
|
115
119
|
|
116
|
-
**
|
120
|
+
**on(:join)** - Called when the session is established
|
117
121
|
```ruby
|
118
|
-
connection.
|
122
|
+
connection.on(:join) do |session, details|
|
119
123
|
|
120
124
|
end
|
121
125
|
```
|
122
126
|
|
123
|
-
**
|
127
|
+
**on(:leave)** - Called when the session is terminated
|
124
128
|
```ruby
|
125
|
-
connection.
|
129
|
+
connection.on(:leave) do |reason, details|
|
126
130
|
|
127
131
|
end
|
128
132
|
```
|
129
133
|
|
130
|
-
**
|
134
|
+
**on(:disconnect)** - Called when the connection is terminated
|
131
135
|
```ruby
|
132
|
-
connection.
|
136
|
+
connection.on(:disconnect) do |reason|
|
133
137
|
|
134
138
|
end
|
135
139
|
```
|
136
140
|
|
137
|
-
**
|
141
|
+
**on(:challenge)** - Called when an authentication challenge is created
|
138
142
|
```ruby
|
139
|
-
connection.
|
143
|
+
connection.on(:challenge) do |authmethod, extra|
|
140
144
|
|
141
145
|
end
|
142
146
|
```
|
143
147
|
|
148
|
+
#### Overriding Transport
|
149
|
+
By default, the library will use the "websocket-eventmachine-client" Gem as the websocket transport.
|
150
|
+
However the library also supports overriding this.
|
151
|
+
|
152
|
+
##### GEM: faye-websocket
|
153
|
+
To use this library, do the following
|
154
|
+
|
155
|
+
Install the "faye-websocket" Gem:
|
156
|
+
|
157
|
+
$ gem install faye-websocket
|
158
|
+
|
159
|
+
Override the transport by doing the following:
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
require 'wamp_client'
|
163
|
+
|
164
|
+
options = {
|
165
|
+
uri: 'ws://127.0.0.1:8080/ws',
|
166
|
+
realm: 'realm1',
|
167
|
+
proxy: { # See faye-websocket documentation
|
168
|
+
:origin => 'http://username:password@proxy.example.com',
|
169
|
+
:headers => {'User-Agent' => 'ruby'}
|
170
|
+
},
|
171
|
+
transport: WampClient::Transport::FayeWebSocket
|
172
|
+
}
|
173
|
+
|
174
|
+
connection = WampClient::Connection.new(options)
|
175
|
+
|
176
|
+
# More code
|
177
|
+
```
|
178
|
+
|
179
|
+
Note that the "faye-wesbsocket" transport supports passing in a "proxy" as shown above.
|
180
|
+
|
181
|
+
##### Custom
|
182
|
+
You can also create your own transports by wrapping them in a "Transport" object
|
183
|
+
and including as shown above. For more details on this, see the files in
|
184
|
+
"lib/wamp_client/transport"
|
185
|
+
|
144
186
|
### Authentication
|
145
187
|
The library supports authentication. Here is how to perform the different methods
|
146
188
|
|
@@ -158,7 +200,7 @@ options = {
|
|
158
200
|
}
|
159
201
|
connection = WampClient::Connection.new(options)
|
160
202
|
|
161
|
-
connection.
|
203
|
+
connection.on(:challenge) do |authmethod, extra|
|
162
204
|
puts 'Challenge'
|
163
205
|
if authmethod == 'wampcra'
|
164
206
|
WampClient::Auth::Cra.sign('secret', extra[:challenge])
|
@@ -167,7 +209,7 @@ connection.on_challenge do |authmethod, extra|
|
|
167
209
|
end
|
168
210
|
end
|
169
211
|
|
170
|
-
connection.
|
212
|
+
connection.on(:join) do |session, details|
|
171
213
|
puts "Session Open"
|
172
214
|
end
|
173
215
|
|
data/lib/wamp_client.rb
CHANGED
@@ -28,8 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
28
28
|
require 'wamp_client/version'
|
29
29
|
require 'wamp_client/message'
|
30
30
|
require 'wamp_client/serializer'
|
31
|
-
require 'wamp_client/transport'
|
32
31
|
require 'wamp_client/connection'
|
33
32
|
require 'wamp_client/session'
|
34
33
|
require 'wamp_client/auth'
|
35
|
-
require 'wamp_client/defer'
|
34
|
+
require 'wamp_client/defer'
|
@@ -25,13 +25,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
25
25
|
|
26
26
|
=end
|
27
27
|
|
28
|
-
require 'websocket-eventmachine-client'
|
29
28
|
require 'wamp_client/session'
|
30
|
-
require 'wamp_client/transport'
|
29
|
+
require 'wamp_client/transport/web_socket_event_machine'
|
30
|
+
require 'wamp_client/transport/faye_web_socket'
|
31
31
|
|
32
32
|
module WampClient
|
33
33
|
class Connection
|
34
|
-
attr_accessor :options, :transport, :session
|
34
|
+
attr_accessor :options, :transport_class, :transport, :session, :verbose
|
35
35
|
|
36
36
|
@reconnect = true
|
37
37
|
|
@@ -77,8 +77,27 @@ module WampClient
|
|
77
77
|
@on_disconnect = on_disconnect
|
78
78
|
end
|
79
79
|
|
80
|
+
# Simple setter for callbacks
|
81
|
+
def on(event, &callback)
|
82
|
+
case event
|
83
|
+
when :connect
|
84
|
+
self.on_connect(&callback)
|
85
|
+
when :join
|
86
|
+
self.on_join(&callback)
|
87
|
+
when :challenge
|
88
|
+
self.on_challenge(&callback)
|
89
|
+
when :leave
|
90
|
+
self.on_leave(&callback)
|
91
|
+
when :disconnect
|
92
|
+
self.on_disconnect(&callback)
|
93
|
+
else
|
94
|
+
raise RuntimeError, "Unknown on(event) '#{event}'"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
80
98
|
# @param options [Hash] The different options to pass to the connection
|
81
99
|
# @option options [String] :uri The uri of the WAMP router to connect to
|
100
|
+
# @option options [String] :proxy The proxy to get to the router
|
82
101
|
# @option options [String] :realm The realm to connect to
|
83
102
|
# @option options [String,nil] :protocol The protocol (default if wamp.2.json)
|
84
103
|
# @option options [String,nil] :authid The id to authenticate with
|
@@ -86,7 +105,9 @@ module WampClient
|
|
86
105
|
# @option options [Hash] :headers Custom headers to include during the connection
|
87
106
|
# @option options [WampClient::Serializer::Base] :serializer The serializer to use (default is json)
|
88
107
|
def initialize(options)
|
108
|
+
self.transport_class = options.delete(:transport) || WampClient::Transport::WebSocketEventMachine
|
89
109
|
self.options = options || {}
|
110
|
+
self.verbose = options[:verbose] || false
|
90
111
|
end
|
91
112
|
|
92
113
|
# Opens the connection
|
@@ -98,7 +119,7 @@ module WampClient
|
|
98
119
|
@retry_timer = 1
|
99
120
|
@retrying = false
|
100
121
|
|
101
|
-
|
122
|
+
self.transport_class.start_event_machine do
|
102
123
|
# Create the transport
|
103
124
|
self._create_transport
|
104
125
|
end
|
@@ -112,6 +133,7 @@ module WampClient
|
|
112
133
|
|
113
134
|
# Leave the session
|
114
135
|
@reconnect = false
|
136
|
+
@retrying = false
|
115
137
|
session.leave
|
116
138
|
|
117
139
|
end
|
@@ -120,17 +142,17 @@ module WampClient
|
|
120
142
|
self.session = WampClient::Session.new(self.transport, self.options)
|
121
143
|
|
122
144
|
# Setup session callbacks
|
123
|
-
self.session.
|
145
|
+
self.session.on(:challenge) do |authmethod, extra|
|
124
146
|
self._finish_retry
|
125
147
|
@on_challenge.call(authmethod, extra) if @on_challenge
|
126
148
|
end
|
127
149
|
|
128
|
-
self.session.
|
150
|
+
self.session.on(:join) do |details|
|
129
151
|
self._finish_retry
|
130
152
|
@on_join.call(self.session, details) if @on_join
|
131
153
|
end
|
132
154
|
|
133
|
-
self.session.
|
155
|
+
self.session.on(:leave) do |reason, details|
|
134
156
|
|
135
157
|
unless @retrying
|
136
158
|
@on_leave.call(reason, details) if @on_leave
|
@@ -156,14 +178,11 @@ module WampClient
|
|
156
178
|
end
|
157
179
|
|
158
180
|
# Initialize the transport
|
159
|
-
|
160
|
-
self.transport = self.options[:transport]
|
161
|
-
else
|
162
|
-
self.transport = WampClient::Transport::WebSocketTransport.new(self.options)
|
163
|
-
end
|
181
|
+
self.transport = self.transport_class.new(self.options)
|
164
182
|
|
165
183
|
# Setup transport callbacks
|
166
|
-
self.transport.
|
184
|
+
self.transport.on(:open) do
|
185
|
+
puts "TRANSPORT OPEN" if self.verbose
|
167
186
|
|
168
187
|
# Call the callback
|
169
188
|
@on_connect.call if @on_connect
|
@@ -173,7 +192,8 @@ module WampClient
|
|
173
192
|
|
174
193
|
end
|
175
194
|
|
176
|
-
self.transport.
|
195
|
+
self.transport.on(:close) do |reason|
|
196
|
+
puts "TRANSPORT CLOSED: #{reason}" if self.verbose
|
177
197
|
@open = false
|
178
198
|
|
179
199
|
unless @retrying
|
@@ -188,10 +208,14 @@ module WampClient
|
|
188
208
|
self._retry unless @retrying
|
189
209
|
else
|
190
210
|
# Stop the Event Machine
|
191
|
-
|
211
|
+
self.transport_class.stop_event_machine
|
192
212
|
end
|
193
213
|
end
|
194
214
|
|
215
|
+
self.transport.on(:error) do |message|
|
216
|
+
puts "TRANSPORT ERROR: #{message}"
|
217
|
+
end
|
218
|
+
|
195
219
|
@open = true
|
196
220
|
|
197
221
|
self.transport.connect
|
@@ -205,16 +229,16 @@ module WampClient
|
|
205
229
|
|
206
230
|
def _retry
|
207
231
|
|
208
|
-
|
232
|
+
if self.session == nil or not self.session.is_open?
|
209
233
|
@retry_timer = 2*@retry_timer unless @retry_timer == 32
|
210
234
|
@retrying = true
|
211
235
|
|
212
236
|
self._create_transport
|
213
237
|
|
214
|
-
puts "Attempting Reconnect... Next attempt in #{@retry_timer} seconds"
|
215
|
-
|
238
|
+
puts "Attempting Reconnect... Next attempt in #{@retry_timer} seconds" if self.verbose
|
239
|
+
self.transport_class.add_timer(@retry_timer*1000) do
|
216
240
|
self._retry if @retrying
|
217
|
-
|
241
|
+
end
|
218
242
|
end
|
219
243
|
|
220
244
|
end
|
data/lib/wamp_client/session.rb
CHANGED
@@ -25,7 +25,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
25
25
|
|
26
26
|
=end
|
27
27
|
|
28
|
-
require 'wamp_client/transport'
|
28
|
+
require 'wamp_client/transport/base'
|
29
29
|
require 'wamp_client/message'
|
30
30
|
require 'wamp_client/check'
|
31
31
|
require 'wamp_client/version'
|
@@ -167,6 +167,20 @@ module WampClient
|
|
167
167
|
@on_challenge = on_challenge
|
168
168
|
end
|
169
169
|
|
170
|
+
# Simple setter for callbacks
|
171
|
+
def on(event, &callback)
|
172
|
+
case event
|
173
|
+
when :join
|
174
|
+
self.on_join(&callback)
|
175
|
+
when :challenge
|
176
|
+
self.on_challenge(&callback)
|
177
|
+
when :leave
|
178
|
+
self.on_leave(&callback)
|
179
|
+
else
|
180
|
+
raise RuntimeError, "Unknown on(event) '#{event}'"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
170
184
|
attr_accessor :id, :realm, :transport, :verbose, :options
|
171
185
|
|
172
186
|
# Private attributes
|
@@ -212,6 +226,7 @@ module WampClient
|
|
212
226
|
# Setup session callbacks
|
213
227
|
@on_join = nil
|
214
228
|
@on_leave = nil
|
229
|
+
@on_challenge = nil
|
215
230
|
|
216
231
|
end
|
217
232
|
|
@@ -908,7 +923,7 @@ module WampClient
|
|
908
923
|
|
909
924
|
# Timeout Logic
|
910
925
|
if options[:timeout] and options[:timeout] > 0
|
911
|
-
self.transport.
|
926
|
+
self.transport.add_timer(options[:timeout]) do
|
912
927
|
# Once the timer expires, if the call hasn't completed, cancel it
|
913
928
|
if self._requests[:call][call.id]
|
914
929
|
call.cancel
|
@@ -52,16 +52,34 @@ module WampClient
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# Callback when there is an error. Parameters are
|
55
|
+
# @param msg [String] The message from the error
|
55
56
|
@on_error
|
56
57
|
def on_error(&on_error)
|
57
58
|
@on_error = on_error
|
58
59
|
end
|
59
60
|
|
60
|
-
|
61
|
+
# Simple setter for callbacks
|
62
|
+
def on(event, &callback)
|
63
|
+
case event
|
64
|
+
when :open
|
65
|
+
self.on_open(&callback)
|
66
|
+
when :close
|
67
|
+
self.on_close(&callback)
|
68
|
+
when :message
|
69
|
+
self.on_message(&callback)
|
70
|
+
when :error
|
71
|
+
self.on_error(&callback)
|
72
|
+
else
|
73
|
+
raise RuntimeError, "Unknown on(event) '#{event}'"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
attr_accessor :uri, :proxy, :headers, :protocol, :serializer, :connected
|
61
78
|
|
62
79
|
# Constructor for the transport
|
63
80
|
# @param options [Hash] The connection options. the different options are as follows
|
64
81
|
# @option options [String] :uri The url to connect to
|
82
|
+
# @option options [String] :proxy The proxy to use
|
65
83
|
# @option options [String] :protocol The protocol
|
66
84
|
# @option options [Hash] :headers Custom headers to include during the connection
|
67
85
|
# @option options [WampClient::Serializer::Base] :serializer The serializer to use
|
@@ -70,6 +88,7 @@ module WampClient
|
|
70
88
|
# Initialize the parameters
|
71
89
|
self.connected = false
|
72
90
|
self.uri = options[:uri]
|
91
|
+
self.proxy = options[:proxy]
|
73
92
|
self.headers = options[:headers] || {}
|
74
93
|
self.protocol = options[:protocol] || 'wamp.2.json'
|
75
94
|
self.serializer = options[:serializer] || WampClient::Serializer::JSONSerializer.new
|
@@ -109,62 +128,24 @@ module WampClient
|
|
109
128
|
# Process the callback when the timer expires
|
110
129
|
# @param [Integer] milliseconds - The number
|
111
130
|
# @param [block] callback - The callback that is fired when the timer expires
|
112
|
-
def
|
131
|
+
def self.add_timer(milliseconds, &callback)
|
113
132
|
# Implement in subclass
|
114
133
|
end
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
# This implementation uses the 'websocket-eventmachine-client' Gem. This is the default if no transport is included
|
119
|
-
class WebSocketTransport < Base
|
120
|
-
attr_accessor :socket
|
121
|
-
|
122
|
-
def initialize(options)
|
123
|
-
super(options)
|
124
|
-
self.type = 'websocket'
|
125
|
-
self.socket = nil
|
126
|
-
end
|
127
|
-
|
128
|
-
def connect
|
129
|
-
self.socket = WebSocket::EventMachine::Client.connect(
|
130
|
-
:uri => self.uri,
|
131
|
-
:headers => self.headers
|
132
|
-
)
|
133
|
-
|
134
|
-
self.socket.onopen do
|
135
|
-
self.connected = true
|
136
|
-
@on_open.call unless @on_open.nil?
|
137
|
-
end
|
138
|
-
|
139
|
-
self.socket.onmessage do |msg, type|
|
140
|
-
@on_message.call(self.serializer.deserialize(msg)) unless @on_message.nil?
|
141
|
-
end
|
142
|
-
|
143
|
-
self.socket.onclose do |code, reason|
|
144
|
-
self.connected = false
|
145
|
-
@on_close.call(reason) unless @on_close.nil?
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def disconnect
|
150
|
-
self.connected = !self.socket.close # close returns 'true' if the connection was closed immediately
|
134
|
+
def add_timer(milliseconds, &callback)
|
135
|
+
self.class.add_timer(milliseconds, &callback)
|
151
136
|
end
|
152
137
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
else
|
157
|
-
raise RuntimeError, "Socket must be open to call 'send_message'"
|
158
|
-
end
|
138
|
+
# Method to start the event machine for the socket
|
139
|
+
def self.start_event_machine(&block)
|
140
|
+
# Implement in subclass
|
159
141
|
end
|
160
142
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
callback.call
|
165
|
-
}
|
143
|
+
# Method to stop the vent machine
|
144
|
+
def self.stop_event_machine
|
145
|
+
# Implement in subclass
|
166
146
|
end
|
167
147
|
|
168
148
|
end
|
149
|
+
|
169
150
|
end
|
170
151
|
end
|