feat: Kernel module

This commit is contained in:
NGPixel
2017-10-07 22:44:35 -04:00
parent 2be7f71be8
commit c26fae2ede
13 changed files with 264 additions and 560 deletions

View File

@@ -75,13 +75,14 @@ module.exports = {
}
}
}).then(results => {
if (_.isArray(results) && results.length > 0) {
if (_.isArray(results) && results.length === subsets.length) {
results.forEach(result => {
wiki.config[result.key] = result.config
})
return true
} else {
return Promise.reject(new Error('Invalid DB Configuration result set'))
wiki.logger.warn('DB Configuration is empty or incomplete.')
return false
}
})
}

View File

@@ -75,7 +75,7 @@ module.exports = {
min: 0,
idle: 10000
},
logging: false,
logging: log => { wiki.logger.log('verbose', log) },
operatorsAliases
})
@@ -92,10 +92,10 @@ module.exports = {
fs
.readdirSync(dbModelsPath)
.filter(function (file) {
.filter(file => {
return (file.indexOf('.') !== 0 && file.indexOf('_') !== 0)
})
.forEach(function (file) {
.forEach(file => {
let modelName = _.upperFirst(_.camelCase(_.split(file, '.')[0]))
self[modelName] = self.inst.import(path.join(dbModelsPath, file))
})
@@ -110,8 +110,8 @@ module.exports = {
// -> Sync DB Schemas
syncSchemas() {
return self.inst.sync({
force: false,
logging: false
force: true,
logging: log => { wiki.logger.log('verbose', log) }
})
},
// -> Set Connection App Name
@@ -129,7 +129,7 @@ module.exports = {
// Perform init tasks
self.onReady = Promise.each(initTasksQueue, t => t())
self.onReady = Promise.each(initTasksQueue, t => t()).return(true)
return self
}

91
server/modules/kernel.js Normal file
View File

@@ -0,0 +1,91 @@
const cluster = require('cluster')
const Promise = require('bluebird')
const _ = require('lodash')
/* global wiki */
module.exports = {
numWorkers: 1,
workers: [],
init() {
if (cluster.isMaster) {
wiki.logger.info('=======================================')
wiki.logger.info('= Wiki.js =============================')
wiki.logger.info('=======================================')
wiki.redis = require('./redis').init()
wiki.queue = require('./queue').init()
this.setWorkerLimit()
this.bootMaster()
} else {
this.bootWorker()
}
},
/**
* Pre-Master Boot Sequence
*/
preBootMaster() {
return Promise.mapSeries([
() => { return wiki.db.onReady },
() => { return wiki.configSvc.loadFromDb() },
() => { return wiki.queue.clean() }
], fn => { return fn() })
},
/**
* Boot Master Process
*/
bootMaster() {
this.preBootMaster().then(sequenceResults => {
if (_.every(sequenceResults, rs => rs === true)) {
this.postBootMaster()
} else {
wiki.logger.info('Starting configuration manager...')
require('../configure')()
}
return true
}).catch(err => {
wiki.logger.error(err)
process.exit(1)
})
},
/**
* Post-Master Boot Sequence
*/
postBootMaster() {
require('../master')().then(() => {
_.times(this.numWorker, this.spawnWorker)
wiki.queue.uplClearTemp.add({}, {
repeat: { cron: '*/15 * * * *' }
})
})
cluster.on('exit', (worker, code, signal) => {
wiki.logger.info(`Background Worker #${worker.id} was terminated.`)
})
},
/**
* Boot Worker Process
*/
bootWorker() {
wiki.logger.info(`Background Worker #${cluster.worker.id} is initializing...`)
require('../worker')
},
/**
* Spawn new Worker process
*/
spawnWorker() {
this.workers.push(cluster.fork())
},
/**
* Set Worker count based on config + system capabilities
*/
setWorkerLimit() {
const numCPUs = require('os').cpus().length
this.numWorkers = (wiki.config.workers > 0) ? wiki.config.workers : numCPUs
if (this.numWorkers > numCPUs) {
this.numWorkers = numCPUs
}
}
}

View File

@@ -30,7 +30,7 @@ module.exports = {
})
}).then(() => {
wiki.logger.info('Purging old queue jobs: OK')
}).catch(err => {
}).return(true).catch(err => {
wiki.logger.error(err)
})
}