You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							115 lines
						
					
					
						
							2.4 KiB
						
					
					
				'use strict';
 | 
						|
 | 
						|
/*
 | 
						|
  node-schedule
 | 
						|
  A cron-like and not-cron-like job scheduler for Node.
 | 
						|
*/
 | 
						|
 | 
						|
const { Job, scheduledJobs } = require('./Job')
 | 
						|
 | 
						|
/* API
 | 
						|
  invoke()
 | 
						|
  runOnDate(date)
 | 
						|
  schedule(date || recurrenceRule || cronstring)
 | 
						|
  cancel(reschedule = false)
 | 
						|
  cancelNext(reschedule = true)
 | 
						|
 | 
						|
   Property constraints
 | 
						|
  name: readonly
 | 
						|
  job: readwrite
 | 
						|
*/
 | 
						|
 | 
						|
/* Convenience methods */
 | 
						|
function scheduleJob() {
 | 
						|
  if (arguments.length < 2) {
 | 
						|
    throw new RangeError('Invalid number of arguments');
 | 
						|
  }
 | 
						|
 | 
						|
  const name = (arguments.length >= 3 && typeof arguments[0] === 'string') ? arguments[0] : null;
 | 
						|
  const spec = name ? arguments[1] : arguments[0];
 | 
						|
  const method = name ? arguments[2] : arguments[1];
 | 
						|
  const callback = name ? arguments[3] : arguments[2];
 | 
						|
 | 
						|
  if (typeof method !== 'function') {
 | 
						|
    throw new RangeError('The job method must be a function.');
 | 
						|
  }
 | 
						|
 | 
						|
  const job = new Job(name, method, callback);
 | 
						|
 | 
						|
  if (job.schedule(spec)) {
 | 
						|
    return job;
 | 
						|
  }
 | 
						|
 | 
						|
  return null;
 | 
						|
}
 | 
						|
 | 
						|
function rescheduleJob(job, spec) {
 | 
						|
  if (job instanceof Job) {
 | 
						|
    if (job.reschedule(spec)) {
 | 
						|
      return job;
 | 
						|
    }
 | 
						|
  } else if (typeof job === 'string') {
 | 
						|
    if (Object.prototype.hasOwnProperty.call(scheduledJobs, job)) {
 | 
						|
      if (scheduledJobs[job].reschedule(spec)) {
 | 
						|
        return scheduledJobs[job];
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      throw new Error('Cannot reschedule one-off job by name, pass job reference instead')
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return null;
 | 
						|
}
 | 
						|
 | 
						|
function cancelJob(job) {
 | 
						|
  let success = false;
 | 
						|
  if (job instanceof Job) {
 | 
						|
    success = job.cancel();
 | 
						|
  } else if (typeof job == 'string' || job instanceof String) {
 | 
						|
    if (job in scheduledJobs && Object.prototype.hasOwnProperty.call(scheduledJobs, job)) {
 | 
						|
      success = scheduledJobs[job].cancel();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return success;
 | 
						|
}
 | 
						|
 | 
						|
function gracefulShutdown() {
 | 
						|
  const jobs = Object.keys(scheduledJobs).map(key => scheduledJobs[key]);
 | 
						|
  jobs.forEach(function (job) {
 | 
						|
    job.cancel();
 | 
						|
  });
 | 
						|
 | 
						|
  let running = false;
 | 
						|
  for (let i = 0; i < jobs.length; i++) {
 | 
						|
    if (jobs[i].running > 0) {
 | 
						|
      running = true;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return new Promise(function (resolve) {
 | 
						|
    if (running) {
 | 
						|
      setInterval(function () {
 | 
						|
        for (let i = 0; i < jobs.length; i++) {
 | 
						|
          if (jobs[i].running > 0) {
 | 
						|
            return;
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        resolve();
 | 
						|
      }, 500);
 | 
						|
    } else {
 | 
						|
      resolve();
 | 
						|
    }
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
/* Public API */
 | 
						|
module.exports = {
 | 
						|
  scheduleJob,
 | 
						|
  rescheduleJob,
 | 
						|
  scheduledJobs,
 | 
						|
  cancelJob,
 | 
						|
  gracefulShutdown,
 | 
						|
}
 |