diff --git a/lib/new-settings-loader.js b/lib/new-settings-loader.js index fd0cc435..d71e171c 100644 --- a/lib/new-settings-loader.js +++ b/lib/new-settings-loader.js @@ -1,6 +1,7 @@ const _ = require('lodash/fp') const db = require('./db') const migration = require('./config-migration') +const { asyncLocalStorage } = require('./async-storage') const OLD_SETTINGS_LOADER_SCHEMA_VERSION = 1 const NEW_SETTINGS_LOADER_SCHEMA_VERSION = 2 @@ -73,7 +74,10 @@ function saveConfig (config) { return loadLatestConfigOrNone() .then(currentConfig => { const newConfig = _.assign(currentConfig, config) - return db.none(configSql, ['config', { config: newConfig }, true, NEW_SETTINGS_LOADER_SCHEMA_VERSION]) + return db.tx(t => { + return t.none(configSql, ['config', { config: newConfig }, true, NEW_SETTINGS_LOADER_SCHEMA_VERSION]) + .then(() => t.none('NOTIFY $1:name, $2', ['poller', asyncLocalStorage.getStore().get('schema')])) + }).catch(console.error) }) } diff --git a/lib/poller.js b/lib/poller.js index 8a44df96..943d0054 100644 --- a/lib/poller.js +++ b/lib/poller.js @@ -15,6 +15,7 @@ const { asyncLocalStorage, defaultStore } = require('./async-storage') const settingsLoader = require('./new-settings-loader') const NodeCache = require('node-cache') const util = require('util') +const db = require('./db') const INCOMING_TX_INTERVAL = 30 * T.seconds const LIVE_INCOMING_TX_INTERVAL = 5 * T.seconds @@ -74,11 +75,18 @@ cachedVariables.on('expired', (key, val) => { } }) +db.connect({ direct: true }).then(sco => { + sco.client.on('notification', data => { + return reload(data.payload) + }) + return sco.none('LISTEN $1:name', 'poller') +}).catch(console.error) + function reload (schema) { const store = defaultStore() store.set('schema', schema) // set asyncLocalStorage so settingsLoader loads settings for the right schema - asyncLocalStorage.run(store, () => { + return asyncLocalStorage.run(store, () => { return settingsLoader.loadLatest().then(settings => { const pi = plugins(settings) cachedVariables.set(schema, { settings, pi, isReloading: false })