module Ansible::Transmit

Public Class Methods

extended(base) click to toggle source
# File lib/ansible/transmit.rb, line 3
def self.extended(base)
  base.class_eval { include ActionController::Live }
end

Public Instance Methods

build_route(beacon_name) click to toggle source
# File lib/ansible/transmit.rb, line 18
def build_route(beacon_name)
  controller_name = self.to_s.underscore.gsub('_controller', '')
  Rails.application.routes.draw do
    Rails.application.routes.routes.named_routes.each do |path, route|
      get path, route.defaults
    end
    get "/#{controller_name}/#{beacon_name}" => "#{controller_name}##{beacon_name}"
  end
end
transmit(name) click to toggle source
# File lib/ansible/transmit.rb, line 7
def transmit(name)
  beacon_name = :"#{name}_ansible_beacon"
  build_route beacon_name
  model = ConstantResolver.new(name).lookup_constant

  model.extend TransmitModalHelper

  define_method beacon_name, beacon_action
  name
end

Private Instance Methods

beacon_action() click to toggle source
# File lib/ansible/transmit.rb, line 30
def beacon_action
  Proc.new do
    begin
      beacon = __method__
      model = ConstantResolver.new(beacon.to_s.split("_").first).lookup_constant

      headers['Content-Type'] = 'text/event-stream'
      sse = SSE.new(response.stream)

      model.on_new_message do |event, message|
        sse.write event, message
      end
    ensure
      sse.close
    end
  end
end