ruflet_server 0.0.12 → 0.0.14

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: 2f7f6af6a5f50b057d32c477999140b9fad6bd8e60c94b552daebee6baf69acc
4
- data.tar.gz: 7520f899e68da6be32c2a4534ab2abb61514820f2ed9c4df457322c16a5940c4
3
+ metadata.gz: 68ae173b9c0aa89989e40d996aed245db4c434b96e084b2bc83642c89f244208
4
+ data.tar.gz: 9aea810e84df29511565821252e06f7c0a73cc989b5df86df683393a496d8793
5
5
  SHA512:
6
- metadata.gz: c6d38619ee9efd5b35bc1c41b55b47740027e59bb9b95d3884c1d38f74079d7bcbb996e33d6240b05b2a3325cc971186bb458e89d47752fdd507358e78921d75
7
- data.tar.gz: 1e40e525abb2f0b87a4bd30d4ff63134e932bc659f59f839cd2200fde74cfbb8a243bcb3d8653fec62bb9624d4906b5991d0766724eb3efd622fab2b0d9d1228
6
+ metadata.gz: de44b6b80acfdc2ce0bca54a3460e027b053d16244cf8d1e44d81b6446d036795008cba9510d37ccec622734205b9bb41cecb8401456bbeb0fa349d8a51ad13e
7
+ data.tar.gz: 5a7e6e9e7623eebc5635ac8e200e13d8e62ba68335d5fe15533d6260b88a83fe5f5d3c279819c3f89d8f2465a5fac5014e399d1c4b9d67a52a15c0a3f3a76f91
@@ -2,8 +2,13 @@
2
2
 
3
3
  module Ruflet
4
4
  class WireCodec
5
+ PICKER_DATE_CONTROLS = %w[CupertinoDatePicker DatePicker DateRangePicker].freeze
6
+ PICKER_DATE_KEYS = %w[current_date end_value first_date last_date start_value value].freeze
7
+ PICKER_TIME_CONTROLS = %w[TimePicker].freeze
8
+ PICKER_TIME_KEYS = %w[value].freeze
9
+
5
10
  class << self
6
- def pack(value)
11
+ def pack(value, context = nil)
7
12
  case value
8
13
  when NilClass
9
14
  "\xc0".b
@@ -16,11 +21,14 @@ module Ruflet
16
21
  when Float
17
22
  "\xcb".b + [value].pack("G")
18
23
  when String
19
- pack_string(value)
24
+ return pack_ext(1, normalize_date_ext(value)) if context == :date
25
+ return pack_ext(2, normalize_time_ext(value)) if context == :time
26
+
27
+ binary_string?(value) ? pack_binary(value) : pack_string(value)
20
28
  when Symbol
21
29
  pack_string(value.to_s)
22
30
  when Array
23
- pack_array(value)
31
+ pack_array(value, context)
24
32
  when Hash
25
33
  pack_map(value)
26
34
  else
@@ -69,7 +77,58 @@ module Ruflet
69
77
  end
70
78
  end
71
79
 
72
- def pack_array(value)
80
+ def pack_binary(value)
81
+ bytes = value.to_s.b
82
+ len = bytes.bytesize
83
+
84
+ if len <= 0xff
85
+ "\xc4".b + [len].pack("C") + bytes
86
+ elsif len <= 0xffff
87
+ "\xc5".b + [len].pack("n") + bytes
88
+ else
89
+ "\xc6".b + [len].pack("N") + bytes
90
+ end
91
+ end
92
+
93
+ def binary_string?(value)
94
+ value.encoding == Encoding::BINARY || !value.valid_encoding?
95
+ end
96
+
97
+ def pack_ext(type, payload)
98
+ bytes = payload.to_s.b
99
+ len = bytes.bytesize
100
+
101
+ if len == 1
102
+ "\xd4".b + [type].pack("c") + bytes
103
+ elsif len == 2
104
+ "\xd5".b + [type].pack("c") + bytes
105
+ elsif len == 4
106
+ "\xd6".b + [type].pack("c") + bytes
107
+ elsif len == 8
108
+ "\xd7".b + [type].pack("c") + bytes
109
+ elsif len == 16
110
+ "\xd8".b + [type].pack("c") + bytes
111
+ elsif len <= 0xff
112
+ "\xc7".b + [len, type].pack("Cc") + bytes
113
+ elsif len <= 0xffff
114
+ "\xc8".b + [len, type].pack("nc") + bytes
115
+ else
116
+ "\xc9".b + [len, type].pack("Nc") + bytes
117
+ end
118
+ end
119
+
120
+ def normalize_date_ext(value)
121
+ raw = value.to_s
122
+ return "#{raw}T00:00:00+00:00" if raw.match?(/\A\d{4}-\d{2}-\d{2}\z/)
123
+
124
+ raw
125
+ end
126
+
127
+ def normalize_time_ext(value)
128
+ value.to_s
129
+ end
130
+
131
+ def pack_array(value, context = nil)
73
132
  len = value.length
74
133
  head =
75
134
  if len <= 15
@@ -81,7 +140,7 @@ module Ruflet
81
140
  end
82
141
 
83
142
  body = +"".b
84
- value.each { |item| body << pack(item) }
143
+ value.each { |item| body << pack(item, context) }
85
144
  head + body
86
145
  end
87
146
 
@@ -98,13 +157,22 @@ module Ruflet
98
157
  end
99
158
 
100
159
  body = +"".b
160
+ control_type = pairs["_c"].to_s
101
161
  pairs.each do |k, v|
102
162
  body << pack(k)
103
- body << pack(v)
163
+ body << pack(v, picker_prop_context(control_type, k))
104
164
  end
105
165
  head + body
106
166
  end
107
167
 
168
+ def picker_prop_context(control_type, key)
169
+ key = key.to_s
170
+ return :date if PICKER_DATE_CONTROLS.include?(control_type) && PICKER_DATE_KEYS.include?(key)
171
+ return :time if PICKER_TIME_CONTROLS.include?(control_type) && PICKER_TIME_KEYS.include?(key)
172
+
173
+ nil
174
+ end
175
+
108
176
  def read_value(reader)
109
177
  marker = reader.read_u8
110
178
 
@@ -178,8 +246,17 @@ module Ruflet
178
246
  end
179
247
 
180
248
  def read_ext(reader, size)
181
- reader.read_i8 # type (ignored)
182
- reader.read_exact(size)
249
+ type = reader.read_i8
250
+ data = reader.read_exact(size)
251
+
252
+ case type
253
+ when 1, 2, 4
254
+ data.dup.force_encoding("UTF-8")
255
+ when 3
256
+ data.to_i
257
+ else
258
+ data
259
+ end
183
260
  end
184
261
  end
185
262
 
data/lib/ruflet/server.rb CHANGED
@@ -480,7 +480,7 @@ module Ruflet
480
480
 
481
481
  def on_invoke_control_method(ws, payload)
482
482
  page = fetch_page(ws)
483
- page.handle_invoke_method_result(payload)
483
+ page.handle_invoke_method_result(Protocol.normalize_invoke_method_result_payload(payload))
484
484
  end
485
485
 
486
486
  def on_control_event(ws, payload)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ruflet
4
- VERSION = "0.0.12" unless const_defined?(:VERSION)
4
+ VERSION = "0.0.14" unless const_defined?(:VERSION)
5
5
  end
data/lib/ruflet_server.rb CHANGED
@@ -10,8 +10,22 @@ module Ruflet
10
10
  callback = entrypoint || block
11
11
  raise ArgumentError, "Ruflet.run requires a callable entrypoint or block" unless callback.respond_to?(:call)
12
12
 
13
+ interceptor = run_interceptor
14
+ if interceptor
15
+ result = interceptor.call(entrypoint: callback, host: host, port: port)
16
+ return result unless result == :pass
17
+ end
18
+
13
19
  Server.new(host: host, port: port) do |page|
14
20
  callback.call(page)
15
21
  end.start
16
22
  end
23
+
24
+ def run_interceptor
25
+ return nil unless instance_variable_defined?(:@run_interceptors_mutex)
26
+ return nil unless instance_variable_defined?(:@run_interceptors)
27
+
28
+ @run_interceptors_mutex.synchronize { @run_interceptors.last }
29
+ end
30
+ private_class_method :run_interceptor
17
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruflet_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - AdamMusa
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.0.12
18
+ version: 0.0.14
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.0.12
25
+ version: 0.0.14
26
26
  description: Ruflet WebSocket server runtime compatible with Flet protocol.
27
27
  email:
28
28
  - adammusa2222@gmail.com