diff --git a/src/lib/device.ts b/src/lib/device.ts index 93dc44cee32fd48fdca5c61ff43be341cf5decd7..bd9b6a7b0ac784a6c07b938df5ca5bea1548b443 100644 --- a/src/lib/device.ts +++ b/src/lib/device.ts @@ -319,28 +319,23 @@ export default abstract class Device extends js.global.EventEmitter { } } - private enqueue(buffer: Uint8Array): void { - - if (Date.now() - this.lastWrite >= 1000 && this.queue.length < 1) { - this.sendToDevice(buffer); - this.lastWrite = Date.now(); - return; - } + // Hot eats, cool treats + private dequeue(): void { + const buf = this.queue.shift(); + if (buf === undefined) return; + this.sendToDevice(buf); + this.lastWrite = Date.now(); + if (this.queue.length > 0) js.setTimeout(this.dequeue, 1000, this); + } + private enqueue(buffer: Uint8Array): void { + const now = Date.now(); this.queue.push(buffer); - if (this.queue.length > 1) return; - - function send(): void { - // @ts-expect-error shut up - this.sendToDevice(this.queue.shift()); - // @ts-expect-error shut up - this.lastWrite = Date.now(); - // @ts-expect-error shut up - if (this.queue.length > 0) js.setTimeout(send, 1000, this); + if (now - this.lastWrite >= 1000 && this.queue.length < 1) { + this.dequeue(); + } else { + js.setTimeout(this.dequeue, Math.max(1, 1000 - (now - this.lastWrite)), this); } - - js.setTimeout(send, 1000, this); - } /** Write a [ToRadio](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.ToRadio) message to the device */