homekit: add mp4 fragment io timeout

This commit is contained in:
Koushik Dutta
2026-06-01 15:57:55 -07:00
parent c5fc35ed6d
commit 86e7cced78
2 changed files with 21 additions and 12 deletions

View File

@@ -7,19 +7,28 @@ import { readLength } from './read-stream';
const { mediaManager } = sdk;
export async function* parseFragmentedMP4(readable: Readable): AsyncGenerator<MP4Atom> {
export async function* parseFragmentedMP4(readable: Readable, timeout = 0): AsyncGenerator<MP4Atom> {
while (true) {
const header = await readLength(readable, 8);
const length = header.readInt32BE(0) - 8;
const type = header.slice(4).toString();
const data = await readLength(readable, length);
const t = timeout ? setTimeout(() => {
readable.destroy(new Error('Timeout waiting for MP4 atom'));
}, timeout) : undefined;
try {
const header = await readLength(readable, 8);
const length = header.readInt32BE(0) - 8;
const type = header.slice(4).toString();
const data = await readLength(readable, length);
clearTimeout(t);
yield {
header,
length,
type,
data,
};
yield {
header,
length,
type,
data,
};
}
finally {
clearTimeout(t);
}
}
}

View File

@@ -162,7 +162,7 @@ export async function* handleFragmentsRequests(streamId: number, device: Scrypte
session = {
socket,
cp: undefined,
generator: parseFragmentedMP4(socket),
generator: parseFragmentedMP4(socket, 30000),
}
}
else {