rdkit 0.1.4 → 0.1.5

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
  SHA1:
3
- metadata.gz: 10a0bd157c17b8098e43a87046384ebc7e9ae534
4
- data.tar.gz: 7ad179971146d74db65ffbc8a6999b1b9b8bb034
3
+ metadata.gz: 88ca08b9ed9e2a240465d7d1a7c6c94bbe16e0cd
4
+ data.tar.gz: 700e931ec7471e9c9dee5f28e91a4510642df5bf
5
5
  SHA512:
6
- metadata.gz: f8fd1464e00be7ce386d4eefb1132984cbfb7632ff498eb7df6ddd97fd07127122f27b8828c1722ad22b515b606a686286fc5a5e550adc964c00409e7950aa62
7
- data.tar.gz: 2d71bef8dfac46a9b7d4274ab755e83a3f944a05a401def43b1bda6932d69c1a2cef181a229a015faf5299d73d22361778502e9653c4e52df61d251572e304a6
6
+ metadata.gz: d764b39f08556c73f39aa34f9a479a55945953bd8eba366ec299560246b0b80a2b0e836c780c14d43bbc2d2a3f2cf9495f9212c214b8617a8ff2cb92a83dfd55
7
+ data.tar.gz: f308794848e69d7f80cb1af00fbb9dd57ec1ee98f0925a948c65758f6b3a45fab4271f07497d1bd48a34ffea72533390ed34d596a8d69e4ebad343651cdc0bd6
data/README.md CHANGED
@@ -417,6 +417,12 @@ $ redis-benchmark -p 3721 -n 10 nonblock
417
417
 
418
418
  See the difference between blocking and non-blocking commands?
419
419
 
420
+ #### Implementing blocked commands
421
+
422
+ Since RDKit version 0.1.5, it allows injection of additional IO handlers into the main loop.
423
+
424
+ For examples, please refer to `examples/ioinject` for an injected UDP echo server.
425
+
420
426
  ### Implemented Redis Commands
421
427
 
422
428
  | command | support | note |
@@ -0,0 +1,10 @@
1
+ require 'rdkit'
2
+
3
+ require_relative 'ioinject/version'
4
+ require_relative 'ioinject/core'
5
+ require_relative 'ioinject/resp_responder'
6
+ require_relative 'ioinject/server'
7
+
8
+ server = IOInject::Server.new
9
+
10
+ server.start
@@ -0,0 +1,41 @@
1
+ require 'socket'
2
+
3
+ module IOInject
4
+ class Core < RDKit::Core
5
+ def initialize(server)
6
+ ############ injection starts here ############
7
+ @injection_called = 0
8
+
9
+ udp_socket = UDPSocket.new
10
+ host, port = 'localhost', 8080
11
+ udp_socket.bind(host, port)
12
+
13
+ puts "UDP echo server injection code running at #{host}:#{port}"
14
+
15
+ server.inject_io_handler(udp_socket) do
16
+ begin
17
+ msg, sender_addrinfo, _, *controls = udp_socket.recvmsg_nonblock
18
+
19
+ p [msg, sender_addrinfo, _, *controls]
20
+
21
+ # echo back
22
+ udp_socket.send(msg, 0, sender_addrinfo)
23
+
24
+ @injection_called += 1
25
+ rescue IO::WaitReadable
26
+ # simply pass
27
+ end
28
+ end
29
+ ############ injection ends here ############
30
+ end
31
+
32
+ def tick!; end
33
+
34
+ def introspection
35
+ {
36
+ ioinject_version: IOInject::VERSION,
37
+ injection_called: @injection_called
38
+ }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,6 @@
1
+ module IOInject
2
+ class RESPResponder < RDKit::RESPResponder
3
+ def initialize
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module IOInject
2
+ class Server < RDKit::Server
3
+ def initialize
4
+ super('0.0.0.0', 3721)
5
+
6
+ # @core is required by RDKit
7
+ @core = Core.new(self)
8
+
9
+ # @responder is also required by RDKit
10
+ @responder = RESPResponder.new
11
+ end
12
+
13
+ def introspection
14
+ super.merge(ioinject: @core.introspection)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module IOInject
2
+ VERSION = '0.0.1'
3
+ end
@@ -51,6 +51,12 @@ module RDKit
51
51
  reader, writer = create_pipe
52
52
  @selfpipe = { :reader => reader, :writer => writer }
53
53
  @signal_queue = []
54
+
55
+ @additional_io_handlers = {}
56
+ end
57
+
58
+ def inject_io_handler(another_io, &block)
59
+ @additional_io_handlers[another_io] = block
54
60
  end
55
61
 
56
62
  def start
@@ -313,7 +319,7 @@ module RDKit
313
319
  end
314
320
 
315
321
  def process_clients
316
- readable, _ = IO.select([@server_socket, @selfpipe[:reader], @clients.keys].flatten, nil, nil, 1.0 / HZ)
322
+ readable, _ = IO.select([@server_socket, @selfpipe[:reader], @clients.keys, @additional_io_handlers.keys].flatten, nil, nil, 1.0 / HZ)
317
323
 
318
324
  if readable
319
325
  readable.each do |socket|
@@ -321,6 +327,8 @@ module RDKit
321
327
  add_client
322
328
  elsif socket == @selfpipe[:reader]
323
329
  handle_signals
330
+ elsif block = @additional_io_handlers[socket]
331
+ block.call
324
332
  else
325
333
  process(socket)
326
334
  end
@@ -1,3 +1,3 @@
1
1
  module RDKit
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Forrest Ye
@@ -200,6 +200,11 @@ files:
200
200
  - example/http/core.rb
201
201
  - example/http/responder.rb
202
202
  - example/http/server.rb
203
+ - example/ioinject.rb
204
+ - example/ioinject/core.rb
205
+ - example/ioinject/resp_responder.rb
206
+ - example/ioinject/server.rb
207
+ - example/ioinject/version.rb
203
208
  - lib/rdkit.rb
204
209
  - lib/rdkit/callbacks.rb
205
210
  - lib/rdkit/client.rb