tamashii-agent 0.2.8 → 0.3.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
  SHA1:
3
- metadata.gz: 5fd9d5c6f30e60812fe77bb31c1c4f867bbdf5ac
4
- data.tar.gz: 6c2b99fe269bb5592d7277b42fafdaf9ff788aa4
3
+ metadata.gz: 5de4cba829b0eab020881898175c0dabd45f9a94
4
+ data.tar.gz: 1700db0dc1f111c39871a195a1fc82919ceef6a7
5
5
  SHA512:
6
- metadata.gz: 3d3809a9b2b9d9d9a8cc562f0b20f2dc20f1ea6d0409cb971057da8c504e8684d233c944ae02abb546ee1242a5d3257dc4d80c420fd1b6d94494fded47b3ec3c
7
- data.tar.gz: 22efd47ced899ab7a920325ff033d3382c3db2375993bbdb09556c79440040924d355c825bd31f003918452e0ad3178fd98477873fb3a5f28eacd4faa941b7d9
6
+ metadata.gz: d5eb697ea55e98cb2fc0dac672e2e4946bb7ba7388255120cc09e9c6cf116f64877df28fabbb7d1a01310494410d88142395e5b55813eefa6f81f54c6ca7f20b
7
+ data.tar.gz: 9d8d9ddd661cb0989a082b9dbba74cf5e645102eab9a8b7289ec8296330bcd937508bc8631ad233753f17cfcbc0d33da0bdd41dc67f1dda044362bcb1b9efa54
@@ -1,15 +1,10 @@
1
1
  require 'tamashii/common'
2
+ require 'tamashii/client'
2
3
  module Tamashii
3
4
  module Agent
4
5
  class Config < Tamashii::Config
5
6
  AUTH_TYPES = [:none, :token]
6
7
 
7
- register :log_file, STDOUT
8
- register :use_ssl, false
9
- register :auth_type, :none
10
- register :entry_point, "/tamashii"
11
- register :manager_host, "localhost"
12
- register :manager_port, 3000
13
8
  register :connection_timeout, 3
14
9
 
15
10
  register :localtime, "+08:00"
@@ -18,6 +13,7 @@ module Tamashii
18
13
  register :lcd_address, 0x27
19
14
  register :lcd_animation_delay, 1
20
15
 
16
+
21
17
  def auth_type(type = nil)
22
18
  return @auth_type ||= :none if type.nil?
23
19
  return unless AUTH_TYPES.include?(type)
@@ -26,8 +22,21 @@ module Tamashii
26
22
 
27
23
  def log_level(level = nil)
28
24
  return Agent.logger.level if level.nil?
25
+ Client.config.log_level(level)
29
26
  Agent.logger.level = level
30
27
  end
28
+
29
+ def log_file(value = nil)
30
+ return @log_file ||= STDOUT if value.nil?
31
+ Client.config.log_file(value)
32
+ @log_file = value
33
+ end
34
+
35
+ [:use_ssl, :host, :port, :entry_point].each do |method_name|
36
+ define_method(method_name) do |*args|
37
+ Tamashii::Client.config.send(method_name, *args)
38
+ end
39
+ end
31
40
  end
32
41
  end
33
42
  end
@@ -1,10 +1,6 @@
1
- require 'socket'
2
- require 'websocket/driver'
3
1
  require 'aasm'
4
- require 'openssl'
5
2
  require 'json'
6
3
  require 'concurrent'
7
- require 'nio'
8
4
 
9
5
  require 'tamashii/common'
10
6
 
@@ -14,54 +10,25 @@ require 'tamashii/agent/component'
14
10
 
15
11
  require 'tamashii/agent/handler'
16
12
 
13
+ require 'tamashii/client'
14
+
17
15
  module Tamashii
18
16
  module Agent
19
17
  class Connection < Component
20
18
 
21
- class RequestTimeoutError < RuntimeError; end
22
-
23
- class RequestObserver
24
- include Common::Loggable
25
- def initialize(connection, id, ev_type, ev_body, future)
26
- @connection = connection
27
- @id = id
28
- @ev_type = ev_type
29
- @ev_body = ev_body
30
- @future = future
31
- end
19
+ autoload :RequestObserver, 'tamashii/agent/connection/request_observer'
32
20
 
33
- def update(time, ev_data, reason)
34
- if @future.fulfilled?
35
- res_ev_type = ev_data[:ev_type]
36
- res_ev_body = ev_data[:ev_body]
37
- case res_ev_type
38
- when Type::RFID_RESPONSE_JSON
39
- logger.debug "Handled: #{res_ev_type}: #{res_ev_body}"
40
- @connection.handle_card_result(JSON.parse(res_ev_body))
41
- else
42
- logger.warn "Unhandled packet result: #{res_ev_type}: #{res_ev_body}"
43
- end
44
- else
45
- logger.error "#{@id} Failed with #{reason}"
46
- @connection.on_request_timeout(@ev_type, @ev_body)
47
- end
48
- end
49
- end
21
+ class RequestTimeoutError < RuntimeError; end
50
22
 
51
23
  include AASM
52
24
 
53
25
  aasm do
54
26
  state :init, initial: true
55
- state :connecting
56
27
  state :auth_pending
57
28
  state :ready
58
29
 
59
- event :connect do
60
- transitions from: :init, to: :connecting, after: Proc.new { logger.info "Start connecting" }
61
- end
62
-
63
30
  event :auth_request do
64
- transitions from: :connecting, to: :auth_pending, after: Proc.new { logger.info "Sending authentication request" }
31
+ transitions from: :init, to: :auth_pending, after: Proc.new { logger.info "Sending authentication request" }
65
32
  end
66
33
 
67
34
  event :auth_success do
@@ -78,24 +45,19 @@ module Tamashii
78
45
 
79
46
  def initialize(master)
80
47
  super
81
- @host = @master.host
82
- @port = @master.port
83
- @url = "#{Config.use_ssl ? "wss" : "ws"}://#{@host}:#{@port}/#{Config.entry_point}"
48
+
84
49
  self.reset
50
+ @client = Tamashii::Client::Base.new
85
51
 
86
52
  @tag = 0
87
53
 
88
54
  @future_ivar_pool = Concurrent::Map.new
89
- @driver_lock = Mutex.new
90
55
 
91
56
  @last_error_report_time = Time.now
57
+ setup_callbacks
92
58
  setup_resolver
93
59
  end
94
60
 
95
- def create_selector
96
- @selector = NIO::Selector.new
97
- end
98
-
99
61
  def setup_resolver
100
62
  env_data = {connection: self}
101
63
  Resolver.config do
@@ -127,9 +89,7 @@ module Tamashii
127
89
 
128
90
  def try_send_request(ev_type, ev_body)
129
91
  if self.ready?
130
- @driver_lock.synchronize do
131
- @driver.binary(Packet.new(ev_type, @tag, ev_body).dump)
132
- end
92
+ @client.transmit(Packet.new(ev_type, @tag, ev_body).dump)
133
93
  true
134
94
  else
135
95
  false
@@ -138,113 +98,43 @@ module Tamashii
138
98
 
139
99
  def stop_threads
140
100
  super
141
- @websocket_thr.exit if @websocket_thr
142
- @websocket_thr = nil
101
+ @client.close
143
102
  end
144
103
 
145
- def run
146
- super
147
- @websocket_thr = Thread.start { run_websocket_loop }
148
- end
149
-
150
- def run_websocket_loop
151
- create_selector
152
- loop do
153
- ready = @selector.select(1)
154
- ready.each { |m| m.value.call } if ready
155
- if @io.nil?
156
- @io = try_create_socket
157
- if @io
158
- # socket io opened
159
- register_socket_io
160
- # start ws
161
- start_web_driver
162
- end
163
- end
164
- end
165
- end
166
104
 
167
105
  def send_auth_request
168
106
  # TODO: other types of auth
169
- @driver.binary(Packet.new(Type::AUTH_TOKEN, 0, [Type::CLIENT[:agent], @master.serial_number,Config.token].join(",")).dump)
107
+ if @client.transmit(Packet.new(Type::AUTH_TOKEN, 0, [Type::CLIENT[:agent], @master.serial_number,Config.token].join(",")).dump)
108
+ logger.debug "Auth sent!"
109
+ else
110
+ logger.error "Cannot sent auth request!"
111
+ end
170
112
  end
171
113
 
172
- def start_web_driver
173
- # TODO: Improve below code
174
- @driver = WebSocket::Driver.client(self)
175
- @driver.on :open, proc { |e|
114
+ def setup_callbacks
115
+ @client.on :open, proc {
176
116
  logger.info "Server opened"
177
117
  self.auth_request
178
118
  send_auth_request
179
119
  }
180
- @driver.on :close, proc { |e|
181
- logger.info "Server closed"
182
- close_socket_io
120
+ @client.on :close, proc {
121
+ # Note: this only called when normally receive the WS close message
122
+ logger.info "Server closed normally"
123
+ }
124
+ @client.on :socket_closed, proc {
125
+ # Note: called when low-level IO is closed
126
+ logger.info "Server socket closed"
183
127
  self.reset
184
128
  }
185
- @driver.on :message, proc { |e|
186
- pkt = Packet.load(e.data)
129
+ @client.on :message, proc { |data|
130
+ pkt = Packet.load(data)
187
131
  process_packet(pkt) if pkt
188
132
  }
189
- @driver.on :error, proc { |e|
133
+ @client.on :error, proc { |e|
190
134
  logger.error("#{e.message}")
191
135
  }
192
- @driver.start
193
- self.connect
194
- end
195
-
196
- def register_socket_io
197
- _monitor = @selector.register(@io, :r)
198
- _monitor.value = proc do
199
- begin
200
- msg = @io.read_nonblock(4096, exception: false)
201
- next if msg == :wait_readable
202
- if msg.nil?
203
- # socket closed
204
- logger.info "No message received from server. Connection reset"
205
- close_socket_io
206
- self.reset
207
- sleep 1
208
- else
209
- @driver.parse(msg)
210
- end
211
- rescue => e
212
- logger.error "#{e.message}"
213
- logger.debug "Backtrace:"
214
- e.backtrace.each {|msg| logger.debug msg}
215
- end
216
- end
217
- end
218
-
219
- def try_create_socket
220
- logger.info "try to open socket..."
221
- if Time.now - @last_error_report_time > 5.0
222
- @master.send_event(Event.new(Event::LCD_MESSAGE, "Initializing\nConnection..."))
223
- @last_error_report_time = Time.now
224
- end
225
- if Config.use_ssl
226
- OpenSSL::SSL::SSLSocket.new(TCPSocket.new(@host, @port)).connect
227
- else
228
- TCPSocket.new(@host, @port)
229
- end
230
- rescue
231
- nil
232
136
  end
233
137
 
234
- def close_socket_io
235
- logger.info "Socket IO Closed and Deregistered"
236
- @selector.deregister(@io)
237
- @io.close
238
- @io = nil
239
- end
240
-
241
- def write(string)
242
- @io.write(string)
243
- rescue
244
- logger.error "Write Error"
245
- close_socket_io
246
- self.reset
247
- end
248
138
 
249
139
  def process_packet(pkt)
250
140
  if self.auth_pending?
@@ -345,16 +235,6 @@ module Tamashii
345
235
  end
346
236
  end
347
237
 
348
- def clean_up
349
- super
350
- if @io
351
- @driver.close
352
- close_socket_io
353
- end
354
- rescue => e
355
- logger.warn "Error occured when clean up: #{e.to_s}"
356
- end
357
-
358
238
  # When data is back
359
239
  def handle_remote_response(ev_type, wrapped_ev_body)
360
240
  logger.debug "Remote packet back: #{ev_type} #{wrapped_ev_body}"
@@ -0,0 +1,39 @@
1
+ require 'tamashii/common'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ class Connection
6
+ class RequestObserver
7
+
8
+ include Common::Loggable
9
+ def initialize(connection, id, ev_type, ev_body, future)
10
+ @connection = connection
11
+ @id = id
12
+ @ev_type = ev_type
13
+ @ev_body = ev_body
14
+ @future = future
15
+ end
16
+
17
+ def update(time, ev_data, reason)
18
+ if @future.fulfilled?
19
+ res_ev_type = ev_data[:ev_type]
20
+ res_ev_body = ev_data[:ev_body]
21
+ case res_ev_type
22
+ when Type::RFID_RESPONSE_JSON
23
+ logger.debug "Handled: #{res_ev_type}: #{res_ev_body}"
24
+ @connection.handle_card_result(JSON.parse(res_ev_body))
25
+ else
26
+ logger.warn "Unhandled packet result: #{res_ev_type}: #{res_ev_body}"
27
+ end
28
+ else
29
+ logger.error "#{@id} Failed with #{reason}"
30
+ @connection.on_request_timeout(@ev_type, @ev_body)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+
39
+
@@ -1,5 +1,5 @@
1
1
  module Tamashii
2
2
  module Agent
3
- VERSION = "0.2.8"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -40,6 +40,7 @@ Gem::Specification.new do |spec|
40
40
 
41
41
 
42
42
  spec.add_runtime_dependency "tamashii-common", ">=0.1.6"
43
+ spec.add_runtime_dependency "tamashii-client"
43
44
  spec.add_runtime_dependency "websocket-driver"
44
45
  spec.add_runtime_dependency "nio4r"
45
46
  spec.add_runtime_dependency "pi_piper"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tamashii-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 蒼時弦也
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2017-08-04 00:00:00.000000000 Z
13
+ date: 2017-09-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -138,6 +138,20 @@ dependencies:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
140
  version: 0.1.6
141
+ - !ruby/object:Gem::Dependency
142
+ name: tamashii-client
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :runtime
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: websocket-driver
143
157
  requirement: !ruby/object:Gem::Requirement
@@ -269,6 +283,7 @@ files:
269
283
  - lib/tamashii/agent/component.rb
270
284
  - lib/tamashii/agent/config.rb
271
285
  - lib/tamashii/agent/connection.rb
286
+ - lib/tamashii/agent/connection/request_observer.rb
272
287
  - lib/tamashii/agent/device/fake_buzzer.rb
273
288
  - lib/tamashii/agent/device/fake_card_reader.rb
274
289
  - lib/tamashii/agent/device/fake_lcd.rb
@@ -304,7 +319,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
319
  version: '0'
305
320
  requirements: []
306
321
  rubyforge_project:
307
- rubygems_version: 2.6.11
322
+ rubygems_version: 2.5.1
308
323
  signing_key:
309
324
  specification_version: 4
310
325
  summary: The agent module for RubyConfTW checkin system.