Objetivo: una cola de prioridad de heapify que se sondea regularmente para enviar objetos de mensaje. Cada vez que se sondea la cola, debe echar un vistazo a la cola para ver si hay algún mensaje. Si es así, debería intentar enviar el mensaje.
En caso de éxito, elimine ese mensaje de la cola.
Me preocupan los mensajes perdidos, por lo que si el mensaje falla, debe permanecer en la cola para enviarse en la siguiente invocación. Y el usuario deberá ser alertado (pero yo mismo me encargaré de esa parte).
Lo que tengo hasta ahora:
import { Heap } from 'heap-js'; function coroutine(f) { var o = f(); // instantiate the coroutine o.next(); // execute until the first yield return function(x) { o.next(x); }; } socket.messageQueue = new Heap(100); var messageBox = coroutine(async function*() { while (true) { yield; if (typeof socket.messageQueue.peek() === 'undefined') { continue; } let message = socket.messageQueue.peek(); let response = await sendMessage(socket, message); if (response.success) { socket.messageQueue.pop(); // the message was sent // reset warnings if they exist } else { // warn user that the message send failed // it will retry in 3 seconds } } }); socket.messageBox = setInterval(messageBox, 3000);Y los mensajes se agregan a la cola así:
let priority = // the largest priority + 1 socket.messageQueue.push(message, priority);El socket es de socket.io. Estoy instanciando el proceso en un socket del lado del servidor porque lo voy a derribar cuando el usuario se desconecte. Y la cola es FIFO, por lo que la prioridad debe establecerse en la última prioridad. Desafortunadamente, no parece que heapify tenga un método incorporado para obtener la mayor prioridad de un montón.
Cualquier sugerencia para hacer esto eficiente y elocuente sería apreciada.