service-core/core/http.mjs

73 lines
1.6 KiB
JavaScript

import http from 'http'
export default class HttpServer {
constructor(config) {
this.active = {
app: false,
manage: false,
dev: false,
}
this.sockets = {
app: new Set(),
manage: new Set(),
dev: new Set(),
}
this._context = 'dev'
}
setContext(name) {
if (name !== 'app' && name !== 'manage' && name !== 'dev') {
throw new Error('Cannot call setContext with values other than app or manage')
}
this._context = name
}
createServer(opts, listener) {
return this._createServer(this._context, opts, listener)
}
_createServer(name, opts, listener) {
let server = http.createServer(opts, listener)
server.on('connection', (socket) => {
this.sockets[name].add(socket)
socket.once('close', () => {
this.sockets[name].delete(socket)
})
})
this.active[name] = server
return server
}
getServer(name) {
return this.active[name]
}
async closeServer(name) {
if (!this.active[name]) return false
try {
return await new Promise((res, rej) => {
this.sockets[name].forEach(function(socket) {
socket.destroy()
})
this.sockets[name].clear()
this.active[name].close(function(err) {
if (err) return rej(err)
// Waiting 1 second for it to close down
setTimeout(function() { res(true) }, 1000)
})
})
} catch (err) {
throw new Error(`Error closing ${name}: ${err.message}`)
}
}
getCurrentServer() {
return this.active[this._context]
}
}