UNPKG

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
"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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