Files
pixelheros/extensions/Excel转JSON/node_modules/atomically/src/utils/retryify_queue.ts
walkpan 8f57f57c1d dd
2024-08-18 23:38:55 +08:00

96 lines
1.7 KiB
TypeScript

/* IMPORT */
import {LIMIT_FILES_DESCRIPTORS} from '../consts';
/* RETRYIFY QUEUE */
const RetryfyQueue = {
interval: 25,
intervalId: <NodeJS.Timeout | undefined> undefined,
limit: LIMIT_FILES_DESCRIPTORS,
queueActive: new Set<Function> (),
queueWaiting: new Set<Function> (),
init: (): void => {
if ( RetryfyQueue.intervalId ) return;
RetryfyQueue.intervalId = setInterval ( RetryfyQueue.tick, RetryfyQueue.interval );
},
reset: (): void => {
if ( !RetryfyQueue.intervalId ) return;
clearInterval ( RetryfyQueue.intervalId );
delete RetryfyQueue.intervalId;
},
add: ( fn: Function ): void => {
RetryfyQueue.queueWaiting.add ( fn );
if ( RetryfyQueue.queueActive.size < ( RetryfyQueue.limit / 2 ) ) { // Active queue not under preassure, executing immediately
RetryfyQueue.tick ();
} else {
RetryfyQueue.init ();
}
},
remove: ( fn: Function ): void => {
RetryfyQueue.queueWaiting.delete ( fn );
RetryfyQueue.queueActive.delete ( fn );
},
schedule: (): Promise<Function> => {
return new Promise ( resolve => {
const cleanup = () => RetryfyQueue.remove ( resolver );
const resolver = () => resolve ( cleanup );
RetryfyQueue.add ( resolver );
});
},
tick: (): void => {
if ( RetryfyQueue.queueActive.size >= RetryfyQueue.limit ) return;
if ( !RetryfyQueue.queueWaiting.size ) return RetryfyQueue.reset ();
for ( const fn of RetryfyQueue.queueWaiting ) {
if ( RetryfyQueue.queueActive.size >= RetryfyQueue.limit ) break;
RetryfyQueue.queueWaiting.delete ( fn );
RetryfyQueue.queueActive.add ( fn );
fn ();
}
}
};
/* EXPORT */
export default RetryfyQueue;