From 207cb9d833ab5301ff7839360c102d1da4b71d1e Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Tue, 2 Apr 2024 20:31:30 -0700 Subject: [PATCH] homekit: clean up late generator bug --- plugins/homekit/src/types/camera.ts | 14 +++++--------- .../homekit/src/types/camera/camera-recording.ts | 9 ++++++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/plugins/homekit/src/types/camera.ts b/plugins/homekit/src/types/camera.ts index 3673f44cea..8209945b55 100644 --- a/plugins/homekit/src/types/camera.ts +++ b/plugins/homekit/src/types/camera.ts @@ -103,24 +103,20 @@ addSupportedType({ const isRecordingEnabled = device.interfaces.includes(ScryptedInterface.MotionSensor); let configuration: CameraRecordingConfiguration; - const openRecordingStreams = new Map>(); + const openRecordingStreams = new Set(); if (isRecordingEnabled) { recordingDelegate = { updateRecordingConfiguration(newConfiguration: CameraRecordingConfiguration) { configuration = newConfiguration; }, handleRecordingStreamRequest(streamId: number): AsyncGenerator { - const ret = handleFragmentsRequests(streamId, device, configuration, console, homekitPlugin); - const d = new Deferred(); - d.promise.then(reason => { - ret.throw(new Error(reason.toString())); - openRecordingStreams.delete(streamId); - }); - openRecordingStreams.set(streamId, d); + const ret = handleFragmentsRequests(streamId, device, configuration, console, homekitPlugin, + () => openRecordingStreams.has(streamId)); + openRecordingStreams.add(streamId); return ret; }, closeRecordingStream(streamId, reason) { - openRecordingStreams.get(streamId)?.resolve(reason); + openRecordingStreams.delete(streamId); }, updateRecordingActive(active) { }, diff --git a/plugins/homekit/src/types/camera/camera-recording.ts b/plugins/homekit/src/types/camera/camera-recording.ts index a2cd33ef99..1a8a514b7a 100644 --- a/plugins/homekit/src/types/camera/camera-recording.ts +++ b/plugins/homekit/src/types/camera/camera-recording.ts @@ -116,7 +116,7 @@ async function checkMp4StartsWithKeyFrame(console: Console, mp4: Buffer) { } export async function* handleFragmentsRequests(streamId: number, device: ScryptedDevice & VideoCamera & MotionSensor & AudioSensor, - configuration: CameraRecordingConfiguration, console: Console, homekitPlugin: HomeKitPlugin): AsyncGenerator { + configuration: CameraRecordingConfiguration, console: Console, homekitPlugin: HomeKitPlugin, isOpen: () => boolean): AsyncGenerator { // homekitPlugin.storageSettings.values.lastKnownHomeHub = connection.remoteAddress; @@ -319,6 +319,7 @@ export async function* handleFragmentsRequests(streamId: number, device: Scrypte let needSkip = true; let ftyp: Buffer[]; let moov: Buffer[]; + for await (const box of generator) { const { header, type, data } = box; // console.log('motion fragment box', type); @@ -331,7 +332,7 @@ export async function* handleFragmentsRequests(streamId: number, device: Scrypte checkMp4 = false; // pending will contain the moof try { - if (!await checkMp4StartsWithKeyFrame(console, Buffer.concat([...ftyp, ...moov, ...pending, header, data]))) { + if (false && !await checkMp4StartsWithKeyFrame(console, Buffer.concat([...ftyp, ...moov, ...pending, header, data]))) { needSkip = false; pending = []; continue; @@ -360,17 +361,19 @@ export async function* handleFragmentsRequests(streamId: number, device: Scrypte data: fragment, isLast, } + if (!isOpen()) + return; yield recordingPacket; if (wasLast) break; } } - console.log(`motion recording finished`); } catch (e) { console.log(`motion recording completed ${e}`); } finally { + console.log(`motion recording finished`); clearTimeout(videoTimeout); cleanupPipes(); recordingFile?.end();