ducts-client 0.1.1 → 0.4.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: 3344b83d9bc5c7da3cbfcc870dfe4a1dbefffd041e38e911d04bb58e59018c00
4
- data.tar.gz: 891fe145f30a3ba1bd7eb989a80fb464025f2dc84e79cb4b2c4111008454b36e
3
+ metadata.gz: de6d875bf28e0042c19c44dbbffa9fbef3f02baebc6038fb0cdbeab5582e14c3
4
+ data.tar.gz: c731e1c5f040b2c1615f6515c678f6d2f8736378c04bbeffc6a588346dedeca3
5
5
  SHA512:
6
- metadata.gz: 2e29a2e545614cd0131e7213148e51da1f6588849a401ef242030591bb445bf9cded5a3cf9746710b41e79ff473251cd22efab64c6accfc7502d30aef134c697
7
- data.tar.gz: f5147cc164268cd0d544e9a98261719665ff6d9b41b93f202489ec90746f7c77fe0b2286dad2c0046b1546b449c0ac106783433cc3691ffbe23b503d86f7671f
6
+ metadata.gz: 92fedce71a7ba385eb3115fbc38e8a77d360ec06d31ce4079ca177d01f2dfba9c32ffb9a3c1326aed4579820a6cd8772b2ff114bd33e77471ef0234e53be1d0e
7
+ data.tar.gz: 173051b649d8358550a24bec88437d469f99e3f5e8e086611e0a4b83359144454351a8c60700c66486a02023bfbf9079a12a8f31fe75449cb4389cf5a82ff365
data/lib/ducts/client.rb CHANGED
@@ -56,6 +56,8 @@ module Ducts
56
56
  end
57
57
  end
58
58
 
59
+ DuctEventHandlerReturnValue = Struct.new(:value)
60
+
59
61
  class ConnectionEventListener < DuctEventListener
60
62
  attr_writer :onopen, :onclose, :onerror, :onmessage
61
63
  def onopen(event)
@@ -119,6 +121,7 @@ module Ducts
119
121
  @_last_rid = nil
120
122
  @_ws = nil
121
123
  @_waiting_completion = Hash.new
124
+ @_loop_queues = Hash.new
122
125
  end
123
126
 
124
127
  def next_rid
@@ -130,19 +133,19 @@ module Ducts
130
133
  next_id
131
134
  end
132
135
 
133
- def open(wsd_url, uuid = nil, **params, &proc)
134
- _open(wsd_url, uuid, **params, &proc)
136
+ def open(wsd_url, uuid = nil, **params)
137
+ _open(wsd_url, uuid, **params)
135
138
  end
136
139
 
137
140
  def reconnect
138
141
  _reconnect
139
142
  end
140
143
 
141
- def send(rid, eid, data)
144
+ def event_send(rid, eid, data)
142
145
  _send(rid, eid, data)
143
146
  end
144
147
 
145
- def call(eid, data)
148
+ def event_call(eid, data)
146
149
  _call(eid, data)
147
150
  end
148
151
 
@@ -239,20 +242,16 @@ module Ducts
239
242
  @_time_offset = 0
240
243
  @_time_latency = 0
241
244
  @_time_count = 0
242
- set_event_handler(@EVENT['ALIVE_MONITORING']) do |rid, eid, data|
243
- client_received = Time.now.to_f
244
- server_sent, server_received = data
245
- client_sent = @_send_timestamp
246
- new_offset = ((server_received - client_sent) - (client_received - server_sent)) / 2
247
- new_latency = ((client_received - client_sent) - (server_sent - server_received)) / 2
248
- @_time_offset = (@_time_offset * @_time_count + new_offset) / (@_time_count + 1)
249
- @_time_latency = (@_time_latency * @_time_count + new_latency) / (@_time_count + 1)
250
- @_time_count += 1
251
- end
245
+ set_event_handler(@EVENT['ALIVE_MONITORING'], &method(:_alive_monitoring_handler))
246
+ set_event_handler(@EVENT['LOOP_RESPONSE_START'], &method(:_loop_response_handler))
247
+ set_event_handler(@EVENT['LOOP_RESPONSE_NEXT'], &method(:_loop_response_handler))
248
+ set_event_handler(@EVENT['LOOP_RESPONSE_END'], &method(:_loop_response_end_handler))
249
+ set_event_handler(@EVENT['DIVIDED_RESPONSE_APPEND'], &method(:_divided_response_append_handler))
250
+ set_event_handler(@EVENT['DIVIDED_RESPONSE_END'], &method(:_divided_response_end_handler))
252
251
  rid = next_rid
253
252
  eid = @EVENT['ALIVE_MONITORING']
254
253
  value = @_send_timestamp
255
- send(rid, eid, value)
254
+ _send(rid, eid, value)
256
255
  end
257
256
 
258
257
  def _onreconnect(connection_event)
@@ -267,7 +266,7 @@ module Ducts
267
266
  def _call(eid, data)
268
267
  rid = next_rid
269
268
  _send(rid, eid, data)
270
- raise if @_waiting_completion.keys.include? rid
269
+ warn Message.construct(Message::Level::WARNING, 'request ID is duplicated.') if @_waiting_completion.keys.include? rid
271
270
  EM::Completion.new.tap { |completion| @_waiting_completion[rid] = completion }
272
271
  end
273
272
 
@@ -285,14 +284,15 @@ module Ducts
285
284
  begin
286
285
  @catchall_event_handler.call(rid, eid, data)
287
286
  handle = @_event_handler[eid]
288
- handle = @uncaught_event_handler unless handle
289
- handle.call(rid, eid, data)
287
+ handle ||= @uncaught_event_handler
288
+ ret = handle.call(rid, eid, data)
289
+ data = ret.value if ret.instance_of? DuctEventHandlerReturnValue
290
290
  completion = @_waiting_completion.delete(rid)
291
291
  if completion
292
292
  if eid > 0
293
293
  completion.succeed(data)
294
294
  else
295
- completion.fail(DuctError.execption(data))
295
+ completion.fail(DuctError.exception(data))
296
296
  end
297
297
  end
298
298
  rescue => error
@@ -302,5 +302,54 @@ module Ducts
302
302
  @event_error_handler.call(-1, -1, nil, error)
303
303
  end
304
304
  end
305
+
306
+ def _alive_monitoring_handler(rid, eid, data)
307
+ client_received = Time.now.to_f
308
+ server_sent, server_received = data
309
+ client_sent = @_send_timestamp
310
+ new_offset = ((server_received - client_sent) - (client_received - server_sent)) / 2
311
+ new_latency = ((client_received - client_sent) - (server_sent - server_received)) / 2
312
+ @_time_offset = (@_time_offset * @_time_count + new_offset) / (@_time_count + 1)
313
+ @_time_latency = (@_time_latency * @_time_count + new_latency) / (@_time_count + 1)
314
+ @_time_count += 1
315
+ end
316
+
317
+ def _loop_response_handler(rid, eid, data)
318
+ warn Message.construct(Message::Level::WARNING, 'loop response has error.') if eid.negative?
319
+ source_eid = data[1]
320
+ source_data = data[2]
321
+ @catchall_event_handler.call(rid, source_eid, source_data)
322
+ handle = @_event_handler[source_eid.abs]
323
+ handle ||= @uncaught_event_handler
324
+ handle.call(rid, source_eid, source_data)
325
+ @_loop_queues[rid] ||= EM::Queue.new
326
+ queue = @_loop_queues[rid]
327
+ queue.push(source_data) if source_data
328
+ DuctEventHandlerReturnValue.new(queue)
329
+ end
330
+
331
+ def _loop_response_end_handler(rid, eid, data)
332
+ warn Message.construct(Message::Level::WARNING, 'loop response end has error.') if eid.negative?
333
+ source_eid = data[1]
334
+ source_data = data[2]
335
+ warn Message.construct(Message::Level::WARNING, "loop response end has data: #{source_data}.") if source_data
336
+ @catchall_event_handler.call(rid, source_eid, source_data)
337
+ handle = @_event_handler[source_eid.abs]
338
+ handle ||= @uncaught_event_handler
339
+ handle.call(rid, source_eid, source_data)
340
+ queue = @_loop_queues.delete(rid)
341
+ queue.push(nil)
342
+ DuctEventHandlerReturnValue.new(source_eid)
343
+ end
344
+
345
+ def _divided_response_append_handler(rid, eid, data)
346
+ raise 'Not implemented.'
347
+ # TODO
348
+ end
349
+
350
+ def _divided_response_end_handler(rid, eid, data)
351
+ raise 'Not implemented.'
352
+ # TODO
353
+ end
305
354
  end
306
355
  end
@@ -4,8 +4,8 @@ module Ducts
4
4
  class Client
5
5
  module Version
6
6
  MAJOR = 0
7
- MINOR = 1
8
- PATCH = 1
7
+ MINOR = 4
8
+ PATCH = 0
9
9
  end
10
10
 
11
11
  VERSION = [ Version::MAJOR, Version::MINOR, Version::PATCH ].map(&:to_s).join('.')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ducts-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenshiro Ueda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-19 00:00:00.000000000 Z
11
+ date: 2021-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket