Compare commits

..

12 Commits

Author SHA1 Message Date
cfcfde2132 3.0.35 2020-09-07 23:44:08 +00:00
b5ab945501 fix(core): update 2020-09-07 23:44:07 +00:00
88378e2f31 3.0.34 2020-09-07 17:16:12 +00:00
db92311daa fix(core): update 2020-09-07 17:16:11 +00:00
36bff0a70a 3.0.33 2020-09-07 16:44:55 +00:00
fa8fd9fa35 fix(core): update 2020-09-07 16:44:54 +00:00
dd783b455f 3.0.32 2020-09-07 12:13:28 +00:00
996685e7fb fix(core): update 2020-09-07 12:13:27 +00:00
110b2c00cf 3.0.31 2020-09-04 15:18:41 +00:00
c8b455b8e2 fix(core): update 2020-09-04 15:18:41 +00:00
d16fd8b69b 3.0.30 2020-09-04 14:24:42 +00:00
f7ed88cd57 fix(core): update 2020-09-04 14:24:42 +00:00
6 changed files with 118 additions and 10 deletions

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "@pushrocks/smarttime",
"version": "3.0.29",
"version": "3.0.35",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,14 +1,14 @@
{
"name": "@pushrocks/smarttime",
"private": false,
"version": "3.0.29",
"version": "3.0.35",
"description": "handle time in smart ways",
"main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts",
"author": "Lossless GmbH",
"license": "MIT",
"scripts": {
"test": "(tstest ./test/)",
"test": "(tstest ./test)",
"build": "(tsbuild --web && tsbundle npm)"
},
"devDependencies": {

View File

@ -44,6 +44,17 @@ tap.test('should create a valid cronJon', async (tools) => {
await done2.promise;
await done3.promise;
testCronManager.stop();
testCronManager.removeCronjob(cronJob3);
});
tap.test('runs every full minute', async (tools) => {
const done = tools.defer();
const cronJob = testCronManager.addCronjob('0 * * * * *', async () => {
done.resolve();
});
testCronManager.start();
await done.promise;
testCronManager.stop();
});
tap.start();

View File

@ -1,10 +1,12 @@
import * as plugins from './smarttime.plugins';
import { CronManager } from './smarttime.classes.cronmanager';
import { CronParser } from './smarttime.classes.cronparser';
export type TJobFunction = (() => void) | (() => Promise<any>);
export class CronJob {
public croner;
public cronParser: CronParser | typeof plugins.croner;
public status: 'started' | 'stopped' | 'initial' = 'initial';
public cronExpression: string;
public jobFunction: TJobFunction;
@ -13,7 +15,7 @@ export class CronJob {
constructor(cronManager: CronManager, cronExpressionArg: string, jobFunction: TJobFunction) {
this.cronExpression = cronExpressionArg;
this.jobFunction = jobFunction;
this.croner = plugins.croner(this.cronExpression);
this.cronParser = plugins.croner(cronExpressionArg);
}
/**
@ -41,7 +43,7 @@ export class CronJob {
* gets the time to next execution
*/
public getTimeToNextExecution() {
return this.croner.msToNext();
return this.cronParser.msToNext();
}
public start() {

View File

@ -46,10 +46,17 @@ export class CronManager {
nextRunningCronjob = cronJob;
}
}
if (nextRunningCronjob) {
this.executionTimeout = new plugins.smartdelay.Timeout(nextRunningCronjob.getTimeToNextExecution());
console.log(
`Next CronJob scheduled in ${this.executionTimeout.getTimeLeft()} milliseconds`
);
} else {
this.executionTimeout = new plugins.smartdelay.Timeout(1000);
console.log('no cronjobs specified! Checking again in 1 second');
}
await this.executionTimeout.promise;
} while (this.status === 'started');
};

View File

@ -0,0 +1,88 @@
import * as plugins from './smarttime.plugins';
export class CronParser {
public cronExpression: string;
public get cronArray() {
return this.cronExpression.split(' ');
}
constructor(cronExpressionArg: string) {
this.cronExpression = cronExpressionArg;
if (this.cronArray.length < 6) {
throw new Error('CronParser needs second level accuracy');
}
}
private getNextPartMatch(cronPart: string, startValue: number, moduloArg: number) {
if (cronPart === '*') {
return startValue;
}
if (cronPart.includes('/')) {
const every = parseInt(cronPart.split('/')[1], 10);
const findEvenMatch = (recursionStartArg: number) => {
if (recursionStartArg % every === 0) {
return recursionStartArg;
} else {
return findEvenMatch(recursionStartArg + 1);
}
};
return findEvenMatch(startValue);
}
if (parseInt(cronPart, 10) || cronPart === '0') {
const match = parseInt(cronPart, 10);
return match;
}
}
public msToNext() {
const cronArray = this.cronArray;
const secondExpression = cronArray[0];
const minuteExpression = cronArray[1];
const hourExpression = cronArray[2];
const dayExpression = cronArray[3];
const monthExpression = cronArray[4];
const yearExpression = cronArray[5];
let currentDate = new Date();
let currentSecond = currentDate.getSeconds() + 1;
let currentMinute = currentDate.getMinutes();
let currentHour = currentDate.getHours();
let currentDay = currentDate.getDate();
let currentMonth = currentDate.getMonth();
let currentYear = currentDate.getFullYear();
const targetSecond = this.getNextPartMatch(secondExpression, currentSecond, 59);
if (targetSecond < currentSecond) {
currentMinute = (currentMinute + 1) % 59;
}
const targetMinute = this.getNextPartMatch(minuteExpression, currentMinute, 59);
if (targetMinute < currentMinute) {
currentHour = (currentHour + 1) % 23;
}
const targetHour = this.getNextPartMatch(hourExpression, currentHour, 23);
if (targetHour < currentHour) {
currentDay = (currentDay + 1) % 30;
}
const targetDay = currentDay;
if (targetDay < currentDay) {
currentMonth = (currentMonth + 1) % 11;
}
const targetMonth = currentMonth;
if (targetMonth < currentMonth) {
currentYear = (currentYear + 1);
}
const targetYear = currentYear;
const targetDate = new Date(
targetYear,
targetMonth,
targetDay,
targetHour,
targetMinute,
targetSecond
);
const targetTime = targetDate.getTime();
return targetTime - Date.now();
}
}