Sha256: 87328379b0d07454d62441752ef755e28612df9d9714481458146df6ca7568ba

Contents?: true

Size: 1.81 KB

Versions: 4

Compression:

Stored size: 1.81 KB

Contents

require 'rack'
require 'listen'
require 'better_errors'

module Flutterby
  class Server
    def initialize(root)
      @root = root
    end

    def run!(port: 4004)
      # Set up listener
      listener = Listen.to(@root.fs_path) do |modified, added, removed|
        # puts "modified absolute path: #{modified}"
        # puts "added absolute path: #{added}"
        # puts "removed absolute path: #{removed}"

        Flutterby.logger.info "Change detected, reloading everything!"
        @root.reload!
        @root.stage!
      end

      # Set up Rack app
      BetterErrors.application_root = __dir__
      this = self
      app = Rack::Builder.app do |app|
        app.use BetterErrors::Middleware
        app.run this
      end

      # Set up server
      server = Rack::Handler::WEBrick

      # Make sure we handle interrupts correctly
      trap('INT') do
        listener.stop
        server.shutdown
      end

      # Go!
      listener.start
      server.run app, Port: port, Logger: Flutterby.logger
    end

    def call(env)
      req = Rack::Request.new(env)
      res = Rack::Response.new([], 200, {})

      # Look for target node in path registry
      if node = find_node_for_path(req.path)
        # Determine MIME type
        mime_type = MIME::Types.type_for(node.ext) || "text/plain"

        # Build response
        res.headers["Content-Type"] = mime_type
        res.body = [node.render(layout: true)]
      else
        res.status = 404
        res.headers["Content-Type"] = "text/html"
        res.body = ["404"]
      end

      res
    end

    def find_node_for_path(path)
      if node = @root.find(path, public_only: true)
        # If the node is a folder, try and find its "index" node.
        # Otherwise, use the node directly.
        node.folder? ? node.find('index') : node
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
flutterby-0.6.0 lib/flutterby/server.rb
flutterby-0.5.2 lib/flutterby/server.rb
flutterby-0.5.1 lib/flutterby/server.rb
flutterby-0.5.0 lib/flutterby/server.rb