diff --git a/ui/koko/tests/sftp/fileTransferRate.test.ts b/ui/koko/tests/sftp/fileTransferRate.test.ts index 1f322f3e1..2082e0b3b 100644 --- a/ui/koko/tests/sftp/fileTransferRate.test.ts +++ b/ui/koko/tests/sftp/fileTransferRate.test.ts @@ -22,7 +22,7 @@ describe("file transfer rate helper", () => { expect(remainingSeconds(10_240, 2_048, 2048)).toBe(4); }); - it("drops stale samples and ignores zero-size remaining", () => { + it("keeps the last two samples when a chunk is slower than the window", () => { const samples = pushTransferRateSample( [ { t: 1_000, bytes: 0 }, @@ -31,7 +31,11 @@ describe("file transfer rate helper", () => { 200, 7_000 ); - expect(samples).toEqual([{ t: 7_000, bytes: 200 }]); + expect(samples).toEqual([ + { t: 2_000, bytes: 100 }, + { t: 7_000, bytes: 200 } + ]); + expect(bytesPerSecond(samples)).toBe(20); expect(remainingSeconds(0, 0, 100)).toBeNull(); expect(remainingSeconds(100, 100, 50)).toBe(0); }); diff --git a/ui/koko/utils/file-transfer/rate.ts b/ui/koko/utils/file-transfer/rate.ts index 90c60c1a7..00bf08f33 100644 --- a/ui/koko/utils/file-transfer/rate.ts +++ b/ui/koko/utils/file-transfer/rate.ts @@ -10,7 +10,10 @@ export function pushTransferRateSample( bytes: number, now = Date.now() ): TransferRateSample[] { - return [...samples, { t: now, bytes }].filter((sample) => now - sample.t <= sampleWindowMs).slice(-12); + const next = [...samples, { t: now, bytes }]; + const recent = next.filter((sample) => now - sample.t <= sampleWindowMs); + if (recent.length >= 2) return recent.slice(-12); + return next.slice(-2); } export function bytesPerSecond(samples: TransferRateSample[] | null | undefined): number | null {