feat: HA event handling + emitting

This commit is contained in:
NGPixel
2020-04-19 20:26:26 -04:00
committed by Nicolas Giard
parent 6a00a5dbce
commit bd4263ecb2
14 changed files with 109 additions and 33 deletions

View File

@@ -281,6 +281,7 @@ module.exports = {
async reloadGroups () {
const groupsArray = await WIKI.models.groups.query()
this.groups = _.keyBy(groupsArray, 'id')
WIKI.auth.guest = await WIKI.models.users.getGuestUser()
},
/**
@@ -324,6 +325,7 @@ module.exports = {
])
await WIKI.auth.activateStrategies()
WIKI.events.outbound.emit('reloadAuthStrategies')
WIKI.logger.info('Regenerated certificates: [ COMPLETED ]')
},
@@ -356,5 +358,20 @@ module.exports = {
await guestUser.$relatedQuery('groups').relate(guestGroup.id)
WIKI.logger.info('Guest user has been reset: [ COMPLETED ]')
},
/**
* Subscribe to HA propagation events
*/
subscribeToEvents() {
WIKI.events.inbound.on('reloadGroups', () => {
WIKI.auth.reloadGroups()
})
WIKI.events.inbound.on('reloadApiKeys', () => {
WIKI.auth.reloadApiKeys()
})
WIKI.events.inbound.on('reloadAuthStrategies', () => {
WIKI.auth.activateStrategies()
})
}
}

View File

@@ -95,7 +95,7 @@ module.exports = {
* @param {Array} keys Array of keys to save
* @returns Promise
*/
async saveToDb(keys) {
async saveToDb(keys, propagate = true) {
try {
for (let key of keys) {
let value = _.get(WIKI.config, key, null)
@@ -107,6 +107,9 @@ module.exports = {
await WIKI.models.settings.query().insert({ key, value })
}
}
if (propagate) {
WIKI.events.outbound.emit('reloadConfig')
}
} catch (err) {
WIKI.logger.error(`Failed to save configuration to DB: ${err.message}`)
return false
@@ -119,5 +122,15 @@ module.exports = {
*/
async applyFlags() {
WIKI.models.knex.client.config.debug = WIKI.config.flags.sqllog
},
/**
* Subscribe to HA propagation events
*/
subscribeToEvents() {
WIKI.events.inbound.on('reloadConfig', async () => {
await WIKI.configSvc.loadFromDb()
await WIKI.configSvc.applyFlags()
})
}
}

View File

@@ -203,12 +203,22 @@ module.exports = {
WIKI.logger.debug(ev)
}
})
// -> Outbound events handling
this.listener.addChannel('wiki', payload => {
if (_.has(payload.event) && payload.source !== WIKI.INSTANCE_ID) {
WIKI.events.emit(payload.event, payload.value)
WIKI.logger.debug(`Received event ${payload.event} from instance ${payload.source}: [ OK ]`)
WIKI.events.inbound.emit(payload.event, payload.value)
}
})
WIKI.events.onAny(this.notifyViaDB)
WIKI.events.outbound.onAny(this.notifyViaDB)
// -> Listen to inbound events
WIKI.auth.subscribeToEvents()
WIKI.configSvc.subscribeToEvents()
WIKI.models.pages.subscribeToEvents()
WIKI.logger.info(`High-Availability Listener initialized successfully: [ OK ]`)
},
@@ -217,7 +227,8 @@ module.exports = {
*/
async unsubscribeToNotifications () {
if (this.listener) {
WIKI.events.offAny(this.notifyViaDB)
WIKI.events.outbound.offAny(this.notifyViaDB)
WIKI.events.inbound.removeAllListeners()
this.listener.close()
}
},

View File

@@ -36,8 +36,10 @@ module.exports = {
WIKI.scheduler = require('./scheduler').init()
WIKI.servers = require('./servers')
WIKI.sideloader = require('./sideloader').init()
WIKI.events = new EventEmitter()
await WIKI.models.subscribeToNotifications()
WIKI.events = {
inbound: new EventEmitter(),
outbound: new EventEmitter()
}
} catch (err) {
WIKI.logger.error(err)
process.exit(1)
@@ -77,6 +79,8 @@ module.exports = {
await WIKI.models.searchEngines.initEngine()
await WIKI.models.storage.initTargets()
WIKI.scheduler.start()
await WIKI.models.subscribeToNotifications()
},
/**
* Init Telemetry