Class: DatawireQuarkCore::Runtime

Inherits:
Object
  • Object
show all
Defined in:
lib/datawire-quark-core.rb

Instance Method Summary collapse

Constructor Details

#initializeRuntime

Returns a new instance of Runtime.



545
546
547
548
549
# File 'lib/datawire-quark-core.rb', line 545

def initialize()
  @events = Eventor.new self
  @log = Logger.new "quark.runtime"
  @servers = Servers.new(@events)
end

Instance Method Details

#callSafely(unary_callable, default) ⇒ Object



667
668
669
670
671
672
673
674
# File 'lib/datawire-quark-core.rb', line 667

def callSafely(unary_callable, default)
  begin
    ::Quark.quark.callUnaryCallable(unary_callable, nil)
  rescue
    @log.error("Exception while calling safely: #{$!}")
    default
  end
end

#codecObject



651
652
653
# File 'lib/datawire-quark-core.rb', line 651

def codec
  return Codec.new
end

#fail(message) ⇒ Object



642
643
644
645
# File 'lib/datawire-quark-core.rb', line 642

def fail(message)
  @log.error message
  exit! 1
end

#logger(topic) ⇒ Object



647
648
649
# File 'lib/datawire-quark-core.rb', line 647

def logger(topic)
  return Logger.new topic
end

#nowObject



655
656
657
# File 'lib/datawire-quark-core.rb', line 655

def now
  (Time.now.to_f * 1000).round
end

#open(url, handler) ⇒ Object



599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
# File 'lib/datawire-quark-core.rb', line 599

def open(url, handler)
  begin
  src = @events.add "ws client"
  client = WebsocketClient.new(url)
  sock = WebsocketAdapter.new(client)
  events = @events
  events.event { handler.onWSInit(sock) }
  client.on_client(:open) do |wsevt|
    # puts "open"
    sock.opened = true
    events.event { handler.onWSConnected(sock) }
  end
  client.on_client(:message) do |wsevt|
    # puts "message"
    case wsevt.data
    when Array then
      buffer = Buffer.new(wsevt.data.pack("C*"))
      events.event { handler.onWSBinary(sock, buffer) }
    when String then
      events.event { handler.onWSMessage(sock, wsevt.data) }
    end
  end
  client.on_client(:close) do |wsevt|
    # puts "close"
    if sock.opened
      events.event { handler.onWSClosed(sock) }
    end
    events.event(final:src) { handler.onWSFinal(sock) }
  end
  client.on_client(:error) do |wsevt|
    # puts self
    events.event { handler.onWSError(sock, ::Quark.quark.WSError.new(wsevt.message)) }
  end
  client.issues.on(:start_failed) do |err|
    events.event { handler.onWSError(sock, ::Quark.quark.WSError.new(err.to_s)) }
    events.event(final:src) { handler.onWSFinal(sock) }
  end
  Thread.new { client.run }
  rescue ::Exception => err
    puts "AIEEE", err, err.backtrace
  end
end

#request(request, handler) ⇒ Object



554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
# File 'lib/datawire-quark-core.rb', line 554

def request(request, handler)
  src = @events.add "http request"
  t = Thread.new do
    begin
      url = request.getUrl
      @events.event { handler.onHTTPInit url }
      headers = {}
      request.getHeaders.each { |k| headers[k] = request.getHeader k }
      uri = URI(url)
      req = Net::HTTPGenericRequest.new(request.getMethod.upcase, 1, 1, uri, headers)
      req.body = request.getBody
      res = Net::HTTP.start(uri.host, uri.port,
                            :use_ssl => uri.scheme == 'https') do | http |
        http.request(req)
      end
      response = HTTP::Response.new
      response.setCode(res.code.to_i)
      response.setBody(res.body)
      @events.event { handler.onHTTPResponse request, response }
    rescue Exception => e
      #@log.warn "EXCEPTION: #{e.inspect}"
      #@log.warn "MESSAGE: #{e.message}"
      @events.event { handler.onHTTPError request, ::Quark.quark.HTTPError.new(e.message) }
    ensure
      @events.event(final:src) { handler.onHTTPFinal request }
    end
  end
end

#respond(request, response) ⇒ Object



591
592
593
594
595
596
597
# File 'lib/datawire-quark-core.rb', line 591

def respond(request, response)
  if request.rs == response
    request.respond :http_response
  else
    request.fail! 500, "servlet failed to pair up request and response\r\n"
  end
end

#schedule(task, delay) ⇒ Object



550
551
552
553
# File 'lib/datawire-quark-core.rb', line 550

def schedule(task, delay)
  src = @events.add "timer"
  @events.schedule(delay) { @events.event(final:src) { task.onExecute self } }
end

#serveHTTP(url, servlet) ⇒ Object



583
584
585
# File 'lib/datawire-quark-core.rb', line 583

def serveHTTP(url, servlet)
  @servers.add(HTTPAdapter.new(url, servlet, @events))
end

#serveWS(url, servlet) ⇒ Object



587
588
589
# File 'lib/datawire-quark-core.rb', line 587

def serveWS(url, servlet)
  @servers.add(WSAdapter.new(url, servlet, @events))
end

#sleep(seconds) ⇒ Object



659
660
661
# File 'lib/datawire-quark-core.rb', line 659

def sleep(seconds)
  Kernel.sleep seconds
end

#uuidObject



663
664
665
# File 'lib/datawire-quark-core.rb', line 663

def uuid
  SecureRandom.uuid
end