@videojs/spf 10.0.0-beta.31 → 10.0.0-beta.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/default/core/actors/create-machine-actor.js +23 -25
- package/dist/default/core/actors/create-machine-actor.js.map +1 -1
- package/dist/default/core/actors/create-transition-actor.js +7 -9
- package/dist/default/core/actors/create-transition-actor.js.map +1 -1
- package/dist/default/core/composition/create-composition.js +26 -29
- package/dist/default/core/composition/create-composition.js.map +1 -1
- package/dist/default/core/composition/share-signals.js +12 -17
- package/dist/default/core/composition/share-signals.js.map +1 -1
- package/dist/default/core/machine.js +3 -4
- package/dist/default/core/machine.js.map +1 -1
- package/dist/default/core/reactors/create-machine-reactor.js +20 -19
- package/dist/default/core/reactors/create-machine-reactor.js.map +1 -1
- package/dist/default/core/signals/effect.js +24 -4
- package/dist/default/core/signals/effect.js.map +1 -1
- package/dist/default/core/signals/primitives.js +10 -14
- package/dist/default/core/signals/primitives.js.map +1 -1
- package/dist/default/core/signals/when.js +6 -8
- package/dist/default/core/signals/when.js.map +1 -1
- package/dist/default/core/tasks/delayed-reschedule.js +7 -11
- package/dist/default/core/tasks/delayed-reschedule.js.map +1 -1
- package/dist/default/core/tasks/task.js +59 -82
- package/dist/default/core/tasks/task.js.map +1 -1
- package/dist/default/hls.js +3 -1
- package/dist/default/index.js +2 -3
- package/dist/default/index.js.map +1 -1
- package/dist/default/media/abr/quality-selection.js +3 -7
- package/dist/default/media/abr/quality-selection.js.map +1 -1
- package/dist/default/media/buffer/back-buffer.js +15 -19
- package/dist/default/media/buffer/back-buffer.js.map +1 -1
- package/dist/default/media/buffer/forward-buffer.js +32 -41
- package/dist/default/media/buffer/forward-buffer.js.map +1 -1
- package/dist/default/media/dom/capabilities.js +26 -37
- package/dist/default/media/dom/capabilities.js.map +1 -1
- package/dist/default/media/dom/mse/append-segment.js +3 -5
- package/dist/default/media/dom/mse/append-segment.js.map +1 -1
- package/dist/default/media/dom/mse/buffer-flusher.js +5 -5
- package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -1
- package/dist/default/media/dom/mse/duration.js +23 -31
- package/dist/default/media/dom/mse/duration.js.map +1 -1
- package/dist/default/media/dom/mse/end-of-stream.js +3 -6
- package/dist/default/media/dom/mse/end-of-stream.js.map +1 -1
- package/dist/default/media/dom/mse/mediasource-setup.js +65 -81
- package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -1
- package/dist/default/media/dom/screen.js +37 -54
- package/dist/default/media/dom/screen.js.map +1 -1
- package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -1
- package/dist/default/media/dom/text/text-track-slots.js +15 -23
- package/dist/default/media/dom/text/text-track-slots.js.map +1 -1
- package/dist/default/media/errors.js +25 -34
- package/dist/default/media/errors.js.map +1 -1
- package/dist/default/media/hls/parse-attributes.js +9 -26
- package/dist/default/media/hls/parse-attributes.js.map +1 -1
- package/dist/default/media/hls/parse-media-playlist.js +25 -33
- package/dist/default/media/hls/parse-media-playlist.js.map +1 -1
- package/dist/default/media/hls/parse-multivariant.js +3 -3
- package/dist/default/media/hls/parse-multivariant.js.map +1 -1
- package/dist/default/media/hls/reload-policy.js +19 -27
- package/dist/default/media/hls/reload-policy.js.map +1 -1
- package/dist/default/media/hls/resolve-url.js +1 -3
- package/dist/default/media/hls/resolve-url.js.map +1 -1
- package/dist/default/media/live-window.js +9 -13
- package/dist/default/media/live-window.js.map +1 -1
- package/dist/default/media/media-tracks/media-tracks.js +12 -17
- package/dist/default/media/media-tracks/media-tracks.js.map +1 -1
- package/dist/default/media/mp4/box.js +4 -5
- package/dist/default/media/mp4/box.js.map +1 -1
- package/dist/default/media/mp4/timestamp-origin.js +30 -42
- package/dist/default/media/mp4/timestamp-origin.js.map +1 -1
- package/dist/default/media/primitives/resolution.js +5 -8
- package/dist/default/media/primitives/resolution.js.map +1 -1
- package/dist/default/media/primitives/select-tracks.js +24 -34
- package/dist/default/media/primitives/select-tracks.js.map +1 -1
- package/dist/default/media/text/parse-vtt-timestamp-map.js +6 -8
- package/dist/default/media/text/parse-vtt-timestamp-map.js.map +1 -1
- package/dist/default/media/text/resolve-vtt-metadata.js +8 -9
- package/dist/default/media/text/resolve-vtt-metadata.js.map +1 -1
- package/dist/default/media/types/index.js +10 -18
- package/dist/default/media/types/index.js.map +1 -1
- package/dist/default/media/utils/cdn.js +10 -16
- package/dist/default/media/utils/cdn.js.map +1 -1
- package/dist/default/media/utils/preload.js +4 -6
- package/dist/default/media/utils/preload.js.map +1 -1
- package/dist/default/media/utils/track-selection.js +10 -14
- package/dist/default/media/utils/track-selection.js.map +1 -1
- package/dist/default/media/utils/tracks.js +56 -54
- package/dist/default/media/utils/tracks.js.map +1 -1
- package/dist/default/network/bandwidth-estimator.js +18 -19
- package/dist/default/network/bandwidth-estimator.js.map +1 -1
- package/dist/default/network/chunked-stream-iterable.js +4 -6
- package/dist/default/network/chunked-stream-iterable.js.map +1 -1
- package/dist/default/network/ewma.js +22 -25
- package/dist/default/network/ewma.js.map +1 -1
- package/dist/default/network/fetch.js +30 -37
- package/dist/default/network/fetch.js.map +1 -1
- package/dist/default/playback/actors/dom/segment-loader.js +28 -44
- package/dist/default/playback/actors/dom/segment-loader.js.map +1 -1
- package/dist/default/playback/actors/dom/source-buffer.js.map +1 -1
- package/dist/default/playback/actors/dom/text-tracks.js.map +1 -1
- package/dist/default/playback/actors/text-track-segment-loader.js +24 -35
- package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -1
- package/dist/default/playback/adapters/hls-audio/adapter.js +23 -31
- package/dist/default/playback/adapters/hls-audio/adapter.js.map +1 -1
- package/dist/default/playback/adapters/hls-audio/media.js.map +1 -1
- package/dist/default/playback/adapters/hls-background-video/adapter.js +50 -70
- package/dist/default/playback/adapters/hls-background-video/adapter.js.map +1 -1
- package/dist/default/playback/adapters/hls-background-video/host.js +12 -16
- package/dist/default/playback/adapters/hls-background-video/host.js.map +1 -1
- package/dist/default/playback/adapters/hls-background-video/media.js +5 -8
- package/dist/default/playback/adapters/hls-background-video/media.js.map +1 -1
- package/dist/default/playback/adapters/hls-video/adapter.js +43 -60
- package/dist/default/playback/adapters/hls-video/adapter.js.map +1 -1
- package/dist/default/playback/adapters/hls-video/error-surface.js +13 -18
- package/dist/default/playback/adapters/hls-video/error-surface.js.map +1 -1
- package/dist/default/playback/adapters/hls-video/media-tracks.js +4 -5
- package/dist/default/playback/adapters/hls-video/media-tracks.js.map +1 -1
- package/dist/default/playback/adapters/hls-video/media.js.map +1 -1
- package/dist/default/playback/adapters/mux-audio/media.js +8 -12
- package/dist/default/playback/adapters/mux-audio/media.js.map +1 -1
- package/dist/default/playback/adapters/mux-video/adapter.js +25 -33
- package/dist/default/playback/adapters/mux-video/adapter.js.map +1 -1
- package/dist/default/playback/adapters/mux-video/media.js +7 -9
- package/dist/default/playback/adapters/mux-video/media.js.map +1 -1
- package/dist/default/playback/behaviors/calculate-presentation-duration.js +5 -8
- package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -1
- package/dist/default/playback/behaviors/collect-errors.js +39 -52
- package/dist/default/playback/behaviors/collect-errors.js.map +1 -1
- package/dist/default/playback/behaviors/derive-cdn-priority.js +16 -23
- package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -1
- package/dist/default/playback/behaviors/dom/airplay.js +38 -61
- package/dist/default/playback/behaviors/dom/airplay.js.map +1 -1
- package/dist/default/playback/behaviors/dom/apply-start-position.js +23 -35
- package/dist/default/playback/behaviors/dom/apply-start-position.js.map +1 -1
- package/dist/default/playback/behaviors/dom/end-of-stream.js +11 -16
- package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -1
- package/dist/default/playback/behaviors/dom/load-segments.js +27 -39
- package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -1
- package/dist/default/playback/behaviors/dom/recover-end-stall.js +21 -26
- package/dist/default/playback/behaviors/dom/recover-end-stall.js.map +1 -1
- package/dist/default/playback/behaviors/dom/seek-to-live-edge.js +41 -60
- package/dist/default/playback/behaviors/dom/seek-to-live-edge.js.map +1 -1
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +50 -74
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -1
- package/dist/default/playback/behaviors/dom/setup-mediasource.js +29 -43
- package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -1
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -1
- package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js +3 -4
- package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -1
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js +30 -45
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-current-time.js +9 -11
- package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-load-triggers.js +24 -32
- package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-playback-rate.js +6 -8
- package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-player-resolution.js +10 -14
- package/dist/default/playback/behaviors/dom/track-player-resolution.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-screen-resolution.js +8 -9
- package/dist/default/playback/behaviors/dom/track-screen-resolution.js.map +1 -1
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +28 -43
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -1
- package/dist/default/playback/behaviors/establish-start-media-time.js +32 -42
- package/dist/default/playback/behaviors/establish-start-media-time.js.map +1 -1
- package/dist/default/playback/behaviors/resolve-presentation.js +13 -22
- package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -1
- package/dist/default/playback/behaviors/resolve-track.js +5 -12
- package/dist/default/playback/behaviors/resolve-track.js.map +1 -1
- package/dist/default/playback/behaviors/select-tracks.js +77 -104
- package/dist/default/playback/behaviors/select-tracks.js.map +1 -1
- package/dist/default/playback/behaviors/setup-failover-monitor.js +11 -16
- package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -1
- package/dist/default/playback/behaviors/sync-preload.js +9 -13
- package/dist/default/playback/behaviors/sync-preload.js.map +1 -1
- package/dist/default/playback/behaviors/track-switching.js +189 -173
- package/dist/default/playback/behaviors/track-switching.js.map +1 -1
- package/dist/default/playback/engines/hls/engine-audio-only.js +20 -24
- package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -1
- package/dist/default/playback/engines/hls/engine-background-video.js +22 -27
- package/dist/default/playback/engines/hls/engine-background-video.js.map +1 -1
- package/dist/default/playback/engines/hls/engine.js +22 -25
- package/dist/default/playback/engines/hls/engine.js.map +1 -1
- package/dist/default/playback/primitives/error-messages.js +16 -25
- package/dist/default/playback/primitives/error-messages.js.map +1 -1
- package/dist/default/playback/primitives/failover-fetch.js +9 -14
- package/dist/default/playback/primitives/failover-fetch.js.map +1 -1
- package/dist/default/playback/primitives/head-peek.js +7 -10
- package/dist/default/playback/primitives/head-peek.js.map +1 -1
- package/dist/default/playback/primitives/live-window.js +12 -15
- package/dist/default/playback/primitives/live-window.js.map +1 -1
- package/dist/default/playback/primitives/relocation-pipelines.js +34 -46
- package/dist/default/playback/primitives/relocation-pipelines.js.map +1 -1
- package/dist/default/playback/primitives/report-track-conditions.js +26 -38
- package/dist/default/playback/primitives/report-track-conditions.js.map +1 -1
- package/dist/default/playback/primitives/segment-load-pipeline.js +15 -15
- package/dist/default/playback/primitives/segment-load-pipeline.js.map +1 -1
- package/dist/default/playback/primitives/selection-rules.js +65 -36
- package/dist/default/playback/primitives/selection-rules.js.map +1 -1
- package/dist/default/playback/primitives/text-segment-load-pipeline.js +4 -5
- package/dist/default/playback/primitives/text-segment-load-pipeline.js.map +1 -1
- package/dist/default/playback/primitives/track-types.js +10 -18
- package/dist/default/playback/primitives/track-types.js.map +1 -1
- package/dist/dev/core/actors/actor.d.ts +4 -4
- package/dist/dev/core/actors/actor.d.ts.map +1 -1
- package/dist/dev/core/actors/create-machine-actor.d.ts +38 -47
- package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -1
- package/dist/dev/core/actors/create-machine-actor.js +23 -25
- package/dist/dev/core/actors/create-machine-actor.js.map +1 -1
- package/dist/dev/core/actors/create-transition-actor.d.ts +11 -15
- package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -1
- package/dist/dev/core/actors/create-transition-actor.js +7 -9
- package/dist/dev/core/actors/create-transition-actor.js.map +1 -1
- package/dist/dev/core/composition/create-composition.d.ts +70 -102
- package/dist/dev/core/composition/create-composition.d.ts.map +1 -1
- package/dist/dev/core/composition/create-composition.js +26 -29
- package/dist/dev/core/composition/create-composition.js.map +1 -1
- package/dist/dev/core/composition/share-signals.d.ts +17 -24
- package/dist/dev/core/composition/share-signals.d.ts.map +1 -1
- package/dist/dev/core/composition/share-signals.js +12 -17
- package/dist/dev/core/composition/share-signals.js.map +1 -1
- package/dist/dev/core/machine.d.ts +4 -4
- package/dist/dev/core/machine.js +3 -4
- package/dist/dev/core/machine.js.map +1 -1
- package/dist/dev/core/reactors/create-machine-reactor.d.ts +33 -39
- package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -1
- package/dist/dev/core/reactors/create-machine-reactor.js +20 -19
- package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -1
- package/dist/dev/core/signals/effect.d.ts +3 -4
- package/dist/dev/core/signals/effect.d.ts.map +1 -1
- package/dist/dev/core/signals/effect.js +24 -4
- package/dist/dev/core/signals/effect.js.map +1 -1
- package/dist/dev/core/signals/primitives.d.ts +10 -12
- package/dist/dev/core/signals/primitives.d.ts.map +1 -1
- package/dist/dev/core/signals/primitives.js +10 -14
- package/dist/dev/core/signals/primitives.js.map +1 -1
- package/dist/dev/core/signals/when.js +6 -8
- package/dist/dev/core/signals/when.js.map +1 -1
- package/dist/dev/core/tasks/delayed-reschedule.js +7 -11
- package/dist/dev/core/tasks/delayed-reschedule.js.map +1 -1
- package/dist/dev/core/tasks/task.d.ts +51 -73
- package/dist/dev/core/tasks/task.d.ts.map +1 -1
- package/dist/dev/core/tasks/task.js +59 -82
- package/dist/dev/core/tasks/task.js.map +1 -1
- package/dist/dev/hls.d.ts +3 -1
- package/dist/dev/hls.js +3 -1
- package/dist/dev/index.d.ts +2 -3
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +2 -3
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/media/abr/quality-selection.d.ts +7 -10
- package/dist/dev/media/abr/quality-selection.d.ts.map +1 -1
- package/dist/dev/media/abr/quality-selection.js +3 -7
- package/dist/dev/media/abr/quality-selection.js.map +1 -1
- package/dist/dev/media/buffer/back-buffer.d.ts +2 -7
- package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -1
- package/dist/dev/media/buffer/back-buffer.js +15 -19
- package/dist/dev/media/buffer/back-buffer.js.map +1 -1
- package/dist/dev/media/buffer/forward-buffer.d.ts +2 -7
- package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -1
- package/dist/dev/media/buffer/forward-buffer.js +32 -41
- package/dist/dev/media/buffer/forward-buffer.js.map +1 -1
- package/dist/dev/media/dom/capabilities.js +26 -37
- package/dist/dev/media/dom/capabilities.js.map +1 -1
- package/dist/dev/media/dom/mse/append-segment.d.ts +3 -5
- package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -1
- package/dist/dev/media/dom/mse/append-segment.js +3 -5
- package/dist/dev/media/dom/mse/append-segment.js.map +1 -1
- package/dist/dev/media/dom/mse/buffer-flusher.d.ts +5 -5
- package/dist/dev/media/dom/mse/buffer-flusher.js +5 -5
- package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -1
- package/dist/dev/media/dom/mse/duration.js +23 -31
- package/dist/dev/media/dom/mse/duration.js.map +1 -1
- package/dist/dev/media/dom/mse/end-of-stream.js +3 -6
- package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -1
- package/dist/dev/media/dom/mse/mediasource-setup.js +65 -81
- package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -1
- package/dist/dev/media/dom/screen.d.ts.map +1 -1
- package/dist/dev/media/dom/screen.js +37 -54
- package/dist/dev/media/dom/screen.js.map +1 -1
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -1
- package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -1
- package/dist/dev/media/dom/text/text-track-slots.d.ts +10 -16
- package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -1
- package/dist/dev/media/dom/text/text-track-slots.js +15 -23
- package/dist/dev/media/dom/text/text-track-slots.js.map +1 -1
- package/dist/dev/media/errors.d.ts +32 -46
- package/dist/dev/media/errors.d.ts.map +1 -1
- package/dist/dev/media/errors.js +25 -34
- package/dist/dev/media/errors.js.map +1 -1
- package/dist/dev/media/hls/parse-attributes.js +9 -26
- package/dist/dev/media/hls/parse-attributes.js.map +1 -1
- package/dist/dev/media/hls/parse-media-playlist.js +25 -33
- package/dist/dev/media/hls/parse-media-playlist.js.map +1 -1
- package/dist/dev/media/hls/parse-multivariant.js +3 -3
- package/dist/dev/media/hls/parse-multivariant.js.map +1 -1
- package/dist/dev/media/hls/reload-policy.js +19 -27
- package/dist/dev/media/hls/reload-policy.js.map +1 -1
- package/dist/dev/media/hls/resolve-url.js +1 -3
- package/dist/dev/media/hls/resolve-url.js.map +1 -1
- package/dist/dev/media/live-window.js +9 -13
- package/dist/dev/media/live-window.js.map +1 -1
- package/dist/dev/media/media-tracks/media-tracks.d.ts +8 -13
- package/dist/dev/media/media-tracks/media-tracks.d.ts.map +1 -1
- package/dist/dev/media/media-tracks/media-tracks.js +12 -17
- package/dist/dev/media/media-tracks/media-tracks.js.map +1 -1
- package/dist/dev/media/mp4/box.js +4 -5
- package/dist/dev/media/mp4/box.js.map +1 -1
- package/dist/dev/media/mp4/timestamp-origin.js +30 -42
- package/dist/dev/media/mp4/timestamp-origin.js.map +1 -1
- package/dist/dev/media/primitives/resolution.d.ts +6 -8
- package/dist/dev/media/primitives/resolution.d.ts.map +1 -1
- package/dist/dev/media/primitives/resolution.js +5 -8
- package/dist/dev/media/primitives/resolution.js.map +1 -1
- package/dist/dev/media/primitives/select-tracks.js +24 -34
- package/dist/dev/media/primitives/select-tracks.js.map +1 -1
- package/dist/dev/media/text/parse-vtt-timestamp-map.js +6 -8
- package/dist/dev/media/text/parse-vtt-timestamp-map.js.map +1 -1
- package/dist/dev/media/text/resolve-vtt-metadata.js +8 -9
- package/dist/dev/media/text/resolve-vtt-metadata.js.map +1 -1
- package/dist/dev/media/types/index.d.ts +106 -177
- package/dist/dev/media/types/index.d.ts.map +1 -1
- package/dist/dev/media/types/index.js +10 -18
- package/dist/dev/media/types/index.js.map +1 -1
- package/dist/dev/media/utils/cdn.d.ts +4 -6
- package/dist/dev/media/utils/cdn.d.ts.map +1 -1
- package/dist/dev/media/utils/cdn.js +10 -16
- package/dist/dev/media/utils/cdn.js.map +1 -1
- package/dist/dev/media/utils/preload.js +4 -6
- package/dist/dev/media/utils/preload.js.map +1 -1
- package/dist/dev/media/utils/track-selection.js +10 -14
- package/dist/dev/media/utils/track-selection.js.map +1 -1
- package/dist/dev/media/utils/tracks.js +56 -54
- package/dist/dev/media/utils/tracks.js.map +1 -1
- package/dist/dev/network/bandwidth-estimator.d.ts +7 -9
- package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -1
- package/dist/dev/network/bandwidth-estimator.js +18 -19
- package/dist/dev/network/bandwidth-estimator.js.map +1 -1
- package/dist/dev/network/chunked-stream-iterable.js +4 -6
- package/dist/dev/network/chunked-stream-iterable.js.map +1 -1
- package/dist/dev/network/ewma.js +22 -25
- package/dist/dev/network/ewma.js.map +1 -1
- package/dist/dev/network/fetch.js +30 -37
- package/dist/dev/network/fetch.js.map +1 -1
- package/dist/dev/playback/actors/dom/segment-loader.d.ts +7 -11
- package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -1
- package/dist/dev/playback/actors/dom/segment-loader.js +28 -44
- package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -1
- package/dist/dev/playback/actors/dom/source-buffer.d.ts +5 -7
- package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -1
- package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -1
- package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -1
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts +10 -16
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -1
- package/dist/dev/playback/actors/text-track-segment-loader.js +24 -35
- package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -1
- package/dist/dev/playback/actors/text-tracks.d.ts +5 -8
- package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-audio/adapter.d.ts +11 -14
- package/dist/dev/playback/adapters/hls-audio/adapter.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-audio/adapter.js +23 -31
- package/dist/dev/playback/adapters/hls-audio/adapter.js.map +1 -1
- package/dist/dev/playback/adapters/hls-audio/media.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-audio/media.js.map +1 -1
- package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts +28 -39
- package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-background-video/adapter.js +50 -70
- package/dist/dev/playback/adapters/hls-background-video/adapter.js.map +1 -1
- package/dist/dev/playback/adapters/hls-background-video/host.d.ts +12 -16
- package/dist/dev/playback/adapters/hls-background-video/host.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-background-video/host.js +12 -16
- package/dist/dev/playback/adapters/hls-background-video/host.js.map +1 -1
- package/dist/dev/playback/adapters/hls-background-video/media.d.ts +5 -8
- package/dist/dev/playback/adapters/hls-background-video/media.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-background-video/media.js +5 -8
- package/dist/dev/playback/adapters/hls-background-video/media.js.map +1 -1
- package/dist/dev/playback/adapters/hls-video/adapter.d.ts +12 -14
- package/dist/dev/playback/adapters/hls-video/adapter.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-video/adapter.js +43 -60
- package/dist/dev/playback/adapters/hls-video/adapter.js.map +1 -1
- package/dist/dev/playback/adapters/hls-video/error-surface.d.ts +4 -5
- package/dist/dev/playback/adapters/hls-video/error-surface.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-video/error-surface.js +13 -18
- package/dist/dev/playback/adapters/hls-video/error-surface.js.map +1 -1
- package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts +4 -5
- package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-video/media-tracks.js +4 -5
- package/dist/dev/playback/adapters/hls-video/media-tracks.js.map +1 -1
- package/dist/dev/playback/adapters/hls-video/media.d.ts.map +1 -1
- package/dist/dev/playback/adapters/hls-video/media.js.map +1 -1
- package/dist/dev/playback/adapters/mux-audio/media.d.ts +8 -12
- package/dist/dev/playback/adapters/mux-audio/media.d.ts.map +1 -1
- package/dist/dev/playback/adapters/mux-audio/media.js +8 -12
- package/dist/dev/playback/adapters/mux-audio/media.js.map +1 -1
- package/dist/dev/playback/adapters/mux-video/adapter.d.ts +9 -11
- package/dist/dev/playback/adapters/mux-video/adapter.d.ts.map +1 -1
- package/dist/dev/playback/adapters/mux-video/adapter.js +25 -33
- package/dist/dev/playback/adapters/mux-video/adapter.js.map +1 -1
- package/dist/dev/playback/adapters/mux-video/media.d.ts +7 -9
- package/dist/dev/playback/adapters/mux-video/media.d.ts.map +1 -1
- package/dist/dev/playback/adapters/mux-video/media.js +7 -9
- package/dist/dev/playback/adapters/mux-video/media.js.map +1 -1
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +5 -8
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js +5 -8
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -1
- package/dist/dev/playback/behaviors/collect-errors.d.ts +2 -0
- package/dist/dev/playback/behaviors/collect-errors.js +39 -52
- package/dist/dev/playback/behaviors/collect-errors.js.map +1 -1
- package/dist/dev/playback/behaviors/derive-cdn-priority.js +16 -23
- package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/airplay.js +38 -61
- package/dist/dev/playback/behaviors/dom/airplay.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/apply-start-position.js +23 -35
- package/dist/dev/playback/behaviors/dom/apply-start-position.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/end-of-stream.js +11 -16
- package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts +5 -8
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/load-segments.js +27 -39
- package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/recover-end-stall.js +21 -26
- package/dist/dev/playback/behaviors/dom/recover-end-stall.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js +41 -60
- package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +50 -74
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js +29 -43
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +3 -3
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js +3 -4
- package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +30 -45
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +2 -2
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-current-time.js +9 -11
- package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +6 -12
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js +24 -32
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +2 -2
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js +6 -8
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-player-resolution.js +10 -14
- package/dist/dev/playback/behaviors/dom/track-player-resolution.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-screen-resolution.js +8 -9
- package/dist/dev/playback/behaviors/dom/track-screen-resolution.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +28 -43
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -1
- package/dist/dev/playback/behaviors/establish-start-media-time.d.ts +15 -19
- package/dist/dev/playback/behaviors/establish-start-media-time.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/establish-start-media-time.js +32 -42
- package/dist/dev/playback/behaviors/establish-start-media-time.js.map +1 -1
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/resolve-presentation.js +13 -22
- package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -1
- package/dist/dev/playback/behaviors/resolve-track.js +5 -12
- package/dist/dev/playback/behaviors/resolve-track.js.map +1 -1
- package/dist/dev/playback/behaviors/select-tracks.d.ts +28 -39
- package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/select-tracks.js +77 -104
- package/dist/dev/playback/behaviors/select-tracks.js.map +1 -1
- package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +1 -4
- package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/setup-failover-monitor.js +11 -16
- package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -1
- package/dist/dev/playback/behaviors/sync-preload.js +9 -13
- package/dist/dev/playback/behaviors/sync-preload.js.map +1 -1
- package/dist/dev/playback/behaviors/track-switching.d.ts +110 -0
- package/dist/dev/playback/behaviors/track-switching.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/track-switching.js +189 -173
- package/dist/dev/playback/behaviors/track-switching.js.map +1 -1
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +59 -72
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -1
- package/dist/dev/playback/engines/hls/engine-audio-only.js +20 -24
- package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -1
- package/dist/dev/playback/engines/hls/engine-background-video.d.ts +51 -78
- package/dist/dev/playback/engines/hls/engine-background-video.d.ts.map +1 -1
- package/dist/dev/playback/engines/hls/engine-background-video.js +22 -27
- package/dist/dev/playback/engines/hls/engine-background-video.js.map +1 -1
- package/dist/dev/playback/engines/hls/engine.d.ts +115 -155
- package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -1
- package/dist/dev/playback/engines/hls/engine.js +22 -25
- package/dist/dev/playback/engines/hls/engine.js.map +1 -1
- package/dist/dev/playback/primitives/derive-start-media-time.d.ts +3 -3
- package/dist/dev/playback/primitives/derive-start-media-time.d.ts.map +1 -1
- package/dist/dev/playback/primitives/error-messages.js +16 -25
- package/dist/dev/playback/primitives/error-messages.js.map +1 -1
- package/dist/dev/playback/primitives/failover-fetch.js +9 -14
- package/dist/dev/playback/primitives/failover-fetch.js.map +1 -1
- package/dist/dev/playback/primitives/head-peek.js +7 -10
- package/dist/dev/playback/primitives/head-peek.js.map +1 -1
- package/dist/dev/playback/primitives/live-window.js +12 -15
- package/dist/dev/playback/primitives/live-window.js.map +1 -1
- package/dist/dev/playback/primitives/relocation-pipelines.js +34 -46
- package/dist/dev/playback/primitives/relocation-pipelines.js.map +1 -1
- package/dist/dev/playback/primitives/report-track-conditions.d.ts +1 -4
- package/dist/dev/playback/primitives/report-track-conditions.d.ts.map +1 -1
- package/dist/dev/playback/primitives/report-track-conditions.js +26 -38
- package/dist/dev/playback/primitives/report-track-conditions.js.map +1 -1
- package/dist/dev/playback/primitives/segment-load-pipeline.js +15 -15
- package/dist/dev/playback/primitives/segment-load-pipeline.js.map +1 -1
- package/dist/dev/playback/primitives/selection-rules.d.ts +45 -17
- package/dist/dev/playback/primitives/selection-rules.d.ts.map +1 -1
- package/dist/dev/playback/primitives/selection-rules.js +65 -36
- package/dist/dev/playback/primitives/selection-rules.js.map +1 -1
- package/dist/dev/playback/primitives/source-buffer-messages.d.ts +6 -9
- package/dist/dev/playback/primitives/source-buffer-messages.d.ts.map +1 -1
- package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts +20 -29
- package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts.map +1 -1
- package/dist/dev/playback/primitives/text-segment-load-pipeline.js +4 -5
- package/dist/dev/playback/primitives/text-segment-load-pipeline.js.map +1 -1
- package/dist/dev/playback/primitives/text-track-messages.d.ts.map +1 -1
- package/dist/dev/playback/primitives/track-types.js +10 -18
- package/dist/dev/playback/primitives/track-types.js.map +1 -1
- package/package.json +25 -28
|
@@ -2,15 +2,15 @@ import { ReadonlySignal } from "./signals/primitives.js";
|
|
|
2
2
|
import "../index.js";
|
|
3
3
|
//#region src/core/machine.d.ts
|
|
4
4
|
/**
|
|
5
|
-
* Base snapshot for all machine-like primitives (Actors and Reactors).
|
|
6
|
-
*
|
|
5
|
+
* Base snapshot for all machine-like primitives (Actors and Reactors). Carries only the finite state value. Actors
|
|
6
|
+
* extend this with `context`.
|
|
7
7
|
*/
|
|
8
8
|
interface MachineSnapshot<State extends string> {
|
|
9
9
|
value: State;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Shared interface for all machine-like primitives.
|
|
13
|
-
*
|
|
12
|
+
* Shared interface for all machine-like primitives. Both Actors (message-driven) and Reactors (signal-driven) implement
|
|
13
|
+
* this.
|
|
14
14
|
*/
|
|
15
15
|
interface Machine<Snapshot extends MachineSnapshot<string>> {
|
|
16
16
|
readonly snapshot: ReadonlySignal<Snapshot>;
|
package/dist/dev/core/machine.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { signal, untrack, update } from "./signals/primitives.js";
|
|
2
2
|
//#region src/core/machine.ts
|
|
3
3
|
/**
|
|
4
|
-
* Provisions the shared mechanics for all machine-like primitives: a snapshot
|
|
5
|
-
*
|
|
4
|
+
* Provisions the shared mechanics for all machine-like primitives: a snapshot signal, an untracked state reader, and a
|
|
5
|
+
* transition function.
|
|
6
6
|
*
|
|
7
|
-
* Internal — consumed by `createMachineActor` and `createMachineReactor`. Not part of the
|
|
8
|
-
* public API.
|
|
7
|
+
* Internal — consumed by `createMachineActor` and `createMachineReactor`. Not part of the public API.
|
|
9
8
|
*/
|
|
10
9
|
function createMachineCore(initialSnapshot) {
|
|
11
10
|
const snapshotSignal = signal(initialSnapshot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine.js","names":[],"sources":["../../../src/core/machine.ts"],"sourcesContent":["import type { ReadonlySignal } from './signals/primitives';\nimport { signal, untrack, update } from './signals/primitives';\n\n// =============================================================================\n// Shared snapshot type\n// =============================================================================\n\n/**\n * Base snapshot for all machine-like primitives (Actors and Reactors)
|
|
1
|
+
{"version":3,"file":"machine.js","names":[],"sources":["../../../src/core/machine.ts"],"sourcesContent":["import type { ReadonlySignal } from './signals/primitives';\nimport { signal, untrack, update } from './signals/primitives';\n\n// =============================================================================\n// Shared snapshot type\n// =============================================================================\n\n/**\n * Base snapshot for all machine-like primitives (Actors and Reactors). Carries only the finite state value. Actors\n * extend this with `context`.\n */\nexport interface MachineSnapshot<State extends string> {\n value: State;\n}\n\n// =============================================================================\n// Shared interface\n// =============================================================================\n\n/**\n * Shared interface for all machine-like primitives. Both Actors (message-driven) and Reactors (signal-driven) implement\n * this.\n */\nexport interface Machine<Snapshot extends MachineSnapshot<string>> {\n readonly snapshot: ReadonlySignal<Snapshot>;\n destroy(): void;\n}\n\n// =============================================================================\n// Shared core factory\n// =============================================================================\n\n/**\n * Provisions the shared mechanics for all machine-like primitives: a snapshot signal, an untracked state reader, and a\n * transition function.\n *\n * Internal — consumed by `createMachineActor` and `createMachineReactor`. Not part of the public API.\n */\nexport function createMachineCore<FullState extends string, Snapshot extends MachineSnapshot<FullState>>(\n initialSnapshot: Snapshot\n) {\n const snapshotSignal = signal(initialSnapshot);\n const getState = (): FullState => untrack(() => snapshotSignal.get().value);\n const transition = (to: FullState): void => update(snapshotSignal, (current) => ({ ...current, value: to }));\n\n return { snapshotSignal, getState, transition };\n}\n"],"mappings":";;;;;;;;AAsCA,SAAgB,kBACd,iBACA;CACA,MAAM,iBAAiB,OAAO,eAAe;CAC7C,MAAM,iBAA4B,cAAc,eAAe,IAAI,CAAC,CAAC,KAAK;CAC1E,MAAM,cAAc,OAAwB,OAAO,iBAAiB,aAAa;EAAE,GAAG;EAAS,OAAO;CAAG,EAAE;CAE3G,OAAO;EAAE;EAAgB;EAAU;CAAW;AAChD"}
|
|
@@ -3,17 +3,15 @@ import { Machine, MachineSnapshot } from "../machine.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* A reactive state-deriving function used in the `monitor` field.
|
|
5
5
|
*
|
|
6
|
-
* Returns the target state the reactor should be in. Any signals read inside
|
|
7
|
-
* the
|
|
8
|
-
* those signals change and automatically calls `transition()` when the returned
|
|
6
|
+
* Returns the target state the reactor should be in. Any signals read inside the fn body create reactive dependencies —
|
|
7
|
+
* the framework re-evaluates it when those signals change and automatically calls `transition()` when the returned
|
|
9
8
|
* state differs from the current one.
|
|
10
9
|
*/
|
|
11
10
|
type ReactorDeriveFn<State extends string> = () => State;
|
|
12
11
|
/**
|
|
13
12
|
* An effect function used in reactor `entry` and `effects` blocks.
|
|
14
13
|
*
|
|
15
|
-
* May return a cleanup function that runs before each re-evaluation and on
|
|
16
|
-
* state exit (including destroy).
|
|
14
|
+
* May return a cleanup function that runs before each re-evaluation and on state exit (including destroy).
|
|
17
15
|
*/
|
|
18
16
|
type ReactorEffectFn = () => (() => void) | {
|
|
19
17
|
abort(): void;
|
|
@@ -21,12 +19,10 @@ type ReactorEffectFn = () => (() => void) | {
|
|
|
21
19
|
/**
|
|
22
20
|
* Per-state effect grouping for a single reactor state.
|
|
23
21
|
*
|
|
24
|
-
* - `entry` effects run once on state entry. The fn body is automatically
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* the fn body changes. Use `untrack()` for reads you do not want to track.
|
|
29
|
-
* Use this for work that must stay in sync with reactive state.
|
|
22
|
+
* - `entry` effects run once on state entry. The fn body is automatically untracked — no `untrack()` calls are needed
|
|
23
|
+
* inside. Use this for one-time setup: reading current values, attaching event listeners, etc.
|
|
24
|
+
* - `effects` run on state entry and re-run whenever a signal read inside the fn body changes. Use `untrack()` for reads
|
|
25
|
+
* you do not want to track. Use this for work that must stay in sync with reactive state.
|
|
30
26
|
*
|
|
31
27
|
* Both are optional; pass `{}` for states with no effects.
|
|
32
28
|
*/
|
|
@@ -37,23 +33,20 @@ type ReactorStateDefinition = {
|
|
|
37
33
|
/**
|
|
38
34
|
* Full reactor definition passed to `createMachineReactor`.
|
|
39
35
|
*
|
|
40
|
-
* `State` is the set of domain-meaningful states. `'destroying'` and
|
|
41
|
-
*
|
|
42
|
-
* do not include them here.
|
|
36
|
+
* `State` is the set of domain-meaningful states. `'destroying'` and `'destroyed'` are always added by the framework as
|
|
37
|
+
* implicit terminal states — do not include them here.
|
|
43
38
|
*/
|
|
44
39
|
type ReactorDefinition<State extends string> = {
|
|
45
40
|
/** Initial state. */
|
|
46
41
|
initial: State;
|
|
47
42
|
/**
|
|
48
|
-
* Reactive state derivation. Registered before per-state effects — the
|
|
49
|
-
*
|
|
50
|
-
* per-state effects re-evaluate in the same flush.
|
|
43
|
+
* Reactive state derivation. Registered before per-state effects — the ordering guarantee ensures transitions fired
|
|
44
|
+
* here take effect before per-state effects re-evaluate in the same flush.
|
|
51
45
|
*/
|
|
52
46
|
monitor?: ReactorDeriveFn<State> | ReactorDeriveFn<State>[];
|
|
53
47
|
/**
|
|
54
|
-
* Per-state effect groupings. Every valid state must be declared — pass `{}`
|
|
55
|
-
*
|
|
56
|
-
* `effect()` calls gated on that state, with their own cleanup lifecycles.
|
|
48
|
+
* Per-state effect groupings. Every valid state must be declared — pass `{}` for states with no effects. `entry` and
|
|
49
|
+
* `effects` each become independent `effect()` calls gated on that state, with their own cleanup lifecycles.
|
|
57
50
|
*/
|
|
58
51
|
states: Record<State, ReactorStateDefinition>;
|
|
59
52
|
};
|
|
@@ -62,30 +55,31 @@ type Reactor<State extends string> = Machine<MachineSnapshot<State>>;
|
|
|
62
55
|
/**
|
|
63
56
|
* Creates a reactive Reactor from a declarative definition.
|
|
64
57
|
*
|
|
65
|
-
* A Reactor is driven by subscriptions to external signals rather than
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* with its own dependency tracking and cleanup lifecycle.
|
|
58
|
+
* A Reactor is driven by subscriptions to external signals rather than imperative messages. Each state holds an array
|
|
59
|
+
* of effect functions — every element becomes one independent `effect()` call gated on that state, with its own
|
|
60
|
+
* dependency tracking and cleanup lifecycle.
|
|
69
61
|
*
|
|
70
|
-
* `'destroying'` and `'destroyed'` are always implicit terminal states.
|
|
71
|
-
* `
|
|
72
|
-
* potential async teardown in a future extension), then immediately `'destroyed'`
|
|
62
|
+
* `'destroying'` and `'destroyed'` are always implicit terminal states. `destroy()` transitions through both in
|
|
63
|
+
* sequence: `'destroying'` first (for potential async teardown in a future extension), then immediately `'destroyed'`
|
|
73
64
|
* for the synchronous base case. Active effect cleanups fire via disposal.
|
|
74
65
|
*
|
|
75
66
|
* @example
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
67
|
+
* const reactor = createMachineReactor({
|
|
68
|
+
* initial: 'waiting',
|
|
69
|
+
* monitor: () => (srcSignal.get() ? 'active' : 'waiting'),
|
|
70
|
+
* states: {
|
|
71
|
+
* active: {
|
|
72
|
+
* // entry: runs once on state entry; fn body is automatically untracked.
|
|
73
|
+
* entry: () => listen(el, 'play', handler),
|
|
74
|
+
* // effects: re-runs whenever tracked signals change.
|
|
75
|
+
* effects: () => {
|
|
76
|
+
* currentTimeSignal.get();
|
|
77
|
+
* return cleanup;
|
|
78
|
+
* },
|
|
79
|
+
* },
|
|
80
|
+
* waiting: {},
|
|
85
81
|
* },
|
|
86
|
-
*
|
|
87
|
-
* }
|
|
88
|
-
* });
|
|
82
|
+
* });
|
|
89
83
|
*/
|
|
90
84
|
declare function createMachineReactor<State extends string>(def: ReactorDefinition<State>): Reactor<State | 'destroying' | 'destroyed'>;
|
|
91
85
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-machine-reactor.d.ts","names":[],"sources":["../../../../src/core/reactors/create-machine-reactor.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-machine-reactor.d.ts","names":[],"sources":["../../../../src/core/reactors/create-machine-reactor.ts"],"mappings":";;;;;;;;;KAgBY,gBAAgB,8BAA8B;;;;;;KAO9C;EAAyC;;;;;;;;;;;;KAYzC;EACV,QAAQ,kBAAkB;EAC1B,UAAU,kBAAkB;;;;;;;;KASlB,kBAAkB;;EAE5B,SAAS;;;;;EAKT,UAAU,gBAAgB,SAAS,gBAAgB;;;;;EAKnD,QAAQ,OAAO,OAAO;;;KAQZ,QAAQ,wBAAwB,QAAQ,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyCpD,qBAAqB,sBACnC,KAAK,kBAAkB,SACtB,QAAQ"}
|
|
@@ -6,30 +6,31 @@ const toArray = (x) => x === void 0 ? [] : Array.isArray(x) ? x : [x];
|
|
|
6
6
|
/**
|
|
7
7
|
* Creates a reactive Reactor from a declarative definition.
|
|
8
8
|
*
|
|
9
|
-
* A Reactor is driven by subscriptions to external signals rather than
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* with its own dependency tracking and cleanup lifecycle.
|
|
9
|
+
* A Reactor is driven by subscriptions to external signals rather than imperative messages. Each state holds an array
|
|
10
|
+
* of effect functions — every element becomes one independent `effect()` call gated on that state, with its own
|
|
11
|
+
* dependency tracking and cleanup lifecycle.
|
|
13
12
|
*
|
|
14
|
-
* `'destroying'` and `'destroyed'` are always implicit terminal states.
|
|
15
|
-
* `
|
|
16
|
-
* potential async teardown in a future extension), then immediately `'destroyed'`
|
|
13
|
+
* `'destroying'` and `'destroyed'` are always implicit terminal states. `destroy()` transitions through both in
|
|
14
|
+
* sequence: `'destroying'` first (for potential async teardown in a future extension), then immediately `'destroyed'`
|
|
17
15
|
* for the synchronous base case. Active effect cleanups fire via disposal.
|
|
18
16
|
*
|
|
19
17
|
* @example
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
18
|
+
* const reactor = createMachineReactor({
|
|
19
|
+
* initial: 'waiting',
|
|
20
|
+
* monitor: () => (srcSignal.get() ? 'active' : 'waiting'),
|
|
21
|
+
* states: {
|
|
22
|
+
* active: {
|
|
23
|
+
* // entry: runs once on state entry; fn body is automatically untracked.
|
|
24
|
+
* entry: () => listen(el, 'play', handler),
|
|
25
|
+
* // effects: re-runs whenever tracked signals change.
|
|
26
|
+
* effects: () => {
|
|
27
|
+
* currentTimeSignal.get();
|
|
28
|
+
* return cleanup;
|
|
29
|
+
* },
|
|
30
|
+
* },
|
|
31
|
+
* waiting: {},
|
|
29
32
|
* },
|
|
30
|
-
*
|
|
31
|
-
* }
|
|
32
|
-
* });
|
|
33
|
+
* });
|
|
33
34
|
*/
|
|
34
35
|
function createMachineReactor(def) {
|
|
35
36
|
const { snapshotSignal, getState, transition } = createMachineCore({ value: def.initial });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-machine-reactor.js","names":[],"sources":["../../../../src/core/reactors/create-machine-reactor.ts"],"sourcesContent":["import type { Machine, MachineSnapshot } from '../machine';\nimport { createMachineCore } from '../machine';\nimport { effect } from '../signals/effect';\nimport { untrack } from '../signals/primitives';\n\n// =============================================================================\n// Definition types\n// =============================================================================\n\n/**\n * A reactive state-deriving function used in the `monitor` field.\n *\n * Returns the target state the reactor should be in. Any signals read inside
|
|
1
|
+
{"version":3,"file":"create-machine-reactor.js","names":[],"sources":["../../../../src/core/reactors/create-machine-reactor.ts"],"sourcesContent":["import type { Machine, MachineSnapshot } from '../machine';\nimport { createMachineCore } from '../machine';\nimport { effect } from '../signals/effect';\nimport { untrack } from '../signals/primitives';\n\n// =============================================================================\n// Definition types\n// =============================================================================\n\n/**\n * A reactive state-deriving function used in the `monitor` field.\n *\n * Returns the target state the reactor should be in. Any signals read inside the fn body create reactive dependencies —\n * the framework re-evaluates it when those signals change and automatically calls `transition()` when the returned\n * state differs from the current one.\n */\nexport type ReactorDeriveFn<State extends string> = () => State;\n\n/**\n * An effect function used in reactor `entry` and `effects` blocks.\n *\n * May return a cleanup function that runs before each re-evaluation and on state exit (including destroy).\n */\nexport type ReactorEffectFn = () => (() => void) | { abort(): void } | void;\n\n/**\n * Per-state effect grouping for a single reactor state.\n *\n * - `entry` effects run once on state entry. The fn body is automatically untracked — no `untrack()` calls are needed\n * inside. Use this for one-time setup: reading current values, attaching event listeners, etc.\n * - `effects` run on state entry and re-run whenever a signal read inside the fn body changes. Use `untrack()` for reads\n * you do not want to track. Use this for work that must stay in sync with reactive state.\n *\n * Both are optional; pass `{}` for states with no effects.\n */\nexport type ReactorStateDefinition = {\n entry?: ReactorEffectFn | ReactorEffectFn[];\n effects?: ReactorEffectFn | ReactorEffectFn[];\n};\n\n/**\n * Full reactor definition passed to `createMachineReactor`.\n *\n * `State` is the set of domain-meaningful states. `'destroying'` and `'destroyed'` are always added by the framework as\n * implicit terminal states — do not include them here.\n */\nexport type ReactorDefinition<State extends string> = {\n /** Initial state. */\n initial: State;\n /**\n * Reactive state derivation. Registered before per-state effects — the ordering guarantee ensures transitions fired\n * here take effect before per-state effects re-evaluate in the same flush.\n */\n monitor?: ReactorDeriveFn<State> | ReactorDeriveFn<State>[];\n /**\n * Per-state effect groupings. Every valid state must be declared — pass `{}` for states with no effects. `entry` and\n * `effects` each become independent `effect()` calls gated on that state, with their own cleanup lifecycles.\n */\n states: Record<State, ReactorStateDefinition>;\n};\n\n// =============================================================================\n// Live reactor interface\n// =============================================================================\n\n/** Live reactor instance returned by `createMachineReactor`. */\nexport type Reactor<State extends string> = Machine<MachineSnapshot<State>>;\n\n// =============================================================================\n// Implementation helpers\n// =============================================================================\n\nconst toArray = <T>(x: T | T[] | undefined): T[] => (x === undefined ? [] : Array.isArray(x) ? x : [x]);\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Creates a reactive Reactor from a declarative definition.\n *\n * A Reactor is driven by subscriptions to external signals rather than imperative messages. Each state holds an array\n * of effect functions — every element becomes one independent `effect()` call gated on that state, with its own\n * dependency tracking and cleanup lifecycle.\n *\n * `'destroying'` and `'destroyed'` are always implicit terminal states. `destroy()` transitions through both in\n * sequence: `'destroying'` first (for potential async teardown in a future extension), then immediately `'destroyed'`\n * for the synchronous base case. Active effect cleanups fire via disposal.\n *\n * @example\n * const reactor = createMachineReactor({\n * initial: 'waiting',\n * monitor: () => (srcSignal.get() ? 'active' : 'waiting'),\n * states: {\n * active: {\n * // entry: runs once on state entry; fn body is automatically untracked.\n * entry: () => listen(el, 'play', handler),\n * // effects: re-runs whenever tracked signals change.\n * effects: () => {\n * currentTimeSignal.get();\n * return cleanup;\n * },\n * },\n * waiting: {},\n * },\n * });\n */\nexport function createMachineReactor<State extends string>(\n def: ReactorDefinition<State>\n): Reactor<State | 'destroying' | 'destroyed'> {\n type FullState = State | 'destroying' | 'destroyed';\n\n const { snapshotSignal, getState, transition } = createMachineCore<FullState, MachineSnapshot<FullState>>({\n value: def.initial as FullState,\n });\n\n const effectDisposals: Array<() => void> = [];\n\n const wrapResult = (result: ReturnType<ReactorEffectFn>) => {\n if (!result) return undefined;\n\n if (typeof result === 'function') return result;\n\n return () => result.abort();\n };\n\n type EffectCall = () => ReturnType<ReactorEffectFn>;\n\n type EffectDescriptor = {\n fn: ReactorEffectFn;\n shouldSkip: (snapshot: { value: FullState }) => boolean;\n toFnCall?: (baseCall: EffectCall) => EffectCall;\n };\n\n const untracked: EffectDescriptor['toFnCall'] = (baseCall) => () => untrack(baseCall);\n\n const isTerminal = (snapshot: { value: FullState }) =>\n snapshot.value === 'destroying' || snapshot.value === 'destroyed';\n\n // `monitor` descriptors are built first — the ordering guarantee ensures\n // transitions they trigger take effect before per-state effects re-evaluate\n // in the same flush. See the comment on effect registration order in the\n // previous implementation for full details.\n const descriptors: EffectDescriptor[] = [\n ...toArray(def.monitor).map((fn) => ({\n fn: () => {\n const target = fn();\n\n if (target !== (getState() as State)) transition(target as FullState);\n },\n shouldSkip: isTerminal,\n })),\n ...(Object.entries(def.states) as Array<[State, ReactorStateDefinition]>).flatMap(([state, stateDef]) => {\n const isNotState = (snapshot: { value: FullState }) => snapshot.value !== state;\n\n return [\n ...toArray(stateDef.entry).map((fn) => ({ fn, shouldSkip: isNotState, toFnCall: untracked })),\n ...toArray(stateDef.effects).map((fn) => ({ fn, shouldSkip: isNotState })),\n ];\n }),\n ];\n\n const toEffect = ({ fn, shouldSkip, toFnCall = (baseCall) => baseCall }: EffectDescriptor) =>\n effect(() => {\n const snapshot = snapshotSignal.get();\n if (shouldSkip(snapshot)) return;\n\n const baseCall = () => fn();\n\n return wrapResult(toFnCall(baseCall)());\n });\n\n effectDisposals.push(...descriptors.map(toEffect));\n\n return {\n get snapshot() {\n return snapshotSignal;\n },\n\n destroy(): void {\n const state = getState();\n if (state === 'destroying' || state === 'destroyed') return;\n\n // Two-step teardown: transition through 'destroying' first to leave room\n // for async teardown in a future extension, then immediately 'destroyed'\n // for the synchronous base case. Active effect cleanups fire via disposal.\n transition('destroying');\n transition('destroyed');\n\n for (const dispose of effectDisposals) dispose();\n },\n };\n}\n"],"mappings":";;;;AAwEA,MAAM,WAAc,MAAiC,MAAM,KAAA,IAAY,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCrG,SAAgB,qBACd,KAC6C;CAG7C,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAAyD,EACxG,OAAO,IAAI,QACb,CAAC;CAED,MAAM,kBAAqC,CAAC;CAE5C,MAAM,cAAc,WAAwC;EAC1D,IAAI,CAAC,QAAQ,OAAO,KAAA;EAEpB,IAAI,OAAO,WAAW,YAAY,OAAO;EAEzC,aAAa,OAAO,MAAM;CAC5B;CAUA,MAAM,aAA2C,mBAAmB,QAAQ,QAAQ;CAEpF,MAAM,cAAc,aAClB,SAAS,UAAU,gBAAgB,SAAS,UAAU;CAMxD,MAAM,cAAkC,CACtC,GAAG,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,QAAQ;EACnC,UAAU;GACR,MAAM,SAAS,GAAG;GAElB,IAAI,WAAY,SAAS,GAAa,WAAW,MAAmB;EACtE;EACA,YAAY;CACd,EAAE,GACF,GAAI,OAAO,QAAQ,IAAI,MAAM,CAAC,CAA4C,SAAS,CAAC,OAAO,cAAc;EACvG,MAAM,cAAc,aAAmC,SAAS,UAAU;EAE1E,OAAO,CACL,GAAG,QAAQ,SAAS,KAAK,CAAC,CAAC,KAAK,QAAQ;GAAE;GAAI,YAAY;GAAY,UAAU;EAAU,EAAE,GAC5F,GAAG,QAAQ,SAAS,OAAO,CAAC,CAAC,KAAK,QAAQ;GAAE;GAAI,YAAY;EAAW,EAAE,CAC3E;CACF,CAAC,CACH;CAEA,MAAM,YAAY,EAAE,IAAI,YAAY,YAAY,aAAa,eAC3D,aAAa;EAEX,IAAI,WADa,eAAe,IACV,CAAC,GAAG;EAE1B,MAAM,iBAAiB,GAAG;EAE1B,OAAO,WAAW,SAAS,QAAQ,CAAC,CAAC,CAAC;CACxC,CAAC;CAEH,gBAAgB,KAAK,GAAG,YAAY,IAAI,QAAQ,CAAC;CAEjD,OAAO;EACL,IAAI,WAAW;GACb,OAAO;EACT;EAEA,UAAgB;GACd,MAAM,QAAQ,SAAS;GACvB,IAAI,UAAU,gBAAgB,UAAU,aAAa;GAKrD,WAAW,YAAY;GACvB,WAAW,WAAW;GAEtB,KAAK,MAAM,WAAW,iBAAiB,QAAQ;EACjD;CACF;AACF"}
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Run a side effect whenever its signal dependencies change.
|
|
4
4
|
*
|
|
5
|
-
* Executes immediately (synchronous initial run), then re-runs on the next
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* cleanup contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.
|
|
5
|
+
* Executes immediately (synchronous initial run), then re-runs on the next microtask after any dependency changes. If
|
|
6
|
+
* the callback returns a function, it is called before each re-run and when the effect is stopped — the same cleanup
|
|
7
|
+
* contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.
|
|
9
8
|
*
|
|
10
9
|
* Returns a cleanup function that stops the effect.
|
|
11
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.d.ts","names":[],"sources":["../../../../src/core/signals/effect.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"effect.d.ts","names":[],"sources":["../../../../src/core/signals/effect.ts"],"mappings":";;;;;;;;;;iBAsDgB,OAAO"}
|
|
@@ -10,15 +10,34 @@ function runPending() {
|
|
|
10
10
|
for (const c of pending) {
|
|
11
11
|
pending.delete(c);
|
|
12
12
|
c.get();
|
|
13
|
+
revalidateSources(c);
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
17
|
+
* Recover an effect that wrote a signal one of its own dependencies reads.
|
|
18
|
+
*
|
|
19
|
+
* When an effect body writes a signal that an intermediate computed in its own dependency graph consumes (e.g. a
|
|
20
|
+
* track-selection effect writing the selection slot a candidate-set computed consults), the graph can't tell the
|
|
21
|
+
* effect: the write marks the intermediate dirty, but the effect is the in-flight consumer, so no watcher notification
|
|
22
|
+
* fires — and the effect finishes the run _clean but stale_. Worse, every later external change routed through that
|
|
23
|
+
* intermediate is deduped against its standing dirty flag, so the effect never hears about those either (the
|
|
24
|
+
* lost-wakeup).
|
|
25
|
+
*
|
|
26
|
+
* Pulling each source once after the run closes the hole: a dirtied intermediate recomputes and its dirty flag clears,
|
|
27
|
+
* so the _next_ change through it propagates and wakes the effect normally. The guarantee is liveness, not immediacy —
|
|
28
|
+
* the effect is deliberately not re-run just because it wrote into its own graph (that would double-run every writing
|
|
29
|
+
* effect); it catches up on the next genuine change. Sources that are clean, or whose recomputation is equals-gated to
|
|
30
|
+
* the same value, cost a cached read and notify no one.
|
|
31
|
+
*/
|
|
32
|
+
function revalidateSources(c) {
|
|
33
|
+
for (const source of Signal.subtle.introspectSources(c)) source.get();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
16
36
|
* Run a side effect whenever its signal dependencies change.
|
|
17
37
|
*
|
|
18
|
-
* Executes immediately (synchronous initial run), then re-runs on the next
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* cleanup contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.
|
|
38
|
+
* Executes immediately (synchronous initial run), then re-runs on the next microtask after any dependency changes. If
|
|
39
|
+
* the callback returns a function, it is called before each re-run and when the effect is stopped — the same cleanup
|
|
40
|
+
* contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.
|
|
22
41
|
*
|
|
23
42
|
* Returns a cleanup function that stops the effect.
|
|
24
43
|
*/
|
|
@@ -30,6 +49,7 @@ function effect(fn) {
|
|
|
30
49
|
});
|
|
31
50
|
watcher.watch(c);
|
|
32
51
|
c.get();
|
|
52
|
+
revalidateSources(c);
|
|
33
53
|
return () => {
|
|
34
54
|
watcher.unwatch(c);
|
|
35
55
|
if (typeof cleanup === "function") cleanup();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.js","names":[],"sources":["../../../../src/core/signals/effect.ts"],"sourcesContent":["import { Signal } from 'signal-polyfill';\n\n// Computeds waiting to re-run after their dependencies changed.\nconst pending = new Set<Signal.Computed<void>>();\n\nconst watcher = new Signal.subtle.Watcher(() => {\n queueMicrotask(runPending);\n});\n\nfunction runPending() {\n for (const c of watcher.getPending()) {\n pending.add(c as Signal.Computed<void>);\n }\n watcher.watch(); // re-arm before running effects, in case they write signals\n for (const c of pending) {\n pending.delete(c);\n c.get(); // re-run the effect body\n }\n}\n\n/**\n * Run a side effect whenever its signal dependencies change.\n *\n * Executes immediately (synchronous initial run), then re-runs on the next
|
|
1
|
+
{"version":3,"file":"effect.js","names":[],"sources":["../../../../src/core/signals/effect.ts"],"sourcesContent":["import { Signal } from 'signal-polyfill';\n\n// Computeds waiting to re-run after their dependencies changed.\nconst pending = new Set<Signal.Computed<void>>();\n\nconst watcher = new Signal.subtle.Watcher(() => {\n queueMicrotask(runPending);\n});\n\nfunction runPending() {\n for (const c of watcher.getPending()) {\n pending.add(c as Signal.Computed<void>);\n }\n\n watcher.watch(); // re-arm before running effects, in case they write signals\n\n for (const c of pending) {\n pending.delete(c);\n c.get(); // re-run the effect body\n revalidateSources(c);\n }\n}\n\n/**\n * Recover an effect that wrote a signal one of its own dependencies reads.\n *\n * When an effect body writes a signal that an intermediate computed in its own dependency graph consumes (e.g. a\n * track-selection effect writing the selection slot a candidate-set computed consults), the graph can't tell the\n * effect: the write marks the intermediate dirty, but the effect is the in-flight consumer, so no watcher notification\n * fires — and the effect finishes the run _clean but stale_. Worse, every later external change routed through that\n * intermediate is deduped against its standing dirty flag, so the effect never hears about those either (the\n * lost-wakeup).\n *\n * Pulling each source once after the run closes the hole: a dirtied intermediate recomputes and its dirty flag clears,\n * so the _next_ change through it propagates and wakes the effect normally. The guarantee is liveness, not immediacy —\n * the effect is deliberately not re-run just because it wrote into its own graph (that would double-run every writing\n * effect); it catches up on the next genuine change. Sources that are clean, or whose recomputation is equals-gated to\n * the same value, cost a cached read and notify no one.\n */\nfunction revalidateSources(c: Signal.Computed<void>): void {\n for (const source of Signal.subtle.introspectSources(c)) {\n (source as Signal.State<unknown> | Signal.Computed<unknown>).get();\n }\n}\n\n/**\n * Run a side effect whenever its signal dependencies change.\n *\n * Executes immediately (synchronous initial run), then re-runs on the next microtask after any dependency changes. If\n * the callback returns a function, it is called before each re-run and when the effect is stopped — the same cleanup\n * contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.\n *\n * Returns a cleanup function that stops the effect.\n */\nexport function effect(fn: () => (() => void) | void): () => void {\n let cleanup: (() => void) | void;\n const c = new Signal.Computed(() => {\n if (typeof cleanup === 'function') cleanup();\n\n cleanup = fn();\n });\n\n watcher.watch(c);\n c.get(); // initial run\n revalidateSources(c); // an initial run may self-write too — see the note\n return () => {\n watcher.unwatch(c);\n\n if (typeof cleanup === 'function') cleanup();\n };\n}\n"],"mappings":";;AAGA,MAAM,0BAAU,IAAI,IAA2B;AAE/C,MAAM,UAAU,IAAI,OAAO,OAAO,cAAc;CAC9C,eAAe,UAAU;AAC3B,CAAC;AAED,SAAS,aAAa;CACpB,KAAK,MAAM,KAAK,QAAQ,WAAW,GACjC,QAAQ,IAAI,CAA0B;CAGxC,QAAQ,MAAM;CAEd,KAAK,MAAM,KAAK,SAAS;EACvB,QAAQ,OAAO,CAAC;EAChB,EAAE,IAAI;EACN,kBAAkB,CAAC;CACrB;AACF;;;;;;;;;;;;;;;;;AAkBA,SAAS,kBAAkB,GAAgC;CACzD,KAAK,MAAM,UAAU,OAAO,OAAO,kBAAkB,CAAC,GACpD,OAA6D,IAAI;AAErE;;;;;;;;;;AAWA,SAAgB,OAAO,IAA2C;CAChE,IAAI;CACJ,MAAM,IAAI,IAAI,OAAO,eAAe;EAClC,IAAI,OAAO,YAAY,YAAY,QAAQ;EAE3C,UAAU,GAAG;CACf,CAAC;CAED,QAAQ,MAAM,CAAC;CACf,EAAE,IAAI;CACN,kBAAkB,CAAC;CACnB,aAAa;EACX,QAAQ,QAAQ,CAAC;EAEjB,IAAI,OAAO,YAAY,YAAY,QAAQ;CAC7C;AACF"}
|
|
@@ -18,25 +18,23 @@ declare function computed<T>(fn: () => T, options?: SignalOptions<T>): Computed<
|
|
|
18
18
|
/**
|
|
19
19
|
* Update a writable signal. Two forms:
|
|
20
20
|
*
|
|
21
|
-
* - **Updater function** `(current) => next`. Works for any signal type,
|
|
22
|
-
*
|
|
23
|
-
* - **Partial object** to merge into the current state. Requires
|
|
24
|
-
* `T extends object`.
|
|
21
|
+
* - **Updater function** `(current) => next`. Works for any signal type, including `Signal<T | undefined>` — handle
|
|
22
|
+
* undefined in the updater.
|
|
23
|
+
* - **Partial object** to merge into the current state. Requires `T extends object`.
|
|
25
24
|
*
|
|
26
25
|
* @example
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* update(state, { playbackRate: 2 });
|
|
27
|
+
* update(state, (s) => ({ ...s, count: s.count + 1 }));
|
|
28
|
+
* update(maybeUndefinedSignal, (current) => current ?? defaultValue);
|
|
30
29
|
*/
|
|
31
30
|
declare function update<T>(signal: Signal$1<T>, updater: (current: T) => T): void;
|
|
32
31
|
declare function update<T extends object>(signal: Signal$1<T>, updater: Partial<T>): void;
|
|
33
32
|
/**
|
|
34
|
-
* Read every signal in a map and return a plain object snapshot. Each read
|
|
35
|
-
*
|
|
36
|
-
* on a single `Signal<S>` over the merged shape.
|
|
33
|
+
* Read every signal in a map and return a plain object snapshot. Each read tracks in the surrounding Computed/Effect —
|
|
34
|
+
* equivalent to calling `.get()` on a single `Signal<S>` over the merged shape.
|
|
37
35
|
*
|
|
38
|
-
* Convenience for behaviors that pass whole state/context snapshots to pure
|
|
39
|
-
*
|
|
36
|
+
* Convenience for behaviors that pass whole state/context snapshots to pure helpers; prefer per-field reads when only a
|
|
37
|
+
* few fields are needed.
|
|
40
38
|
*/
|
|
41
39
|
declare function snapshot<M extends Record<string, ReadonlySignal<unknown>>>(map: M): { [K in keyof M]: M[K] extends {
|
|
42
40
|
get(): infer V;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","names":[],"sources":["../../../../src/core/signals/primitives.ts"],"mappings":";;;cAGa,UAAU,GAAG,UAAU,MAAM;;
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","names":[],"sources":["../../../../src/core/signals/primitives.ts"],"mappings":";;;cAGa,UAAU,GAAG,UAAU,MAAM;;KAkB9B,SAAO,KAAK,OAAS,MAAM;;KAG3B,SAAS,KAAK,OAAS,SAAS;;KAGhC,eAAe,KAAK,KAAK,OAAS,MAAM;UAEnC,cAAc;EAC7B,UAAU,GAAG,GAAG,IAAI;;;iBAIN,OAAO,GAAG,cAAc,GAAG,UAAU,cAAc,KAAK,SAAO;;iBAK/D,SAAS,GAAG,UAAU,GAAG,UAAU,cAAc,KAAK,SAAS;;;;;;;;;;;;;iBAgB/D,OAAO,GAAG,QAAQ,SAAO,IAAI,UAAU,SAAS,MAAM;iBACtD,OAAO,kBAAkB,QAAQ,SAAO,IAAI,SAAS,QAAQ;;;;;;;;iBAmC7D,SAAS,UAAU,eAAe,0BAChD,KAAK,OACD,WAAW,IAAI,EAAE;EAAa,aAAa;IAAM"}
|
|
@@ -3,18 +3,15 @@ import { Signal } from "signal-polyfill";
|
|
|
3
3
|
/** Read a signal value without tracking it as a dependency. */
|
|
4
4
|
const untrack = Signal.subtle.untrack;
|
|
5
5
|
/**
|
|
6
|
-
* Read a signal's current value without tracking it as a dependency. Sugar
|
|
7
|
-
*
|
|
8
|
-
* sites. Structurally typed to accept any signal-like (Signal, Computed,
|
|
9
|
-
* ReadonlySignal).
|
|
6
|
+
* Read a signal's current value without tracking it as a dependency. Sugar for `untrack(() => signal.get())` to reduce
|
|
7
|
+
* boilerplate at single-read sites. Structurally typed to accept any signal-like (Signal, Computed, ReadonlySignal).
|
|
10
8
|
*
|
|
11
|
-
* Accepts an optional `transform` to project the value in the same call;
|
|
12
|
-
*
|
|
13
|
-
* unchanged.
|
|
9
|
+
* Accepts an optional `transform` to project the value in the same call; the default is the identity function so the
|
|
10
|
+
* single-arg form returns `T` unchanged.
|
|
14
11
|
*
|
|
15
12
|
* @example
|
|
16
|
-
*
|
|
17
|
-
*
|
|
13
|
+
* const value = peek(someSignal);
|
|
14
|
+
* const id = peek(presentationSignal, (p) => p?.id);
|
|
18
15
|
*/
|
|
19
16
|
function peek(source, transform = (v) => v) {
|
|
20
17
|
return untrack(() => transform(source.get()));
|
|
@@ -36,12 +33,11 @@ function update(signal, updater) {
|
|
|
36
33
|
});
|
|
37
34
|
}
|
|
38
35
|
/**
|
|
39
|
-
* Read every signal in a map and return a plain object snapshot. Each read
|
|
40
|
-
*
|
|
41
|
-
* on a single `Signal<S>` over the merged shape.
|
|
36
|
+
* Read every signal in a map and return a plain object snapshot. Each read tracks in the surrounding Computed/Effect —
|
|
37
|
+
* equivalent to calling `.get()` on a single `Signal<S>` over the merged shape.
|
|
42
38
|
*
|
|
43
|
-
* Convenience for behaviors that pass whole state/context snapshots to pure
|
|
44
|
-
*
|
|
39
|
+
* Convenience for behaviors that pass whole state/context snapshots to pure helpers; prefer per-field reads when only a
|
|
40
|
+
* few fields are needed.
|
|
45
41
|
*/
|
|
46
42
|
function snapshot(map) {
|
|
47
43
|
const out = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","names":["SignalNS"],"sources":["../../../../src/core/signals/primitives.ts"],"sourcesContent":["import { Signal as SignalNS } from 'signal-polyfill';\n\n/** Read a signal value without tracking it as a dependency. */\nexport const untrack: <T>(fn: () => T) => T = SignalNS.subtle.untrack;\n\n/**\n * Read a signal's current value without tracking it as a dependency. Sugar
|
|
1
|
+
{"version":3,"file":"primitives.js","names":["SignalNS"],"sources":["../../../../src/core/signals/primitives.ts"],"sourcesContent":["import { Signal as SignalNS } from 'signal-polyfill';\n\n/** Read a signal value without tracking it as a dependency. */\nexport const untrack: <T>(fn: () => T) => T = SignalNS.subtle.untrack;\n\n/**\n * Read a signal's current value without tracking it as a dependency. Sugar for `untrack(() => signal.get())` to reduce\n * boilerplate at single-read sites. Structurally typed to accept any signal-like (Signal, Computed, ReadonlySignal).\n *\n * Accepts an optional `transform` to project the value in the same call; the default is the identity function so the\n * single-arg form returns `T` unchanged.\n *\n * @example\n * const value = peek(someSignal);\n * const id = peek(presentationSignal, (p) => p?.id);\n */\nexport function peek<T, R = T>(source: { get(): T }, transform: (value: T) => R = (v: T) => v as unknown as R): R {\n return untrack(() => transform(source.get()));\n}\n\n/** A writable reactive value (read + write). */\nexport type Signal<T> = SignalNS.State<T>;\n\n/** A derived reactive value that re-evaluates when its dependencies change (read-only). */\nexport type Computed<T> = SignalNS.Computed<T>;\n\n/** A read-only view of a reactive value. */\nexport type ReadonlySignal<T> = Omit<SignalNS.State<T>, 'set'>;\n\nexport interface SignalOptions<T> {\n equals?: (t: T, t2: T) => boolean;\n}\n\n/** Create a writable reactive value. */\nexport function signal<T>(initialValue: T, options?: SignalOptions<T>): Signal<T> {\n return new SignalNS.State(initialValue, options as SignalNS.Options<T>);\n}\n\n/** Create a computed reactive value. */\nexport function computed<T>(fn: () => T, options?: SignalOptions<T>): Computed<T> {\n return new SignalNS.Computed(fn, options as SignalNS.Options<T>);\n}\n\n/**\n * Update a writable signal. Two forms:\n *\n * - **Updater function** `(current) => next`. Works for any signal type, including `Signal<T | undefined>` — handle\n * undefined in the updater.\n * - **Partial object** to merge into the current state. Requires `T extends object`.\n *\n * @example\n * update(state, { playbackRate: 2 });\n * update(state, (s) => ({ ...s, count: s.count + 1 }));\n * update(maybeUndefinedSignal, (current) => current ?? defaultValue);\n */\nexport function update<T>(signal: Signal<T>, updater: (current: T) => T): void;\nexport function update<T extends object>(signal: Signal<T>, updater: Partial<T>): void;\nexport function update<T>(signal: Signal<T>, updater: ((current: T) => T) | object): void {\n const current = untrack(() => signal.get());\n\n if (typeof updater === 'function') {\n signal.set((updater as (current: T) => T)(current));\n } else {\n // Partial<T> form — `T extends object` enforced by the public overload.\n signal.set({ ...(current as object), ...updater } as T);\n }\n}\n\n/**\n * Equality comparator for objects with an optional `id` field. Designed for use as a `computed` `equals` option when\n * reacting to identity changes (Ham-shaped objects, JSON-API-shaped resources) while filtering internal updates that\n * preserve the id.\n *\n * Handles undefined inputs symmetrically: both undefined → equal; one undefined → different.\n *\n * @example\n * const presentationById = computed(() => state.presentation.get(), {\n * equals: equalsById,\n * });\n */\nexport function equalsById<T extends { id?: string }>(a: T | undefined, b: T | undefined): boolean {\n return a?.id === b?.id;\n}\n\n/**\n * Read every signal in a map and return a plain object snapshot. Each read tracks in the surrounding Computed/Effect —\n * equivalent to calling `.get()` on a single `Signal<S>` over the merged shape.\n *\n * Convenience for behaviors that pass whole state/context snapshots to pure helpers; prefer per-field reads when only a\n * few fields are needed.\n */\nexport function snapshot<M extends Record<string, ReadonlySignal<unknown>>>(\n map: M\n): { [K in keyof M]: M[K] extends { get(): infer V } ? V : never } {\n const out = {} as { [K in keyof M]: M[K] extends { get(): infer V } ? V : never };\n\n for (const key in map) {\n out[key] = map[key]!.get() as never;\n }\n\n return out;\n}\n"],"mappings":";;;AAGA,MAAa,UAAiCA,OAAS,OAAO;;;;;;;;;;;;AAa9D,SAAgB,KAAe,QAAsB,aAA8B,MAAS,GAAsB;CAChH,OAAO,cAAc,UAAU,OAAO,IAAI,CAAC,CAAC;AAC9C;;AAgBA,SAAgB,OAAU,cAAiB,SAAuC;CAChF,OAAO,IAAIA,OAAS,MAAM,cAAc,OAA8B;AACxE;;AAGA,SAAgB,SAAY,IAAa,SAAyC;CAChF,OAAO,IAAIA,OAAS,SAAS,IAAI,OAA8B;AACjE;AAgBA,SAAgB,OAAU,QAAmB,SAA6C;CACxF,MAAM,UAAU,cAAc,OAAO,IAAI,CAAC;CAE1C,IAAI,OAAO,YAAY,YACrB,OAAO,IAAK,QAA8B,OAAO,CAAC;MAGlD,OAAO,IAAI;EAAE,GAAI;EAAoB,GAAG;CAAQ,CAAM;AAE1D;;;;;;;;AAyBA,SAAgB,SACd,KACiE;CACjE,MAAM,MAAM,CAAC;CAEb,KAAK,MAAM,OAAO,KAChB,IAAI,OAAO,IAAI,IAAI,CAAE,IAAI;CAG3B,OAAO;AACT"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { effect } from "./effect.js";
|
|
2
2
|
//#region src/core/signals/when.ts
|
|
3
3
|
/**
|
|
4
|
-
* Resolve once `condition` returns true. The condition is a tracked read — it
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* mid-task without polling).
|
|
4
|
+
* Resolve once `condition` returns true. The condition is a tracked read — it re-evaluates whenever a signal it read
|
|
5
|
+
* changes — so this is the promise bridge from signal space into async task bodies (await a state condition mid-task
|
|
6
|
+
* without polling).
|
|
8
7
|
*
|
|
9
|
-
* Settles synchronously when the condition already holds. Rejects with the
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* its runner instead of leaking the subscription.
|
|
8
|
+
* Settles synchronously when the condition already holds. Rejects with the abort reason when `signal` aborts first (an
|
|
9
|
+
* already-aborted signal rejects without evaluating the condition), so a task awaiting a condition dies with its runner
|
|
10
|
+
* instead of leaking the subscription.
|
|
13
11
|
*/
|
|
14
12
|
function when(condition, options = {}) {
|
|
15
13
|
const { signal } = options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"when.js","names":[],"sources":["../../../../src/core/signals/when.ts"],"sourcesContent":["import { effect } from './effect';\n\n/**\n * Resolve once `condition` returns true. The condition is a tracked read — it
|
|
1
|
+
{"version":3,"file":"when.js","names":[],"sources":["../../../../src/core/signals/when.ts"],"sourcesContent":["import { effect } from './effect';\n\n/**\n * Resolve once `condition` returns true. The condition is a tracked read — it re-evaluates whenever a signal it read\n * changes — so this is the promise bridge from signal space into async task bodies (await a state condition mid-task\n * without polling).\n *\n * Settles synchronously when the condition already holds. Rejects with the abort reason when `signal` aborts first (an\n * already-aborted signal rejects without evaluating the condition), so a task awaiting a condition dies with its runner\n * instead of leaking the subscription.\n */\nexport function when(condition: () => boolean, options: { signal?: AbortSignal } = {}): Promise<void> {\n const { signal } = options;\n if (signal?.aborted) return Promise.reject(signal.reason);\n\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const settle = (complete: () => void) => {\n if (settled) return;\n\n settled = true;\n complete();\n // Deferred: on the effect's synchronous initial run `stop` isn't\n // assigned yet, and stopping an effect from inside its own body is\n // undefined behavior for the scheduler either way.\n queueMicrotask(() => {\n signal?.removeEventListener('abort', onAbort);\n stop();\n });\n };\n const onAbort = () => settle(() => reject(signal?.reason));\n\n signal?.addEventListener('abort', onAbort, { once: true });\n const stop = effect(() => {\n if (!settled && condition()) settle(resolve);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,KAAK,WAA0B,UAAoC,CAAC,GAAkB;CACpG,MAAM,EAAE,WAAW;CACnB,IAAI,QAAQ,SAAS,OAAO,QAAQ,OAAO,OAAO,MAAM;CAExD,OAAO,IAAI,SAAe,SAAS,WAAW;EAC5C,IAAI,UAAU;EACd,MAAM,UAAU,aAAyB;GACvC,IAAI,SAAS;GAEb,UAAU;GACV,SAAS;GAIT,qBAAqB;IACnB,QAAQ,oBAAoB,SAAS,OAAO;IAC5C,KAAK;GACP,CAAC;EACH;EACA,MAAM,gBAAgB,aAAa,OAAO,QAAQ,MAAM,CAAC;EAEzD,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACzD,MAAM,OAAO,aAAa;GACxB,IAAI,CAAC,WAAW,UAAU,GAAG,OAAO,OAAO;EAC7C,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import { sleep } from "@videojs/utils/time";
|
|
2
2
|
//#region src/core/tasks/delayed-reschedule.ts
|
|
3
3
|
/**
|
|
4
|
-
* Build a {@link Reschedule} from a pure cadence function — the common
|
|
5
|
-
* timer-based, *start-anchored* implementation.
|
|
4
|
+
* Build a {@link Reschedule} from a pure cadence function — the common timer-based, _start-anchored_ implementation.
|
|
6
5
|
*
|
|
7
|
-
* Invoked concurrently with the run, it observes the result, then waits
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* RFC 8216 §6.3.4's "measured from the last time the client began loading"). If
|
|
12
|
-
* the run takes longer than the cadence, the next run starts immediately.
|
|
6
|
+
* Invoked concurrently with the run, it observes the result, then waits `cadence(current, previous)` milliseconds
|
|
7
|
+
* **measured from when it was invoked** (≈ the run's start): it subtracts the run's own elapsed time, so consecutive
|
|
8
|
+
* runs begin one cadence apart regardless of how long each run takes (per RFC 8216 §6.3.4's "measured from the last
|
|
9
|
+
* time the client began loading"). If the run takes longer than the cadence, the next run starts immediately.
|
|
13
10
|
*
|
|
14
|
-
* A `null` cadence stops the recurrence. A rejected run rejects this reschedule,
|
|
15
|
-
*
|
|
16
|
-
* recovery (e.g. retrying transient fetch failures) belongs below, at the fetch
|
|
11
|
+
* A `null` cadence stops the recurrence. A rejected run rejects this reschedule, which the `RecurringRunner` propagates
|
|
12
|
+
* as the recurrence's failure — error recovery (e.g. retrying transient fetch failures) belongs below, at the fetch
|
|
17
13
|
* layer, not in the cadence.
|
|
18
14
|
*/
|
|
19
15
|
function delayedReschedule(cadence) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delayed-reschedule.js","names":[],"sources":["../../../../src/core/tasks/delayed-reschedule.ts"],"sourcesContent":["import { sleep } from '@videojs/utils/time';\nimport type { Reschedule } from './task';\n\n/**\n * Build a {@link Reschedule} from a pure cadence function — the common
|
|
1
|
+
{"version":3,"file":"delayed-reschedule.js","names":[],"sources":["../../../../src/core/tasks/delayed-reschedule.ts"],"sourcesContent":["import { sleep } from '@videojs/utils/time';\n\nimport type { Reschedule } from './task';\n\n/**\n * Build a {@link Reschedule} from a pure cadence function — the common timer-based, _start-anchored_ implementation.\n *\n * Invoked concurrently with the run, it observes the result, then waits `cadence(current, previous)` milliseconds\n * **measured from when it was invoked** (≈ the run's start): it subtracts the run's own elapsed time, so consecutive\n * runs begin one cadence apart regardless of how long each run takes (per RFC 8216 §6.3.4's \"measured from the last\n * time the client began loading\"). If the run takes longer than the cadence, the next run starts immediately.\n *\n * A `null` cadence stops the recurrence. A rejected run rejects this reschedule, which the `RecurringRunner` propagates\n * as the recurrence's failure — error recovery (e.g. retrying transient fetch failures) belongs below, at the fetch\n * layer, not in the cadence.\n */\nexport function delayedReschedule<TValue>(\n cadence: (current: TValue, previous: TValue | undefined) => number | null\n): Reschedule<TValue> {\n return async (task) => {\n const startedAt = Date.now();\n const current = await task.run();\n // `task.previous` is the prior successful value (carried by the runner's\n // clone); read-only for the cadence, hence the cast off `DeepReadonly`.\n const ms = cadence(current, task.previous as TValue | undefined);\n if (ms === null) return false;\n\n await sleep(Math.max(0, ms - (Date.now() - startedAt)), task.signal);\n return true;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,kBACd,SACoB;CACpB,OAAO,OAAO,SAAS;EACrB,MAAM,YAAY,KAAK,IAAI;EAI3B,MAAM,KAAK,QAAQ,MAHG,KAAK,IAAI,GAGH,KAAK,QAA8B;EAC/D,IAAI,OAAO,MAAM,OAAO;EAExB,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,UAAU,GAAG,KAAK,MAAM;EACnE,OAAO;CACT;AACF"}
|