Class: Terminus::Proxy::DriverBody

Inherits:
Object
  • Object
show all
Defined in:
lib/terminus/proxy/driver_body.rb

Constant Summary collapse

ASYNC_BROWSERS =
%w[Android]
TEMPLATE =
ERB.new(<<-HTML)
  <script type="text/javascript" id="terminus-data">
    TERMINUS_STATUS = <%= @response.first %>;
    TERMINUS_HEADERS = {};
    <% @response[1].each do |key, value| %>
      TERMINUS_HEADERS[<%= key.inspect %>] = <%= value.inspect %>;
    <% end %>
    TERMINUS_SOURCE = <%= page_source %>;
  </script>
  <script type="text/javascript">
    (function() {
      var terminusScript = document.getElementById('terminus-data');
      terminusScript.parentNode.removeChild(terminusScript);
    })();
  </script>
  <% if @async %>
    <script type="text/javascript">
      (function() {
        var head = document.getElementsByTagName('head')[0],
            script = document.createElement('script');

        script.type = 'text/javascript';
        script.src = '<%= @host %>/bootstrap.js';
        head.appendChild(script);
      })();
    </script>
  <% else %>
    <script type="text/javascript" src="<%= @host %><%= FAYE_MOUNT %>/client.js"></script>
    <script type="text/javascript" src="<%= @host %>/compiled/terminus-min.js"></script>
    <script type="text/javascript">
      setTimeout(function() {
        Terminus.connect('<%= @env['SERVER_NAME'] %>', <%= Terminus.port %>);
      }, 0);
    </script>
  <% end %>
HTML

Instance Method Summary collapse

Constructor Details

#initialize(env, response) ⇒ DriverBody

Returns a new instance of DriverBody.



44
45
46
47
48
49
50
# File 'lib/terminus/proxy/driver_body.rb', line 44

def initialize(env, response)
  @env      = env
  @response = response
  @body     = response[2]
  @host     = "http://#{@env['SERVER_NAME']}:#{Terminus.port}"
  @async    = ASYNC_BROWSERS.include?(UserAgent.parse(env['HTTP_USER_AGENT']).browser)
end

Instance Method Details

#each(&block) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/terminus/proxy/driver_body.rb', line 52

def each(&block)
  script_injected = false
  @source = ''

  @body.each do |fragment|
    @source << fragment
    output = inject_script(fragment)
    script_injected ||= (output != fragment)
    block.call(output)
  end

  unless script_injected
    block.call(TEMPLATE.result(binding))
  end
end