mirror of https://github.com/Requarks/wiki.git
9 changed files with 159 additions and 127 deletions
Split View
Diff Options
-
24client/components/admin/admin-storage.vue
-
2client/components/common/duration-picker.vue
-
1package.json
-
3server/app/data.yml
-
84server/core/job.js
-
100server/core/scheduler.js
-
30server/jobs/sync-storage.js
-
37server/models/storage.js
-
5yarn.lock
@ -1,84 +0,0 @@ |
|||
const moment = require('moment') |
|||
const childProcess = require('child_process') |
|||
|
|||
module.exports = class Job { |
|||
constructor({ |
|||
name, |
|||
immediate = false, |
|||
schedule = 'P1D', |
|||
repeat = false, |
|||
worker = false |
|||
}) { |
|||
this.finished = Promise.resolve() |
|||
this.name = name |
|||
this.immediate = immediate |
|||
this.schedule = moment.duration(schedule) |
|||
this.repeat = repeat |
|||
this.worker = worker |
|||
} |
|||
|
|||
/** |
|||
* Start Job |
|||
* |
|||
* @param {Object} data Job Data |
|||
*/ |
|||
start(data) { |
|||
if (this.immediate) { |
|||
this.invoke(data) |
|||
} else { |
|||
this.queue(data) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Queue the next job run according to the wait duration |
|||
* |
|||
* @param {Object} data Job Data |
|||
*/ |
|||
queue(data) { |
|||
this.timeout = setTimeout(this.invoke.bind(this), this.schedule.asMilliseconds(), data) |
|||
} |
|||
|
|||
/** |
|||
* Run the actual job |
|||
* |
|||
* @param {Object} data Job Data |
|||
*/ |
|||
async invoke(data) { |
|||
try { |
|||
if (this.worker) { |
|||
const proc = childProcess.fork(`server/core/worker.js`, [ |
|||
`--job=${this.name}`, |
|||
`--data=${data}` |
|||
], { |
|||
cwd: WIKI.ROOTPATH |
|||
}) |
|||
this.finished = new Promise((resolve, reject) => { |
|||
proc.on('exit', (code, signal) => { |
|||
if (code === 0) { |
|||
resolve() |
|||
} else { |
|||
reject(signal) |
|||
} |
|||
proc.kill() |
|||
}) |
|||
}) |
|||
} else { |
|||
this.finished = require(`../jobs/${this.name}`)(data) |
|||
} |
|||
await this.finished |
|||
} catch (err) { |
|||
WIKI.logger.warn(err) |
|||
} |
|||
if (this.repeat) { |
|||
this.queue(data) |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Stop any future job invocation from occuring |
|||
*/ |
|||
stop() { |
|||
clearTimeout(this.timeout) |
|||
} |
|||
} |
@ -1,18 +1,20 @@ |
|||
const _ = require('lodash') |
|||
|
|||
/* global WIKI */ |
|||
|
|||
module.exports = async ({ target }) => { |
|||
WIKI.logger.info(`Syncing with storage provider ${job.data.target.title}...`) |
|||
module.exports = async (targetKey) => { |
|||
WIKI.logger.info(`Syncing with storage target ${targetKey}...`) |
|||
|
|||
// try {
|
|||
// const target = require(`../modules/storage/${job.data.target.key}/storage.js`)
|
|||
// target[job.data.event].call({
|
|||
// config: job.data.target.config,
|
|||
// mode: job.data.target.mode,
|
|||
// page: job.data.page
|
|||
// })
|
|||
// WIKI.logger.info(`Syncing with storage provider ${job.data.target.title}: [ COMPLETED ]`)
|
|||
// } catch (err) {
|
|||
// WIKI.logger.error(`Syncing with storage provider ${job.data.target.title}: [ FAILED ]`)
|
|||
// WIKI.logger.error(err.message)
|
|||
// }
|
|||
try { |
|||
const target = _.find(WIKI.models.storage.targets, ['key', targetKey]) |
|||
if (target) { |
|||
await target.fn.sync() |
|||
WIKI.logger.info(`Syncing with storage target ${targetKey}: [ COMPLETED ]`) |
|||
} else { |
|||
throw new Error('Invalid storage target. Unable to perform sync.') |
|||
} |
|||
} catch (err) { |
|||
WIKI.logger.error(`Syncing with storage target ${targetKey}: [ FAILED ]`) |
|||
WIKI.logger.error(err.message) |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save