Comparing version 1.0.3 to 1.0.4
export declare type QueueState = { | ||
readonly pending: number; | ||
readonly total: number; | ||
readonly size: number; | ||
readonly done: number; | ||
@@ -15,2 +15,3 @@ readonly percent: number; | ||
export interface QueuePromises { | ||
readonly runned: number; | ||
state(): 'idle' | QueueState; | ||
@@ -17,0 +18,0 @@ enqueue<T>(item: Job<T>): void; |
@@ -6,3 +6,3 @@ import { asap } from './asap'; | ||
const queue = []; | ||
let total = 0; | ||
let size = 0; | ||
let idle = true; | ||
@@ -13,5 +13,7 @@ let start = Date.now(); | ||
let canRefresh = 0; | ||
let lastError; | ||
let runned = 0; | ||
const state = { | ||
get total() { | ||
return total; | ||
get size() { | ||
return size; | ||
}, | ||
@@ -22,6 +24,6 @@ get pending() { | ||
get done() { | ||
return total - queue.length; | ||
return size - queue.length; | ||
}, | ||
get percent() { | ||
return Math.round((total - queue.length) / total * 1000) / 10; | ||
return Math.round((size - queue.length) / size * 1000) / 10; | ||
}, | ||
@@ -33,3 +35,3 @@ get rate() { | ||
const ellapsed = (now - start) / 1000; | ||
const rate = (total - queue.length) / (ellapsed); | ||
const rate = (size - queue.length) / (ellapsed); | ||
return rate; | ||
@@ -42,4 +44,4 @@ }, | ||
const ellapsed = (now - start) / 1000; | ||
const rate = (total - queue.length) / (ellapsed); | ||
const seconds = (total - queue.length) / rate; | ||
const rate = (size - queue.length) / (ellapsed); | ||
const seconds = (size - queue.length) / rate; | ||
if (seconds < 50) | ||
@@ -59,2 +61,5 @@ return (seconds).toFixed(0) + ' seconds'; | ||
return { | ||
get runned() { | ||
return runned; | ||
}, | ||
state() { | ||
@@ -65,3 +70,3 @@ return idle ? 'idle' : state; | ||
queue.push(item); | ||
total++; | ||
size++; | ||
canRate = Date.now() + 1000; | ||
@@ -71,7 +76,12 @@ scheduleProcess(); | ||
waitFor() { | ||
return new Promise((resolve) => { | ||
return new Promise((resolve, reject) => { | ||
setTimeout(check, 100); | ||
function check() { | ||
if (running + queue.length === 0) | ||
resolve(); | ||
if (running + queue.length === 0) { | ||
if (lastError) | ||
reject(lastError); | ||
else | ||
resolve(); | ||
lastError = undefined; | ||
} | ||
else | ||
@@ -92,3 +102,3 @@ setTimeout(check, 100); | ||
onProgress && setTimeout(() => { | ||
if (total > 0) { | ||
if (size > 0) { | ||
onProgress(state); | ||
@@ -102,5 +112,8 @@ } | ||
else if (running < 1) { | ||
total = 0; | ||
size = 0; | ||
onProgress && asap(() => onProgress('finished')); | ||
idle = true; | ||
setTimeout(() => { | ||
lastError = undefined; | ||
}, 2000); | ||
} | ||
@@ -117,3 +130,7 @@ } | ||
} | ||
catch (e) { | ||
lastError = e; | ||
} | ||
finally { | ||
runned++; | ||
running--; | ||
@@ -120,0 +137,0 @@ scheduleProcess(); |
{ | ||
"name": "pjobs", | ||
"description": "A simple and efficient queue job executor using promises. And some promise's utilities.", | ||
"version": "1.0.3", | ||
"version": "1.0.4", | ||
"private": false, | ||
@@ -6,0 +6,0 @@ "main": "dist/index.js", |
@@ -22,3 +22,5 @@ [![Node.js CI](https://github.com/teintinu/pjobs/actions/workflows/test.yml/badge.svg)](https://github.com/teintinu/pjobs/actions/workflows/test.yml) | ||
onProgress (status) { // allow you to inform users about execution progress | ||
console.log('queue status: ', status) | ||
console.log('done: ', status.percent, '%') | ||
console.log('speed: ', status.rate) // jobs runned per second | ||
console.log('estimated time remaining to finish: ', status.timeRemaining) | ||
} | ||
@@ -25,0 +27,0 @@ }) |
8545
195
70