Move queue in common

This commit is contained in:
Marcel Mraz 2025-03-18 20:07:22 +01:00
parent a9b4b758cf
commit a3fef45365
No known key found for this signature in database
GPG key ID: 4EBD6E62DC830CD2
3 changed files with 3 additions and 2 deletions

View file

@ -0,0 +1,48 @@
import { promiseTry, resolvablePromise } from "@excalidraw/common";
import type { ResolvablePromise } from "@excalidraw/common";
import type { MaybePromise } from "@excalidraw/common/utility-types";
type Job<T, TArgs extends unknown[]> = (...args: TArgs) => MaybePromise<T>;
type QueueJob<T, TArgs extends unknown[]> = {
jobFactory: Job<T, TArgs>;
promise: ResolvablePromise<T>;
args: TArgs;
};
export class Queue {
private jobs: QueueJob<any, any[]>[] = [];
private running = false;
private tick() {
if (this.running) {
return;
}
const job = this.jobs.shift();
if (job) {
this.running = true;
job.promise.resolve(
promiseTry(job.jobFactory, ...job.args).finally(() => {
this.running = false;
this.tick();
}),
);
} else {
this.running = false;
}
}
push<TValue, TArgs extends unknown[]>(
jobFactory: Job<TValue, TArgs>,
...args: TArgs
): Promise<TValue> {
const promise = resolvablePromise<TValue>();
this.jobs.push({ jobFactory, promise, args });
this.tick();
return promise;
}
}