Files
artcraft/app/pages/PageEnigma/Queue/Queue.ts
T
2024-05-13 21:14:05 -07:00

88 lines
1.9 KiB
TypeScript

import { fromEngineActions } from "~/pages/PageEnigma/Queue/fromEngineActions";
import { toEngineActions } from "~/pages/PageEnigma/Queue/toEngineActions";
import {
QueueClip,
QueueKeyframe,
UpdateTime,
MediaItem,
} from "~/pages/PageEnigma/models";
import { toTimelineActions } from "./toTimelineActions";
import { ClipUI } from "../datastructures/clips/clip_ui";
import { ToastTypes } from "~/contexts/ToasterContext";
import { GenerationOptions } from "../models/generationOptions";
export type ToastDataType = {
type: ToastTypes;
message: string;
}
type UnionedActionTypes =
| fromEngineActions
| toEngineActions
| toTimelineActions;
type UnionedDataTypes =
| QueueClip
| UpdateTime
| QueueKeyframe
| ClipUI[]
| MediaItem
| ToastDataType
| GenerationOptions
| null;
export type QueueSubscribeType = {
action: UnionedActionTypes;
data: UnionedDataTypes;
};
class Queue {
private _queue: Record<
string,
{
action: UnionedActionTypes;
data: UnionedDataTypes;
}[]
> = {};
private _subscribers: Record<
string,
(entry: { action: UnionedActionTypes; data: UnionedDataTypes }) => void
> = {};
public publish({
queueName,
action,
data,
}: {
queueName: string;
action: UnionedActionTypes;
data: UnionedDataTypes;
}) {
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: QueueSubscribeType) => 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;