Sha256: 91c3fdc91cef156bea9a24ef9c444cf67764d3eb2c5d457c93844410102f46ea

Contents?: true

Size: 1.91 KB

Versions: 1

Compression:

Stored size: 1.91 KB

Contents

require 'opal'
require 'erb'

module Opal
  class Server

    attr_accessor :debug, :index_path, :main, :public_dir, :sprockets

    def initialize(debug = true)
      @sprockets = Sprockets::Environment.new
      Opal.paths.each { |p| @sprockets.append_path p }

      @public_dir = '.'
      @debug = debug

      yield self if block_given?
      create_app
    end

    def append_path(path)
      @sprockets.append_path path
    end

    def create_app
      server, sprockets = self, @sprockets

      @app = Rack::Builder.app do
        map('/assets') { run sprockets }
        use Index, server
        run Rack::Directory.new(server.public_dir)
      end
    end

    def call(env)
      @app.call env
    end

    class Index

      def initialize(app, server)
        @app = app
        @server = server
        @index_path = server.index_path
      end

      def call(env)
        if %w[/ /index.html].include? env['PATH_INFO']
          [200, { 'Content-Type' => 'text/html' }, [html]]
        else
          @app.call env
        end
      end

      def html
        source = if @index_path
          raise "index does not exist: #{@index_path}" unless File.exist?(@index_path)
          File.read @index_path
        else
          SOURCE
        end

        ERB.new(source).result binding
      end

      def javascript_include_tag(source)
        if @server.debug
          assets = @server.sprockets[source].to_a

          raise "Cannot find asset: #{source}" if assets.empty?

          scripts = assets.map do |a|
            %Q{<script src="/assets/#{ a.logical_path }?body=1"></script>}
          end

          scripts.join "\n"
        else
          "<script src=\"/assets/#{source}.js\"></script>"
        end
      end

      SOURCE = <<-HTML
  <!DOCTYPE html>
  <html>
  <head>
    <title>Opal Server</title>
  </head>
  <body>
    <%= javascript_include_tag @server.main %>
  </body>
  </html>
      HTML
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
opal-0.3.41 lib/opal/server.rb