diff --git a/packages/node-sdk/package.json b/packages/node-sdk/package.json index 075186fd..b4dec0ee 100644 --- a/packages/node-sdk/package.json +++ b/packages/node-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@bucketco/node-sdk", - "version": "1.6.2", + "version": "1.6.3", "license": "MIT", "repository": { "type": "git", diff --git a/packages/node-sdk/src/batch-buffer.ts b/packages/node-sdk/src/batch-buffer.ts index 2407bc9d..0435a509 100644 --- a/packages/node-sdk/src/batch-buffer.ts +++ b/packages/node-sdk/src/batch-buffer.ts @@ -69,19 +69,20 @@ export default class BatchBuffer { return; } + const flushingBuffer = this.buffer; + this.buffer = []; + try { - await this.flushHandler(this.buffer); + await this.flushHandler(flushingBuffer); this.logger?.info("flushed buffered items", { - count: this.buffer.length, + count: flushingBuffer.length, }); } catch (error) { this.logger?.error("flush of buffered items failed; discarding items", { error, - count: this.buffer.length, + count: flushingBuffer.length, }); } - - this.buffer = []; } } diff --git a/packages/node-sdk/test/batch-buffer.test.ts b/packages/node-sdk/test/batch-buffer.test.ts index d6cd2461..e02100ff 100644 --- a/packages/node-sdk/test/batch-buffer.test.ts +++ b/packages/node-sdk/test/batch-buffer.test.ts @@ -147,6 +147,22 @@ describe("BatchBuffer", () => { ); }); + it("calling flush simultaneously should only flush data once", async () => { + let itemsFlushed = 0; + const buffer = new BatchBuffer({ + flushHandler: async (items) => { + itemsFlushed += items.length; + await new Promise((resolve) => setTimeout(resolve, 100)); + mockFlushHandler(); + }, + logger: mockLogger, + }); + + await buffer.add("item1"); + await Promise.all([buffer.flush(), buffer.flush()]); + expect(itemsFlushed).toBe(1); + }); + it("should flush buffer", async () => { const buffer = new BatchBuffer({ flushHandler: mockFlushHandler,