Compare commits

...

20 Commits

Author SHA1 Message Date
19b5ba4a5d 3.0.29 2020-09-04 06:39:22 +00:00
457182a97a fix(core): update 2020-09-04 06:39:22 +00:00
a7a961c869 3.0.28 2020-09-03 20:14:23 +00:00
f1d7771e30 fix(core): update 2020-09-03 20:14:23 +00:00
ff16b70206 3.0.27 2020-09-03 20:06:03 +00:00
8e43ce7e9b fix(core): update 2020-09-03 20:06:02 +00:00
f129ce42b6 3.0.26 2020-09-02 14:27:11 +00:00
56a802664f fix(core): update 2020-09-02 14:27:11 +00:00
743c9fb847 3.0.25 2020-09-02 14:09:22 +00:00
ac2edd6d74 fix(core): update 2020-09-02 14:09:21 +00:00
725102d02c 3.0.24 2020-07-12 00:25:56 +00:00
7c73579c9f fix(core): update 2020-07-12 00:25:55 +00:00
a1996ea1bd 3.0.23 2020-07-12 00:00:50 +00:00
dc92ae7140 fix(core): update 2020-07-12 00:00:50 +00:00
3e862f233c 3.0.22 2020-07-11 23:36:24 +00:00
73f7360f8c fix(core): update 2020-07-11 23:36:24 +00:00
2c74de8aef 3.0.21 2020-07-11 23:31:10 +00:00
78498626ea fix(core): update 2020-07-11 23:31:09 +00:00
b2299b149a 3.0.20 2020-07-11 21:41:33 +00:00
885b2432a8 fix(core): update 2020-07-11 21:41:33 +00:00
14 changed files with 8754 additions and 935 deletions

View File

@ -19,23 +19,35 @@ mirror:
stage: security stage: security
script: script:
- npmci git mirror - npmci git mirror
only:
- tags
tags: tags:
- lossless - lossless
- docker - docker
- notpriv - notpriv
audit: auditProductionDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci npm prepare
- npmci command npm install --production --ignore-scripts
- npmci command npm config set registry https://registry.npmjs.org
- npmci command npm audit --audit-level=high --only=prod --production
tags:
- docker
auditDevDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security stage: security
script: script:
- npmci npm prepare - npmci npm prepare
- npmci command npm install --ignore-scripts - npmci command npm install --ignore-scripts
- npmci command npm config set registry https://registry.npmjs.org - npmci command npm config set registry https://registry.npmjs.org
- npmci command npm audit --audit-level=high - npmci command npm audit --audit-level=high --only=dev
tags: tags:
- lossless
- docker - docker
- notpriv allow_failure: true
# ==================== # ====================
# test stage # test stage
@ -50,9 +62,7 @@ testStable:
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- priv
testBuild: testBuild:
stage: test stage: test
@ -63,9 +73,7 @@ testBuild:
- npmci command npm run build - npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- notpriv
release: release:
stage: release stage: release
@ -85,6 +93,8 @@ release:
codequality: codequality:
stage: metadata stage: metadata
allow_failure: true allow_failure: true
only:
- tags
script: script:
- npmci command npm install -g tslint typescript - npmci command npm install -g tslint typescript
- npmci npm prepare - npmci npm prepare

View File

@ -15,7 +15,7 @@
"properties": { "properties": {
"projectType": { "projectType": {
"type": "string", "type": "string",
"enum": ["website", "element", "service", "npm"] "enum": ["website", "element", "service", "npm", "wcc"]
} }
} }
} }

9445
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
{ {
"name": "@pushrocks/smarttime", "name": "@pushrocks/smarttime",
"private": false, "private": false,
"version": "3.0.19", "version": "3.0.29",
"description": "handle time in smart ways", "description": "handle time in smart ways",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist_ts/index.d.ts",
@ -9,23 +9,24 @@
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"test": "(tstest ./test/)", "test": "(tstest ./test/)",
"build": "(tsbuild && tsbundle npm)" "build": "(tsbuild --web && tsbundle npm)"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.11", "@gitzone/tsbuild": "^2.1.25",
"@gitzone/tsbundle": "^1.0.69", "@gitzone/tsbundle": "^1.0.78",
"@gitzone/tsrun": "^1.2.6", "@gitzone/tsrun": "^1.2.12",
"@gitzone/tstest": "^1.0.24", "@gitzone/tstest": "^1.0.44",
"@pushrocks/tapbundle": "^3.0.9", "@pushrocks/tapbundle": "^3.2.9",
"@types/node": "^14.0.5", "@types/node": "^14.6.2",
"tslint": "^6.1.2", "tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0" "tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@pushrocks/smartdelay": "^2.0.9", "@pushrocks/lik": "^4.0.17",
"@pushrocks/smartdelay": "^2.0.10",
"@pushrocks/smartpromise": "^3.0.2", "@pushrocks/smartpromise": "^3.0.2",
"croner": "^1.1.23", "croner": "^1.1.23",
"dayjs": "^1.8.27", "dayjs": "^1.8.35",
"is-nan": "^1.3.0" "is-nan": "^1.3.0"
}, },
"files": [ "files": [
@ -39,5 +40,8 @@
"cli.js", "cli.js",
"npmextra.json", "npmextra.json",
"readme.md" "readme.md"
],
"browserslist": [
"last 1 chrome versions"
] ]
} }

View File

@ -8,13 +8,20 @@ handle time in smart ways
* [docs (typedoc)](https://pushrocks.gitlab.io/smarttime/) * [docs (typedoc)](https://pushrocks.gitlab.io/smarttime/)
## Status for master ## Status for master
[![pipeline status](https://gitlab.com/pushrocks/smarttime/badges/master/pipeline.svg)](https://gitlab.com/pushrocks/smarttime/commits/master)
[![coverage report](https://gitlab.com/pushrocks/smarttime/badges/master/coverage.svg)](https://gitlab.com/pushrocks/smarttime/commits/master) Status Category | Status Badge
[![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/smarttime.svg)](https://www.npmjs.com/package/@pushrocks/smarttime) -- | --
[![Known Vulnerabilities](https://snyk.io/test/npm/@pushrocks/smarttime/badge.svg)](https://snyk.io/test/npm/@pushrocks/smarttime) GitLab Pipelines | [![pipeline status](https://gitlab.com/pushrocks/smarttime/badges/master/pipeline.svg)](https://lossless.cloud)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/) GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/smarttime/badges/master/coverage.svg)](https://lossless.cloud)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/) npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/smarttime)](https://lossless.cloud)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/) Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/smarttime)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@pushrocks/smarttime)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/smarttime)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/smarttime)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage ## Usage
@ -44,7 +51,6 @@ import { ExtendedDate } from '@pushrocks/smarttime'
const myDate: Date = ExtendedDate.fromEuropeanDate('8.6.2018') const myDate: Date = ExtendedDate.fromEuropeanDate('8.6.2018')
``` ```
## Contribution ## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :) We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)

View File

@ -0,0 +1,27 @@
import { tap, expect } from '@pushrocks/tapbundle';
import * as smarttime from '../ts/index';
let testCronManager: smarttime.CronManager;
tap.test('should create a valid instance of cronmanager', async () => {
testCronManager = new smarttime.CronManager();
expect(testCronManager).to.be.instanceOf(smarttime.CronManager);
});
tap.test('should create a valid cronJon', async (tools) => {
const done = tools.defer();
let counter = 0;
testCronManager.addCronjob('*/2 * * * * *', async () => {
if (counter === 10) {
done.resolve();
}
counter++;
console.log(`hey ${counter}`);
});
testCronManager.start();
await done.promise;
testCronManager.stop();
});
tap.start();

View File

@ -9,18 +9,40 @@ tap.test('should create a valid instance of cronmanager', async () => {
expect(testCronManager).to.be.instanceOf(smarttime.CronManager); expect(testCronManager).to.be.instanceOf(smarttime.CronManager);
}); });
tap.test('should create a valid cronJon', async tools => { tap.test('should create a valid cronJon', async (tools) => {
const done = tools.defer(); const done = tools.defer();
const done2 = tools.defer();
const done3 = tools.defer();
let counter = 0; let counter = 0;
testCronManager.addCronjob('*/2 * * * * *', () => { let counter2 = 0;
let counter3 = 0;
const cronJob = testCronManager.addCronjob('*/2 * * * * *', async () => {
if (counter === 10) { if (counter === 10) {
testCronManager.removeCronjob(cronJob);
done.resolve(); done.resolve();
} }
counter++; counter++;
console.log(`hey ${counter}`); console.log(`${new Date().getSeconds()} hey ${counter} -> runs every 2 seconds`);
});
const cronJob2 = testCronManager.addCronjob('*/3 * * * * *', async () => {
if (counter2 === 10) {
testCronManager.removeCronjob(cronJob2);
done2.resolve();
}
counter2++;
console.log(`${new Date().getSeconds()} hey ${counter2} -> runs every 3 seconds`);
});
const cronJob3 = testCronManager.addCronjob('*/4 * * * * *', async () => {
if (counter3 === 10) {
done3.resolve();
}
counter3++;
console.log(`${new Date().getSeconds()} hey ${counter3} -> runs every 4 seconds`);
}); });
testCronManager.start(); testCronManager.start();
await done.promise; await done.promise;
await done2.promise;
await done3.promise;
testCronManager.stop(); testCronManager.stop();
}); });

View File

@ -5,7 +5,7 @@ import * as smarttime from '../ts/index';
// Test TimeStamp class // Test TimeStamp class
let testTimeStamp: smarttime.TimeStamp; let testTimeStamp: smarttime.TimeStamp;
let testTimeStamp2: smarttime.TimeStamp; let testTimeStamp2: smarttime.TimeStamp;
tap.test('should create valid testTimeStamp instance', async tools => { tap.test('should create valid testTimeStamp instance', async (tools) => {
testTimeStamp = new smarttime.TimeStamp(); testTimeStamp = new smarttime.TimeStamp();
await tools.delayFor(2); await tools.delayFor(2);
testTimeStamp2 = new smarttime.TimeStamp(); testTimeStamp2 = new smarttime.TimeStamp();
@ -23,7 +23,7 @@ tap.test('should have valid linuxtime', async () => {
let testHrtMeasurement: smarttime.HrtMeasurement; let testHrtMeasurement: smarttime.HrtMeasurement;
// Test HrtMeasurement // Test HrtMeasurement
tap.test('should create valid HrtMeasurements', async tools => { tap.test('should create valid HrtMeasurements', async (tools) => {
testHrtMeasurement = new smarttime.HrtMeasurement(); testHrtMeasurement = new smarttime.HrtMeasurement();
testHrtMeasurement.start(); testHrtMeasurement.start();
await tools.delayFor(20); await tools.delayFor(20);
@ -41,7 +41,7 @@ tap.test('should combine units', async () => {
weeks: 2, weeks: 2,
days: 2, days: 2,
hours: 2, hours: 2,
minutes: 2 minutes: 2,
}); });
// tslint:disable-next-line:no-console // tslint:disable-next-line:no-console
console.log(computedTime); console.log(computedTime);

View File

@ -1,4 +1,5 @@
export * from './smarttime.classes.cronmanager'; export * from './smarttime.classes.cronmanager';
export * from './smarttime.classes.cronjob';
export * from './smarttime.classes.extendeddate'; export * from './smarttime.classes.extendeddate';
export * from './smarttime.classes.hrtmeasurement'; export * from './smarttime.classes.hrtmeasurement';
export * from './smarttime.classes.interval'; export * from './smarttime.classes.interval';

View File

@ -4,7 +4,7 @@ import { CronManager } from './smarttime.classes.cronmanager';
export type TJobFunction = (() => void) | (() => Promise<any>); export type TJobFunction = (() => void) | (() => Promise<any>);
export class CronJob { export class CronJob {
public croner; public croner;
public status: 'started' | 'stopped' | 'initial' = 'initial'; public status: 'started' | 'stopped' | 'initial' = 'initial';
public cronExpression: string; public cronExpression: string;
public jobFunction: TJobFunction; public jobFunction: TJobFunction;
@ -21,15 +21,29 @@ export class CronJob {
*/ */
public checkExecution(): number { public checkExecution(): number {
if (this.nextExecutionUnix === 0) { if (this.nextExecutionUnix === 0) {
this.nextExecutionUnix = this.croner.msToNext(); this.getNextExecutionTime();
} }
if (Date.now() > this.nextExecutionUnix) { if (Date.now() > this.nextExecutionUnix) {
this.jobFunction(); const maybePromise = this.jobFunction();
this.nextExecutionUnix = this.croner.msToNext(); if (maybePromise instanceof Promise) {
maybePromise.catch(e => console.log(e));
}
this.nextExecutionUnix = this.getNextExecutionTime();
} }
return this.nextExecutionUnix; return this.nextExecutionUnix;
} }
public getNextExecutionTime() {
return this.nextExecutionUnix = Date.now() + this.getTimeToNextExecution();
}
/**
* gets the time to next execution
*/
public getTimeToNextExecution() {
return this.croner.msToNext();
}
public start() { public start() {
this.status = 'started'; this.status = 'started';
} }

View File

@ -5,54 +5,69 @@ export class CronManager {
public executionTimeout: plugins.smartdelay.Timeout<void>; public executionTimeout: plugins.smartdelay.Timeout<void>;
public status: 'started' | 'stopped' = 'stopped'; public status: 'started' | 'stopped' = 'stopped';
public cronjobs: CronJob[] = []; public cronjobs = new plugins.lik.ObjectMap<CronJob>();
constructor() {} constructor() {}
public addCronjob(cronIdentifierArg: string, cronFunctionArg: () => any) { public addCronjob(cronIdentifierArg: string, cronFunctionArg: () => Promise<void>) {
const newCronJob = new CronJob(this, cronIdentifierArg, cronFunctionArg); const newCronJob = new CronJob(this, cronIdentifierArg, cronFunctionArg);
this.cronjobs.push(newCronJob); this.cronjobs.add(newCronJob);
if (this.status === 'started') { if (this.status === 'started') {
newCronJob.start(); newCronJob.start();
} }
return newCronJob;
}
public removeCronjob(cronjobArg: CronJob) {
cronjobArg.stop();
this.cronjobs.remove(cronjobArg);
} }
/** /**
* starts the cronjob * starts the cronjob
*/ */
public start() { public start() {
this.status = 'started'; if (this.status !== 'started') {
for (const cronJob of this.cronjobs) { this.status = 'started';
cronJob.start(); for (const cronJob of this.cronjobs.getArray()) {
} cronJob.start();
this.executionTimeout = new plugins.smartdelay.Timeout(0); }
const runCronCycle = async () => {
// recursion this.executionTimeout = new plugins.smartdelay.Timeout(0);
const runCheckExecution = () => { do {
console.log(`Next CronJob scheduled in ${this.executionTimeout.getTimeLeft()} milliseconds`); let nextRunningCronjob: CronJob;
this.executionTimeout.promise.then(() => { for (const cronJob of this.cronjobs.getArray()) {
let timeToNextOverallExecution: number; cronJob.checkExecution();
for (const cronJob of this.cronjobs) { if (
const timeToNextJobExecution = cronJob.checkExecution(); !nextRunningCronjob ||
if (timeToNextJobExecution < timeToNextOverallExecution || !timeToNextOverallExecution) { cronJob.getTimeToNextExecution() < nextRunningCronjob.getTimeToNextExecution()
timeToNextOverallExecution = timeToNextJobExecution; ) {
nextRunningCronjob = cronJob;
}
} }
} this.executionTimeout = new plugins.smartdelay.Timeout(nextRunningCronjob.getTimeToNextExecution());
this.executionTimeout = new plugins.smartdelay.Timeout(timeToNextOverallExecution); console.log(
runCheckExecution(); `Next CronJob scheduled in ${this.executionTimeout.getTimeLeft()} milliseconds`
}); );
}; await this.executionTimeout.promise;
} while (this.status === 'started');
runCheckExecution(); };
runCronCycle();
}
} }
/** /**
* stops all cronjobs * stops all cronjobs
*/ */
public stop() { public stop() {
this.status = 'stopped'; if (this.status === 'started') {
this.executionTimeout.cancel(); this.status = 'stopped';
for (const cron of this.cronjobs) { this.executionTimeout.cancel();
} else {
console.log(`You tried to stop a CronManager that was not actually started.`);
}
for (const cron of this.cronjobs.getArray()) {
cron.stop(); cron.stop();
} }
} }

View File

@ -98,7 +98,7 @@ export class ExtendedDate extends Date {
'September', 'September',
'October', 'October',
'November', 'November',
'December' 'December',
]; ];
const daysArray = [ const daysArray = [
'Monday', 'Monday',
@ -107,7 +107,7 @@ export class ExtendedDate extends Date {
'Thursday', 'Thursday',
'Friday', 'Friday',
'Saturday', 'Saturday',
'Sunday' 'Sunday',
]; ];
return { return {
year: this.getFullYear(), year: this.getFullYear(),
@ -118,7 +118,7 @@ export class ExtendedDate extends Date {
day: this.getDate(), day: this.getDate(),
dayString: ('0' + this.getDate()).slice(-2), dayString: ('0' + this.getDate()).slice(-2),
dayOfTheWeek: this.getDay(), dayOfTheWeek: this.getDay(),
dayOfTheWeekName: daysArray[this.getDay()] dayOfTheWeekName: daysArray[this.getDay()],
}; };
} }
} }

View File

@ -1,8 +1,9 @@
// @pushrocks scope // @pushrocks scope
import * as lik from '@pushrocks/lik';
import * as smartdelay from '@pushrocks/smartdelay'; import * as smartdelay from '@pushrocks/smartdelay';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
export { smartdelay, smartpromise }; export { lik, smartdelay, smartpromise };
// third parties // third parties
import croner from 'croner'; import croner from 'croner';

View File

@ -16,7 +16,7 @@ export let units = {
}, },
minutes: (timesArg = 1) => { minutes: (timesArg = 1) => {
return timesArg * 60000; return timesArg * 60000;
} },
}; };
export interface IUnitCombinationArg { export interface IUnitCombinationArg {
@ -30,7 +30,7 @@ export interface IUnitCombinationArg {
export let getMilliSecondsFromUnits = (combinationArg: IUnitCombinationArg) => { export let getMilliSecondsFromUnits = (combinationArg: IUnitCombinationArg) => {
let timeInMilliseconds = 0; let timeInMilliseconds = 0;
let addMilliSeconds = milliSecondsArg => { let addMilliSeconds = (milliSecondsArg) => {
timeInMilliseconds = timeInMilliseconds + milliSecondsArg; timeInMilliseconds = timeInMilliseconds + milliSecondsArg;
}; };
if (combinationArg.years) { if (combinationArg.years) {