From 60989d43a0defca133dde12753485e86846e3c80 Mon Sep 17 00:00:00 2001 From: Elijah R Date: Mon, 18 Dec 2023 16:55:45 -0500 Subject: [PATCH] improve message queue logic --- src/VM.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/VM.ts b/src/VM.ts index 00d521b..f8d4029 100644 --- a/src/VM.ts +++ b/src/VM.ts @@ -12,6 +12,7 @@ export default class VM { #socket : Socket; #writeLock : Mutex = new Mutex(); #messageQueue : Queue = new Queue(); + #messageQueueRunning : boolean = false; #nopTimeout : NodeJS.Timeout | null = null; #reconnectTimeout : NodeJS.Timeout | null = null; isConnectedToVM : boolean = false; @@ -50,10 +51,6 @@ export default class VM { }); this.#socket.on('data', (data) => this.#onData(data)); this.#events = new EventEmitter(); - this.#events.on('ack', () => { - if (this.#messageQueue.size > 0) - this.messageQueueLoop(); - }) } UploadFile(file : File) { @@ -66,15 +63,24 @@ export default class VM { messageQueueLoop() { return new Promise(async (res, rej) => { + this.#messageQueueRunning = true; + while (this.#messageQueue.size > 0) { var msg = this.#messageQueue.dequeue(); var payload = msgpack.encode(msg); await this.#sendMessage(payload); + await new Promise((res, rej) => { + this.#events.once('ack', () => { + res(); + }); + }); + } + this.#messageQueueRunning = false; }) } #enqueueMessage(msg : protocol.ProtocolMessage) { this.#messageQueue.enqueue(msg); - if (this.#messageQueue.size === 1) this.messageQueueLoop(); + if (this.#messageQueueRunning) this.messageQueueLoop(); } #sendMessage(data : Buffer) : Promise { @@ -118,7 +124,6 @@ export default class VM { this.#noNop = false; if (!this.isConnectedToVM) { log("INFO", `Got connection to VM at ${this.#id}`); - if (this.#messageQueue.size > 0) this.messageQueueLoop(); this.isConnectedToVM = true; } switch (msg.Operation) { @@ -138,6 +143,7 @@ export default class VM { } else { this.isConnectedToVM = false; clearTimeout(this.#nopTimeout!); + this.#messageQueue.clear(); log("INFO", `Connection to VM at ${this.#id} timed out`); } }