From 7d4e166678c35d48b22b8d1d05639f981a956a8b Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Mon, 13 Apr 2026 04:41:33 +0200 Subject: fix: text measurement, rotation handle, video cache races, playback sync Made-with: Cursor --- apps/web/src/services/video-cache/service.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'apps/web/src/services/video-cache') diff --git a/apps/web/src/services/video-cache/service.ts b/apps/web/src/services/video-cache/service.ts index 36441981..e5f3991d 100644 --- a/apps/web/src/services/video-cache/service.ts +++ b/apps/web/src/services/video-cache/service.ts @@ -19,6 +19,7 @@ interface VideoSinkData { export class VideoCache { private sinks = new Map(); private initPromises = new Map>(); + private frameChain = new Map>(); async getFrameAt({ mediaId, @@ -34,6 +35,21 @@ export class VideoCache { const sinkData = this.sinks.get(mediaId); if (!sinkData) return null; + const previous = this.frameChain.get(mediaId) ?? Promise.resolve(); + const current = previous.then(() => + this.resolveFrame({ sinkData, time }), + ); + this.frameChain.set(mediaId, current.catch(() => {})); + return current; + } + + private async resolveFrame({ + sinkData, + time, + }: { + sinkData: VideoSinkData; + time: number; + }): Promise { if (sinkData.nextFrame && sinkData.nextFrame.timestamp <= time) { sinkData.currentFrame = sinkData.nextFrame; sinkData.nextFrame = null; -- cgit v1.3.1