Compare commits

..

108 Commits

Author SHA1 Message Date
3f749dfdd2 2.0.11 2019-09-18 19:15:56 +02:00
2a39543a75 fix(core): update 2019-09-18 19:15:56 +02:00
68f7d26d3b 2.0.10 2019-09-08 22:45:37 +02:00
6373a74fb3 fix(core): update 2019-09-08 22:45:36 +02:00
be3d2d41d6 2.0.9 2019-09-06 16:32:36 +02:00
2affa189a7 fix(core): update 2019-09-06 16:32:36 +02:00
8c4c2a552c 2.0.8 2019-09-05 11:35:26 +02:00
eff9c6e6c9 fix(core): update 2019-09-05 11:35:26 +02:00
4c7a373d98 2.0.7 2019-01-15 00:20:05 +01:00
6b93a2e7ac fix(core): update 2019-01-15 00:20:05 +01:00
9c6487c779 2.0.6 2019-01-15 00:17:45 +01:00
e3f37f5027 fix(core): update 2019-01-15 00:17:44 +01:00
1152bb1138 2.0.5 2018-08-12 20:55:07 +02:00
9df7787450 2.0.4 2018-08-11 00:01:19 +02:00
3e81fdacad fix(CI): now building properly 2018-08-11 00:01:19 +02:00
f74da6ff0b 2.0.3 2018-08-05 23:10:01 +02:00
e9d976ad1e fix(ci): update testing framework to the new tstest 2018-08-05 23:10:00 +02:00
f6d314695a 2.0.2 2018-08-04 18:03:23 +02:00
d35b34f4aa fix(package.json): update private param 2018-08-04 18:03:22 +02:00
9fec5ce62e 2.0.1 2018-08-04 18:02:41 +02:00
7577479368 fix(docs): update docs 2018-08-04 18:02:41 +02:00
dbcd5bbfc8 2.0.0 2018-08-04 18:00:22 +02:00
d91b6c8360 BREAKING CHANGE(scope): switch to pushrocks scope 2018-08-04 18:00:21 +02:00
b9af186190 update 2018-08-04 17:59:01 +02:00
bdb7064394 update 2018-08-04 17:58:46 +02:00
f60deddadd fix(tests): now using tstest 2018-08-04 17:53:22 +02:00
df18aba4b5 1.0.22 2017-07-12 16:45:21 +02:00
a3699f2869 introduce TaskOnce 2017-07-12 16:45:18 +02:00
017c0789ca 1.0.21 2017-07-10 14:29:02 +02:00
6e6d056617 update docs 2017-07-10 14:28:58 +02:00
3f7f38ee17 1.0.20 2017-07-10 12:49:04 +02:00
5bfc72a602 add docs 2017-07-10 12:48:57 +02:00
ca8882962e 1.0.19 2017-07-10 12:45:36 +02:00
df6bf2c681 updated dependencies 2017-07-10 12:45:33 +02:00
310a683e14 1.0.18 2017-07-10 12:42:11 +02:00
3f275ebc08 implemented execDelay 2017-07-10 12:42:06 +02:00
01d469960e 1.0.17 2017-06-18 13:25:12 +02:00
2ed701040a now has working TaskManager 2017-06-18 13:25:09 +02:00
ca3bb38205 update test texts 2017-06-17 17:29:26 +02:00
891d727fd4 1.0.16 2017-06-17 16:56:37 +02:00
e1424ea0fb implement TaskManager 2017-06-17 16:56:33 +02:00
cf1b31d635 1.0.15 2017-06-09 23:34:40 +02:00
d5570311ee update ci 2017-06-09 23:34:37 +02:00
44b3ba1313 1.0.14 2017-06-09 23:33:45 +02:00
4721d8c9e6 clean up code 2017-06-09 23:33:41 +02:00
c7336eedfb 1.0.13 2017-06-09 23:26:25 +02:00
5477911b5e update to latest standards 2017-06-09 23:26:23 +02:00
2f8d3f7625 1.0.12 2017-02-15 22:52:34 +01:00
b00d31b41a update dependencies 2017-02-15 22:52:29 +01:00
4031692f6f 1.0.11 2017-01-20 21:36:21 +01:00
174beae65f fix test 2017-01-20 21:36:18 +01:00
c1144d3405 add taskmanager class 2017-01-20 20:48:07 +01:00
065d92e573 1.0.10 2017-01-20 18:54:28 +01:00
46878819df add better readme 2017-01-20 18:54:23 +01:00
aa8df29bbb 1.0.9 2017-01-20 18:50:43 +01:00
f5cb0843fc smartq now working 2017-01-20 18:50:37 +01:00
1d52d098fb Merge branch 'master' into 'master'
update from q to smartq

See merge request !1
2017-01-20 08:33:32 +00:00
eb7eb14415 update from q to smartq 2017-01-19 17:26:35 +01:00
670bf5b124 1.0.8 2016-09-02 18:11:49 +02:00
fab863c66c update dependencies 2016-09-02 18:11:33 +02:00
402e2b982f 1.0.7 2016-08-03 14:51:47 +02:00
1d0a85e6ca now returning correct Promise types 2016-08-03 14:51:43 +02:00
7ded7b036e 1.0.6 2016-08-03 12:14:29 +02:00
03020eacbc update type versions 2016-08-03 12:14:21 +02:00
dc95885646 1.0.5 2016-08-03 11:28:21 +02:00
11cdaad226 add error catching 2016-08-03 11:28:13 +02:00
a1ad463140 1.0.4 2016-08-02 11:10:08 +02:00
76c57451b3 values now flow correctly between tasks 2016-08-02 11:09:42 +02:00
5dca9a9460 1.0.3 2016-08-01 16:10:06 +02:00
d30fb551f9 now running correctly in buffered mode 2016-08-01 16:10:00 +02:00
7a60f30f0b 1.0.2 2016-08-01 13:35:38 +02:00
9e175245ed update README 2016-08-01 13:35:33 +02:00
4bc5617240 1.0.1 2016-08-01 13:19:50 +02:00
39c41a817e now exporting interfaces 2016-08-01 13:19:42 +02:00
8823e2b01d 1.0.0 2016-08-01 13:17:36 +02:00
24e96926e3 update taskbuffer and add gitlab ci 2016-08-01 13:17:15 +02:00
8a414b9a7d update structure 2016-08-01 00:53:27 +02:00
a347ded65a 0.1.3 2016-05-23 05:37:12 +02:00
3ce4b200db add typings to package.json 2016-05-23 05:36:55 +02:00
cd6407f189 0.1.2 2016-05-17 03:32:57 +02:00
ca2afbd8c7 improve Readme 2016-05-17 03:32:47 +02:00
6640d5fb2f 0.1.1 2016-05-17 03:27:34 +02:00
7a3aed275f update README 2016-05-17 03:27:29 +02:00
19beb95e20 now logging allright 2016-05-15 15:52:59 +02:00
8944ae2462 added Taskparallel class that executest tasks in parallel 2016-05-15 15:28:38 +02:00
b1eeb3563e 0.1.0 2016-05-15 03:18:19 +02:00
1714f552ac now has working taskchain 2016-05-15 03:16:50 +02:00
454a999a42 improve options handling between classes 2016-05-14 23:24:11 +02:00
1f3f2ae92f included ora and introduced taskspace. 2016-05-14 04:28:22 +02:00
9014eec9f6 tiny fix 2016-05-13 05:14:29 +02:00
ee56b6f655 now has working task class 2016-05-06 02:05:45 +02:00
55ddbece13 update tests 2016-05-05 19:30:24 +02:00
130c4177a6 0.0.5 2016-05-05 19:26:02 +02:00
90c9f23c23 improved .npmignore 2016-05-05 19:25:59 +02:00
0d0ee67ca3 compiled 2016-05-05 19:21:50 +02:00
5fd11ec9c0 add some more buffer logic 2016-05-05 19:21:01 +02:00
569cb311c9 compile and update some imports to work with TypeScript declaration 2016-05-05 18:36:31 +02:00
44db37574c now running Tasks and handling task loops allright. 2016-05-05 18:06:04 +02:00
fb7f5c5e68 recompile 2016-05-04 05:20:51 +02:00
b6595ac1d3 small typo fix 2016-05-04 05:15:05 +02:00
3f3f9c68f1 small update on promise return in README 2016-05-04 05:13:36 +02:00
48c20c081f update README on how buffered Tasks work. 2016-05-04 05:11:08 +02:00
72504d7ad7 cleanup 2016-05-04 04:42:47 +02:00
370e714fe1 0.0.4 2016-05-04 04:29:35 +02:00
4179347f26 fix package.json 2016-05-04 04:29:27 +02:00
130e071a06 update structure and deps 2016-05-04 04:28:50 +02:00
c4e2021a01 0.0.3 2016-05-04 04:18:11 +02:00
58ac5745a1 Update Readme and clarify use of Promises. 2016-05-04 04:17:59 +02:00
37 changed files with 2764 additions and 316 deletions

27
.gitignore vendored
View File

@ -1,7 +1,22 @@
.idea/
.nogit/
# artifacts
coverage/
docs/
ts/*.js
ts/*.js.map
ts/typings/
node_modules
public/
pages/
# installs
node_modules/
# caches
.yarn/
.cache/
.rpt2_cache
# builds
dist/
dist_web/
dist_serve/
dist_ts_web/
# custom

119
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,119 @@
# gitzone ci_default
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
cache:
paths:
- .npmci_cache/
key: "$CI_BUILD_STAGE"
stages:
- security
- test
- release
- metadata
# ====================
# security stage
# ====================
mirror:
stage: security
script:
- npmci git mirror
tags:
- docker
- notpriv
snyk:
stage: security
script:
- npmci npm prepare
- npmci command npm install -g snyk
- npmci command npm install --ignore-scripts
- npmci command snyk test
tags:
- docker
- notpriv
# ====================
# test stage
# ====================
testStable:
stage: test
script:
- npmci npm prepare
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- priv
testBuild:
stage: test
script:
- npmci npm prepare
- npmci node install lts
- npmci npm install
- npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
release:
stage: release
script:
- npmci node install lts
- npmci npm publish
only:
- tags
tags:
- docker
- notpriv
# ====================
# metadata stage
# ====================
codequality:
stage: metadata
allow_failure: true
script:
- npmci command npm install -g tslint typescript
- npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags:
- docker
- priv
trigger:
stage: metadata
script:
- npmci trigger
only:
- tags
tags:
- docker
- notpriv
pages:
image: hosttoday/ht-docker-dbase:npmci
services:
- docker:stable-dind
stage: metadata
script:
- npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare
- npmci npm install
- npmci command tsdoc
tags:
- docker
- notpriv
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public
allow_failure: true

View File

@ -0,0 +1,5 @@
docs/
coverage/
ts/
node_modules/
pages/

View File

@ -1,11 +0,0 @@
language: node_js
node_js:
- stable
deploy:
provider: npm
email: npm@lossless.digital
api_key:
secure: NejErc2+ohEEH8DecYcx6/2oSdEQQBRzlOwTMxQBftHdIkvziwOcCerqCJtrXuzalqAofVCcVisunWIXZmxfIBGV6mJVauCIp5KzH4JUhYzLym33p9MSphjlPNfsI6nKkW0LAgOMjkJGuHLqU3oskvBqYyh8m3NuCna5mNwm8lo5WGckzHSwdsmhnb839WhlZbmQc6M6WW6Ir7bbxX9ZOmNUYUWH6VdXfPBxoXN3nO21pXKt7Zg8/nU7IkF+VEUVfYNlR3xUiocWemuBFxjtsfoliQ/y/oGL7ccQ7OeE4PxSu+xNUpYYVipkQcRtyWDKCwJp4R2DNTj/ikOHH+BEFOBDG8qYxwf37Ju0jFybzslAEJLy5gl4bFjiZNA8ldUXY5ubJb56iZTNSbMU0lmXw+qKvIoyVY/1JAE5lzFGVA6nDdiUGAEOg/ajzAC3gjFU2QS2Wvncz3dky0k/2INBVUwmmAvAMazl5XkvHtQ3Wzb+Fc8TXWflqBDF0okySoJzlY13pm/OtOHipiqEyUCnqaUUwJtLIb6tHOPzxZKlWLCem7y84cDlxQSbLVItbArOJFHdr66sp/U/FqYAtWeLdbkhjCENFwzR9kYtEyEl+QWLTckO1/lVF4xJLh6drfhQ66CwF5bfqr5xIS08mnKuYBfJOA4/wV4bQFPhtYm7Oi8=
on:
tags: true
repo: pushrocks/taskbuffer

View File

@ -1,19 +0,0 @@
# taskbuffer
Flexible task organization for gulp.
## Status
[![Coverage Status](https://coveralls.io/repos/github/pushrocks/taskbuffer/badge.svg?branch=master)](https://coveralls.io/github/pushrocks/taskbuffer?branch=master)
## Install
```sh
npm install taskbuffer --save
```
## Concepts
#### Task
* A Task in its most simple form is a function that is executed when the task runs.
* It can have a preTaska and an afterTask (those are run before or after the main function whenever the task is called)
* A Task can be buffered. That means it can be called multiple times in a very short time. However execution happens in line: meaning execution of the task's main function is on halt until the previous task call has finished.
* Multiple Tasks can be combined in a bigger task using a Taskchain. Taskchain extends Task.

7
dist/index.js vendored
View File

@ -1,7 +0,0 @@
var task = require("./taskbuffer.task");
var taskbuffer = {
task: task
};
module.exports = taskbuffer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLElBQU8sSUFBSSxXQUFXLG1CQUFtQixDQUFDLENBQUM7QUFHM0MsSUFBSSxVQUFVLEdBQUc7SUFDYixJQUFJLEVBQUUsSUFBSTtDQUNiLENBQUM7QUFFRixpQkFBUyxVQUFVLENBQUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG5pbXBvcnQgcGx1Z2lucyA9IHJlcXVpcmUoXCIuL3Rhc2tidWZmZXIucGx1Z2luc1wiKTtcbmltcG9ydCB0YXNrID0gcmVxdWlyZShcIi4vdGFza2J1ZmZlci50YXNrXCIpO1xuaW1wb3J0IHRhc2tjaGFpbiA9IHJlcXVpcmUoXCIuL3Rhc2tidWZmZXIudGFza2NoYWluXCIpO1xuXG52YXIgdGFza2J1ZmZlciA9IHtcbiAgICB0YXNrOiB0YXNrXG59O1xuXG5leHBvcnQgPSB0YXNrYnVmZmVyOyJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==

View File

@ -1,16 +0,0 @@
/// <reference path="./typings/main.d.ts" />
var plugins = require("./taskbuffer.plugins");
var classes = require("./taskbuffer.classes");
exports.emptyTaskFunction = function () {
var done = plugins.Q.defer();
done.resolve();
return done.promise;
};
exports.runTask = function (taskArg) {
var done = plugins.Q.defer();
if (taskArg instanceof classes.Task) {
}
return done.promise;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIuY2xhc3Nlcy5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRDQUE0QztBQUM1QyxJQUFPLE9BQU8sV0FBVyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2pELElBQU8sT0FBTyxXQUFXLHNCQUFzQixDQUFDLENBQUM7QUFDdEMseUJBQWlCLEdBQUc7SUFDM0IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFUyxlQUFPLEdBQUcsVUFBUyxPQUFPO0lBQ2pDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsRUFBRSxDQUFBLENBQUMsT0FBTyxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDO0lBRXBDLENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUMiLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLmhlbHBlcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG5pbXBvcnQgcGx1Z2lucyA9IHJlcXVpcmUoXCIuL3Rhc2tidWZmZXIucGx1Z2luc1wiKTtcbmltcG9ydCBjbGFzc2VzID0gcmVxdWlyZShcIi4vdGFza2J1ZmZlci5jbGFzc2VzXCIpO1xuZXhwb3J0IHZhciBlbXB0eVRhc2tGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIGRvbmUgPSBwbHVnaW5zLlEuZGVmZXIoKTtcbiAgICBkb25lLnJlc29sdmUoKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxuZXhwb3J0IHZhciBydW5UYXNrID0gZnVuY3Rpb24odGFza0FyZyl7XG4gICAgdmFyIGRvbmUgPSBwbHVnaW5zLlEuZGVmZXIoKTtcbiAgICBpZih0YXNrQXJnIGluc3RhbmNlb2YgY2xhc3Nlcy5UYXNrKXtcblxuICAgIH1cbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTsiXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=

View File

@ -1,65 +0,0 @@
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
/// <reference path="./typings/main.d.ts" />
var plugins = require("./taskbuffer.plugins");
var helpers = require("./taskbuffer.classes.helpers");
var Task = (function () {
function Task(taskArg, optionsArg) {
if (optionsArg === void 0) { optionsArg = {}; }
var options = optionsArg;
this.task = taskArg;
this.preTask = options.preTask;
this.afterTask = options.afterTask;
this.idle = true;
this.running = false;
if (typeof options.buffered === "boolean") {
this.buffered = options.buffered;
}
else {
this.buffered = false;
}
}
Task.prototype.trigger = function () {
helpers.runTask(this.preTask)
.then(function () {
})
.then(function () {
});
};
;
Task.prototype.triggerBuffered = function () {
var done = plugins.Q.defer();
};
Object.defineProperty(Task.prototype, "state", {
get: function () {
return this._state;
},
set: function (stateArg) {
if (stateArg == "locked") {
this._state = "locked";
}
else {
plugins.beautylog.error("state type");
}
},
enumerable: true,
configurable: true
});
return Task;
})();
exports.Task = Task;
var TaskChain = (function (_super) {
__extends(TaskChain, _super);
function TaskChain(taskArrayArg) {
_super.call(this, {
task: function () { }
});
}
return TaskChain;
})(Task);
exports.TaskChain = TaskChain;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIuY2xhc3Nlcy50cyJdLCJuYW1lcyI6WyJUYXNrIiwiVGFzay5jb25zdHJ1Y3RvciIsIlRhc2sudHJpZ2dlciIsIlRhc2sudHJpZ2dlckJ1ZmZlcmVkIiwiVGFzay5zdGF0ZSIsIlRhc2tDaGFpbiIsIlRhc2tDaGFpbi5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBNEM7QUFDNUMsSUFBTyxPQUFPLFdBQVcsc0JBQXNCLENBQUMsQ0FBQztBQUNqRCxJQUFPLE9BQU8sV0FBVyw4QkFBOEIsQ0FBQyxDQUFDO0FBQ3pEO0lBV0lBLGNBQVlBLE9BQU9BLEVBQUNBLFVBQWtFQTtRQUFsRUMsMEJBQWtFQSxHQUFsRUEsZUFBa0VBO1FBQ2xGQSxJQUFJQSxPQUFPQSxHQUFHQSxVQUFVQSxDQUFDQTtRQUN6QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsT0FBT0EsQ0FBQ0E7UUFDcEJBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLE9BQU9BLENBQUNBLE9BQU9BLENBQUNBO1FBQy9CQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxPQUFPQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUNuQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDakJBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLEtBQUtBLENBQUNBO1FBQ3JCQSxFQUFFQSxDQUFDQSxDQUFDQSxPQUFPQSxPQUFPQSxDQUFDQSxRQUFRQSxLQUFLQSxTQUFTQSxDQUFDQSxDQUFBQSxDQUFDQTtZQUN2Q0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsT0FBT0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7UUFDckNBLENBQUNBO1FBQUNBLElBQUlBLENBQUNBLENBQUNBO1lBQ0pBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLEtBQUtBLENBQUNBO1FBQzFCQSxDQUFDQTtJQUNMQSxDQUFDQTtJQUNERCxzQkFBT0EsR0FBUEE7UUFDSUUsT0FBT0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7YUFDeEJBLElBQUlBLENBQUNBO1FBRU4sQ0FBQyxDQUFDQTthQUNEQSxJQUFJQSxDQUFDQTtRQUVOLENBQUMsQ0FBQ0EsQ0FBQUE7SUFDVkEsQ0FBQ0E7O0lBQ0RGLDhCQUFlQSxHQUFmQTtRQUNJRyxJQUFJQSxJQUFJQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQTtJQUNqQ0EsQ0FBQ0E7SUFFREgsc0JBQUlBLHVCQUFLQTthQUFUQTtZQUNJSSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtRQUN2QkEsQ0FBQ0E7YUFDREosVUFBVUEsUUFBZUE7WUFDckJJLEVBQUVBLENBQUNBLENBQUNBLFFBQVFBLElBQUlBLFFBQVFBLENBQUNBLENBQUFBLENBQUNBO2dCQUN0QkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsUUFBUUEsQ0FBQ0E7WUFDM0JBLENBQUNBO1lBQUNBLElBQUlBLENBQUNBLENBQUNBO2dCQUNKQSxPQUFPQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxZQUFZQSxDQUFFQSxDQUFDQTtZQUMzQ0EsQ0FBQ0E7UUFDTEEsQ0FBQ0E7OztPQVBBSjtJQVFMQSxXQUFDQTtBQUFEQSxDQS9DQSxBQStDQ0EsSUFBQTtBQS9DWSxZQUFJLE9BK0NoQixDQUFBO0FBR0Q7SUFBK0JLLDZCQUFJQTtJQUMvQkEsbUJBQVlBLFlBQW1CQTtRQUMzQkMsa0JBQU1BO1lBQ0ZBLElBQUlBLEVBQUNBLGNBQVcsQ0FBQztTQUNwQkEsQ0FBQ0EsQ0FBQ0E7SUFDUEEsQ0FBQ0E7SUFDTEQsZ0JBQUNBO0FBQURBLENBTkEsQUFNQ0EsRUFOOEIsSUFBSSxFQU1sQztBQU5ZLGlCQUFTLFlBTXJCLENBQUEiLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwaW5ncy9tYWluLmQudHNcIiAvPlxuaW1wb3J0IHBsdWdpbnMgPSByZXF1aXJlKFwiLi90YXNrYnVmZmVyLnBsdWdpbnNcIik7XG5pbXBvcnQgaGVscGVycyA9IHJlcXVpcmUoXCIuL3Rhc2tidWZmZXIuY2xhc3Nlcy5oZWxwZXJzXCIpO1xuZXhwb3J0IGNsYXNzIFRhc2sge1xuICAgIHRhc2s6YW55O1xuICAgIGlkbGU6Ym9vbGVhbjtcbiAgICBydW5uaW5nOmJvb2xlYW47XG4gICAgYnVmZmVyZWQ6Ym9vbGVhbjtcbiAgICBwcml2YXRlIF9jb3VudGVyQnVmZmVyUmVsYXRpdmU7XG4gICAgcHJpdmF0ZSBfY291bnRlclRyaWdnZXJBYnNvbHV0ZTtcbiAgICBwcml2YXRlIF9zdGF0ZTpzdHJpbmc7XG4gICAgcHJlVGFzazpUYXNrO1xuICAgIGFmdGVyVGFzazpUYXNrO1xuXG4gICAgY29uc3RydWN0b3IodGFza0FyZyxvcHRpb25zQXJnOntwcmVUYXNrPzpUYXNrLGFmdGVyVGFzaz86VGFzaywgYnVmZmVyZWQ/OmJvb2xlYW59ID0ge30pe1xuICAgICAgICB2YXIgb3B0aW9ucyA9IG9wdGlvbnNBcmc7XG4gICAgICAgIHRoaXMudGFzayA9IHRhc2tBcmc7XG4gICAgICAgIHRoaXMucHJlVGFzayA9IG9wdGlvbnMucHJlVGFzaztcbiAgICAgICAgdGhpcy5hZnRlclRhc2sgPSBvcHRpb25zLmFmdGVyVGFzaztcbiAgICAgICAgdGhpcy5pZGxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5idWZmZXJlZCA9PT0gXCJib29sZWFuXCIpe1xuICAgICAgICAgICAgdGhpcy5idWZmZXJlZCA9IG9wdGlvbnMuYnVmZmVyZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJpZ2dlcigpe1xuICAgICAgICBoZWxwZXJzLnJ1blRhc2sodGhpcy5wcmVUYXNrKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIH0pXG4gICAgfTtcbiAgICB0cmlnZ2VyQnVmZmVyZWQoKXtcbiAgICAgICAgdmFyIGRvbmUgPSBwbHVnaW5zLlEuZGVmZXIoKTtcbiAgICB9XG5cbiAgICBnZXQgc3RhdGUoKTpzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIHNldCBzdGF0ZShzdGF0ZUFyZzpzdHJpbmcpe1xuICAgICAgICBpZiAoc3RhdGVBcmcgPT0gXCJsb2NrZWRcIil7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFwibG9ja2VkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbHVnaW5zLmJlYXV0eWxvZy5lcnJvcihcInN0YXRlIHR5cGVcIiApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmV4cG9ydCBjbGFzcyBUYXNrQ2hhaW4gZXh0ZW5kcyBUYXNrIHtcbiAgICBjb25zdHJ1Y3Rvcih0YXNrQXJyYXlBcmc6VGFza1tdKXtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgdGFzazpmdW5jdGlvbigpe31cbiAgICAgICAgfSk7XG4gICAgfVxufSJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==

View File

@ -1,8 +0,0 @@
/// <reference path="./typings/main.d.ts" />
var plugins = {
beautylog: require("beautylog"),
Q: require("q")
};
module.exports = plugins;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0Q0FBNEM7QUFDNUMsSUFBSSxPQUFPLEdBQUc7SUFDVixTQUFTLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUMvQixDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztDQUNsQixDQUFDO0FBQ0YsaUJBQVMsT0FBTyxDQUFDIiwiZmlsZSI6InRhc2tidWZmZXIucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3R5cGluZ3MvbWFpbi5kLnRzXCIgLz5cbnZhciBwbHVnaW5zID0ge1xuICAgIGJlYXV0eWxvZzogcmVxdWlyZShcImJlYXV0eWxvZ1wiKSxcbiAgICBROiByZXF1aXJlKFwicVwiKVxufTtcbmV4cG9ydCA9IHBsdWdpbnM7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=

View File

@ -1,3 +0,0 @@
/// <reference path="./typings/main.d.ts" />
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIucHJvbWlzZWNoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRDQUE0QyIsImZpbGUiOiJ0YXNrYnVmZmVyLnByb21pc2VjaGFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3R5cGluZ3MvbWFpbi5kLnRzXCIgLz4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=

View File

@ -1,9 +0,0 @@
/// <reference path="./typings/main.d.ts" />
var classes = require("./taskbuffer.classes");
var task = function (taskArg, options) {
var task = taskArg;
return new classes.Task(task, options);
};
module.exports = task;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIudGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0Q0FBNEM7QUFDNUMsSUFBTyxPQUFPLFdBQVcsc0JBQXNCLENBQUMsQ0FBQztBQUNqRCxJQUFJLElBQUksR0FBRyxVQUFTLE9BQU8sRUFBQyxPQUFRO0lBQ2hDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQTtJQUNsQixNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQyxPQUFPLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFDRixpQkFBUyxJQUFJLENBQUMiLCJmaWxlIjoidGFza2J1ZmZlci50YXNrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwaW5ncy9tYWluLmQudHNcIiAvPlxuaW1wb3J0IGNsYXNzZXMgPSByZXF1aXJlKFwiLi90YXNrYnVmZmVyLmNsYXNzZXNcIik7XG52YXIgdGFzayA9IGZ1bmN0aW9uKHRhc2tBcmcsb3B0aW9ucz8pe1xuICAgIHZhciB0YXNrID0gdGFza0FyZ1xuICAgIHJldHVybiBuZXcgY2xhc3Nlcy5UYXNrKHRhc2ssb3B0aW9ucyk7XG59O1xuZXhwb3J0ID0gdGFzazsiXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=

View File

@ -1,8 +0,0 @@
/// <reference path="./typings/main.d.ts" />
var classes = require("./taskbuffer.classes");
var taskChain = function (taskArrayArg) {
return new classes.TaskChain(taskArrayArg);
};
module.exports = taskChain;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhc2tidWZmZXIudGFza2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRDQUE0QztBQUM1QyxJQUFPLE9BQU8sV0FBVyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2pELElBQUksU0FBUyxHQUFHLFVBQVMsWUFBMkI7SUFFaEQsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFDRixpQkFBUyxTQUFTLENBQUMiLCJmaWxlIjoidGFza2J1ZmZlci50YXNrY2hhaW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG5pbXBvcnQgY2xhc3NlcyA9IHJlcXVpcmUoXCIuL3Rhc2tidWZmZXIuY2xhc3Nlc1wiKTtcbnZhciB0YXNrQ2hhaW4gPSBmdW5jdGlvbih0YXNrQXJyYXlBcmc6Y2xhc3Nlcy5UYXNrW10pe1xuXG4gICAgcmV0dXJuIG5ldyBjbGFzc2VzLlRhc2tDaGFpbih0YXNrQXJyYXlBcmcpO1xufTtcbmV4cG9ydCA9IHRhc2tDaGFpbjtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==

17
npmextra.json Normal file
View File

@ -0,0 +1,17 @@
{
"npmci": {
"npmGlobalTools": [],
"npmAccessLevel": "public",
"npmRegistryUrl": "registry.npmjs.org"
},
"gitzone": {
"module": {
"githost": "gitlab.com",
"gitscope": "pushrocks",
"gitrepo": "taskbuffer",
"shortDescription": "flexible task management. TypeScript ready!",
"npmPackagename": "@pushrocks/taskbuffer",
"license": "MIT"
}
}
}

View File

@ -1,4 +0,0 @@
{
"mode":"default",
"coveralls":true
}

1676
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,34 +1,57 @@
{
"name": "taskbuffer",
"version": "0.0.2",
"description": "manage triggers and execution of tasks with promises",
"name": "@pushrocks/taskbuffer",
"version": "2.0.11",
"private": false,
"description": "flexible task management. TypeScript ready!",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"scripts": {
"test": "(npmts)"
"test": "(tstest test/)",
"build": "(tsbuild)"
},
"repository": {
"type": "git",
"url": "git+https://github.com/pushrocks/taskbuffer.git"
"url": "git+https://gitlab.com/pushrocks/taskbuffer.git"
},
"keywords": [
"gulp",
"tasks",
"watch",
"buffer"
"task",
"buffer",
"TypeScript",
"push.rocks"
],
"author": "Lossless GmbH",
"license": "MIT",
"bugs": {
"url": "https://github.com/pushrocks/taskbuffer/issues"
"url": "https://gitlab.com/pushrocks/taskbuffer/issues"
},
"homepage": "https://github.com/pushrocks/taskbuffer#readme",
"homepage": "https://gitlab.com/pushrocks/taskbuffer#readme",
"dependencies": {
"beautylog": "^2.1.1",
"npmts": "^3.1.2",
"projectinfo": "0.0.2",
"q": "^1.4.1"
"@pushrocks/lik": "^3.0.11",
"@pushrocks/smartdelay": "^2.0.3",
"@pushrocks/smartlog": "^2.0.19",
"@pushrocks/smartpromise": "^3.0.5",
"@types/cron": "^1.7.1",
"cron": "^1.7.2",
"rxjs": "^6.5.3"
},
"devDependencies": {
"should": "^8.2.2"
}
"@gitzone/tsbuild": "^2.1.17",
"@gitzone/tstest": "^1.0.24",
"@pushrocks/tapbundle": "^3.0.13",
"@types/node": "^12.7.5",
"tslint": "^5.20.0",
"tslint-config-prettier": "^1.18.0"
},
"files": [
"ts/*",
"ts_web/*",
"dist/*",
"dist_web/*",
"dist_ts_web/*",
"assets/*",
"cli.js",
"npmextra.json",
"readme.md"
]
}

52
readme.md Normal file
View File

@ -0,0 +1,52 @@
# @pushrocks/taskbuffer
flexible task management. TypeScript ready!
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/taskbuffer)
* [gitlab.com (source)](https://gitlab.com/pushrocks/taskbuffer)
* [github.com (source mirror)](https://github.com/pushrocks/taskbuffer)
* [docs (typedoc)](https://pushrocks.gitlab.io/taskbuffer/)
## Status for master
[![build status](https://gitlab.com/pushrocks/taskbuffer/badges/master/build.svg)](https://gitlab.com/pushrocks/taskbuffer/commits/master)
[![coverage report](https://gitlab.com/pushrocks/taskbuffer/badges/master/coverage.svg)](https://gitlab.com/pushrocks/taskbuffer/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/taskbuffer.svg)](https://www.npmjs.com/package/@pushrocks/taskbuffer)
[![Known Vulnerabilities](https://snyk.io/test/npm/@pushrocks/taskbuffer/badge.svg)](https://snyk.io/test/npm/@pushrocks/taskbuffer)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
We highly recommend TypeScript as this module supports **TypeScript intellisense**.
```javascript
import * as taskbuffer from "taskbuffer";
myTask = new taskbuffer.Task({
preTask: someOtherTask // optional, don't worry loops are prevented
afterTask: someOtherTask // optional, don't worry loops are prevented
name:"myTask1",
buffered: true, // optional
bufferMax: 3, // optional, call qeues greater than this are truncated
execDelay: 1000, // optional, time in ms to wait before executing task call
taskFunction:() => {
// do some stuff and return promise
// pass on any data through promise resolution
// Use TypeScript for better understanding and code completion
}
})
```
For further information read the linked docs at the top of this README.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

115
test/test.1.task.ts Normal file
View File

@ -0,0 +1,115 @@
import { expect, tap } from '@pushrocks/tapbundle';
import taskbuffer = require('../ts/index');
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartdelay from '@pushrocks/smartdelay';
// setup some testData to work with
let testTask: taskbuffer.Task;
let testPreTask = new taskbuffer.Task({
taskFunction: async () => {
console.log('preTask executed');
},
preTask: testTask
});
// some more tasks to test with
let task1Counter = 0; // how often task 1 is being executed
let task1 = new taskbuffer.Task({
name: 'Task 1',
taskFunction: () => {
let done = smartpromise.defer();
console.log('Task1 started');
setTimeout(() => {
task1Counter++;
console.log('Task1 executed');
done.resolve();
}, 5000);
return done.promise;
}
});
let task2 = new taskbuffer.Task({
name: 'Task 1',
taskFunction: async () => {
const done = smartpromise.defer();
console.log('Task2 started');
setTimeout(() => {
console.log('Task2 executed');
done.resolve();
}, 5000);
await done.promise;
}
});
let task3 = new taskbuffer.Task({
name: 'Task 3',
taskFunction: () => {
let done = smartpromise.defer();
console.log('Task3 started');
setTimeout(() => {
console.log('Task3 executed');
done.resolve();
}, 5000);
return done.promise;
}
});
tap.test('new Task() should return a new task', async () => {
testTask = new taskbuffer.Task({
taskFunction: async () => {
console.log('executed twice');
},
preTask: testPreTask
});
});
tap.test('expect testTask to be an instance of Task', async () => {
expect(testTask).to.be.instanceof(taskbuffer.Task);
});
tap.test('expect testTask.idle is true', async () => {
if (!testTask.idle) {
throw new Error('testTask.idle is not true');
}
});
tap.test('testTask.running should be of type boolean and initially false', async () => {
expect(testTask.running).to.be.a('boolean');
// tslint:disable-next-line:no-unused-expression
expect(testTask.running).to.be.false;
});
tap.test('testTask.trigger() should return Promise', async () => {
expect(testTask.trigger()).to.be.instanceof(Promise);
});
tap.test('testTask.trigger() returned Promise should be fullfilled', async () => {
await testTask.trigger();
});
tap.test('expect to run a task without pre and afterTask errorless', async () => {
let localTestTask = new taskbuffer.Task({
taskFunction: async () => {
console.log('only once');
}
});
await localTestTask.trigger();
});
tap.test('expect task to run in buffered mode', async () => {
let localTestTask = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(3000);
},
buffered: true,
bufferMax: 2
});
localTestTask.trigger();
localTestTask.trigger();
localTestTask.trigger();
await localTestTask.trigger();
});
tap.start();

48
test/test.2.taskchain.ts Normal file
View File

@ -0,0 +1,48 @@
import { expect, tap } from '@pushrocks/tapbundle';
import taskbuffer = require('../ts/index');
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartdelay from '@pushrocks/smartdelay';
let task1Executed = false;
let task1 = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(2000);
task1Executed = true;
}
});
let task2Executed = false;
let task2 = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(2000);
task2Executed = true;
}
});
let task3Executed = false;
let task3 = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(2000);
task3Executed = true;
}
});
tap.test('expect run tasks in sequence', async () => {
let testTaskchain = new taskbuffer.Taskchain({
name: 'Taskchain1',
taskArray: [task1, task2, task3]
});
let testPromise = testTaskchain.trigger();
await smartdelay.delayFor(2100);
// tslint:disable-next-line:no-unused-expression
expect(task1Executed).to.be.true;
// tslint:disable-next-line:no-unused-expression
expect(task2Executed).to.be.false;
await smartdelay.delayFor(2100);
// tslint:disable-next-line:no-unused-expression
expect(task2Executed).to.be.true;
await testPromise;
});
tap.start();

View File

@ -0,0 +1,36 @@
import { expect, tap } from '@pushrocks/tapbundle';
import taskbuffer = require('../ts/index');
import * as smartdelay from '@pushrocks/smartdelay';
let task1Executed = false;
const task1 = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(2000);
task1Executed = true;
}
});
let task2Executed = false;
const task2 = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(2000);
task2Executed = true;
}
});
let task3Executed = false;
const task3 = new taskbuffer.Task({
taskFunction: async () => {
await smartdelay.delayFor(2000);
task3Executed = true;
}
});
tap.test('expect run in Parallel', async () => {
const testTaskparallel = new taskbuffer.Taskparallel({
taskArray: [task1, task2, task3]
});
await testTaskparallel.trigger();
});
tap.start();

View File

@ -0,0 +1,42 @@
import { expect, tap } from '@pushrocks/tapbundle';
import taskbuffer = require('../ts/index');
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartdelay from '@pushrocks/smartdelay';
let myTaskManager: taskbuffer.TaskManager;
let taskRunCounter = 0;
const taskDone = smartpromise.defer();
tap.test('should create an instance of TaskManager', async () => {
myTaskManager = new taskbuffer.TaskManager();
expect(myTaskManager).to.be.instanceof(taskbuffer.TaskManager);
});
tap.test('should run the task as expected', async () => {
let referenceBoolean = false;
myTaskManager.addTask(
new taskbuffer.Task({
name: 'myTask',
taskFunction: async () => {
console.log('Task executed!');
referenceBoolean = true;
taskRunCounter++;
if (taskRunCounter === 10) {
taskDone.resolve();
}
}
})
);
await myTaskManager.triggerTaskByName('myTask');
// tslint:disable-next-line:no-unused-expression
expect(referenceBoolean).to.be.true;
});
tap.test('should schedule task', async () => {
myTaskManager.scheduleTaskByName('myTask', '* * * * * *');
await taskDone.promise;
myTaskManager.descheduleTaskByName('myTask');
});
tap.start();

View File

@ -0,0 +1,64 @@
import { expect, tap } from '@pushrocks/tapbundle';
import taskbuffer = require('../ts/index');
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartdelay from '@pushrocks/smartdelay';
const flowTask1 = new taskbuffer.Task({
taskFunction: (x: number) => {
const done = smartpromise.defer();
console.log('flowTask1');
console.log(x);
done.resolve(x);
return done.promise;
}
});
const flowTaskBuffered = new taskbuffer.Task({
taskFunction: (x: number) => {
const done = smartpromise.defer();
console.log('flowTask1');
console.log(x);
done.resolve(x);
return done.promise;
},
buffered: true,
bufferMax: 1
});
const flowTask2 = new taskbuffer.Task({
taskFunction: (x: number) => {
const done = smartpromise.defer();
console.log('flowTask2');
console.log(x);
done.resolve(x);
return done.promise;
},
preTask: flowTask1
});
const flowTask3 = new taskbuffer.Taskchain({
taskArray: [flowTask1, flowTask2]
});
tap.test('should let a value flow through a task', async () => {
const result = await flowTask1.trigger(12);
expect(result).to.equal(12);
});
tap.test('expect values to flow between tasks', async () => {
const result = await flowTask2.trigger(12);
expect(result).to.equal(12);
});
tap.test('expect values to flow between tasks when buffered', async () => {
const result = await flowTaskBuffered.trigger(12);
expect(result).to.equal(12);
});
tap.test('expect values to flow between tasks in Taskchain', async () => {
const result = await flowTask3.trigger(12);
expect(result).to.equal(12);
});
tap.start();

28
test/test.6.taskonce.ts Normal file
View File

@ -0,0 +1,28 @@
import { expect, tap } from '@pushrocks/tapbundle';
import * as taskbuffer from '../ts/index';
let myNumber = 0;
let myTaskOnce: taskbuffer.TaskOnce;
tap.test('should create a valid instance of TaskOnce', async () => {
myTaskOnce = new taskbuffer.TaskOnce({
taskFunction: async () => {
myNumber++;
}
});
expect(myTaskOnce).to.be.instanceof(taskbuffer.TaskOnce);
});
tap.test('myNumber should still be 0', async () => {
expect(myNumber).to.equal(0);
});
tap.test('myTaskOnce should trigger once', async () => {
await myTaskOnce.trigger();
await myTaskOnce.trigger();
await myTaskOnce.trigger();
expect(myNumber).to.equal(1);
});
tap.start();

View File

@ -1,25 +0,0 @@
/// <reference path="../ts/typings/main.d.ts" />
var taskbuffer = require("../dist/index");
var classes = require("../dist/taskbuffer.classes");
var should = require("should");
describe("taskbuffer", function () {
describe(".task()", function () {
var testTask;
it("should return a new task to var testTask", function () {
testTask = taskbuffer.task();
});
it("testTask should be instance of Task", function () {
testTask.should.be.instanceof(classes.Task);
});
it("testTask.idle is true", function () {
if (!testTask.idle) {
throw new Error("testTask.idle is not true");
}
});
it("testTask.running is type boolean and initially false", function () {
testTask.running.should.be.type("boolean");
testTask.running.should.be.false();
});
});
});
//# sourceMappingURL=test.js.map

View File

@ -1 +0,0 @@
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,IAAI,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC1C,IAAI,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;AACpD,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC/B,QAAQ,CAAC,YAAY,EAAC;IAClB,QAAQ,CAAC,SAAS,EAAC;QACf,IAAI,QAAQ,CAAC;QACb,EAAE,CAAC,0CAA0C,EAAC;YAC1C,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAC;YACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,uBAAuB,EAAC;YACvB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACjD,CAAC;QACL,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,sDAAsD,EAAC;YACtD,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}

View File

@ -1,25 +0,0 @@
/// <reference path="../ts/typings/main.d.ts" />
var taskbuffer = require("../dist/index");
var classes = require("../dist/taskbuffer.classes");
var should = require("should");
describe("taskbuffer",function(){
describe(".task()",function(){
var testTask;
it("should return a new task to var testTask",function(){
testTask = taskbuffer.task();
});
it("testTask should be instance of Task",function(){
testTask.should.be.instanceof(classes.Task);
});
it("testTask.idle is true",function(){
if (!testTask.idle){
throw new Error("testTask.idle is not true");
}
});
it("testTask.running is type boolean and initially false",function(){
testTask.running.should.be.type("boolean");
testTask.running.should.be.false();
});
});
});

View File

@ -1,2 +1,8 @@
/// <reference path="./typings/main.d.ts" />
export * from "./taskbuffer.classes"
export { Task, ITaskFunction } from './taskbuffer.classes.task';
export { Taskchain } from './taskbuffer.classes.taskchain';
export { Taskparallel } from './taskbuffer.classes.taskparallel';
export { TaskManager } from './taskbuffer.classes.taskmanager';
export { TaskOnce } from './taskbuffer.classes.taskonce';
// import for naming only
import './taskbuffer.classes.helpers';

View File

@ -1,29 +1,166 @@
/// <reference path="./typings/main.d.ts" />
import plugins = require("./taskbuffer.plugins");
import classes = require("./taskbuffer.classes");
import plugins = require('./taskbuffer.plugins');
import { Task, ITaskFunction } from './taskbuffer.classes.task';
export var emptyTaskFunction = function(){
var done = plugins.Q.defer();
done.resolve();
return done.promise;
export const emptyTaskFunction: ITaskFunction = function(x) {
const done = plugins.smartpromise.defer();
done.resolve();
return done.promise;
};
export var isTask = function(taskArg):boolean{
if(
taskArg instanceof classes.Task
&& typeof taskArg.task === "function"
){
return true;
} else {
return false;
}
export const isTask = (taskArg: Task): boolean => {
if (taskArg instanceof Task && typeof taskArg.taskFunction === 'function') {
return true;
} else {
return false;
}
};
export var runTask = function(taskArg){
var done = plugins.Q.defer();
var taskReturn;
if(isTask(taskArg)){
taskReturn taskArg.task();
export const isTaskTouched = (taskArg: Task, touchedTasksArray: Task[]): boolean => {
let result = false;
for (const keyArg in touchedTasksArray) {
if (taskArg === touchedTasksArray[keyArg]) {
result = true;
}
}
return result;
};
export const runTask = async (taskArg: Task, optionsArg: { x?; touchedTasksArray?: Task[] }) => {
const done = plugins.smartpromise.defer();
// pay respect to execDelay
if (taskArg.execDelay) {
await plugins.smartdelay.delayFor(taskArg.execDelay);
}
// set running params
taskArg.running = true;
done.promise.then(async () => {
taskArg.running = false;
});
// handle options
const options = {
...{ x: undefined, touchedTasksArray: [] },
...optionsArg
};
const x = options.x;
const touchedTasksArray: Task[] = options.touchedTasksArray;
touchedTasksArray.push(taskArg);
// run the task cascade
const localDeferred = plugins.smartpromise.defer();
localDeferred.promise
.then(() => {
// lets run any preTask
if (taskArg.preTask && !isTaskTouched(taskArg.preTask, touchedTasksArray)) {
return runTask(taskArg.preTask, { x, touchedTasksArray });
} else {
const done2 = plugins.smartpromise.defer();
done2.resolve(x);
return done2.promise;
}
})
.then(async x => {
// lets run the main task
try {
return await taskArg.taskFunction(x);
} catch (e) {
console.log(e);
}
})
.then(x => {
if (taskArg.afterTask && !isTaskTouched(taskArg.afterTask, touchedTasksArray)) {
return runTask(taskArg.afterTask, { x: x, touchedTasksArray: touchedTasksArray });
} else {
const done2 = plugins.smartpromise.defer();
done2.resolve(x);
return done2.promise;
}
})
.then(x => {
done.resolve(x);
})
.catch(err => {
console.log(err);
});
localDeferred.resolve();
return await done.promise;
};
export interface cycleObject {
cycleCounter: number;
deferred: plugins.smartpromise.Deferred<any>;
}
export class CycleCounter {
task: Task;
cycleObjectArray: cycleObject[] = [];
constructor(taskArg: Task) {
this.task = taskArg;
}
getPromiseForCycle(cycleCountArg: number) {
const done = plugins.smartpromise.defer();
const cycleObject: cycleObject = {
cycleCounter: cycleCountArg,
deferred: done
};
this.cycleObjectArray.push(cycleObject);
return done.promise;
};
}
informOfCycle(x) {
const newCycleObjectArray: cycleObject[] = [];
this.cycleObjectArray.forEach(cycleObjectArg => {
cycleObjectArg.cycleCounter--;
if (cycleObjectArg.cycleCounter <= 0) {
cycleObjectArg.deferred.resolve(x);
} else {
newCycleObjectArray.push(cycleObjectArg);
}
});
this.cycleObjectArray = newCycleObjectArray;
}
}
export class BufferRunner {
task: Task;
// initialze by default
bufferCounter: number = 0;
running: boolean = false;
constructor(taskArg: Task) {
this.task = taskArg;
}
trigger(x): Promise<any> {
if (!(this.bufferCounter >= this.task.bufferMax)) {
this.bufferCounter++;
}
const returnPromise: Promise<any> = this.task.cycleCounter.getPromiseForCycle(
this.bufferCounter + 1
);
if (!this.running) {
this._run(x);
}
return returnPromise;
}
private _run(x) {
const recursiveBufferRunner = x => {
if (this.bufferCounter >= 0) {
this.running = true;
this.task.running = true;
runTask(this.task, { x: x }).then(x => {
this.bufferCounter--;
this.task.cycleCounter.informOfCycle(x);
recursiveBufferRunner(x);
});
} else {
this.running = false;
this.task.running = false;
}
};
recursiveBufferRunner(x);
}
}

View File

@ -1,52 +1,106 @@
/// <reference path="./typings/main.d.ts" />
import * as plugins from "./taskbuffer.plugins"
import * as helpers from "./taskbuffer.classes.helpers"
import * as plugins from './taskbuffer.plugins';
import * as helpers from './taskbuffer.classes.helpers';
export interface ITaskFunction {
(x?: any): PromiseLike<any>;
}
export class Task {
task:function;
idle:boolean;
running:boolean;
buffered:boolean;
private _counterBufferRelative;
private _counterTriggerAbsolute;
private _state:string;
preTask:Task;
afterTask:Task;
// man datory properties
name: string;
taskFunction: ITaskFunction;
buffered: boolean;
constructor(taskArg,optionsArg:{preTask?:Task,afterTask?:Task, buffered?:boolean} = {}){
var options = optionsArg;
this.task = taskArg;
this.preTask = options.preTask;
this.afterTask = options.afterTask;
this.idle = true;
this.running = false;
if (typeof options.buffered === "boolean"){
this.buffered = options.buffered;
} else {
this.buffered = false;
}
}
trigger(){
helpers.runTask(this.preTask)
.then(function(){
bufferMax: number;
execDelay: number;
})
.then(function(){
// tasks to run before and after
preTask: Task;
afterTask: Task;
})
};
triggerBuffered(){
var done = plugins.Q.defer();
}
// initialize by default
running: boolean = false;
bufferRunner = new helpers.BufferRunner(this);
cycleCounter = new helpers.CycleCounter(this);
get state():string {
return this._state;
idle: boolean = true;
private _state: string = 'ready';
constructor(optionsArg: {
/**
* the task function to run, must return promise
*/
taskFunction: ITaskFunction;
/**
* any other task to run before
*/
preTask?: Task;
/**
* any other task to run after
*/
afterTask?: Task;
/**
* wether this task should run buffered
*/
buffered?: boolean;
/**
* the maximum buffer
*/
bufferMax?: number;
/**
* the execution delay, before the task is executed
* only makes sense when running in buffered mode
*/
execDelay?: number;
/**
* the name of the task
*/
name?: string;
}) {
this.taskFunction = optionsArg.taskFunction;
this.preTask = optionsArg.preTask;
this.afterTask = optionsArg.afterTask;
this.idle = !this.running;
this.buffered = optionsArg.buffered;
this.bufferMax = optionsArg.bufferMax;
this.execDelay = optionsArg.execDelay;
this.name = optionsArg.name;
}
/**
* trigger the task. Will trigger buffered if this.buffered is true
*/
trigger(x?): Promise<any> {
if (this.buffered) {
return this.triggerBuffered(x);
} else {
return this.triggerUnBuffered(x);
}
set state(stateArg:string){
if (stateArg == "locked"){
this._state = "locked";
} else {
plugins.beautylog.error("state type" );
}
}
/**
* trigger task unbuffered.
*/
triggerUnBuffered(x?): Promise<any> {
return helpers.runTask(this, { x: x });
}
/**
* trigger task buffered.
*/
triggerBuffered(x?): Promise<any> {
return this.bufferRunner.trigger(x);
}
get state(): string {
return this._state;
}
set state(stateArg: string) {
if (stateArg === 'locked') {
this._state = 'locked';
} else {
plugins.smartlog.defaultLogger.log('error', 'state type ' + stateArg + ' could not be set');
}
}
}
}

View File

@ -1,11 +1,58 @@
/// <reference path="./typings/main.d.ts" />
import helpers = require("./taskbuffer.classes.helpers");
import * as classes from "./taskbuffer.classes"
// TaskChain chains tasks
// and extends Task
export class Taskchain extends classes.Task {
constructor(taskArrayArg:classes.Task[]){
super({
task: function(){}
});
}
}
import * as plugins from './taskbuffer.plugins';
import { Task } from './taskbuffer.classes.task';
import helpers = require('./taskbuffer.classes.helpers');
export class Taskchain extends Task {
taskArray: Task[];
constructor(optionsArg: {
taskArray: Task[];
name?: string;
log?: boolean;
buffered?: boolean;
bufferMax?: number;
}) {
let options = {
...{
name: 'unnamed Taskchain',
log: false
},
...optionsArg,
...{
taskFunction: (x: any) => {
// this is the function that gets executed when TaskChain is triggered
let done = plugins.smartpromise.defer(); // this is the starting Deferred object
let taskCounter = 0; // counter for iterating async over the taskArray
let iterateTasks = x => {
if (typeof this.taskArray[taskCounter] !== 'undefined') {
console.log(this.name + ' running: Task' + this.taskArray[taskCounter].name);
this.taskArray[taskCounter].trigger(x).then(x => {
plugins.smartlog.defaultLogger.log('info', this.taskArray[taskCounter].name);
taskCounter++;
iterateTasks(x);
});
} else {
console.log('Taskchain "' + this.name + '" completed successfully');
done.resolve(x);
}
};
iterateTasks(x);
return done.promise;
}
}
};
super(options);
this.taskArray = optionsArg.taskArray;
}
addTask(taskArg: Task) {
this.taskArray.push(taskArg);
}
removeTask(taskArg: Task) {
// TODO:
}
shiftTask() {
// TODO:
}
}

View File

@ -0,0 +1,109 @@
import * as plugins from './taskbuffer.plugins';
import { Task } from './taskbuffer.classes.task';
export interface ICronJob {
cronString: string;
taskNameArg: string;
job: any;
}
export class TaskManager {
public taskMap = new plugins.lik.Objectmap<Task>();
private cronJobMap = new plugins.lik.Objectmap<ICronJob>();
constructor() {
// nothing here
}
/**
* checks if a task is already present
* @param taskNameArg
*/
public getTaskByName(taskNameArg): Task {
return this.taskMap.find(itemArg => {
return itemArg.name === taskNameArg;
});
}
/**
* adds a Task to the TaskManager
* @param taskArg
*/
public addTask(taskArg: Task): void {
if (!taskArg.name) {
throw new Error('taskArg needs a name to be added to taskManager');
}
this.taskMap.add(taskArg);
}
/**
* adds and schedules a task at once
* @param taskArg
* @param cronStringArg
*/
public addAndScheduleTask(taskArg: Task, cronStringArg: string) {
this.addTask(taskArg);
const taskName = taskArg.name;
this.scheduleTaskByName(taskName, cronStringArg);
}
/**
* triggers a task in the TaskManagerByName
* @param taskNameArg
*/
public triggerTaskByName(taskNameArg: string): Promise<any> {
const taskToTrigger = this.getTaskByName(taskNameArg);
if (!taskToTrigger) {
throw new Error(`There is no task with the name of ${taskNameArg}`);
}
return taskToTrigger.trigger();
}
public async triggerTask(task: Task) {
return task.trigger();
}
/**
* schedules the task by name
* @param taskNameArg
*/
public scheduleTaskByName(taskNameArg: string, cronStringArg: string) {
const taskToSchedule = this.getTaskByName(taskNameArg);
const job = new plugins.cron.CronJob({
cronTime: cronStringArg,
onTick: () => {
this.triggerTaskByName(taskNameArg);
},
start: true
});
this.cronJobMap.add({
taskNameArg: taskToSchedule.name,
cronString: cronStringArg,
job
});
}
/**
* deschedules a task by name
* @param taskNameArg
*/
public descheduleTaskByName(taskNameArg: string) {
const descheduledCron = this.cronJobMap.findOneAndRemove(itemArg => {
return itemArg.taskNameArg === taskNameArg;
});
descheduledCron.job.stop();
}
/**
* deschedules a task
* @param task
*/
public async descheduleTask(task: Task) {
await this.descheduleTaskByName(task.name);
}
/**
* returns all schedules of a specific task
* @param taskNameArg
*/
public getSchedulesForTaskName(taskNameArg: string) {}
}

View File

@ -0,0 +1,21 @@
import * as plugins from './taskbuffer.plugins';
import { Task, ITaskFunction } from './taskbuffer.classes.task';
/**
* TaskOnce is run exactly once, no matter how often it is triggered
*/
export class TaskOnce extends Task {
hasTriggered: boolean = false;
constructor(optionsArg: { name?: string; taskFunction: ITaskFunction }) {
super({
name: optionsArg.name,
taskFunction: async () => {
if (!this.hasTriggered) {
this.hasTriggered = true;
await optionsArg.taskFunction();
}
}
});
}
}

View File

@ -0,0 +1,25 @@
import * as plugins from './taskbuffer.plugins';
import * as helpers from './taskbuffer.classes.helpers';
import { Task } from './taskbuffer.classes.task';
export class Taskparallel extends Task {
taskArray: Task[];
constructor(optionsArg: { taskArray: Task[] }) {
const options = {
...optionsArg,
...{
taskFunction: () => {
let done = plugins.smartpromise.defer();
let promiseArray: Promise<any>[] = []; // stores promises of all tasks, since they run in parallel
this.taskArray.forEach(function(taskArg) {
promiseArray.push(taskArg.trigger());
});
Promise.all(promiseArray).then(done.resolve);
return done.promise;
}
}
};
super(options);
this.taskArray = optionsArg.taskArray;
}
}

View File

@ -1,2 +0,0 @@
export * from "./taskbuffer.classes.task"
export * from "./taskbuffer.classes.taskchain"

View File

@ -1,6 +1,8 @@
/// <reference path="./typings/main.d.ts" />
var plugins = {
beautylog: require("beautylog"),
Q: require("q")
};
export = plugins;
import * as smartlog from '@pushrocks/smartlog';
import cron from 'cron';
import * as lik from '@pushrocks/lik';
import * as rxjs from 'rxjs';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartdelay from '@pushrocks/smartdelay';
export { smartlog, cron, lik, rxjs, smartpromise, smartdelay };

View File

@ -1,7 +0,0 @@
{
"ambientDependencies": {
"node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts",
"mocha": "github:Bartvds/tsd-deftools/typings/DefinitelyTyped/mocha/mocha.d.ts",
"colors": "github:DefinitelyTyped/DefinitelyTyped/colors/colors.d.ts"
}
}

17
tslint.json Normal file
View File

@ -0,0 +1,17 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}