protocol-websocket 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 076d348e98312526d98d8fc80840b9760cf30496ac4ca83d129ac53e120c10a0
4
- data.tar.gz: 142d1fa0b2c8e06a3642cfff30f76f835308b23ca3d6964e1c3ae0870204d5e1
3
+ metadata.gz: 1c466ba64c434d16b197dacfb48341ab14eca48ba5aefde4cf06df4f10be84fc
4
+ data.tar.gz: 3d470e57b3c94936ec31adce97e829550344e6345de423f0d3c51915d951d782
5
5
  SHA512:
6
- metadata.gz: 941eda4ac12acbc31bdd359cae2b2aaffd59f78f328844fcd171f6aca517cc225831ea3726f919448eaef3c7246a630d415988528ef08f4f6a394239b5924aeb
7
- data.tar.gz: 9c37cfc67173a3632c344d042682f906b9b9afc2c4cbc35263f9cc48fa0cf4e62ee7348b4ce5a1af7bed2b118d23f477721e2b575f8d91f991806fa53996da7c
6
+ metadata.gz: 271a7a12c932857ea8887e67d7303a008852cc700e2d3bea0cbf96a6f30c53b8cae442f62877f4ad89c215dfb5bae81c0948da6b3cd5c267304dc368d795e542
7
+ data.tar.gz: 826444b74fd01885c66389a1c08b8b2cb99617662c3e364453d4d1572fa0237447d70d196fc867bde6231bc11efd6b47c874619bafe1efa800bcc1304a055329
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/.DS_Store ADDED
Binary file
Binary file
@@ -19,6 +19,7 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require_relative 'frame'
22
+ require_relative 'message'
22
23
 
23
24
  module Protocol
24
25
  module WebSocket
@@ -30,7 +31,7 @@ module Protocol
30
31
  end
31
32
 
32
33
  def read_message(buffer)
33
- buffer
34
+ return BinaryMessage.new(buffer)
34
35
  end
35
36
 
36
37
  def apply(connection)
@@ -131,39 +131,7 @@ module Protocol
131
131
  raise ProtocolError, "Received unexpected continuation!"
132
132
  end
133
133
  end
134
-
135
- def text_message(buffer, **options)
136
- frame = TextFrame.new(mask: @mask)
137
- frame.pack(buffer)
138
-
139
- return frame
140
- end
141
-
142
- def send_text(buffer, **options)
143
- write_frame(@writer.text_message(buffer, **options))
144
- end
145
-
146
- def binary_message(buffer, **options)
147
- frame = BinaryFrame.new(mask: @mask)
148
- frame.pack(buffer)
149
-
150
- return frame
151
- end
152
-
153
- def send_binary(buffer, **options)
154
- write_frame(@writer.binary_message(buffer, **options))
155
- end
156
-
157
- def send_close(code = Error::NO_ERROR, reason = "")
158
- frame = CloseFrame.new(mask: @mask)
159
- frame.pack(code, reason)
160
-
161
- self.write_frame(frame)
162
- self.flush
163
-
164
- @state = :closed
165
- end
166
-
134
+
167
135
  def receive_close(frame)
168
136
  @state = :closed
169
137
 
@@ -209,23 +177,59 @@ module Protocol
209
177
  warn "Unhandled frame #{frame.inspect}"
210
178
  end
211
179
 
212
- def write_message(buffer, **options)
213
- # Text: The "Payload data" is text data encoded as UTF-8
214
- if buffer.encoding == Encoding::UTF_8
215
- send_text(buffer, **options)
216
- else
217
- send_binary(buffer, **options)
218
- end
180
+ def pack_text_frame(buffer, **options)
181
+ frame = TextFrame.new(mask: @mask)
182
+ frame.pack(buffer)
183
+
184
+ return frame
219
185
  end
220
186
 
221
- # @param buffer [String] a unicode or binary string.
222
- def write(buffer, **options)
223
- # https://tools.ietf.org/html/rfc6455#section-5.6
187
+ def send_text(buffer, **options)
188
+ write_frame(@writer.pack_text_frame(buffer, **options))
189
+ end
190
+
191
+ def pack_binary_frame(buffer, **options)
192
+ frame = BinaryFrame.new(mask: @mask)
193
+ frame.pack(buffer)
224
194
 
225
- self.write_message(buffer, **options)
195
+ return frame
226
196
  end
227
197
 
228
- # @return [String] a unicode or binary string.
198
+ def send_binary(buffer, **options)
199
+ write_frame(@writer.pack_binary_frame(buffer, **options))
200
+ end
201
+
202
+ def send_close(code = Error::NO_ERROR, reason = "")
203
+ frame = CloseFrame.new(mask: @mask)
204
+ frame.pack(code, reason)
205
+
206
+ self.write_frame(frame)
207
+ self.flush
208
+
209
+ @state = :closed
210
+ end
211
+
212
+ # Write a message to the connection.
213
+ # @parameter message [Message] The message to send.
214
+ def write(message, **options)
215
+ if message.is_a?(String)
216
+ if message.encoding == Encoding::UTF_8
217
+ return send_text(message, **options)
218
+ else
219
+ return send_binary(message, **options)
220
+ end
221
+ end
222
+
223
+ message.send(self, **options)
224
+ end
225
+
226
+ # The default implementation for reading a message buffer.
227
+ def unpack_frames(frames)
228
+ frames.map(&:unpack).join("")
229
+ end
230
+
231
+ # Read a message from the connection.
232
+ # @returns message [Message] The received message.
229
233
  def read(**options)
230
234
  @framer.flush
231
235
 
@@ -234,7 +238,7 @@ module Protocol
234
238
  frames = @frames
235
239
  @frames = []
236
240
 
237
- buffer = @reader.read_message(frames, **options)
241
+ buffer = @reader.unpack_frames(frames, **options)
238
242
  return frames.first.read_message(buffer)
239
243
  end
240
244
  end
@@ -243,10 +247,6 @@ module Protocol
243
247
 
244
248
  raise
245
249
  end
246
-
247
- def read_message(frames, **options)
248
- frames.map(&:unpack).join("")
249
- end
250
250
  end
251
251
  end
252
252
  end
@@ -0,0 +1,34 @@
1
+ # Copyright, 2021, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'zlib'
22
+
23
+ module Protocol
24
+ module WebSocket
25
+ module Extension
26
+ module Compression
27
+ NAME = 'permessage-deflate'
28
+
29
+ # Zlib is not capable of handling < 9 window bits.
30
+ MINIMUM_WINDOW_BITS = 9
31
+ end
32
+ end
33
+ end
34
+ end
@@ -18,24 +18,26 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'zlib'
21
+ require_relative 'constants'
22
22
 
23
23
  module Protocol
24
24
  module WebSocket
25
25
  module Extension
26
26
  module Compression
27
27
  class Deflate
28
- def self.client(parent, client_window_bits: 15, client_no_context_takeover: false, **options)
28
+ # Client writing to server.
29
+ def self.client(parent, client_max_window_bits: 15, client_no_context_takeover: false, **options)
29
30
  self.new(parent,
30
- window_bits: client_window_bits,
31
+ window_bits: client_max_window_bits,
31
32
  context_takeover: !client_no_context_takeover,
32
33
  **options
33
34
  )
34
35
  end
35
36
 
36
- def self.server(parent, server_window_bits: 15, server_no_context_takeover: false, **options)
37
+ # Server writing to client.
38
+ def self.server(parent, server_max_window_bits: 15, server_no_context_takeover: false, **options)
37
39
  self.new(parent,
38
- window_bits: server_window_bits,
40
+ window_bits: server_max_window_bits,
39
41
  context_takeover: !server_no_context_takeover,
40
42
  **options
41
43
  )
@@ -46,28 +48,39 @@ module Protocol
46
48
 
47
49
  @deflate = nil
48
50
 
49
- @compression_level = level
51
+ @level = level
50
52
  @memory_level = memory_level
51
53
  @strategy = strategy
52
54
 
55
+ if window_bits < MINIMUM_WINDOW_BITS
56
+ window_bits = MINIMUM_WINDOW_BITS
57
+ end
58
+
53
59
  @window_bits = window_bits
54
60
  @context_takeover = context_takeover
55
61
  end
56
62
 
57
- def text_message(buffer, compress: true, **options)
63
+ def inspect
64
+ "#<#{self.class} window_bits=#{@window_bits} context_takeover=#{@context_takeover}>"
65
+ end
66
+
67
+ attr :window_bits
68
+ attr :context_takeover
69
+
70
+ def pack_text_frame(buffer, compress: true, **options)
58
71
  buffer = self.deflate(buffer)
59
72
 
60
- frame = @parent.text_message(buffer, **options)
73
+ frame = @parent.pack_text_frame(buffer, **options)
61
74
 
62
75
  frame.flags |= Frame::RSV1
63
76
 
64
77
  return frame
65
78
  end
66
79
 
67
- def binary_message(buffer, compress: false, **options)
68
- message = self.deflate(buffer)
80
+ def pack_binary_frame(buffer, compress: false, **options)
81
+ buffer = self.deflate(buffer)
69
82
 
70
- frame = parent.binary_message(buffer, **options)
83
+ frame = @parent.pack_binary_frame(buffer, **options)
71
84
 
72
85
  frame.flags |= Frame::RSV1
73
86
 
@@ -77,14 +90,13 @@ module Protocol
77
90
  private
78
91
 
79
92
  def deflate(buffer)
80
- Console.logger.info(self, "Deflating #{buffer.size} bytes")
81
93
  deflate = @deflate || Zlib::Deflate.new(@level, -@window_bits, @memory_level, @strategy)
82
94
 
83
95
  if @context_takeover
84
96
  @deflate = deflate
85
97
  end
86
98
 
87
- return @deflate.deflate(buffer, Zlib::SYNC_FLUSH)[0...-4]
99
+ return deflate.deflate(buffer, Zlib::SYNC_FLUSH)[0...-4]
88
100
  end
89
101
  end
90
102
  end
@@ -18,26 +18,26 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'zlib'
21
+ require_relative 'constants'
22
22
 
23
23
  module Protocol
24
24
  module WebSocket
25
25
  module Extension
26
26
  module Compression
27
27
  class Inflate
28
- def self.client(parent, client_window_bits: 15, client_no_context_takeover: false, **options)
28
+ # Client reading from server.
29
+ def self.client(parent, server_max_window_bits: 15, server_no_context_takeover: false, **options)
29
30
  self.new(parent,
30
- window_bits: client_window_bits,
31
- context_takeover: !client_no_context_takeover,
32
- **options
31
+ window_bits: server_max_window_bits,
32
+ context_takeover: !server_no_context_takeover,
33
33
  )
34
34
  end
35
35
 
36
- def self.server(parent, server_window_bits: 15, server_no_context_takeover: false, **options)
36
+ # Server reading from client.
37
+ def self.server(parent, client_max_window_bits: 15, client_no_context_takeover: false, **options)
37
38
  self.new(parent,
38
- window_bits: server_window_bits,
39
- context_takeover: !server_no_context_takeover,
40
- **options
39
+ window_bits: client_max_window_bits,
40
+ context_takeover: !client_no_context_takeover,
41
41
  )
42
42
  end
43
43
 
@@ -48,12 +48,19 @@ module Protocol
48
48
 
49
49
  @inflate = nil
50
50
 
51
+ if window_bits < MINIMUM_WINDOW_BITS
52
+ window_bits = MINIMUM_WINDOW_BITS
53
+ end
54
+
51
55
  @window_bits = window_bits
52
56
  @context_takeover = context_takeover
53
57
  end
54
58
 
55
- def read_message(frames, **options)
56
- buffer = @parent.read_message(frames, **options)
59
+ attr :window_bits
60
+ attr :context_takeover
61
+
62
+ def unpack_frames(frames, **options)
63
+ buffer = @parent.unpack_frames(frames, **options)
57
64
 
58
65
  frame = frames.first
59
66
 
@@ -69,7 +76,6 @@ module Protocol
69
76
  private
70
77
 
71
78
  def inflate(buffer)
72
- Console.logger.info(self, "Inflating #{buffer.bytesize} bytes")
73
79
  inflate = @inflate || Zlib::Inflate.new(-@window_bits)
74
80
 
75
81
  if @context_takeover
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'zlib'
21
+ require_relative 'compression/constants'
22
22
  require_relative 'compression/inflate'
23
23
  require_relative 'compression/deflate'
24
24
 
@@ -26,17 +26,15 @@ module Protocol
26
26
  module WebSocket
27
27
  module Extension
28
28
  module Compression
29
- NAME = 'permessage-deflate'
30
-
31
29
  # Client offer to server, construct a list of requested compression parameters suitable for the `Sec-WebSocket-Extensions` header.
32
30
  # @returns [Array(String)] a list of compression parameters suitable to send to the server.
33
- def self.offer(client_window_bits: true, server_window_bits: true, client_no_context_takeover: false, server_no_context_takeover: false)
31
+ def self.offer(client_max_window_bits: true, server_max_window_bits: true, client_no_context_takeover: false, server_no_context_takeover: false)
34
32
 
35
33
  header = [NAME]
36
34
 
37
- case client_window_bits
35
+ case client_max_window_bits
38
36
  when 8..15
39
- header << "client_max_window_bits=#{client_window_bits}"
37
+ header << "client_max_window_bits=#{client_max_window_bits}"
40
38
  when true
41
39
  header << 'client_max_window_bits'
42
40
  else
@@ -47,9 +45,9 @@ module Protocol
47
45
  header << 'client_no_context_takeover'
48
46
  end
49
47
 
50
- case server_window_bits
48
+ case server_max_window_bits
51
49
  when 8..15
52
- header << "server_max_window_bits=#{server_window_bits}"
50
+ header << "server_max_window_bits=#{server_max_window_bits}"
53
51
  when true
54
52
  # Default (unspecified) to the server maximum window bits.
55
53
  else
@@ -72,22 +70,28 @@ module Protocol
72
70
  arguments.each do |key, value|
73
71
  case key
74
72
  when "server_no_context_takeover"
75
- options[:server_no_context_takeover] = false
73
+ options[:server_no_context_takeover] = true
76
74
  header << key
77
75
  when "client_no_context_takeover"
78
- options[:client_no_context_takeover] = false
76
+ options[:client_no_context_takeover] = true
79
77
  header << key
80
78
  when "server_max_window_bits"
81
- options[:server_max_window_bits] = Integer(value || 15)
79
+ value = Integer(value || 15)
80
+ value = MINIMUM_WINDOW_BITS if value < MINIMUM_WINDOW_BITS
81
+ options[:server_max_window_bits] = value
82
+ header << "server_max_window_bits=#{value}"
82
83
  when "client_max_window_bits"
83
- options[:client_max_window_bits] = Integer(value || 15)
84
+ value = Integer(value || 15)
85
+ value = MINIMUM_WINDOW_BITS if value < MINIMUM_WINDOW_BITS
86
+ options[:client_max_window_bits] = value
87
+ header << "client_max_window_bits=#{value}"
84
88
  else
85
89
  raise ArgumentError, "Unknown option #{key}!"
86
90
  end
87
91
  end
88
92
 
89
93
  # The header which represents the final accepted/negotiated configuration.
90
- return header
94
+ return header, options
91
95
  end
92
96
 
93
97
  # @parameter options [Hash] a hash of options which are accepted by the server.
@@ -105,9 +109,9 @@ module Protocol
105
109
  arguments.each do |key, value|
106
110
  case key
107
111
  when "server_no_context_takeover"
108
- options[:server_no_context_takeover] = false
112
+ options[:server_no_context_takeover] = true
109
113
  when "client_no_context_takeover"
110
- options[:client_no_context_takeover] = false
114
+ options[:client_no_context_takeover] = true
111
115
  when "server_max_window_bits"
112
116
  options[:server_max_window_bits] = Integer(value || 15)
113
117
  when "client_max_window_bits"
@@ -116,6 +120,8 @@ module Protocol
116
120
  raise ArgumentError, "Unknown option #{key}!"
117
121
  end
118
122
  end
123
+
124
+ return options
119
125
  end
120
126
 
121
127
  # @parameter options [Hash] a hash of options which are accepted by the client.
@@ -75,7 +75,7 @@ module Protocol
75
75
  if extension = named.delete(name)
76
76
  klass, options = extension
77
77
 
78
- klass.accept(arguments, **options)
78
+ options = klass.accept(arguments, **options)
79
79
 
80
80
  @accepted << [klass, options]
81
81
  end
@@ -84,7 +84,7 @@ module Protocol
84
84
 
85
85
  def apply(connection)
86
86
  @accepted.each do |(klass, options)|
87
- klass.server(connection, **options)
87
+ klass.client(connection, **options)
88
88
  end
89
89
  end
90
90
  end
@@ -121,7 +121,9 @@ module Protocol
121
121
  if extension = named[name]
122
122
  klass, options = extension
123
123
 
124
- if header = klass.negotiate(arguments, **options)
124
+ if result = klass.negotiate(arguments, **options)
125
+ header, options = result
126
+
125
127
  # The extension is accepted and no further offers will be considered:
126
128
  named.delete(name)
127
129
 
@@ -0,0 +1,61 @@
1
+ # Copyright, 2022, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require_relative 'frame'
22
+
23
+ module Protocol
24
+ module WebSocket
25
+ class Message
26
+ def initialize(buffer)
27
+ @buffer = buffer
28
+ end
29
+
30
+ attr :buffer
31
+
32
+ def size
33
+ @buffer.bytesize
34
+ end
35
+
36
+ def == other
37
+ @buffer == other
38
+ end
39
+
40
+ def to_str
41
+ @buffer
42
+ end
43
+
44
+ def encoding
45
+ @buffer.encoding
46
+ end
47
+ end
48
+
49
+ class TextMessage < Message
50
+ def send(connection, **options)
51
+ connection.send_text(@buffer, **options)
52
+ end
53
+ end
54
+
55
+ class BinaryMessage < Message
56
+ def send(connection, **options)
57
+ connection.send_binary(@buffer, **options)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -19,6 +19,7 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require_relative 'frame'
22
+ require_relative 'message'
22
23
 
23
24
  module Protocol
24
25
  module WebSocket
@@ -39,7 +40,7 @@ module Protocol
39
40
  raise ProtocolError, "invalid UTF-8 in text frame!"
40
41
  end
41
42
 
42
- buffer
43
+ return TextMessage.new(buffer)
43
44
  end
44
45
 
45
46
  # Apply this frame to the specified connection.
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Protocol
22
22
  module WebSocket
23
- VERSION = "0.8.0"
23
+ VERSION = "0.9.0"
24
24
  end
25
25
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-websocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -41,7 +41,7 @@ cert_chain:
41
41
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
42
42
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
43
43
  -----END CERTIFICATE-----
44
- date: 2022-08-20 00:00:00.000000000 Z
44
+ date: 2022-08-22 00:00:00.000000000 Z
45
45
  dependencies:
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: protocol-http
@@ -100,25 +100,27 @@ dependencies:
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
102
  - !ruby/object:Gem::Dependency
103
- name: rspec
103
+ name: sus
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '3.0'
108
+ version: 0.9.1
109
109
  type: :development
110
110
  prerelease: false
111
111
  version_requirements: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: '3.0'
115
+ version: 0.9.1
116
116
  description:
117
117
  email:
118
118
  executables: []
119
119
  extensions: []
120
120
  extra_rdoc_files: []
121
121
  files:
122
+ - lib/.DS_Store
123
+ - lib/protocol/.DS_Store
122
124
  - lib/protocol/websocket.rb
123
125
  - lib/protocol/websocket/binary_frame.rb
124
126
  - lib/protocol/websocket/close_frame.rb
@@ -126,6 +128,7 @@ files:
126
128
  - lib/protocol/websocket/continuation_frame.rb
127
129
  - lib/protocol/websocket/error.rb
128
130
  - lib/protocol/websocket/extension/compression.rb
131
+ - lib/protocol/websocket/extension/compression/constants.rb
129
132
  - lib/protocol/websocket/extension/compression/deflate.rb
130
133
  - lib/protocol/websocket/extension/compression/inflate.rb
131
134
  - lib/protocol/websocket/extensions.md
@@ -133,6 +136,7 @@ files:
133
136
  - lib/protocol/websocket/frame.rb
134
137
  - lib/protocol/websocket/framer.rb
135
138
  - lib/protocol/websocket/headers.rb
139
+ - lib/protocol/websocket/message.rb
136
140
  - lib/protocol/websocket/ping_frame.rb
137
141
  - lib/protocol/websocket/pong_frame.rb
138
142
  - lib/protocol/websocket/text_frame.rb
metadata.gz.sig CHANGED
Binary file