Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | 16x 16x 16x 16x 16x 16x 16x 16x 18x 18x 1x 18x 17x 71x 2x 2x 2x 2x 16x 16x | import Debug from 'debug'
import { v4 as uuid } from 'uuid/v4'
import redis from 'redis'
import Crowi from 'server/crowi'
const debug = Debug('crowi:service:config')
export default class Config {
crowi: Crowi
config: any
pubSub: {
id: uuid
publisher: redis.RedisClient | null
subscriber: redis.RedisClient | null
channel: string
}
constructor(crowi: Crowi) {
this.crowi = crowi
this.config = {}
this.pubSub = {
id: uuid(),
publisher: null,
subscriber: null,
channel: 'config',
}
this.setupPubSub()
}
async load() {
const Config = this.crowi.model('Config')
const config = await Config.loadAllConfig()
this.set(config)
}
set(config) {
// FIXME: Deep copy to avoid deleting itself.
config = JSON.parse(JSON.stringify(config))
// FIXME: Treat as a mutable object always.
// We should always get config using `crowi.getConfig()` *just before* referencing config.
for (const key of Object.keys(this.config)) {
delete this.config[key]
}
for (const key of Object.keys(config)) {
this.config[key] = config[key]
}
}
get() {
return this.config || {}
}
notifyUpdated() {
const { publisher, channel, id } = this.pubSub
Iif (publisher) {
publisher.publish(channel, JSON.stringify({ id }))
}
}
update(config) {
this.set(config)
this.notifyUpdated()
}
setupPubSub() {
const { redisOpts } = this.crowi
Iif (redisOpts) {
this.pubSub.publisher = redis.createClient(redisOpts)
this.pubSub.subscriber = redis.createClient(redisOpts)
const { pubSub } = this
const { subscriber } = pubSub
debug('PubSubId', pubSub.id)
if (subscriber) {
subscriber.on('message', async (channel, message) => {
if (channel !== pubSub.channel) return
const { id } = JSON.parse(message)
if (id === pubSub.id) return
await this.load()
await Promise.all([this.crowi.setupSlack(), this.crowi.setupMailer()])
debug(`Config updated by ${pubSub.id}`)
})
subscriber.subscribe(pubSub.channel)
}
}
}
}
|