ruflet_server 0.0.13 → 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: 25450e49973d445cda961a273eda6c37aa2e1245865f4094e9c61a6df5dcfdbb
4
- data.tar.gz: 607f67ac69a68360e657133f1f674f09ea917cdf53a2fe86bcf685e1022786ac
3
+ metadata.gz: 68ae173b9c0aa89989e40d996aed245db4c434b96e084b2bc83642c89f244208
4
+ data.tar.gz: 9aea810e84df29511565821252e06f7c0a73cc989b5df86df683393a496d8793
5
5
  SHA512:
6
- metadata.gz: f4f7c79eda7eeafe780e39e16a90f1196e8f729e802374885f2b283ca7e9f5759f7431747fccd8435ea8d60b8424d19d284c97550cfb1d1f96a952d76c467e63
7
- data.tar.gz: d659f02495e1d47b9d9272327de7c42788287e0e269b245e2da511a4a7ae5124a7ac1bebf9566292c67567cc7af807beffd28fad84e3693f49dd0248f2ef316c
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
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
+
19
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
@@ -86,7 +94,41 @@ module Ruflet
86
94
  value.encoding == Encoding::BINARY || !value.valid_encoding?
87
95
  end
88
96
 
89
- def pack_array(value)
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)
90
132
  len = value.length
91
133
  head =
92
134
  if len <= 15
@@ -98,7 +140,7 @@ module Ruflet
98
140
  end
99
141
 
100
142
  body = +"".b
101
- value.each { |item| body << pack(item) }
143
+ value.each { |item| body << pack(item, context) }
102
144
  head + body
103
145
  end
104
146
 
@@ -115,13 +157,22 @@ module Ruflet
115
157
  end
116
158
 
117
159
  body = +"".b
160
+ control_type = pairs["_c"].to_s
118
161
  pairs.each do |k, v|
119
162
  body << pack(k)
120
- body << pack(v)
163
+ body << pack(v, picker_prop_context(control_type, k))
121
164
  end
122
165
  head + body
123
166
  end
124
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
+
125
176
  def read_value(reader)
126
177
  marker = reader.read_u8
127
178
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ruflet
4
- VERSION = "0.0.13" 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.13
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.13
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.13
25
+ version: 0.0.14
26
26
  description: Ruflet WebSocket server runtime compatible with Flet protocol.
27
27
  email:
28
28
  - adammusa2222@gmail.com