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

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