class Wedge::Middleware::Responder

Attributes

app[RW]
env[RW]
extension[RW]
opal[R]
scope[R]
skip_call[R]
wedge_path[RW]

Public Class Methods

new(app, opal, scope, skip_call, env) click to toggle source
# File lib/wedge/middleware.rb, line 40
def initialize(app, opal, scope, skip_call, env)
  @app = app; @opal = opal; @scope = (scope || self); @skip_call = skip_call; @env = env
end

Public Instance Methods

respond() click to toggle source
# File lib/wedge/middleware.rb, line 44
def respond
  if path =~ Wedge.assets_url_regex
    @wedge_path, @extension = $1, $2

    if extension == 'call'
      return response.finish if skip_call

      body, headers, status = [], {}, 200

      body_data = request.body.read
      data      = request.params

      begin
        # try json
        data.merge!(body_data ? JSON.parse(body_data) : {})
      rescue
        begin
          # try form data
          data.merge!(body_data ? Rack::Utils.parse_query(body_data) : {})
        rescue
          # no data
        end
      end

      data          = data.indifferent
      name          = data.delete(:__wedge_name__)
      method_called = data.delete(:__wedge_method__)
      # no clue why you need to do __wedge_args__[]
      method_args   = data.delete(:__wedge_args__) || data.delete(:'__wedge_args__[]')

      if wedge_path == 'wedge/list_assets'
        res = {
          urls: Wedge.get_asset_urls(data[:path_name]),
          code: Wedge::Opal::Sprockets.load_asset(data[:path_name], Wedge.config.opal[:server].sprockets)
        }
      elsif method_args == '__wedge_data__' && data
        method_args = [data]
        res         = Wedge.scope!(scope, method_called)[name].send(method_called, *method_args) || ''
      else
        # This used to send things like init, we need a better way to
        # send client config data to the server
        # res = scope.wedge(name, data).send(method_called, *method_args) || ''
        res = Wedge.scope!(scope, method_called)[name].send(method_called, *method_args) || ''
      end

      # discuss: I don't think we should update the csrf token # every ajax call
      # headers["WEDGE-CSRF-TOKEN"] = self.csrf_token if self.methods.include? :csrf_token

      if res.is_a? Hash
        headers["Content-Type"] = 'application/json; charset=UTF-8'
        body << res.to_json
      else
        body << res.to_s
      end

      [status, headers, body]
    else
      if Wedge.config.debug
        if path[@opal[:maps_prefix]]
          @opal[:maps_app].call env
        else
          e = env.deep_dup
          e['PATH_INFO'] = env['PATH_INFO'].sub "#{Wedge.assets_url_with_host}/", ''
          @opal[:sprockets].call e
        end
      else
        status, headers, body = @opal[:server].call env

        headers['Content-Type'] = 'application/javascript; charset=UTF-8'

        if Wedge.config.gzip_assets
          require 'zlib'

          headers['Content-Encoding'] = 'gzip'
          headers.delete 'Content-Length'

          wio = StringIO.new("")
          w_gz = Zlib::GzipWriter.new(wio)
          w_gz.write((body.instance_variable_get(:@body) || body).last.to_s)
          w_gz.close

          body = wio.string
        end

        [status, headers, [body]]
      end
    end
  else
    response.finish
  end
end
wedge(*args, &block) click to toggle source
# File lib/wedge/middleware.rb, line 136
def wedge(*args, &block)
  Wedge[*args, &block]
end

Private Instance Methods

path() click to toggle source
# File lib/wedge/middleware.rb, line 142
def path
  @env['PATH_INFO'].present?? @env['PATH_INFO'] : @env['PATH_INFO'] = @env['REQUEST_PATH']
end
request() click to toggle source
# File lib/wedge/middleware.rb, line 146
def request
  @request ||= Rack::Request.new(@env)
end
response() click to toggle source
# File lib/wedge/middleware.rb, line 150
def response
  @response ||= begin
    status, headers, body = (@app ? @app.call(request.env) : [404, {}, ''])
    Rack::Response.new(body, status, headers)
  end
end