websocket_sequential_client 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c86e2bfd2241079309ed7daceed67c861a0e6e27
4
- data.tar.gz: f1f3b91c65126b6885bd5c6b735e44c350ada22c
3
+ metadata.gz: 4a9cdfa2ccc4b1defa9165cfeddf1ec01abf7825
4
+ data.tar.gz: c35dea58c8e676a4642500210ac907d605e9b9cd
5
5
  SHA512:
6
- metadata.gz: 85b89614c39101a15684018881338f6aa747faeeb34e909f112d6fbc2762bd7000c04e9902ad42ed93bb9b35222ab668d2c84553c74adfbb42e5fba8e4f43c3c
7
- data.tar.gz: e43c3706bef4b80a410ad6946958e608e59a77bff13b79a582a3a1b35b57fb0b83ba4293e254b7db59d487237ec34233c3f775f0f695b77c9c0a4fdaab32cecb
6
+ metadata.gz: 86696686c0fcd88d2e7e076a87a2800544b2df30c0d24c04791fc2008364ebeb9ad60f55cef242d26aa34d50eaa7fc5463531acb2a98820a18ad800d09d4af8e
7
+ data.tar.gz: 01c5186f40dd70ae8f2cd3dfb6e1e9ad278cda60743cbc5abcdffbda4e4daf75847243b5f818f349923e44b43b78950205928ff67f4c4cebb2d68df7a5adf203
data/.travis.yml CHANGED
@@ -10,9 +10,9 @@ rvm:
10
10
  - 2.2
11
11
  - ruby-head
12
12
  - rbx
13
- - jruby
13
+ # - jruby
14
14
  matrix:
15
15
  allow_failures:
16
16
  - rvm: ruby-head
17
17
  - rvm: rbx
18
- - rvm: jruby
18
+ # - rvm: jruby
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # WebsocketSequentialClient [![Build Status](https://travis-ci.org/masamitsu-murase/websocket_sequential_client.svg)](https://travis-ci.org/masamitsu-murase/websocket_sequential_client)
1
+ # WebSocketSequentialClient [![Gem Version](https://badge.fury.io/rb/websocket_sequential_client.svg)](http://badge.fury.io/rb/websocket_sequential_client) [![Build Status](https://travis-ci.org/masamitsu-murase/websocket_sequential_client.svg)](https://travis-ci.org/masamitsu-murase/websocket_sequential_client)
2
2
 
3
3
  This ruby gem library allows you to access a WebSocket server in a **sequential** way instead of an event-driven way.
4
4
 
@@ -122,6 +122,8 @@ ws.close
122
122
 
123
123
  ## Versions
124
124
 
125
+ * 1.0.1
126
+ Fix handling of optional parameters.
125
127
  * 1.0.0
126
128
  Initial release
127
129
 
@@ -7,5 +7,6 @@ require "websocket_sequential_client/exception"
7
7
  module WebsocketSequentialClient
8
8
  end
9
9
 
10
+ # <tt>WebSocketSequentialClient</tt> can be used instead of <tt>WebsocketSequentialClient</tt>.
10
11
  WebSocketSequentialClient = WebsocketSequentialClient
11
12
 
@@ -1,15 +1,27 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module WebsocketSequentialClient
4
+ #
5
+ # Base errror class
6
+ #
4
7
  class Error < StandardError
5
8
  end
6
9
 
10
+ #
11
+ # This error is raised when <tt>recv</tt> or <tt>send</tt> is called after the socket is closed.
12
+ #
7
13
  class SocketAlreadyClosed < Error
8
14
  end
9
15
 
16
+ #
17
+ # This error is raised when handshake with a server failed.
18
+ #
10
19
  class HandshakeFailed < Error
11
20
  end
12
21
 
22
+ #
23
+ # This error is raised when a invaid data is received.
24
+ #
13
25
  class InvalidDataReceived < Error
14
26
  end
15
27
  end
@@ -3,7 +3,7 @@
3
3
  require "thread"
4
4
 
5
5
  module WebsocketSequentialClient
6
- class ReadQueue
6
+ class ReadQueue #:nodoc:
7
7
  def initialize
8
8
  @mutex = Mutex.new
9
9
  @cond_var = ConditionVariable.new
@@ -1,3 +1,3 @@
1
1
  module WebsocketSequentialClient
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -4,15 +4,41 @@ require("socket")
4
4
  require("thread")
5
5
 
6
6
  module WebsocketSequentialClient
7
+ #
8
+ # This class provides the access to a WebSocket server.
9
+ #
7
10
  class WebSocket
8
11
  DEFAULT_PING_INTERVAL = 20
9
12
  DEFAULT_CLOSE_CODE = 1000
10
13
  DEFAULT_CLOSE_TIMEOUT = 20
11
14
 
12
- RECV_SIZE = 1024
13
-
14
- WS_PORT = 80
15
-
15
+ RECV_SIZE = 1024 #:nodoc:
16
+
17
+ WS_PORT = 80 #:nodoc:
18
+
19
+ #
20
+ # Connects to a WebSocket server and returns the connected socket.
21
+ #
22
+ # === Parameters
23
+ # +args+ :: See <tt>initialize</tt> method.
24
+ # +block+ :: If given, it will be called with the instance of WebSocket as the argument.
25
+ #
26
+ # === Examples
27
+ # WebSocketSequentialClient::WebSocket.open "ws://server-url" do |ws|
28
+ # ws.send "message"
29
+ # puts ws.recv
30
+ # end
31
+ #
32
+ # ws = WebSocketSequentialClient::WebSocket.open "ws://server-url"
33
+ # ws.send "message"
34
+ # puts ws.recv
35
+ # ws.close
36
+ #
37
+ # WebSocketSequentialClient::WebSocket.open "ws://server-url", { ping: false } do |ws|
38
+ # ws.send "message"
39
+ # puts ws.recv
40
+ # end
41
+ #
16
42
  def self.open *args, &block
17
43
  if block
18
44
  ws = self.new *args
@@ -26,7 +52,29 @@ module WebsocketSequentialClient
26
52
  end
27
53
  end
28
54
 
29
- def initialize url, opt = { ping: true, headers: {} }
55
+ #
56
+ # Connects to a WebSocket server and returns the connected socket.
57
+ #
58
+ # === Parameters
59
+ # +url+ :: URL of the server.
60
+ # +opt+ :: Optional hash parameters.
61
+ # <tt>:ping</tt> key specifies whether to enable automatic ping. You can set <tt>true</tt>, <tt>false</tt> or <tt>{ interval: 10 }</tt>. The default value is <tt>true</tt>.
62
+ # <tt>:headers</tt> key specifies the additional HTTP headers. You can set <tt>{ headers: { "Cookie" => "name=value" } }</tt>. The default value is <tt>{}</tt> (empty hash).
63
+ #
64
+ # === Examples
65
+ # # Connect to the server.
66
+ # ws = WebSocketSequentialClient::WebSocket.new "ws://server-url"
67
+ #
68
+ # # Disable automatic ping.
69
+ # ws = WebSocketSequentialClient::WebSocket.new "ws://server-url", ping: false
70
+ #
71
+ # # Set the ping interval to 10s and send additional HTTP headers.
72
+ # opt = { ping: { interval: 10 }, headers: { "Cookie" => "name=value", "Header" => "Value" } }
73
+ # ws = WebSocketSequentialClient::WebSocket.open "ws://server-url", opt
74
+ #
75
+ def initialize url, opt = {}
76
+ opt = { ping: true, headers: {} }.merge opt
77
+
30
78
  @read_queue = ReadQueue.new
31
79
  @write_queue = WriteQueue.new
32
80
 
@@ -64,11 +112,20 @@ module WebsocketSequentialClient
64
112
  end
65
113
  attr_reader :close_code, :close_reason
66
114
 
115
+ #
116
+ # Returns true if a received data is in the internal buffer.
117
+ #
67
118
  def available?
68
119
  @read_queue.available?
69
120
  end
70
121
  alias data_available? available?
71
122
 
123
+ #
124
+ # Returns a received data from the server.
125
+ # The encoding of the returned data is "UTF-8" for text messages, "ASCII-8BIT" for binary messages.
126
+ #
127
+ # This is a <b>blocking</b> method. i.e. This method is blocked until a data is received from the server.
128
+ #
72
129
  def recv
73
130
  data = @read_queue.pop
74
131
  raise data if data.kind_of? StandardError
@@ -84,6 +141,13 @@ module WebsocketSequentialClient
84
141
  end
85
142
  alias receive recv
86
143
 
144
+ #
145
+ # Sends a data to the server.
146
+ #
147
+ # === Parameters
148
+ # +data+ :: String to be sent. The encoding should be "UTF-8" for text messages, "ASCII-8BIT" for binary messages.
149
+ # +type+ :: Specifies <tt>:text</tt>, <tt>:binary</tt> or <tt>:guess</tt>. If <tt>:guess</tt> is specified, the type is guessed based on the encoding of <tt>data</tt>.
150
+ #
87
151
  def send data, type = :guess
88
152
  case type
89
153
  when :guess
@@ -111,16 +175,33 @@ module WebsocketSequentialClient
111
175
  raise result if result.kind_of? StandardError
112
176
  end
113
177
 
178
+ #
179
+ # Sends a text message.
180
+ # Same as <tt>send data, :text</tt>.
181
+ #
114
182
  def send_text data
115
183
  send data, :text
116
184
  end
117
185
 
186
+ #
187
+ # Sends a binary message.
188
+ # Same as <tt>send data, :binary</tt>.
189
+ #
118
190
  def send_binary data
119
191
  send data, :binary
120
192
  end
121
193
 
122
- def close code = nil, reason = nil, opt = { timeout: DEFAULT_CLOSE_TIMEOUT, wait_for_response: true }
194
+ #
195
+ # Close the socket.
196
+ #
197
+ # === Parameters
198
+ # +code+ :: Code of the close frame. The default value is 1000.
199
+ # +reason+ :: The reason of the close frame. The default value is nil.
200
+ #
201
+ def close code = nil, reason = nil, opt = {}
123
202
  code ||= DEFAULT_CLOSE_CODE
203
+ opt = { timeout: DEFAULT_CLOSE_TIMEOUT, wait_for_response: true }.merge opt
204
+
124
205
  param = {
125
206
  code: code,
126
207
  type: :close,
@@ -129,10 +210,10 @@ module WebsocketSequentialClient
129
210
  param[:data] = reason if reason
130
211
  frame = ::WebSocket::Frame::Outgoing::Client.new(param)
131
212
 
132
- @close_timeout = (opt.key?(:timeout) ? opt[:timeout] : DEFAULT_CLOSE_CODE)
213
+ @close_timeout = opt[:timeout]
133
214
  @write_queue.process_frame frame
134
215
 
135
- wait_for_response = (opt.key?(:wait_for_response) ? opt[:wait_for_response] : true)
216
+ wait_for_response = opt[:wait_for_response]
136
217
  if wait_for_response
137
218
  @closed_status_mutex.synchronize do
138
219
  @closed_status_cond_var.wait @closed_status_mutex until @closed_status == :closed
@@ -158,7 +239,11 @@ module WebsocketSequentialClient
158
239
  end
159
240
 
160
241
  def start_ping_thread ping_opt
161
- interval = (ping_opt[:interval] rescue DEFAULT_PING_INTERVAL)
242
+ if ping_opt == true
243
+ interval = DEFAULT_PING_INTERVAL
244
+ else
245
+ interval = (ping_opt[:interval] || DEFAULT_PING_INTERVAL)
246
+ end
162
247
  raise ArgumentError, "opt[:ping][:interval] must be a positive number." if interval <= 0
163
248
  @ping_th = Thread.start(interval) do |i|
164
249
  while true
@@ -3,7 +3,7 @@
3
3
  require "thread"
4
4
 
5
5
  module WebsocketSequentialClient
6
- class WriteQueue
6
+ class WriteQueue #:nodoc:
7
7
  def initialize
8
8
  @mutex = Mutex.new
9
9
  @cond_var = ConditionVariable.new
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: websocket_sequential_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masamitsu MURASE
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
11
+ date: 2015-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket