64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
/**
|
|
* Message Queue Bridge
|
|
*
|
|
* Allows non-React code (like Task.ts) to add messages to the messageQueue.
|
|
* The queue adder function is set by App.tsx on mount.
|
|
*
|
|
* This enables background tasks to queue their notification XML directly
|
|
* into messageQueue, where the existing dequeue logic handles auto-firing.
|
|
*/
|
|
|
|
export type QueuedMessage = {
|
|
kind: "user" | "task_notification";
|
|
text: string;
|
|
};
|
|
|
|
type QueueAdder = (message: QueuedMessage) => void;
|
|
|
|
let queueAdder: QueueAdder | null = null;
|
|
const pendingMessages: QueuedMessage[] = [];
|
|
const MAX_PENDING_MESSAGES = 10;
|
|
|
|
/**
|
|
* Set the queue adder function. Called by App.tsx on mount.
|
|
*/
|
|
export function setMessageQueueAdder(fn: QueueAdder | null): void {
|
|
queueAdder = fn;
|
|
if (queueAdder && pendingMessages.length > 0) {
|
|
for (const message of pendingMessages) {
|
|
queueAdder(message);
|
|
}
|
|
pendingMessages.length = 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add a message to the messageQueue.
|
|
* Called from Task.ts when a background task completes.
|
|
* If queue adder not set (App not mounted), message is dropped.
|
|
*/
|
|
export function addToMessageQueue(message: QueuedMessage): void {
|
|
if (queueAdder) {
|
|
queueAdder(message);
|
|
return;
|
|
}
|
|
if (pendingMessages.length >= MAX_PENDING_MESSAGES) {
|
|
pendingMessages.shift();
|
|
}
|
|
pendingMessages.push(message);
|
|
}
|
|
|
|
/**
|
|
* Check if the queue bridge is connected.
|
|
*/
|
|
export function isQueueBridgeConnected(): boolean {
|
|
return queueAdder !== null;
|
|
}
|
|
|
|
/**
|
|
* Clear any pending messages (for testing).
|
|
*/
|
|
export function clearPendingMessages(): void {
|
|
pendingMessages.length = 0;
|
|
}
|