import type { Frame } from "../karp/frame" export class Segment { id: number // Take in a stream of frames input: WritableStream // Output a stream of bytes, which we fork for each new subscriber. #cache: ReadableStream timestamp = 0 constructor(id: number) { this.id = id // Set a max size for each segment, dropping the tail if it gets too long. // We tee the reader, so this limit applies to the FASTEST reader. const backpressure = new ByteLengthQueuingStrategy({ highWaterMark: 8_000_000, }) const transport = new TransformStream( { transform: (frame: Frame, controller) => { // Compute the max timestamp of the segment this.timestamp = Math.max(this.timestamp, frame.timestamp) // Push the chunk to any listeners. controller.enqueue(frame.data) }, }, undefined, backpressure, ) this.input = transport.writable this.#cache = transport.readable } // Split the output reader into two parts. chunks(): ReadableStream { const [tee, cache] = this.#cache.tee() this.#cache = cache return tee } }