protocol-zmtp 0.5.0 → 0.6.0

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
  SHA256:
3
- metadata.gz: 0f82192f566af0256273b9dd794ad7032c5b1f3d1b2f8a58c37235847715f6fc
4
- data.tar.gz: b74e78954d38be3f239d96cbcac676dc564b9ab56dff16f1beff8fbcedb77b8b
3
+ metadata.gz: fe0884f347da68db2bbd04949c944108a997d67f545e511e5a74973a84c1d359
4
+ data.tar.gz: ff1542dd2feffb84db290fc1dacb8e06d10da80282619c342a59d8d239388125
5
5
  SHA512:
6
- metadata.gz: 985cc52f11cc1ad7d24bdbec3916ee5485bda72a396413b3735254ae97430117b40ae3fd6331107e953c0b99bc3c05a997c368eeae642e64b023dd3d744381eb
7
- data.tar.gz: 100df0f00b447bbc6799c4468b040f15e8fe633bf25d736b44931683772d5f52a50fa2646e8ce3f4768f6076d47482a9a004944f55f42a3d35720ca3f6ede27e
6
+ metadata.gz: 41b15de98c2e4f0ed6db44f9cf9d9524e4dac42c1f01bf75652a363c9afbedc1af755b7531e113e32abea1a3fd64f164446190c81e036a172989868b5bd712a0
7
+ data.tar.gz: 7325e3b59a72b14776128de68361f0507ebfca31d52646aadd1688b6b022e8b04fa9308c3b8a2da7ddccccaaa1d5ed81d58f9f8a0f15a308fd0e196f8b45ceb9
@@ -20,14 +20,16 @@ module Protocol
20
20
  # @return [String] command name (e.g. "READY", "SUBSCRIBE")
21
21
  attr_reader :name
22
22
 
23
+
23
24
  # @return [String] command data (binary)
24
25
  attr_reader :data
25
26
 
27
+
26
28
  # @param name [String] command name
27
29
  # @param data [String] command data
28
- def initialize(name, data = "".b)
30
+ def initialize(name, data = EMPTY_BINARY)
29
31
  @name = name
30
- @data = data.b
32
+ @data = data.encoding == Encoding::BINARY ? data : data.b
31
33
  end
32
34
 
33
35
 
@@ -35,8 +37,9 @@ module Protocol
35
37
  #
36
38
  # @return [String] binary body (name-length + name + data)
37
39
  def to_body
38
- name_bytes = @name.b
39
- name_bytes.bytesize.chr.b + name_bytes + @data
40
+ name_bytes = @name.encoding == Encoding::BINARY ? @name : @name.b
41
+ buf = String.new(capacity: 1 + name_bytes.bytesize + @data.bytesize, encoding: Encoding::BINARY)
42
+ buf << Frame::FLAG_BYTES[name_bytes.bytesize] << name_bytes << @data
40
43
  end
41
44
 
42
45
 
@@ -3,6 +3,11 @@
3
3
  module Protocol
4
4
  module ZMTP
5
5
  module Codec
6
+
7
+ # Frozen empty binary string for zero-length frame bodies.
8
+ EMPTY_BINARY = "".b.freeze
9
+
10
+
6
11
  # ZMTP frame encode/decode.
7
12
  #
8
13
  # Wire format:
@@ -19,6 +24,9 @@ module Protocol
19
24
  # Short frame: 1-byte size, max body 255 bytes.
20
25
  SHORT_MAX = 255
21
26
 
27
+ # Pre-computed single-byte flag strings (avoids Integer#chr + String#b per frame).
28
+ FLAG_BYTES = Array.new(256) { |i| i.chr.b.freeze }.freeze
29
+
22
30
 
23
31
  # @return [String] frame body (binary)
24
32
  attr_reader :body
@@ -49,9 +57,9 @@ module Protocol
49
57
  flags |= FLAGS_COMMAND if @command
50
58
 
51
59
  if size > SHORT_MAX
52
- (flags | FLAGS_LONG).chr.b + [size].pack("Q>") + @body
60
+ FLAG_BYTES[flags | FLAGS_LONG] + [size].pack("Q>") + @body
53
61
  else
54
- flags.chr.b + size.chr.b + @body
62
+ FLAG_BYTES[flags] + FLAG_BYTES[size] + @body
55
63
  end
56
64
  end
57
65
 
@@ -64,9 +72,20 @@ module Protocol
64
72
  # @return [String] frozen binary wire representation
65
73
  #
66
74
  def self.encode_message(parts)
67
- buf = +""
68
- parts.each_with_index do |part, i|
69
- buf << new(part, more: i < parts.size - 1).to_wire
75
+ buf = String.new(encoding: Encoding::BINARY)
76
+ last = parts.size - 1
77
+ i = 0
78
+ while i < parts.size
79
+ body = parts[i]
80
+ body = body.b unless body.encoding == Encoding::BINARY
81
+ size = body.bytesize
82
+ flags = i < last ? FLAGS_MORE : 0
83
+ if size > SHORT_MAX
84
+ buf << FLAG_BYTES[flags | FLAGS_LONG] << [size].pack("Q>") << body
85
+ else
86
+ buf << FLAG_BYTES[flags] << FLAG_BYTES[size] << body
87
+ end
88
+ i += 1
70
89
  end
71
90
  buf.freeze
72
91
  end
@@ -95,7 +114,7 @@ module Protocol
95
114
  raise Error, "frame size #{size} exceeds max_message_size #{max_message_size}"
96
115
  end
97
116
 
98
- body = size > 0 ? io.read_exactly(size) : "".b
117
+ body = size > 0 ? io.read_exactly(size) : EMPTY_BINARY
99
118
 
100
119
  new(body, more: more, command: command)
101
120
  end
@@ -306,13 +306,17 @@ module Protocol
306
306
  def write_frames(parts)
307
307
  encrypted = @mechanism.encrypted?
308
308
  buf = @header_buf
309
+ last = parts.size - 1
309
310
 
310
- parts.each_with_index do |part, i|
311
- more = i < parts.size - 1
311
+ i = 0
312
+ while i < parts.size
313
+ part = parts[i]
314
+ more = i < last
312
315
  if encrypted
313
- @io.write(@mechanism.encrypt(part.b, more: more))
316
+ body = part.encoding == Encoding::BINARY ? part : part.b
317
+ @io.write(@mechanism.encrypt(body, more: more))
314
318
  else
315
- body = part.b
319
+ body = part.encoding == Encoding::BINARY ? part : part.b
316
320
  size = body.bytesize
317
321
  flags = more ? Codec::Frame::FLAGS_MORE : 0
318
322
  buf.clear
@@ -324,6 +328,7 @@ module Protocol
324
328
  @io.write(buf)
325
329
  @io.write(body)
326
330
  end
331
+ i += 1
327
332
  end
328
333
  end
329
334
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Protocol
4
4
  module ZMTP
5
- VERSION = "0.5.0"
5
+ VERSION = "0.6.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-zmtp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrik Wenger