Sha256: 2b4fa43a4e0f4d4fd1911d84a5d8a69fa9cd0a278360ef8505d7e346e5274d50

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

module ServiceWorker
  class Middleware
    def initialize(app, opts = {})
      @app = app
      @opts = opts
      @headers = opts.fetch(:headers, {}).merge(default_headers)
      @router = opts.fetch(:routes, ServiceWorker::Router.new)
    end

    def call(env)
      case env["REQUEST_METHOD"]
      when "GET", "HEAD"
        path = env["PATH_INFO"].chomp("/")
        info("responding to #{path}")
        route = @router.match_route(path)
        return respond_to_route(route, env) if route
      end

      @app.call(env)
    end

    private

    def default_headers
      {
        "Cache-Control" => "private, max-age=0, no-cache"
      }
    end

    def respond_to_route(route, env)
      status, headers, body = process_handler(route, env)

      [status, headers.merge(@headers).merge(route.headers), body]
    end

    def process_handler(route, env)
      handler.call(env.merge("serviceworker.asset_name" => route.asset_name))
    end

    def info(msg)
      logger.info "[#{self.class}] - #{msg}"
    end

    # TODO
    # provide non-rails handler as default
    def handler
      @handler ||= @opts.fetch(:handler)
    end

    def logger
      @logger ||= @opts.fetch(:logger, Logger.new(STDOUT))
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
serviceworker-rails-0.2.0 lib/serviceworker/middleware.rb