diff --git a/dist/index.d.ts b/dist/index.d.ts index fbe52b12..cef53bab 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -28,7 +28,7 @@ declare module "queue-promise" { start(): void; stop(): void; dequeue(): any; - enqueue(tasks: TaskFactory | ReadonlyArray): void; + enqueue(tasks: TaskFactory | ReadonlyArray): number[]; add(tasks: TaskFactory | ReadonlyArray): void; clear(): void; } diff --git a/dist/index.js b/dist/index.js index 620eadac..420370f2 100755 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -"use strict";var _events=_interopRequireDefault(require("events"));Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c{for(;this.shouldRun;)await this.dequeue()})())}stop(){clearTimeout(this.timeoutId),this.state=State.STOPPED,this.emit("stop")}finalize(){this.currentlyHandled-=1,0===this.currentlyHandled&&this.isEmpty&&(this.stop(),this.state=State.IDLE,this.emit("end"))}async execute(){const a=[];this.tasks.forEach((b,c)=>{this.currentlyHandled(this.emit("resolve",a),a)).catch(a=>(this.emit("reject",a),a)).finally(()=>{this.emit("dequeue"),this.finalize()})))});const b=await Promise.all(a);return 1===this.options.concurrent?b[0]:b}dequeue(){const{interval:a}=this.options;return new Promise(b=>{const c=Math.max(0,a-(Date.now()-this.lastRan));clearTimeout(this.timeoutId),this.timeoutId=setTimeout(()=>{this.lastRan=Date.now(),this.execute().then(b)},c)})}enqueue(a){if(Array.isArray(a))return void a.map(a=>this.enqueue(a));if("function"!=typeof a)throw new Error(`You must provide a function, not ${typeof a}.`);this.uniqueId=(this.uniqueId+1)%Number.MAX_SAFE_INTEGER,this.tasks.set(this.uniqueId,a),this.options.start&&this.state!==State.STOPPED&&this.start()}add(a){this.enqueue(a)}clear(){this.tasks.clear()}get size(){return this.tasks.size}get isEmpty(){return 0===this.size}get shouldRun(){return!this.isEmpty&&this.state!==State.STOPPED}}exports.default=Queue,module.exports=exports.default; \ No newline at end of file +"use strict";var _events=_interopRequireDefault(require("events"));Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c{for(;this.shouldRun;)await this.dequeue()})())}stop(){clearTimeout(this.timeoutId),this.state=State.STOPPED,this.emit("stop")}finalize(){this.currentlyHandled-=1,0===this.currentlyHandled&&this.isEmpty&&(this.stop(),this.state=State.IDLE,this.emit("end"))}async execute(){const a=[];this.tasks.forEach((b,c)=>{this.currentlyHandled(this.emit("resolve",a),a)).catch(a=>(this.emit("reject",a),a)).finally(()=>{this.emit("dequeue",c),this.finalize()})))});const b=await Promise.all(a);return 1===this.options.concurrent?b[0]:b}dequeue(){const{interval:a}=this.options;return new Promise(b=>{const c=Math.max(0,a-(Date.now()-this.lastRan));clearTimeout(this.timeoutId),this.timeoutId=setTimeout(()=>{this.lastRan=Date.now(),this.execute().then(b)},c)})}enqueue(a){var b=Number.MAX_SAFE_INTEGER;if(Array.isArray(a)){const b=[].concat(a.map(a=>this.enqueue(a)[0]));return b}if("function"!=typeof a)throw new Error(`You must provide a function, not ${typeof a}.`);return this.uniqueId=(this.uniqueId+1)%b,this.tasks.set(this.uniqueId,a),this.options.start&&this.state!==State.STOPPED&&this.start(),[this.uniqueId]}add(a){this.enqueue(a)}clear(){this.tasks.clear()}get size(){return this.tasks.size}get isEmpty(){return 0===this.size}get shouldRun(){return!this.isEmpty&&this.state!==State.STOPPED}}exports.default=Queue,module.exports=exports.default; \ No newline at end of file diff --git a/dist/index.js.flow b/dist/index.js.flow index e6bbc8cc..75a759fc 100755 --- a/dist/index.js.flow +++ b/dist/index.js.flow @@ -192,7 +192,7 @@ export default class Queue extends EventEmitter { return error; }) .finally(() => { - this.emit("dequeue"); + this.emit("dequeue", id); this.finalize(); }) ); @@ -237,13 +237,16 @@ export default class Queue extends EventEmitter { * * @param {Function|Array} tasks Tasks to add to the queue * @throws {Error} When task is not a function - * @return {void} + * @return {number[]} Array of task ids * @access public */ - enqueue(tasks: Function | Array): void { + enqueue(tasks: Function | Array): number[] { if (Array.isArray(tasks)) { - tasks.map((task) => this.enqueue(task)); - return; + const emptyNumberArray: number[] = []; + const taskIds = emptyNumberArray.concat( + tasks.map((task) => this.enqueue(task)[0]) + ); + return taskIds; } if (typeof tasks !== "function") { @@ -258,6 +261,8 @@ export default class Queue extends EventEmitter { if (this.options.start && this.state !== State.STOPPED) { this.start(); } + + return [this.uniqueId]; } /** diff --git a/package-lock.json b/package-lock.json index a7682a83..fcab3641 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5483,7 +5483,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, - "optional": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5493,15 +5492,13 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true + "dev": true }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "optional": true, "requires": { "fill-range": "^7.0.1" } @@ -5511,7 +5508,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "optional": true, "requires": { "to-regex-range": "^5.0.1" } @@ -5521,7 +5517,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "optional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -5530,15 +5525,13 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true + "dev": true }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true, "requires": { "picomatch": "^2.2.1" } @@ -5548,7 +5541,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "optional": true, "requires": { "is-number": "^7.0.0" } diff --git a/src/index.js b/src/index.js index e6bbc8cc..75a759fc 100755 --- a/src/index.js +++ b/src/index.js @@ -192,7 +192,7 @@ export default class Queue extends EventEmitter { return error; }) .finally(() => { - this.emit("dequeue"); + this.emit("dequeue", id); this.finalize(); }) ); @@ -237,13 +237,16 @@ export default class Queue extends EventEmitter { * * @param {Function|Array} tasks Tasks to add to the queue * @throws {Error} When task is not a function - * @return {void} + * @return {number[]} Array of task ids * @access public */ - enqueue(tasks: Function | Array): void { + enqueue(tasks: Function | Array): number[] { if (Array.isArray(tasks)) { - tasks.map((task) => this.enqueue(task)); - return; + const emptyNumberArray: number[] = []; + const taskIds = emptyNumberArray.concat( + tasks.map((task) => this.enqueue(task)[0]) + ); + return taskIds; } if (typeof tasks !== "function") { @@ -258,6 +261,8 @@ export default class Queue extends EventEmitter { if (this.options.start && this.state !== State.STOPPED) { this.start(); } + + return [this.uniqueId]; } /** diff --git a/types/index.d.ts b/types/index.d.ts index fbe52b12..cef53bab 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -28,7 +28,7 @@ declare module "queue-promise" { start(): void; stop(): void; dequeue(): any; - enqueue(tasks: TaskFactory | ReadonlyArray): void; + enqueue(tasks: TaskFactory | ReadonlyArray): number[]; add(tasks: TaskFactory | ReadonlyArray): void; clear(): void; } diff --git a/types/index.test.ts b/types/index.test.ts index 5fe210d3..dc90ad52 100644 --- a/types/index.test.ts +++ b/types/index.test.ts @@ -40,11 +40,11 @@ queue.stop(); const [e, f, g] = await queue.dequeue(); })(); -// $ExpectType void +// $ExpectType number[] queue.enqueue(() => resolve("Success")); -// $ExpectType void +// $ExpectType number[] queue.enqueue(() => reject("Error")); -// $ExpectType void +// $ExpectType number[] queue.enqueue([() => reject("Success"), () => reject("Error")]); // $ExpectError queue.enqueue("ab");