Class: Rack::SpaApp

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/spa_app.rb

Class Method Summary collapse

Class Method Details

.dependencies(build_folder, immutable: true, enforce_ssl: true, service_worker_allowed: nil, index_bytes: nil) ⇒ Object

Return Rack middleware dependencies for the SPA app.

Parameters:

  • build_folder (String, Pathname)

    Path to the build folder.

  • immutable (true, false) (defaults to: true)

    True to use Rack::Immutable middleware, so that files that look fingerprinted (<name>.<git sha>.ext) get immutable cache headers.

  • enforce_ssl (true, false) (defaults to: true)

    True to use Rack::SsslEnforcer. Requires ‘rack-ssl-enforcer` gem.

  • service_worker_allowed (String, nil) (defaults to: nil)

    Scope of the server worker for the Service-Worker-Allowed header.

  • index_bytes (String, nil) (defaults to: nil)

    Bytes of the app’s index.html file. If not passed, use the contents of ‘<build_folder>/index.html`.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/rack/spa_app.rb', line 18

def self.dependencies(
  build_folder,
  immutable: true,
  enforce_ssl: true,
  service_worker_allowed: nil,
  index_bytes: nil
)
  index_bytes ||= File.read("#{build_folder}/index.html")
  result = []
  result << [Rack::SslEnforcer, {redirect_html: false}] if enforce_ssl
  result << [Rack::ConditionalGet, {}]
  result << [Rack::ETag, {}]
  result << [Rack::Immutable, {match: immutable.is_a?(TrueClass) ? nil : immutable}] if immutable
  result << [Rack::SpaRewrite, {index_bytes:, html_only: true}]
  result << [Rack::ServiceWorkerAllowed, {scope: service_worker_allowed}] if service_worker_allowed
  result << [Rack::Static, {urls: [""], root: build_folder.to_s, cascade: true}]
  result << [Rack::SpaRewrite, {index_bytes:, html_only: false}]
  return result
end

.install(builder, dependencies) ⇒ Object



38
39
40
# File 'lib/rack/spa_app.rb', line 38

def self.install(builder, dependencies)
  dependencies.each { |cls, opts| builder.use(cls, **opts) }
end

.run(builder) ⇒ Object



42
43
44
# File 'lib/rack/spa_app.rb', line 42

def self.run(builder)
  builder.run Rack::LambdaApp.new(->(_) { raise "Should not see SpaApp fallback" })
end

.run_spa_app(builder, build_folder, enforce_ssl: true, immutable: true, index_bytes: nil, **kw) ⇒ Object



46
47
48
49
50
# File 'lib/rack/spa_app.rb', line 46

def self.run_spa_app(builder, build_folder, enforce_ssl: true, immutable: true, index_bytes: nil, **kw)
  deps = self.dependencies(build_folder, enforce_ssl:, immutable:, index_bytes:, **kw)
  self.install(builder, deps)
  self.run(builder)
end