ducts-client 0.4.0 → 0.4.4

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: de6d875bf28e0042c19c44dbbffa9fbef3f02baebc6038fb0cdbeab5582e14c3
4
- data.tar.gz: c731e1c5f040b2c1615f6515c678f6d2f8736378c04bbeffc6a588346dedeca3
3
+ metadata.gz: e4ed02a6ed450d3495ea4d27af20b735e50959f1d95042dccf7afcca9331e079
4
+ data.tar.gz: f8a5f500b92af0ff4a6f3fca4f4590b480534976c412c969944919ecb7d5c261
5
5
  SHA512:
6
- metadata.gz: 92fedce71a7ba385eb3115fbc38e8a77d360ec06d31ce4079ca177d01f2dfba9c32ffb9a3c1326aed4579820a6cd8772b2ff114bd33e77471ef0234e53be1d0e
7
- data.tar.gz: 173051b649d8358550a24bec88437d469f99e3f5e8e086611e0a4b83359144454351a8c60700c66486a02023bfbf9079a12a8f31fe75449cb4389cf5a82ff365
6
+ metadata.gz: e7621536c5e0dafabfa1d6f47eb0d69a6f96188251e2c83ddc33aeb1d58abc8a32d5ff1b88d7c39dad1c0040d063f428457e2fde85aca1be8c3d4af541ed06e9
7
+ data.tar.gz: 611bd6b7d8bf79eef1abff322f98723e9239a5f63a6f94443baf0a104263eb937d626d06ddaf8cda5884144deb72f4c50c005ff439ce0ce3bd69c64441c919fd
data/lib/ducts/client.rb CHANGED
@@ -120,7 +120,8 @@ module Ducts
120
120
 
121
121
  @_last_rid = nil
122
122
  @_ws = nil
123
- @_waiting_completion = Hash.new
123
+ @_waiting_message_completion = Hash.new
124
+ @_waiting_closed_completion = Array.new
124
125
  @_loop_queues = Hash.new
125
126
  end
126
127
 
@@ -133,29 +134,13 @@ module Ducts
133
134
  next_id
134
135
  end
135
136
 
136
- def open(wsd_url, uuid = nil, **params)
137
- _open(wsd_url, uuid, **params)
138
- end
139
-
140
- def reconnect
141
- _reconnect
142
- end
143
-
144
- def event_send(rid, eid, data)
145
- _send(rid, eid, data)
146
- end
147
-
148
- def event_call(eid, data)
149
- _call(eid, data)
150
- end
151
-
152
- def close
153
- _close
154
- end
155
-
156
137
  def set_event_handler(event_id, &handler)
157
138
  @_event_handler ||= {}
158
- @_event_handler[event_id] = handler
139
+ if handler
140
+ @_event_handler.store(event_id, handler)
141
+ else
142
+ @_event_handler.delete(event_id)
143
+ end
159
144
  end
160
145
 
161
146
  def state
@@ -166,16 +151,16 @@ module Ducts
166
151
  end
167
152
  end
168
153
 
169
- private
170
- def _reconnect(wsd)
171
- if wsd
172
- @WSD = wsd
173
- @EVENT = @WSD['EVENT']
154
+ def reconnect
155
+ completion = EM::Completion.new
156
+ if @_ws
157
+ completion.succeed(self)
158
+ return completion;
174
159
  end
175
- return if @_ws
176
160
  Faye::WebSocket::Client.new(@WSD['websocket_url_reconnect']).tap do |ws|
177
161
  ws.on(:open) do |event|
178
162
  @_ws = ws
163
+ completion.succeed(self)
179
164
  connection_event = DuctConnectionEvent.new('onopen', event)
180
165
  _onreconnect(connection_event)
181
166
  @connection_listener.onopen(connection_event)
@@ -195,10 +180,15 @@ module Ducts
195
180
  @connection_listener.onerror(connection_event)
196
181
  end
197
182
  end
183
+ completion
198
184
  end
199
185
 
200
- def _open(wsd_url, uuid, **params)
201
- return if @_ws
186
+ def open(wsd_url, uuid = nil, **params)
187
+ completion = EM::Completion.new
188
+ if @_ws
189
+ completion.succeed(self)
190
+ return completion;
191
+ end
202
192
  begin
203
193
  query = '?uuid=' + (uuid || 'dummy') + params.map{ |k, v| "&#{k}=#{v}" }.join
204
194
  uri = URI.parse(wsd_url + query)
@@ -213,6 +203,7 @@ module Ducts
213
203
  Faye::WebSocket::Client.new(@WSD['websocket_url']).tap do |ws|
214
204
  ws.on(:open) do |event|
215
205
  @_ws = ws
206
+ completion.succeed(self)
216
207
  connection_event = DuctConnectionEvent.new('onopen', event)
217
208
  _onopen(connection_event)
218
209
  @connection_listener.onopen(connection_event)
@@ -228,6 +219,19 @@ module Ducts
228
219
  @connection_listener.onerror(connection_event)
229
220
  end
230
221
  ws.on(:close) do |event|
222
+ @_ws = nil
223
+ case event.code
224
+ when 1000
225
+ @_waiting_closed_completion.each do |waiting_closed_completion|
226
+ waiting_closed_completion.succeed(event)
227
+ end
228
+ else
229
+ p event.code
230
+ @_waiting_closed_completion.each do |waiting_closed_completion|
231
+ waiting_closed_completion.fail(event)
232
+ end
233
+ end
234
+ @_waiting_closed_completion.clear
231
235
  connection_event = DuctConnectionEvent.new('onclose', event)
232
236
  @connection_listener.onclose(connection_event)
233
237
  end
@@ -235,8 +239,34 @@ module Ducts
235
239
  rescue => error
236
240
  @connection_listener.onerror(DuctConnectionEvent.new('onerror', error))
237
241
  end
242
+ completion
243
+ end
244
+
245
+ def event_send(rid, eid, data)
246
+ msgpack = [ rid, eid, data ].to_msgpack
247
+ @_ws.send(msgpack.chars.map(&:ord))
248
+ rid
249
+ end
250
+
251
+ def event_call(eid, data)
252
+ rid = next_rid
253
+ event_send(rid, eid, data)
254
+ warn Message.construct(Message::Level::WARNING, 'request ID is duplicated.') if @_waiting_message_completion.keys.include? rid
255
+ EM::Completion.new.tap { |completion| @_waiting_message_completion[rid] = completion }
256
+ end
257
+
258
+ def close
259
+ completion = EM::Completion.new
260
+ if @_ws
261
+ @_ws.close
262
+ @_waiting_closed_completion.push(completion)
263
+ else
264
+ completion.succeed(nil)
265
+ end
266
+ completion
238
267
  end
239
268
 
269
+ private
240
270
  def _onopen(event)
241
271
  @_send_timestamp = Time.now.to_f
242
272
  @_time_offset = 0
@@ -251,33 +281,12 @@ module Ducts
251
281
  rid = next_rid
252
282
  eid = @EVENT['ALIVE_MONITORING']
253
283
  value = @_send_timestamp
254
- _send(rid, eid, value)
284
+ event_send(rid, eid, value)
255
285
  end
256
286
 
257
287
  def _onreconnect(connection_event)
258
288
  end
259
289
 
260
- def _send(rid, eid, data)
261
- msgpack = [ rid, eid, data ].to_msgpack
262
- @_ws.send(msgpack.chars.map(&:ord))
263
- rid
264
- end
265
-
266
- def _call(eid, data)
267
- rid = next_rid
268
- _send(rid, eid, data)
269
- warn Message.construct(Message::Level::WARNING, 'request ID is duplicated.') if @_waiting_completion.keys.include? rid
270
- EM::Completion.new.tap { |completion| @_waiting_completion[rid] = completion }
271
- end
272
-
273
- def _close
274
- begin
275
- @_ws.close if @_ws
276
- ensure
277
- @_ws = nil
278
- end
279
- end
280
-
281
290
  def _onmessage(connection_event)
282
291
  begin
283
292
  rid, eid, data = %i(rid eid data).map{ |name| connection_event.source.public_send(name) }
@@ -286,13 +295,13 @@ module Ducts
286
295
  handle = @_event_handler[eid]
287
296
  handle ||= @uncaught_event_handler
288
297
  ret = handle.call(rid, eid, data)
289
- data = ret.value if ret.instance_of? DuctEventHandlerReturnValue
290
- completion = @_waiting_completion.delete(rid)
298
+ handled_data = (ret.instance_of? DuctEventHandlerReturnValue)? ret.value : data
299
+ completion = @_waiting_message_completion.delete(rid)
291
300
  if completion
292
301
  if eid > 0
293
- completion.succeed(data)
302
+ completion.succeed(handled_data)
294
303
  else
295
- completion.fail(DuctError.exception(data))
304
+ completion.fail(DuctError.exception(handled_data))
296
305
  end
297
306
  end
298
307
  rescue => error
@@ -321,10 +330,11 @@ module Ducts
321
330
  @catchall_event_handler.call(rid, source_eid, source_data)
322
331
  handle = @_event_handler[source_eid.abs]
323
332
  handle ||= @uncaught_event_handler
324
- handle.call(rid, source_eid, source_data)
333
+ ret = handle.call(rid, source_eid, source_data)
334
+ handled_source_data = (ret.instance_of? DuctEventHandlerReturnValue)? ret.value : source_data
325
335
  @_loop_queues[rid] ||= EM::Queue.new
326
336
  queue = @_loop_queues[rid]
327
- queue.push(source_data) if source_data
337
+ queue.push(handled_source_data) if handled_source_data
328
338
  DuctEventHandlerReturnValue.new(queue)
329
339
  end
330
340
 
@@ -5,7 +5,7 @@ module Ducts
5
5
  module Version
6
6
  MAJOR = 0
7
7
  MINOR = 4
8
- PATCH = 0
8
+ PATCH = 4
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.4.0
4
+ version: 0.4.4
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-06-08 00:00:00.000000000 Z
11
+ date: 2021-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket