mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 16:55:37 +02:00
This adds: - [x] Keyboard and mouse handling on the frontend - [x] Video and audio streaming from the backend to the frontend - [x] Input server that works with Websockets Update - 17/11 - [ ] Master docker container to run this - [ ] Steam runtime - [ ] Entrypoint.sh --------- Co-authored-by: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Co-authored-by: Kristian Ollikainen <DatCaptainHorse@users.noreply.github.com>
48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
import type { Frame } from "../karp/frame"
|
|
|
|
export class Segment {
|
|
id: number
|
|
|
|
// Take in a stream of frames
|
|
input: WritableStream<Frame>
|
|
|
|
// Output a stream of bytes, which we fork for each new subscriber.
|
|
#cache: ReadableStream<Uint8Array>
|
|
|
|
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<Frame, Uint8Array>(
|
|
{
|
|
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<Uint8Array> {
|
|
const [tee, cache] = this.#cache.tee()
|
|
this.#cache = cache
|
|
return tee
|
|
}
|
|
}
|