ts3bot/services.iced

70 lines
1.9 KiB
Plaintext
Raw Normal View History

# At this point I feel like I'm writing my own init system. Phew...
merge = require "merge"
getLogger = require("./logger")
EventEmitter = require("events").EventEmitter
log = getLogger("ServiceMgr")
Sync = require "sync"
getLegacyServiceName = (serviceName) -> serviceName.toLowerCase().replace(/[^A-z0-9]/g, "_")
module.exports =
services: []
find: (serviceName) ->
serviceNameUpper = serviceName.toUpperCase()
for service in services
if service.name.toUpperCase() == serviceNameUpper
return service
null
register: (service) ->
if @[service.name]
throw new Error "There is already a service registered under that name"
@services.push service
log.debug "Registered service #{service.name}"
unregister: (serviceName) ->
for service, index in @services
if service.name == serviceName
@services.splice index, 1
log.debug "Unregistered service #{service.name}"
throw new Error "There is no service registered under that name"
shutdown: (cb) ->
shutdownOrder = @services.splice 0
shutdownOrder.reverse()
while true
for own k, v of shutdownOrder
if v.state == "stopped"
continue
await v.stop defer()
breakOut = true
for own k, v of shutdownOrder
if v.state != "stopped"
log.debug "Service #{k} in state #{v.state} after shutdown loop, relooping"
breakOut = false
if breakOut
break
cb?()
shutdownSync: () -> Sync () => @shutdown.sync @
# base class for all services
module.exports.Service = require "./service_template"
# register services
services = [
new(require "./services/api")
new(require "./services/pulseaudio")
new(require "./services/ts3client")
new(require "./services/vlc")
new(require "./services/xvfb")
new(require "./services/blackbox")
]
services.sort require("./service_depcomparer") # sort services by dependency
for service in services
module.exports.register service
module.exports.services = services