From 12f582ec1a7819e38c800664dd05c687c77fff6c Mon Sep 17 00:00:00 2001 From: rahim Date: Wed, 18 Mar 2026 00:56:26 -0700 Subject: [PATCH] fix(core): sync playback feature state on seeked event (#1000) --- packages/core/src/dom/store/features/playback.ts | 1 + .../src/dom/store/features/tests/playback.test.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/packages/core/src/dom/store/features/playback.ts b/packages/core/src/dom/store/features/playback.ts index 7fe14bdb..41bd3553 100644 --- a/packages/core/src/dom/store/features/playback.ts +++ b/packages/core/src/dom/store/features/playback.ts @@ -37,5 +37,6 @@ export const playbackFeature = definePlayerFeature({ listen(media, 'ended', sync, { signal }); listen(media, 'playing', sync, { signal }); listen(media, 'waiting', sync, { signal }); + listen(media, 'seeked', sync, { signal }); }, }); diff --git a/packages/core/src/dom/store/features/tests/playback.test.ts b/packages/core/src/dom/store/features/tests/playback.test.ts index c181bff9..171783bd 100644 --- a/packages/core/src/dom/store/features/tests/playback.test.ts +++ b/packages/core/src/dom/store/features/tests/playback.test.ts @@ -104,6 +104,21 @@ describe('playbackFeature', () => { expect(store.state.ended).toBe(true); }); + it('clears ended state on seeked event', () => { + const video = createMockVideo({ ended: true }); + + const store = createStore()(playbackFeature); + store.attach({ media: video, container: null }); + + expect(store.state.ended).toBe(true); + + // Simulate seeking: browser clears ended when user seeks + Object.defineProperty(video, 'ended', { value: false, writable: false, configurable: true }); + video.dispatchEvent(new Event('seeked')); + + expect(store.state.ended).toBe(false); + }); + it('stops listening when store is destroyed', () => { const video = createMockVideo({});