d4c-queue
Version:
A task queue executes tasks sequentially or concurrently. Wrap an async/promise-returning/sync function as a queue-ready async function for easy reusing. Support passing arguments/getting return value, @synchronized/@concurrent decorator, Node.js/Browser.
910 lines • 68.1 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const autobind_decorator_1 = __importDefault(require("autobind-decorator"));
const ava_1 = __importDefault(require("ava"));
const D4C_1 = require("./D4C");
const fixture = ['hello'];
const fixture2 = 'world';
const queueTag = 'queue1';
const funcAsync = (input, input2) => __awaiter(void 0, void 0, void 0, function* () {
return input[0] + input2;
});
const funcSync = (input, input2) => {
return input[0] + input2;
};
const funcPromise = (input, input2) => {
return Promise.resolve(input[0] + input2);
};
const timeout = (seconds, target) => {
return new Promise((resolve, _) => setTimeout(() => {
if ((target === null || target === void 0 ? void 0 : target.str) != undefined && (target === null || target === void 0 ? void 0 : target.str) != null) {
target.str += seconds;
}
resolve();
}, seconds * 100));
};
const timeoutError = (seconds, result) => {
return new Promise((_, reject) => setTimeout(() => {
reject(result);
}, seconds * 100));
};
const immediateFun = (seconds, target) => {
target.str += seconds;
};
const immediateFunPromise = (seconds, target) => {
target.str += seconds;
return Promise.resolve();
};
ava_1.default('Class usage: test concurrency', (t) => __awaiter(void 0, void 0, void 0, function* () {
let TestController = class TestController {
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
instanceTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout2(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
instanceTimeout2(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
random(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.concurrent
], TestController.prototype, "instanceTimeout", null);
__decorate([
D4C_1.concurrent({ tag: '2' })
], TestController.prototype, "instanceTimeout2", null);
__decorate([
D4C_1.synchronized({ tag: '3' })
], TestController.prototype, "random", null);
__decorate([
D4C_1.concurrent
], TestController, "staticTimeout", null);
__decorate([
D4C_1.concurrent({ tag: '2' })
], TestController, "staticTimeout2", null);
TestController = __decorate([
D4C_1.QConcurrency([
{ limit: 100, isStatic: true },
{ limit: 100, isStatic: false },
{ limit: 1, isStatic: true, tag: '2' },
{ limit: 1, tag: '2' },
])
], TestController);
// test: concurrency on static method, and use default tag
let test = { str: '' };
yield Promise.all([
TestController.staticTimeout(0.5, test),
TestController.staticTimeout(0.1, test),
]);
t.is(test.str, '0.10.5');
// test: concurrency on static method,
test = { str: '' };
yield Promise.all([
TestController.staticTimeout2(0.5, test),
TestController.staticTimeout2(0.1, test),
]);
t.is(test.str, '0.50.1');
// test: concurrency on instance method, and use default tag
const testController = new TestController();
test = { str: '' };
yield Promise.all([
testController.instanceTimeout(0.5, test),
testController.instanceTimeout(0.1, test),
]);
t.is(test.str, '0.10.5');
// test: concurrency on instance method
test = { str: '' };
yield Promise.all([
testController.instanceTimeout2(0.5, test),
testController.instanceTimeout2(0.1, test),
]);
t.is(test.str, '0.50.1');
// test: no use class decorator so @concurrent will use default @concurrency Infinity
class TestController2 {
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
}
__decorate([
D4C_1.concurrent
], TestController2, "staticTimeout", null);
test = { str: '' };
yield Promise.all([
TestController2.staticTimeout(0.5, test),
TestController2.staticTimeout(0.1, test),
]);
t.is(test.str, '0.10.5');
let TestController3 = class TestController3 {
static staticTimeoutNoDecorator(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
instanceTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout2(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
instanceTimeout2(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.concurrent
], TestController3.prototype, "instanceTimeout", null);
__decorate([
D4C_1.concurrent({ tag: '2' })
], TestController3.prototype, "instanceTimeout2", null);
__decorate([
D4C_1.concurrent
], TestController3, "staticTimeout", null);
__decorate([
D4C_1.concurrent({ tag: '2' })
], TestController3, "staticTimeout2", null);
TestController3 = __decorate([
D4C_1.QConcurrency([
{ limit: 1, isStatic: true },
{ limit: 1, isStatic: false },
{ limit: 1, isStatic: true, tag: '2' },
{ limit: 1, isStatic: false, tag: '2' },
])
], TestController3);
// Test: applying @classConcurrency but testing method not decorated will not be affected
test = { str: '' };
yield Promise.all([
TestController3.staticTimeoutNoDecorator(0.5, test),
TestController3.staticTimeoutNoDecorator(0.1, test),
]);
t.is(test.str, '0.10.5');
// Test: different queues are isolated with each other
const testController3 = new TestController3();
test = { str: '' };
yield Promise.all([
TestController.staticTimeout(0.5, test),
testController.instanceTimeout(0.4, test),
TestController.staticTimeout2(0.3, test),
testController.instanceTimeout2(0.2, test),
]);
t.is(test.str, '0.20.30.40.5');
/** @classConcurrency tries to setup default queue's concurrency but is conflicted with synchronized (implicitly concurrency =1) */
let error = null;
try {
let TestController4 = class TestController4 {
static staticTimeoutNoDecorator(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.synchronized
], TestController4, "staticTimeout", null);
TestController4 = __decorate([
D4C_1.QConcurrency([{ limit: 1, isStatic: true }])
], TestController4);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.ClassAndMethodDecoratorsIncompatible);
/** for test coverage */
error = null;
try {
let TestController5 = class TestController5 {
static staticTimeoutNoDecorator(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.synchronized
], TestController5, "staticTimeout", null);
TestController5 = __decorate([
D4C_1.QConcurrency([{ limit: 1, isStatic: true, tag: '2' }])
], TestController5);
}
catch (err) {
error = err;
}
t.is(error, null);
/** for test coverage */
error = null;
try {
let TestController6 = class TestController6 {
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.concurrent
], TestController6, "staticTimeout", null);
TestController6 = __decorate([
D4C_1.QConcurrency([{ limit: 1, isStatic: true, tag: '2' }])
], TestController6);
}
catch (err) {
error = err;
}
t.is(error, null);
/** for test coverage */
error = null;
try {
let TestController7 = class TestController7 {
staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.synchronized
], TestController7.prototype, "staticTimeout", null);
TestController7 = __decorate([
D4C_1.QConcurrency([{ limit: 1, tag: '2' }])
], TestController7);
}
catch (err) {
error = err;
}
t.is(error, null);
/** for test coverage */
error = null;
try {
let TestController8 = class TestController8 {
staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
TestController8 = __decorate([
D4C_1.QConcurrency([
{ limit: 1, tag: '2' },
{ limit: 1, tag: '3', isStatic: true },
])
], TestController8);
}
catch (err) {
error = err;
}
t.is(error, null);
/** for the same tag queue, @concurrent & @synchronized can not be applied both */
error = null;
try {
let TestController9 = class TestController9 {
static staticTimeoutNoDecorator(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static staticTimeout2(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
__decorate([
D4C_1.synchronized
], TestController9, "staticTimeout", null);
__decorate([
D4C_1.concurrent
], TestController9, "staticTimeout2", null);
TestController9 = __decorate([
D4C_1.QConcurrency([{ limit: 1, isStatic: true }])
], TestController9);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.TwoDecoratorsIncompatible);
/** @classConcurrency' parameters should be an array */
error = null;
try {
let TestController10 = class TestController10 {
staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
TestController10 = __decorate([
D4C_1.QConcurrency({ limit: 1, tag: '2' })
], TestController10);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidClassDecoratorParameter);
/** limit should be a number */
error = null;
try {
let TestController11 = class TestController11 {
staticTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
};
TestController11 = __decorate([
D4C_1.QConcurrency([null, { limit: '3' }])
], TestController11);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidClassDecoratorParameter);
}));
ava_1.default('Instance usage: test concurrency', (t) => __awaiter(void 0, void 0, void 0, function* () {
/** Fixme: dummy cases for code coverage */
let d4c = new D4C_1.D4C([null]);
d4c = new D4C_1.D4C([{}]);
d4c.setConcurrency(null);
/** default queue: concurrency 100 test */
let test = { str: '' };
d4c = new D4C_1.D4C([{ concurrency: { limit: 100 } }]);
let fn1 = d4c.wrap(timeout);
let fn2 = d4c.wrap(immediateFun);
let fn3 = d4c.wrap(immediateFunPromise);
yield Promise.all([
fn1(2, test),
fn2(1, test),
fn1(0.5, test),
fn3(0.2, test),
fn1(0.05, test),
]);
t.is(test.str, '10.20.050.52');
/** tag queue: concurrency 100 test */
test = { str: '' };
d4c = new D4C_1.D4C([{ concurrency: { limit: 100, tag: '2' } }]);
fn1 = d4c.wrap(timeout, { tag: '2' });
fn2 = d4c.wrap(immediateFun, { tag: '2' });
fn3 = d4c.wrap(immediateFunPromise, { tag: '2' });
yield Promise.all([
fn1(2, test),
fn2(1, test),
fn1(0.5, test),
fn3(0.2, test),
fn1(0.05, test),
]);
t.is(test.str, '10.20.050.52');
/** default queue: use setConcurrency to change concurrency on default to 100 */
test = { str: '' };
d4c = new D4C_1.D4C();
d4c.setConcurrency([{ limit: 100 }]);
fn1 = d4c.wrap(timeout);
fn2 = d4c.wrap(immediateFun);
fn3 = d4c.wrap(immediateFunPromise);
yield Promise.all([
fn1(2, test),
fn2(1, test),
fn1(0.5, test),
fn3(0.2, test),
fn1(0.05, test),
]);
t.is(test.str, '10.20.050.52');
/** new tag with setConcurrency to set concurrency 1 */
test = { str: '' };
d4c.setConcurrency([{ limit: 1, tag: '2' }]);
fn1 = d4c.wrap(timeout, { tag: '2' });
fn2 = d4c.wrap(immediateFun, { tag: '2' });
fn3 = d4c.wrap(immediateFunPromise, { tag: '2' });
yield Promise.all([
fn1(2, test),
fn2(1, test),
fn1(0.5, test),
fn3(0.2, test),
fn1(0.05, test),
]);
t.is(test.str, '210.50.20.05');
/** default queue: use setConcurrency to set it back to 1 */
test = { str: '' };
d4c.setConcurrency([{ limit: 1 }]);
fn1 = d4c.wrap(timeout);
fn2 = d4c.wrap(immediateFun);
fn3 = d4c.wrap(immediateFunPromise);
yield Promise.all([
fn1(2, test),
fn2(1, test),
fn1(0.5, test),
fn3(0.2, test),
fn1(0.05, test),
]);
t.is(test.str, '210.50.20.05');
let error = null;
try {
d4c.setConcurrency([undefined]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidQueueConcurrency);
error = null;
try {
d4c.setConcurrency([{ limit: -100 }]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidQueueConcurrency);
error = null;
try {
d4c.setConcurrency([{ tag: true, limit: 100 }]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidQueueTag);
error = null;
try {
d4c.setConcurrency([{ tag: true }]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidQueueConcurrency);
error = null;
try {
d4c.setConcurrency([{ tag: true, limit: '100' }]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidQueueConcurrency);
error = null;
try {
d4c = new D4C_1.D4C([{ concurrency: { limit: '11' } }]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidQueueConcurrency);
}));
ava_1.default('Instance usage: pass a class arrow function property', (t) => __awaiter(void 0, void 0, void 0, function* () {
class TestController {
constructor(message) {
this.greet = (text) => __awaiter(this, void 0, void 0, function* () {
const str = 'Hello, ' + text + this.greeting;
return str;
});
this.greeting = message;
}
}
const d4c = new D4C_1.D4C();
const test = new TestController('!!');
const newFunc = d4c.wrap(test.greet, { tag: queueTag });
const job = newFunc(fixture2);
const resp = yield job;
t.is(resp, 'Hello, world!!');
/** wrap_exec part */
const resp2 = yield d4c.apply(test.greet, {
tag: queueTag,
args: [fixture2],
});
t.is(resp2, 'Hello, world!!');
}));
ava_1.default('Decorator usage', (t) => __awaiter(void 0, void 0, void 0, function* () {
class TestController {
constructor(message) {
this.greeting = message;
this.testManualBind = this.testManualBind.bind(this);
}
greet(text) {
const str = 'Hello, ' + text + this.greeting;
return str;
}
testManualBind(text) {
return __awaiter(this, void 0, void 0, function* () {
const str = 'Hello, ' + text + this.greeting;
return str;
});
}
testAutoBind(text) {
return __awaiter(this, void 0, void 0, function* () {
const str = 'Hello, ' + text + this.greeting;
return str;
});
}
static staticMethod(text) {
return __awaiter(this, void 0, void 0, function* () {
return text;
});
}
static timeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
static timeoutAnotherQueue(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
instanceTimeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
instanceTimeoutError(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeoutError(seconds, obj);
});
}
testNoBlockCurr(seconds, obj) {
obj.str += seconds;
}
autobindMethodNoQueue(text) {
const str = 'Hello, ' + text + this.greeting;
return str;
}
}
__decorate([
D4C_1.synchronized
], TestController.prototype, "greet", null);
__decorate([
D4C_1.synchronized()
], TestController.prototype, "testManualBind", null);
__decorate([
autobind_decorator_1.default,
D4C_1.synchronized()
], TestController.prototype, "testAutoBind", null);
__decorate([
D4C_1.synchronized({ inheritPreErr: true })
], TestController.prototype, "instanceTimeout", null);
__decorate([
D4C_1.synchronized({})
], TestController.prototype, "instanceTimeoutError", null);
__decorate([
D4C_1.synchronized({ noBlockCurr: true })
], TestController.prototype, "testNoBlockCurr", null);
__decorate([
autobind_decorator_1.default
], TestController.prototype, "autobindMethodNoQueue", null);
__decorate([
D4C_1.synchronized({})
], TestController, "staticMethod", null);
__decorate([
D4C_1.synchronized
], TestController, "timeout", null);
__decorate([
D4C_1.synchronized({ tag: '2' })
], TestController, "timeoutAnotherQueue", null);
// /** instance method */
const testController = new TestController('!!');
t.is(yield testController.greet(fixture2), 'Hello, world!!');
/** test if this lib working with manual bind */
const testManualBind = testController.testManualBind;
t.is(yield testManualBind(fixture2), 'Hello, world!!');
/** test if this lib working with auto bind */
const testAutoBind = testController.testAutoBind;
t.is(yield testAutoBind(fixture2), 'Hello, world!!');
/** static method part */
t.is(yield TestController.staticMethod(fixture2), 'world');
/** Test if they are really executed one by one */
let test = { str: '' };
yield Promise.all([
TestController.timeout(0.5, test),
TestController.timeout(0.1, test),
]);
t.is(test.str, '0.50.1');
/** Test if these are really use different queues */
test = { str: '' };
yield Promise.all([
TestController.timeout(0.5, test),
TestController.timeoutAnotherQueue(0.1, test),
]);
t.is(test.str, '0.10.5');
//** Static and Instance method should have different queues */
test = { str: '' };
yield Promise.all([
TestController.timeout(0.5, test),
testController.instanceTimeout(0.1, test),
]);
t.is(test.str, '0.10.5');
//** Two instances should have different queues */
const testController2 = new TestController('!!');
test = { str: '' };
yield Promise.all([
testController2.instanceTimeout(0.5, test),
testController.instanceTimeout(0.1, test),
]);
t.is(test.str, '0.10.5');
/** Class instance and D4C instance should have different queues */
test = { str: '' };
const fn = new D4C_1.D4C().wrap(timeout);
yield Promise.all([fn(0.5, test), testController.instanceTimeout(0.1, test)]);
t.is(test.str, '0.10.5');
/** composite case: D4C instance on no autobind decorated method */
let error = null;
try {
const d4c = new D4C_1.D4C();
const newFunc = d4c.wrap(testController.greet);
const resp = yield newFunc('');
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.MissingThisDueBindIssue);
/** composite case: D4C instance on autobind decorated method */
const d4c = new D4C_1.D4C();
const result = yield d4c.apply(testController.testAutoBind, {
args: ['world'],
});
t.is(result, 'Hello, world!!');
/** composite case: D4C instance on autobind non-decorated method */
t.is(yield d4c.apply(testController.autobindMethodNoQueue), 'Hello, undefined!!');
/** Two class should not affect each other */
class TestController2 {
constructor(message) {
this.greeting = message;
}
static timeout(seconds, obj) {
return __awaiter(this, void 0, void 0, function* () {
yield timeout(seconds, obj);
});
}
}
__decorate([
D4C_1.synchronized({})
], TestController2, "timeout", null);
test = { str: '' };
yield Promise.all([
TestController.timeout(0.5, test),
TestController2.timeout(0.1, test),
]);
t.is(test.str, '0.10.5');
/** test invalid decorator */
error = null;
try {
class TestController4 {
static greet(text) {
return __awaiter(this, void 0, void 0, function* () {
return text;
});
}
}
__decorate([
D4C_1.synchronized({ tag: true })
], TestController4, "greet", null);
yield TestController4.greet(fixture2), 'world';
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InvalidDecoratorOption);
(() => __awaiter(void 0, void 0, void 0, function* () {
try {
yield testController.instanceTimeoutError(1, 'some_error');
}
catch (err) {
// console.log(" err by purpose")
}
}))();
error = null;
try {
yield testController.instanceTimeout(0.1, { str: '' });
}
catch (err) {
error = err;
}
t.is(error.message, 'some_error');
/** test if option noBlockCurr works on decorator */
test = { str: '' };
const job = testController.testNoBlockCurr(2, test);
test.str = test.str + '1';
yield job;
t.is(test.str, '12');
}));
ava_1.default('Instance usage: funcAsync, symbol tag', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
const job = d4c.wrap(funcAsync, { tag: Symbol('123') })(fixture, fixture2);
t.is(yield job, 'helloworld');
}));
ava_1.default('Instance usage: funcAsync, a invalid null tag case', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
let error;
try {
yield d4c.wrap(funcAsync, { tag: null });
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.InstanceInvalidTag);
}));
ava_1.default('Instance usage: async function', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
const newFunc = d4c.wrap(funcAsync, { tag: queueTag });
const job = newFunc(fixture, fixture2);
const resp = yield job;
t.is(resp, 'helloworld');
}));
ava_1.default('Instance usage: non-async function', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
const newFunc = d4c.wrap(funcSync, { tag: queueTag });
const job = newFunc(fixture, fixture2);
const resp = yield job;
t.is(resp, 'helloworld');
}));
ava_1.default('Instance usage: promise-returning function', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
const job = d4c.wrap(funcPromise, { tag: queueTag })(fixture, fixture2);
const resp = yield job;
t.is(resp, 'helloworld');
}));
ava_1.default('Instance usage: apply a funcAsync', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
/** apply */
const resp = yield d4c.apply(funcAsync, {
tag: queueTag,
args: [['33', '44'], '5'],
});
t.is(resp, '335');
}));
ava_1.default('Instance usage: test if queue really work, execute one by one', (t) => __awaiter(void 0, void 0, void 0, function* () {
let test = { str: '' };
yield Promise.all([
timeout(2, test),
immediateFun(1, test),
timeout(0.5, test),
immediateFunPromise(0.2, test),
timeout(0.05, test),
]);
t.is(test.str, '10.20.050.52'); // 1, 0.2, 0.05, 0.5, 2
test = { str: '' };
const d4c = new D4C_1.D4C();
const fn1 = d4c.wrap(timeout);
const fn2 = d4c.wrap(immediateFun);
const fn3 = d4c.wrap(immediateFunPromise);
yield Promise.all([
fn1(2, test),
fn2(1, test),
fn1(0.5, test),
fn3(0.2, test),
fn1(0.05, test),
]);
t.is(test.str, '210.50.20.05');
test = { str: '' };
const d4c2 = new D4C_1.D4C();
const fn11 = d4c2.wrap(timeout, { tag: '1' });
const fn21 = d4c2.wrap(immediateFun, { tag: '2' });
const fn31 = d4c2.wrap(immediateFunPromise, { tag: '3' });
yield Promise.all([
fn11(2, test),
fn21(1, test),
fn11(0.5, test),
fn31(0.2, test),
fn11(0.05, test),
]);
t.is(test.str, '10.220.50.05'); // 1, 0.2, 2, 0.5, 0.05
test = { str: '' };
const fn12 = new D4C_1.D4C().wrap(timeout);
const fn22 = new D4C_1.D4C().wrap(immediateFun);
const fn32 = new D4C_1.D4C().wrap(immediateFunPromise);
yield Promise.all([
fn12(2, test),
fn22(1, test),
fn12(0.5, test),
fn32(0.2, test),
fn12(0.05, test),
]);
t.is(test.str, '10.220.50.05');
}));
ava_1.default('Instance usage: option noBlockCurr enable, with two non-async function ', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
let testStr = '';
testStr += '1';
const newFunc = d4c.wrap(() => {
testStr += 'inFuncSyn';
}, { tag: queueTag, noBlockCurr: true });
testStr += '2';
const job = newFunc();
testStr += '3';
const newFunc2 = d4c.wrap(() => {
testStr += 'inFuncSyn2';
}, { tag: queueTag });
yield Promise.all([job, newFunc2()]);
testStr += '4';
t.is(testStr, '123inFuncSyninFuncSyn24');
}));
ava_1.default("Instance usage: option inheritPreErr enable: task2 inherit task1's error in object queue", (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C();
const fun2 = () => __awaiter(void 0, void 0, void 0, function* () {
console.log('dummy fun2');
});
const fun1ErrorProducer = () => __awaiter(void 0, void 0, void 0, function* () {
try {
yield d4c.wrap(timeoutError)(1, new Error('some_error'));
}
catch (_) {
// console.log(" err by purpose")
}
});
fun1ErrorProducer();
let error;
try {
yield d4c.wrap(fun2, { inheritPreErr: true })();
}
catch (err) {
error = err;
}
t.is(error.message, 'some_error');
}));
ava_1.default('Instance usage: test option dropWhenReachLimit', (t) => __awaiter(void 0, void 0, void 0, function* () {
const d4c = new D4C_1.D4C([{ concurrency: { limit: 2 } }]);
const fn1 = d4c.wrap(timeout, { dropWhenReachLimit: true });
let error = null;
try {
yield fn1(3);
yield Promise.all([fn1(3), fn1(3), fn1(3)]);
}
catch (err) {
error = err;
}
t.is(error.message, D4C_1.ErrMsg.QueueIsFull);
}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRDRDLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL0Q0Qy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNEVBQXlDO0FBQ3pDLDhDQUFzQjtBQUV0QiwrQkFBMkU7QUFFM0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN6QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUE7QUFDeEIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFBO0FBRXpCLE1BQU0sU0FBUyxHQUFHLENBQ2hCLEtBQWdCLEVBQ2hCLE1BQWUsRUFDRSxFQUFFO0lBQ25CLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtBQUMxQixDQUFDLENBQUEsQ0FBQTtBQUVELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBZSxFQUFFLE1BQWMsRUFBVSxFQUFFO0lBQzNELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtBQUMxQixDQUFDLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWUsRUFBRSxNQUFjLEVBQW1CLEVBQUU7SUFDdkUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQTtBQUMzQyxDQUFDLENBQUE7QUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQWUsRUFBRSxNQUF3QixFQUFFLEVBQUU7SUFDNUQsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUN0QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxHQUFHLEtBQUksU0FBUyxJQUFJLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEdBQUcsS0FBSSxJQUFJLEVB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