Files
artcraft/app/pages/PageEnigma/Queue/Queue.ts
T
2024-03-30 01:00:18 +07:00

58 lines
1.5 KiB
TypeScript

import { fromEngineActions } from "~/pages/PageEnigma/Queue/fromEngineActions";
import { toEngineActions } from "~/pages/PageEnigma/Queue/toEngineActions";
import { QueueClip } from "~/pages/PageEnigma/models/track";
class Queue {
private _queue: Record<
string,
{
action: fromEngineActions | toEngineActions;
data: QueueClip | { currentTime: number };
}[]
> = {};
private _subscribers: Record<
string,
(entry: {
action: fromEngineActions | toEngineActions;
data: QueueClip | { currentTime: number };
}) => void
> = {};
public publish({
queueName,
action,
data,
}: {
queueName: string;
action: fromEngineActions | toEngineActions;
data: QueueClip | { currentTime: number };
}) {
if (!this._queue[queueName]) {
this._queue[queueName] = [];
}
this._queue[queueName].push({ action, data });
console.log("Queued", queueName, action, data);
if (this._subscribers[queueName]) {
this._subscribers[queueName](this._queue[queueName].splice(0, 1)[0]);
}
}
public subscribe(
queueName: string,
onMessage: (entry: {
action: fromEngineActions | toEngineActions;
data: QueueClip | { currentTime: number };
}) => void,
) {
this._subscribers[queueName] = onMessage;
while (this._queue[queueName]?.length) {
this._subscribers[queueName](this._queue[queueName].splice(0, 1)[0]);
}
}
}
const queue = new Queue();
export default queue;