ducts-client 0.4.0 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
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