• Jump To … +
    command.coffee configuration.coffee daemon.coffee dns_server.coffee index.coffee installer.coffee logger.coffee utils.coffee
  • daemon.coffee

  • ¶

    A Daemon is the root object in a Masq process. It’s responsible for starting and stopping a DnsServer in tandem.

    {EventEmitter} = require "events"
    DnsServer      = require "./dns_server"
    fs             = require "fs"
    path           = require "path"
    
    module.exports = class Daemon extends EventEmitter
  • ¶

    Create a new Daemon with the given Configuration instance.

        constructor: (@configuration) ->
            super()
            @dnsServer = new DnsServer @configuration
  • ¶

    The daemon stops in response to SIGINT, SIGTERM and SIGQUIT signals.

            process.on "SIGINT",  @stop
            process.on "SIGTERM", @stop
            process.on "SIGQUIT", @stop
    
        start: ->
            return if @starting or @started
            @starting = true
    
            startServer = (server, port, callback) -> process.nextTick ->
                try
                    server.on 'error', callback
    
                    server.once 'listening', ->
                        server.removeListener 'error', callback
                        callback()
    
                    server.listen port
    
                catch err
                    callback err
    
            pass = =>
                @starting = false
                @started = true
                @emit "start"
    
            flunk = (err) =>
                @starting = false
                try @dnsServer.close()
                @emit "error", err
    
            startServer @dnsServer, @configuration.dnsPort, (err) ->
                if err then flunk err
                else pass()
  • ¶

    Stop the daemon if it’s started. This means calling close on both servers in succession, beginning with the HTTP server, and waiting for the servers to notify us that they’re done. The daemon emits a stop event when this process is complete.

        stop: ->
            return if @stopping or !@started
            @stopping = true
    
            stopServer = (server, callback) -> process.nextTick ->
                try
                    close = ->
                        server.removeListener "close", close
                        callback null
                    server.on "close", close
                    server.close()
                catch err
                    callback err
    
            stopServer @dnsServer, =>
                @stopping = false
                @started  = false
                @emit "stop"