UNPKG

@mieweb/wikigdrive

Version:

Google Drive to MarkDown synchronization

59 lines (45 loc) 1.01 kB
import {EventEmitter} from 'node:events'; class Job<T> { private readonly starter: { (): Promise<T> }; public readonly promise: Promise<T>; private resolve: (value?: T) => void; private reject: (reason?: Error) => void; constructor(starter) { this.starter = starter; this.promise = new Promise((resolve, reject) => { this.resolve = resolve; this.reject = reject; }); } async execute() { try { const result: T = await this.starter(); this.resolve(result); } catch (err) { this.reject(err); } } } export class JobsQueue extends EventEmitter { private jobs: Job<unknown>[]; constructor() { super(); this.jobs = []; } pushJob(starter) { const job = new Job(starter); this.jobs.push(job); this.emit('update', this); return job.promise; } popJob() { const job = this.jobs.shift(); if (!job) { this.emit('empty'); } return job; } size() { return this.jobs.length; } }