Skip to content

Commit e5bfa1c

Browse files
ono-maxko1
authored andcommitted
Improve the way to convert messages to binary
1 parent ab76237 commit e5bfa1c

File tree

1 file changed

+41
-9
lines changed

1 file changed

+41
-9
lines changed

lib/debug/server_cdp.rb

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,35 @@ class Detach < StandardError
179179
end
180180

181181
class WebSocketServer
182+
class Frame
183+
attr_reader :b
184+
185+
def initialize
186+
@b = ''.b
187+
end
188+
189+
def << obj
190+
case obj
191+
when String
192+
@b << obj.b
193+
when Enumerable
194+
obj.each{|e| self << e}
195+
end
196+
end
197+
198+
def char bytes
199+
@b << bytes
200+
end
201+
202+
def ulonglong bytes
203+
@b << [bytes].pack('Q>')
204+
end
205+
206+
def uint16 bytes
207+
@b << [bytes].pack('n*')
208+
end
209+
end
210+
182211
def initialize s
183212
@sock = s
184213
end
@@ -197,27 +226,30 @@ def handshake
197226

198227
def send **msg
199228
msg = JSON.generate(msg)
200-
frame = []
229+
frame = Frame.new
201230
fin = 0b10000000
202231
opcode = 0b00000001
203-
frame << fin + opcode
232+
frame.char fin + opcode
204233

205234
mask = 0b00000000 # A server must not mask any frames in a WebSocket Protocol.
206235
bytesize = msg.bytesize
207236
if bytesize < 126
208237
payload_len = bytesize
238+
frame.char mask + payload_len
209239
elsif bytesize < 2 ** 16
210240
payload_len = 0b01111110
211-
ex_payload_len = [bytesize].pack('n*').bytes
212-
else
241+
frame.char mask + payload_len
242+
frame.uint16 bytesize
243+
elsif bytesize < 2 ** 64
213244
payload_len = 0b01111111
214-
ex_payload_len = [bytesize].pack('Q>').bytes
245+
frame.char mask + payload_len
246+
frame.ulonglong bytesize
247+
else
248+
raise 'Bytesize is too big.'
215249
end
216250

217-
frame << mask + payload_len
218-
frame.push *ex_payload_len if ex_payload_len
219-
frame.push *msg.bytes
220-
@sock.print frame.pack 'c*'
251+
frame << msg
252+
@sock.print frame.b
221253
end
222254

223255
def extract_data

0 commit comments

Comments
 (0)