class MessageBus::Rack::Diagnostics

Public Class Methods

new(app, config = {}) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 4
def initialize(app, config = {})
  @app = app
  @bus = config[:message_bus] || MessageBus
end

Public Instance Methods

asset_contents(asset) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 25
def asset_contents(asset)
  File.open(asset_path(asset)).read
end
asset_path(asset) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 29
def asset_path(asset)
  File.expand_path("../../../../assets/#{asset}", __FILE__)
end
call(env) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 63
def call(env)

  return @app.call(env) unless env['PATH_INFO'].start_with? '/message-bus/_diagnostics'

  route = env['PATH_INFO'].split('/message-bus/_diagnostics')[1]

  if @bus.is_admin_lookup.nil? || !@bus.is_admin_lookup.call(env)
    return [403, {}, ['not allowed']]
  end

  return index unless route

  if route == '/discover'
    user_id = @bus.user_id_lookup.call(env)
    @bus.publish('/_diagnostics/discover', user_id: user_id)
    return [200, {}, ['ok']]
  end

  if route =~ /^\/hup\//
    hostname, pid = route.split('/hup/')[1].split('/')
    @bus.publish('/_diagnostics/hup', {hostname: hostname, pid: pid.to_i})
    return [200, {}, ['ok']]
  end

  asset = route.split('/assets/')[1]
  if asset && !asset !~ /\//
    content = asset_contents(asset)
    split = asset.split('.')
    if split[1] == 'handlebars'
      content = translate_handlebars(split[0],content)
    end
    return [200, {'content-type' => 'text/javascript;'}, [content]]
  end

  return [404, {}, ['not found']]
end
file_hash(asset) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 20
def file_hash(asset)
  require 'digest/sha1'
  Digest::SHA1.hexdigest(asset_contents(asset))
end
generate_script_tag(name) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 16
def  generate_script_tag(name)
  "<script src='/message-bus/_diagnostics/assets/#{name}?#{file_hash(name)}' type='text/javascript'></script>"
end
indent(string) click to toggle source

from ember-rails

# File lib/message_bus/rack/diagnostics.rb, line 59
def indent(string)
  string.gsub(/$(.)/m, "\\1  ").strip
end
index() click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 33
  def index
    html = <<HTML
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id="app"></div>
    #{js_asset "jquery-1.8.2.js"}
    #{js_asset "handlebars.js"}
    #{js_asset "ember.js"}
    #{js_asset "message-bus.js"}
    #{js_asset "application.handlebars"}
    #{js_asset "index.handlebars"}
    #{js_asset "application.js"}
  </body>
</html>
HTML
    return [200, {"content-type" => "text/html;"}, [html]]
  end
js_asset(name) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 9
def js_asset(name)
  return generate_script_tag(name) unless @bus.cache_assets
  @@asset_cache ||= {}
  @@asset_cache[name] ||= generate_script_tag(name)
  @@asset_cache[name]
end
translate_handlebars(name, content) click to toggle source
# File lib/message_bus/rack/diagnostics.rb, line 54
def translate_handlebars(name, content)
  "Ember.TEMPLATES['#{name}'] = Ember.Handlebars.compile(#{indent(content).inspect});"
end