diff --git a/lib/helpers/progressEventReducer.js b/lib/helpers/progressEventReducer.js index 85f109b7..e2c15c0d 100644 --- a/lib/helpers/progressEventReducer.js +++ b/lib/helpers/progressEventReducer.js @@ -7,6 +7,9 @@ export const progressEventReducer = (listener, isDownloadStream, freq = 3) => { const _speedometer = speedometer(50, 250); return throttle((e) => { + if (!e || typeof e.loaded !== 'number') { + return; + } const rawLoaded = e.loaded; const total = e.lengthComputable ? e.total : undefined; const loaded = total != null ? Math.min(rawLoaded, total) : rawLoaded; diff --git a/tests/unit/helpers/progressEventReducer.test.js b/tests/unit/helpers/progressEventReducer.test.js index 1569bee9..325347a3 100644 --- a/tests/unit/helpers/progressEventReducer.test.js +++ b/tests/unit/helpers/progressEventReducer.test.js @@ -24,4 +24,27 @@ describe('helpers::progressEventReducer', () => { expect(last.upload).toBe(true); expect(last.bytes).toBe(20); }); + + it('should ignore malformed events that lack a numeric loaded value', () => { + const events = []; + const [onProgress, flush] = progressEventReducer((data) => { + events.push(data); + }, false, Number.POSITIVE_INFINITY); + + onProgress(undefined); + onProgress(null); + onProgress({}); + onProgress({ loaded: null, total: 100, lengthComputable: true }); + onProgress({ loaded: 'abc', total: 100, lengthComputable: true }); + flush(); + + expect(events.length).toBe(0); + + onProgress({ lengthComputable: true, loaded: 50, total: 100 }); + flush(); + + expect(events.length).toBe(1); + expect(events[0].loaded).toBe(50); + expect(events[0].bytes).toBe(50); + }); });