| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | const moment = require('moment')const childProcess = require('child_process')const _ = require('lodash')const configHelper = require('../helpers/config')/* global WIKI */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)  }}module.exports = {  jobs: [],  init() {    return this  },  start() {    _.forOwn(WIKI.data.jobs, (queueParams, queueName) => {      if (WIKI.config.offline && queueParams.offlineSkip) {        WIKI.logger.warn(`Skipping job ${queueName} because offline mode is enabled. [SKIPPED]`)        return      }      const schedule = (configHelper.isValidDurationString(queueParams.schedule)) ? queueParams.schedule : 'P1D'      this.registerJob({        name: _.kebabCase(queueName),        immediate: _.get(queueParams, 'onInit', false),        schedule: schedule,        repeat: _.get(queueParams, 'repeat', false),        worker: _.get(queueParams, 'worker', false)      })    })  },  registerJob(opts, data) {    const job = new Job(opts)    job.start(data)    if (job.repeat) {      this.jobs.push(job)    }    return job  },  stop() {    this.jobs.forEach(job => {      job.stop()    })  }}
 |