Module: Fox
- Defined in:
- lib/keminglabs-fox-rubby.rb,
lib/keminglabs-fox-rubby/version.rb
Defined Under Namespace
Classes: Abort
Constant Summary collapse
- SockPath =
"fox"
- Context =
ZMQ::Context.new(1)
- Poller =
ZMQ::Poller.new
- VERSION =
"0.0.4"
Class Method Summary collapse
-
._assert(raise_p, req, *dependencies) ⇒ Object
Connects to Fox server via ZeroMQ and ensures that all requested dependencies are met.
- .assert(req, *dependencies) ⇒ Object
- .register(path, handler) ⇒ Object
- .start! ⇒ Object
Class Method Details
._assert(raise_p, req, *dependencies) ⇒ Object
Connects to Fox server via ZeroMQ and ensures that all requested dependencies are met. If something isn’t met, raises a special exception that’s rescued by the main run loop and turned into an abort message.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/keminglabs-fox-rubby.rb', line 21 def self._assert(raise_p, req, *dependencies) deps = dependencies.flatten.uniq.compact return true if deps.empty? sock = Context.socket(ZMQ::REQ) sock.connect req[:socket] sock.send_string JSON.generate({target: req[:target], dependencies: deps}) res = "" sock.recv_string res if (res == "fox-abort") if raise_p raise Abort else false end else true end end |
.assert(req, *dependencies) ⇒ Object
44 45 46 |
# File 'lib/keminglabs-fox-rubby.rb', line 44 def self.assert(req, *dependencies) self._assert true, req, dependencies end |
.register(path, handler) ⇒ Object
49 50 51 52 53 54 55 |
# File 'lib/keminglabs-fox-rubby.rb', line 49 def self.register(path, handler) FileUtils.mkdir_p SockPath + "/" + File.dirname(path) sock = Context.socket(ZMQ::ROUTER) sock.bind "ipc://#{SockPath}/#{path}.ipc" @handlers[sock] = {handler: handler, path: path} nil end |
.start! ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/keminglabs-fox-rubby.rb', line 58 def self.start! @handlers.each do |sock, h| $stderr.puts "Registering handler at: #{h[:path]}" Poller.register_readable sock end Signal.trap("INT") do break Context.terminate end loop do Poller.poll(:blocking) Poller.readables.each do |sock| id, req = recv_multipart sock msg = begin parse_handler_response @handlers[sock][:handler].call(req) rescue Abort => _ {exit: "abort"} rescue Exception => e $stderr.puts e {exit: "fail", log: e.to_s} end $stderr.puts "#{msg[:exit]}: #{req[:target]}" send! sock, id, msg end end end |