import { OVar } from "../jshelper/mod.ts"; interface Measurement { time: number, duration: number, size: number } export class SegmentDownloader { private measurements: Measurement[] = [] public bandwidth = new OVar(Infinity) constructor() { } async download(url: string): Promise { const dl_start = performance.now(); const res = await fetch(url) const dl_header = performance.now(); if (!res.ok) throw new Error("aaaaa"); const buf = await res.arrayBuffer() const dl_body = performance.now(); if (buf.byteLength > 500 * 1000) { const m = { time: dl_start, duration: (dl_body - dl_header) / 1000, size: buf.byteLength } this.measurements.push(m) this.update_bandwidth() } return buf; } update_bandwidth() { while (this.measurements.length > 32) this.measurements.splice(0, 1) const total_size = this.measurements.reduce((a, v) => v.size + a, 0) const total_duration = this.measurements.reduce((a, v) => v.duration + a, 0) const average = total_size / total_duration this.bandwidth.value = average } }