From 4a5093addff8441ef799df3e07d487e2e746cc3c Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Tue, 21 Jun 2022 01:05:20 +0200 Subject: [PATCH] refactor(tracker/BatchWriter): explicit logic --- tracker/tracker/src/webworker/BatchWriter.ts | 58 +++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/tracker/tracker/src/webworker/BatchWriter.ts b/tracker/tracker/src/webworker/BatchWriter.ts index 7ddf97dbe..e5b9c3674 100644 --- a/tracker/tracker/src/webworker/BatchWriter.ts +++ b/tracker/tracker/src/webworker/BatchWriter.ts @@ -16,11 +16,25 @@ export default class BatchWriter { private timestamp: number, private onBatch: (batch: Uint8Array) => void ) { - this.prepareBatchMeta() + this.prepare() } - private prepareBatchMeta(): boolean { - return new BatchMeta(this.pageNo, this.nextIndex, this.timestamp).encode(this.writer) + private prepare(): void { + if (!this.writer.isEmpty()) { + //console.log("") + return + } + new BatchMeta(this.pageNo, this.nextIndex, this.timestamp).encode(this.writer) + } + + private write(message: Message): boolean { + const wasWritten = message.encode(this.writer) + if (wasWritten) { + this.isEmpty = false + this.writer.checkpoint() + this.nextIndex++ + } + return wasWritten } private beaconSizeLimit = 1e6 @@ -28,41 +42,31 @@ export default class BatchWriter { this.beaconSizeLimit = limit } - // TODO: clear workflow writeMessage(message: Message) { if (message instanceof Timestamp) { this.timestamp = (message).timestamp } - - if (!message.encode(this.writer)) { - if (!this.isEmpty) { - this.onBatch(this.writer.flush()) - this.prepareBatchMeta() - } - - while (!message.encode(this.writer)) { - if (this.beaconSize === this.beaconSizeLimit) { - console.warn("OpenReplay: beacon size overflow. Skipping large message."); - this.writer.reset() - this.prepareBatchMeta() - this.isEmpty = true - return - } - // MBTODO: tempWriter for one message? - this.beaconSize = Math.min(this.beaconSize*2, this.beaconSizeLimit) - this.writer = new PrimitiveWriter(this.beaconSize) - this.prepareBatchMeta() + while (!this.write(message)) { + this.finaliseBatch() + if (this.beaconSize === this.beaconSizeLimit) { + console.warn("OpenReplay: beacon size overflow. Skipping large message."); + this.writer.reset() + this.prepare() + this.isEmpty = true + return } + // MBTODO: tempWriter for one message? + this.beaconSize = Math.min(this.beaconSize*2, this.beaconSizeLimit) + this.writer = new PrimitiveWriter(this.beaconSize) + this.prepare() + this.isEmpty = true } - this.writer.checkpoint() - this.nextIndex++ - this.isEmpty = false } finaliseBatch() { if (this.isEmpty) { return } this.onBatch(this.writer.flush()) - this.prepareBatchMeta() + this.prepare() this.isEmpty = true }