module Glim::LocalServer

Public Class Methods

start(config) click to toggle source
# File lib/local_server.rb, line 320
def self.start(config)
  config['url'] = "http://#{config['host']}:#{config['port']}"
  project_dir = config.site.project_dir

  websocket_server, listener = nil, nil

  if config['livereload']
    websocket_server = WebSocket::Server.new(host: config['host'], port: config['livereload_port'])
    websocket_server.start
  end

  server = WEBrick::HTTPServer.new(
    BindAddress: config['host'],
    Port:        config['port'],
    Logger:      WEBrick::Log.new('/dev/null'),
    AccessLog:   [],
  )

  server.mount('/', Servlet, config)

  if config['watch'] || config['livereload']
    listener = Listen.to(project_dir) do |modified, added, removed|
      paths = [ *modified, *added, *removed ]
      $log.debug("File changes detected for: #{paths.select { |path| path.start_with?(project_dir) }.map { |path| Util.relative_path(path, project_dir) }.join(', ')}")
      config.reload
      websocket_server.broadcast('reload') if websocket_server
    end
    $log.debug("Watching #{project_dir} for changes")
    listener.start
  end

  trap("INT") do
    server.shutdown
  end

  if config['open_url'] && File.executable?('/usr/bin/open')
    page = config.site.links['.']
    system('/usr/bin/open', page ? page.url : config['url'])
  end

  $log.info("Starting server on #{config['url']}")
  server.start
  $log.info("Server shutting down…")

  listener.stop if listener

  if websocket_server
    if config['open_url'] && File.executable?('/usr/bin/open')
      websocket_server.broadcast('close')
    end

    websocket_server.shutdown
  end
end