浏览代码

fix: localization master callback + various fixes

Nicolas Giard 6 年之前
父节点
当前提交
27adad8dad

+ 3 - 0
server/core/kernel.js

@@ -1,4 +1,5 @@
 const _ = require('lodash')
+const EventEmitter = require('events')
 
 /* global WIKI */
 
@@ -23,6 +24,8 @@ module.exports = {
       await WIKI.models.onReady
       await WIKI.configSvc.loadFromDb()
       await WIKI.queue.clean()
+      WIKI.events = new EventEmitter()
+      WIKI.redisSub = require('./redis').subscribe()
     } catch (err) {
       WIKI.logger.error(err)
       process.exit(1)

+ 9 - 0
server/core/localization.js

@@ -33,6 +33,15 @@ module.exports = {
     // Load current language + namespaces
     this.refreshNamespaces(true)
 
+    // Listen for localization events
+    WIKI.events.on('localization', (action) => {
+      switch (action) {
+        case 'reload':
+          this.refreshNamespaces()
+          break
+      }
+    })
+
     return this
   },
   attachMiddleware (app) {

+ 5 - 0
server/core/queue.js

@@ -36,6 +36,11 @@ module.exports = {
       }
     })
   },
+  async quit() {
+    for (const queueName in this.job) {
+      await this.job[queueName].close()
+    }
+  },
   async clean() {
     return Promise.each(_.keys(WIKI.data.jobs), queueName => {
       return new Promise((resolve, reject) => {

+ 14 - 0
server/core/redis.js

@@ -19,5 +19,19 @@ module.exports = {
       WIKI.logger.error('Invalid Redis configuration!')
       process.exit(1)
     }
+  },
+  subscribe() {
+    let red = this.init()
+    red.on('message', (channel, msg) => {
+      WIKI.events.emit(channel, msg)
+    })
+    red.subscribe('localization', (err, count) => {
+      if (err) {
+        WIKI.logger.error(err)
+        process.exit(1)
+      }
+      WIKI.logger.info('Redis Subscriber connection: [ OK ]')
+    })
+    return red
   }
 }

+ 20 - 16
server/graph/index.js

@@ -4,8 +4,8 @@ const fs = require('fs')
 const path = require('path')
 const autoload = require('auto-load')
 const PubSub = require('graphql-subscriptions').PubSub
-const util = require('util')
-const winston = require('winston')
+const { LEVEL, MESSAGE } = require('triple-beam')
+const Transport = require('winston-transport')
 
 /* global WIKI */
 
@@ -37,20 +37,24 @@ let schemaDirectives = autoload(path.join(WIKI.SERVERPATH, 'graph/directives'))
 
 // Live Trail Logger (admin)
 
-let LiveTrailLogger = winston.transports.LiveTrailLogger = function (options) {
-  this.name = 'livetrailLogger'
-  this.level = 'debug'
-}
-util.inherits(LiveTrailLogger, winston.Transport)
-LiveTrailLogger.prototype.log = function (level, msg, meta, callback) {
-  WIKI.GQLEmitter.publish('livetrail', {
-    loggingLiveTrail: {
-      timestamp: new Date(),
-      level,
-      output: msg
-    }
-  })
-  callback(null, true)
+class LiveTrailLogger extends Transport {
+  constructor(opts) {
+    super(opts)
+
+    this.name = 'liveTrailLogger'
+    this.level = 'debug'
+  }
+
+  log (info, callback = () => {}) {
+    WIKI.GQLEmitter.publish('livetrail', {
+      loggingLiveTrail: {
+        timestamp: new Date(),
+        level: info[LEVEL],
+        output: info[MESSAGE]
+      }
+    })
+    callback(null, true)
+  }
 }
 
 WIKI.logger.add(new LiveTrailLogger({}))

+ 2 - 0
server/jobs/fetch-graph-locale.js

@@ -51,6 +51,8 @@ module.exports = async (job) => {
       throw new Error('Failed to fetch cached locales list! Restart server to resolve this issue.')
     }
 
+    await WIKI.redis.publish('localization', 'reload')
+
     WIKI.logger.info(`Fetching locale ${job.data.locale} from Graph endpoint: [ COMPLETED ]`)
   } catch (err) {
     WIKI.logger.error(`Fetching locale ${job.data.locale} from Graph endpoint: [ FAILED ]`)

+ 10 - 1
server/jobs/render-page.js

@@ -29,16 +29,25 @@ module.exports = async (job) => {
 
     $('h1,h2,h3,h4,h5,h6').each((idx, el) => {
       const depth = _.toSafeInteger(el.name.substring(1)) - (isStrict ? 1 : 2)
+      let leafPathError = false
+
       const leafPath = _.reduce(_.times(depth), (curPath, curIdx) => {
         if (_.has(toc, curPath)) {
           const lastLeafIdx = _.get(toc, curPath).length - 1
-          curPath = `${curPath}[${lastLeafIdx}].children`
+          if (lastLeafIdx >= 0) {
+            curPath = `${curPath}[${lastLeafIdx}].children`
+          } else {
+            leafPathError = true
+          }
         }
         return curPath
       }, 'root')
 
+      if (leafPathError) { return }
+
       const leafSlug = $('.toc-anchor', el).first().attr('href')
       $('.toc-anchor', el).remove()
+
       _.get(toc, leafPath).push({
         title: _.trim($(el).text()),
         anchor: leafSlug,

+ 2 - 0
server/jobs/sync-graph-locales.js

@@ -68,6 +68,8 @@ module.exports = async (job) => {
       }).where('code', WIKI.config.lang.code)
     }
 
+    await WIKI.redis.publish('localization', 'reload')
+
     WIKI.logger.info('Syncing locales with Graph endpoint: [ COMPLETED ]')
   } catch (err) {
     WIKI.logger.error('Syncing locales with Graph endpoint: [ FAILED ]')

+ 1 - 1
server/setup.js

@@ -133,7 +133,7 @@ module.exports = () => {
         nativeName: 'English'
       })
 
-      // Create default locale
+      // Create default groups
 
       WIKI.logger.info('Creating default groups...')
       const adminGroup = await WIKI.models.groups.query().insert({

+ 3 - 0
wiki.js

@@ -121,6 +121,9 @@ const init = {
     await global.WIKI.models.knex.destroy()
     console.warn(chalk.yellow('--- Closing Redis connections...'))
     await global.WIKI.redis.quit()
+    await global.WIKI.redisSub.quit()
+    console.warn(chalk.yellow('--- Closing Queue connections...'))
+    await global.WIKI.queue.quit()
     console.warn(chalk.yellow('--- Closing Server connections...'))
     global.WIKI.server.destroy(() => {
       global.WIKI = {}