diff --git a/packages/telemetry/browser-telemetry/__tests__/collectors/rrweb/SessionBuffer.test.ts b/packages/telemetry/browser-telemetry/__tests__/collectors/rrweb/RollingBuffer.test.ts similarity index 59% rename from packages/telemetry/browser-telemetry/__tests__/collectors/rrweb/SessionBuffer.test.ts rename to packages/telemetry/browser-telemetry/__tests__/collectors/rrweb/RollingBuffer.test.ts index 2bdf2cf069..772f7ddbd3 100644 --- a/packages/telemetry/browser-telemetry/__tests__/collectors/rrweb/SessionBuffer.test.ts +++ b/packages/telemetry/browser-telemetry/__tests__/collectors/rrweb/RollingBuffer.test.ts @@ -27,3 +27,27 @@ it('when the buffer is exceeded it will wrap around', () => { expect(buffer.toArray()).toEqual(expectedItems); }); + +it('can reset the buffer', () => { + const bufferSize = 5; + const numberBuffers = 4; + const buffer = new RollingBuffer(bufferSize, numberBuffers); + const demoItems = Array.from(new Array(10), (_, i) => i); + + demoItems.forEach(buffer.push.bind(buffer)); + buffer.reset(); + + expect(buffer.toArray()).toEqual([]); +}); + +it('returns correct items when buffer is partially filled', () => { + const bufferSize = 5; + const numberBuffers = 4; + const buffer = new RollingBuffer(bufferSize, numberBuffers); + const itemsToAdd = 7; // Less than total capacity + const demoItems = Array.from(new Array(itemsToAdd), (_, i) => i); + + demoItems.forEach(buffer.push.bind(buffer)); + + expect(buffer.toArray()).toEqual(demoItems); +}); diff --git a/packages/telemetry/browser-telemetry/src/collectors/rrweb/RollingBuffer.ts b/packages/telemetry/browser-telemetry/src/collectors/rrweb/RollingBuffer.ts index df2ecd2ddb..073bbd08da 100644 --- a/packages/telemetry/browser-telemetry/src/collectors/rrweb/RollingBuffer.ts +++ b/packages/telemetry/browser-telemetry/src/collectors/rrweb/RollingBuffer.ts @@ -43,16 +43,20 @@ export default class RollingBuffer { toArray(): any[] { const asArray: any[] = []; - const size = this._buffers.reduce((acc: number, item: EventBuffer) => { - if (item.isPopulated()) { - return acc + 1; - } - return acc; - }, 0); - for (let index = this._headPointer; index < this._headPointer + size; index += 1) { + // Loop through the buffers, apprending their contents to asArray, until we find an empty one. + for ( + let index = this._headPointer; + index < this._headPointer + this._buffers.length; + index += 1 + ) { const realIndex = index % this._buffers.length; - asArray.push(...this._buffers[realIndex].content); + const item = this._buffers[realIndex]; + + if (!item.isPopulated) { + break; + } + asArray.push(...item.content); } return asArray;