Class: Wedge::Middleware::Responder

Inherits:
Object
  • Object
show all
Defined in:
lib/wedge/middleware.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, opal, scope, skip_call, env) ⇒ Responder

Returns a new instance of Responder.



40
41
42
# 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

Instance Attribute Details

#appObject

Returns the value of attribute app.



38
39
40
# File 'lib/wedge/middleware.rb', line 38

def app
  @app
end

#envObject

Returns the value of attribute env.



38
39
40
# File 'lib/wedge/middleware.rb', line 38

def env
  @env
end

#extensionObject

Returns the value of attribute extension.



38
39
40
# File 'lib/wedge/middleware.rb', line 38

def extension
  @extension
end

#opalObject (readonly)

Returns the value of attribute opal.



37
38
39
# File 'lib/wedge/middleware.rb', line 37

def opal
  @opal
end

#scopeObject (readonly)

Returns the value of attribute scope.



37
38
39
# File 'lib/wedge/middleware.rb', line 37

def scope
  @scope
end

#skip_callObject (readonly)

Returns the value of attribute skip_call.



37
38
39
# File 'lib/wedge/middleware.rb', line 37

def skip_call
  @skip_call
end

#wedge_pathObject

Returns the value of attribute wedge_path.



38
39
40
# File 'lib/wedge/middleware.rb', line 38

def wedge_path
  @wedge_path
end

Instance Method Details

#respondObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# 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) ⇒ Object



136
137
138
# File 'lib/wedge/middleware.rb', line 136

def wedge(*args, &block)
  Wedge[*args, &block]
end