@videojs/spf 10.0.0-beta.23 → 10.0.0-beta.25
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/background-video.js +3 -0
- package/dist/{dev/core → default/core/actors}/create-machine-actor.js +3 -3
- package/dist/default/core/actors/create-machine-actor.js.map +1 -0
- package/dist/default/core/{create-transition-actor.js → actors/create-transition-actor.js} +3 -3
- package/dist/default/core/actors/create-transition-actor.js.map +1 -0
- package/dist/default/core/composition/create-composition.js +85 -0
- package/dist/default/core/composition/create-composition.js.map +1 -0
- package/dist/default/core/composition/share-signals.js +39 -0
- package/dist/default/core/composition/share-signals.js.map +1 -0
- package/dist/{dev/core → default/core/reactors}/create-machine-reactor.js +4 -4
- package/dist/default/core/reactors/create-machine-reactor.js.map +1 -0
- package/dist/default/core/signals/primitives.js +33 -11
- package/dist/default/core/signals/primitives.js.map +1 -1
- package/dist/default/core/{task.js → tasks/task.js} +2 -2
- package/dist/default/core/tasks/task.js.map +1 -0
- package/dist/default/dom.js +9 -10
- package/dist/default/hls.js +5 -0
- package/dist/default/index.js +12 -3
- package/dist/default/index.js.map +1 -1
- package/dist/default/media/abr/quality-selection.js +21 -0
- package/dist/default/media/abr/quality-selection.js.map +1 -0
- package/dist/default/{core → media}/buffer/back-buffer.js +2 -2
- package/dist/default/media/buffer/back-buffer.js.map +1 -0
- package/dist/{dev/core → default/media}/buffer/forward-buffer.js +14 -2
- package/dist/default/media/buffer/forward-buffer.js.map +1 -0
- package/dist/default/media/dom/capabilities.js +70 -0
- package/dist/default/media/dom/capabilities.js.map +1 -0
- package/dist/{dev/dom/media → default/media/dom/mse}/append-segment.js +1 -1
- package/dist/default/media/dom/mse/append-segment.js.map +1 -0
- package/dist/default/{dom/media → media/dom/mse}/buffer-flusher.js +1 -1
- package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -0
- package/dist/default/media/dom/mse/duration.js +78 -0
- package/dist/default/media/dom/mse/duration.js.map +1 -0
- package/dist/default/media/dom/mse/end-of-stream.js +20 -0
- package/dist/default/media/dom/mse/end-of-stream.js.map +1 -0
- package/dist/default/{dom/media → media/dom/mse}/mediasource-setup.js +63 -18
- package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -0
- package/dist/default/{dom/text/parse-vtt-segment.js → media/dom/text/resolve-vtt-segment.js} +5 -5
- package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -0
- package/dist/default/media/dom/text/text-track-slots.js +69 -0
- package/dist/default/media/dom/text/text-track-slots.js.map +1 -0
- package/dist/{dev/core → default/media}/hls/parse-attributes.js +17 -3
- package/dist/default/media/hls/parse-attributes.js.map +1 -0
- package/dist/{dev/core → default/media}/hls/parse-media-playlist.js +25 -2
- package/dist/default/media/hls/parse-media-playlist.js.map +1 -0
- package/dist/{dev/core → default/media}/hls/parse-multivariant.js +17 -8
- package/dist/default/media/hls/parse-multivariant.js.map +1 -0
- package/dist/default/{core → media}/hls/resolve-url.js +1 -1
- package/dist/default/media/hls/resolve-url.js.map +1 -0
- package/dist/default/media/primitives/select-tracks.js +130 -0
- package/dist/default/media/primitives/select-tracks.js.map +1 -0
- package/dist/default/media/types/index.js +36 -0
- package/dist/default/media/types/index.js.map +1 -0
- package/dist/default/media/utils/cdn.js +56 -0
- package/dist/default/media/utils/cdn.js.map +1 -0
- package/dist/default/media/utils/preload.js +22 -0
- package/dist/default/media/utils/preload.js.map +1 -0
- package/dist/default/media/utils/track-selection.js +47 -0
- package/dist/default/media/utils/track-selection.js.map +1 -0
- package/dist/default/media/utils/tracks.js +130 -0
- package/dist/default/media/utils/tracks.js.map +1 -0
- package/dist/default/{core/abr → network}/bandwidth-estimator.js +6 -5
- package/dist/default/network/bandwidth-estimator.js.map +1 -0
- package/dist/{dev/dom → default}/network/chunked-stream-iterable.js +1 -1
- package/dist/default/network/chunked-stream-iterable.js.map +1 -0
- package/dist/{dev/core/abr → default/network}/ewma.js +1 -1
- package/dist/default/network/ewma.js.map +1 -0
- package/dist/default/network/fetch.js +115 -0
- package/dist/default/network/fetch.js.map +1 -0
- package/dist/default/{dom/features/segment-loader-actor.js → playback/actors/dom/segment-loader.js} +63 -23
- package/dist/default/playback/actors/dom/segment-loader.js.map +1 -0
- package/dist/default/{dom/media/source-buffer-actor.js → playback/actors/dom/source-buffer.js} +10 -9
- package/dist/default/playback/actors/dom/source-buffer.js.map +1 -0
- package/dist/{dev/dom/features/text-tracks-actor.js → default/playback/actors/dom/text-tracks.js} +7 -3
- package/dist/default/playback/actors/dom/text-tracks.js.map +1 -0
- package/dist/default/playback/actors/text-track-segment-loader.js +135 -0
- package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -0
- package/dist/default/playback/behaviors/calculate-presentation-duration.js +36 -0
- package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -0
- package/dist/default/playback/behaviors/derive-cdn-priority.js +68 -0
- package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -0
- package/dist/default/playback/behaviors/dom/end-of-stream.js +90 -0
- package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -0
- package/dist/default/playback/behaviors/dom/load-segments.js +177 -0
- package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -0
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +192 -0
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
- package/dist/default/playback/behaviors/dom/setup-mediasource.js +89 -0
- package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -0
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js +54 -0
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js +124 -0
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-current-time.js +52 -0
- package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-load-triggers.js +94 -0
- package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-playback-rate.js +37 -0
- package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -0
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +90 -0
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
- package/dist/default/playback/behaviors/resolve-presentation.js +85 -0
- package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -0
- package/dist/default/playback/behaviors/resolve-track.js +120 -0
- package/dist/default/playback/behaviors/resolve-track.js.map +1 -0
- package/dist/default/playback/behaviors/select-tracks.js +101 -0
- package/dist/default/playback/behaviors/select-tracks.js.map +1 -0
- package/dist/default/playback/behaviors/setup-failover-monitor.js +66 -0
- package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -0
- package/dist/default/playback/behaviors/sync-preload.js +59 -0
- package/dist/default/playback/behaviors/sync-preload.js.map +1 -0
- package/dist/default/playback/behaviors/track-switching.js +341 -0
- package/dist/default/playback/behaviors/track-switching.js.map +1 -0
- package/dist/default/playback/engines/background-video/adapter.js +158 -0
- package/dist/default/playback/engines/background-video/adapter.js.map +1 -0
- package/dist/default/playback/engines/background-video/engine.js +75 -0
- package/dist/default/playback/engines/background-video/engine.js.map +1 -0
- package/dist/default/playback/engines/hls/adapter-audio-only.js +119 -0
- package/dist/default/playback/engines/hls/adapter-audio-only.js.map +1 -0
- package/dist/default/{dom/playback-engine → playback/engines/hls}/adapter.js +40 -26
- package/dist/default/playback/engines/hls/adapter.js.map +1 -0
- package/dist/default/playback/engines/hls/engine-audio-only.js +80 -0
- package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -0
- package/dist/default/playback/engines/hls/engine.js +115 -0
- package/dist/default/playback/engines/hls/engine.js.map +1 -0
- package/dist/default/playback/primitives/failover-fetch.js +42 -0
- package/dist/default/playback/primitives/failover-fetch.js.map +1 -0
- package/dist/default/playback/primitives/track-types.js +61 -0
- package/dist/default/playback/primitives/track-types.js.map +1 -0
- package/dist/dev/background-video.d.ts +3 -0
- package/dist/dev/background-video.js +3 -0
- package/dist/dev/core/{actor.d.ts → actors/actor.d.ts} +2 -2
- package/dist/dev/core/actors/actor.d.ts.map +1 -0
- package/dist/dev/core/actors/create-machine-actor.d.ts +125 -0
- package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -0
- package/dist/{default/core → dev/core/actors}/create-machine-actor.js +3 -3
- package/dist/dev/core/actors/create-machine-actor.js.map +1 -0
- package/dist/dev/core/actors/create-transition-actor.d.ts +42 -0
- package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -0
- package/dist/dev/core/{create-transition-actor.js → actors/create-transition-actor.js} +3 -3
- package/dist/dev/core/actors/create-transition-actor.js.map +1 -0
- package/dist/dev/core/composition/create-composition.d.ts +274 -0
- package/dist/dev/core/composition/create-composition.d.ts.map +1 -0
- package/dist/dev/core/composition/create-composition.js +85 -0
- package/dist/dev/core/composition/create-composition.js.map +1 -0
- package/dist/dev/core/composition/share-signals.d.ts +47 -0
- package/dist/dev/core/composition/share-signals.d.ts.map +1 -0
- package/dist/dev/core/composition/share-signals.js +39 -0
- package/dist/dev/core/composition/share-signals.js.map +1 -0
- package/dist/dev/core/machine.d.ts +0 -1
- package/dist/dev/core/machine.d.ts.map +1 -1
- package/dist/dev/core/reactors/create-machine-reactor.d.ts +93 -0
- package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -0
- package/dist/{default/core → dev/core/reactors}/create-machine-reactor.js +4 -4
- package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -0
- package/dist/dev/core/signals/primitives.d.ts +38 -1
- package/dist/dev/core/signals/primitives.d.ts.map +1 -1
- package/dist/dev/core/signals/primitives.js +33 -11
- package/dist/dev/core/signals/primitives.js.map +1 -1
- package/dist/dev/core/tasks/task.d.ts +115 -0
- package/dist/dev/core/tasks/task.d.ts.map +1 -0
- package/dist/dev/core/{task.js → tasks/task.js} +2 -2
- package/dist/dev/core/tasks/task.js.map +1 -0
- package/dist/dev/dom.d.ts +9 -10
- package/dist/dev/dom.js +9 -10
- package/dist/dev/hls.d.ts +5 -0
- package/dist/dev/hls.js +5 -0
- package/dist/dev/index.d.ts +15 -3
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +12 -3
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/media/abr/quality-selection.d.ts +22 -0
- package/dist/dev/media/abr/quality-selection.d.ts.map +1 -0
- package/dist/dev/media/abr/quality-selection.js +21 -0
- package/dist/dev/media/abr/quality-selection.js.map +1 -0
- package/dist/dev/media/buffer/back-buffer.d.ts +14 -0
- package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -0
- package/dist/dev/{core → media}/buffer/back-buffer.js +2 -2
- package/dist/dev/media/buffer/back-buffer.js.map +1 -0
- package/dist/dev/media/buffer/forward-buffer.d.ts +14 -0
- package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -0
- package/dist/{default/core → dev/media}/buffer/forward-buffer.js +14 -2
- package/dist/dev/media/buffer/forward-buffer.js.map +1 -0
- package/dist/dev/media/dom/capabilities.js +70 -0
- package/dist/dev/media/dom/capabilities.js.map +1 -0
- package/dist/dev/{dom/media → media/dom/mse}/append-segment.d.ts +1 -1
- package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -0
- package/dist/{default/dom/media → dev/media/dom/mse}/append-segment.js +1 -1
- package/dist/dev/media/dom/mse/append-segment.js.map +1 -0
- package/dist/dev/{dom/media → media/dom/mse}/buffer-flusher.d.ts +1 -1
- package/dist/dev/media/dom/mse/buffer-flusher.d.ts.map +1 -0
- package/dist/dev/{dom/media → media/dom/mse}/buffer-flusher.js +1 -1
- package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -0
- package/dist/dev/media/dom/mse/duration.js +78 -0
- package/dist/dev/media/dom/mse/duration.js.map +1 -0
- package/dist/dev/media/dom/mse/end-of-stream.js +20 -0
- package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -0
- package/dist/dev/{dom/media → media/dom/mse}/mediasource-setup.js +63 -18
- package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -0
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts +12 -0
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -0
- package/dist/dev/{dom/text/parse-vtt-segment.js → media/dom/text/resolve-vtt-segment.js} +5 -5
- package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -0
- package/dist/dev/media/dom/text/text-track-slots.d.ts +31 -0
- package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -0
- package/dist/dev/media/dom/text/text-track-slots.js +69 -0
- package/dist/dev/media/dom/text/text-track-slots.js.map +1 -0
- package/dist/{default/core → dev/media}/hls/parse-attributes.js +17 -3
- package/dist/dev/media/hls/parse-attributes.js.map +1 -0
- package/dist/{default/core → dev/media}/hls/parse-media-playlist.js +25 -2
- package/dist/dev/media/hls/parse-media-playlist.js.map +1 -0
- package/dist/{default/core → dev/media}/hls/parse-multivariant.js +17 -8
- package/dist/dev/media/hls/parse-multivariant.js.map +1 -0
- package/dist/dev/{core → media}/hls/resolve-url.js +1 -1
- package/dist/dev/media/hls/resolve-url.js.map +1 -0
- package/dist/dev/media/primitives/select-tracks.d.ts +36 -0
- package/dist/dev/media/primitives/select-tracks.d.ts.map +1 -0
- package/dist/dev/media/primitives/select-tracks.js +130 -0
- package/dist/dev/media/primitives/select-tracks.js.map +1 -0
- package/dist/dev/{core → media}/types/index.d.ts +55 -3
- package/dist/dev/media/types/index.d.ts.map +1 -0
- package/dist/dev/media/types/index.js +36 -0
- package/dist/dev/media/types/index.js.map +1 -0
- package/dist/dev/media/utils/cdn.d.ts +13 -0
- package/dist/dev/media/utils/cdn.d.ts.map +1 -0
- package/dist/dev/media/utils/cdn.js +56 -0
- package/dist/dev/media/utils/cdn.js.map +1 -0
- package/dist/dev/media/utils/preload.js +22 -0
- package/dist/dev/media/utils/preload.js.map +1 -0
- package/dist/dev/media/utils/track-selection.js +47 -0
- package/dist/dev/media/utils/track-selection.js.map +1 -0
- package/dist/dev/media/utils/tracks.js +130 -0
- package/dist/dev/media/utils/tracks.js.map +1 -0
- package/dist/dev/{core/abr → network}/bandwidth-estimator.d.ts +17 -2
- package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -0
- package/dist/dev/{core/abr → network}/bandwidth-estimator.js +6 -5
- package/dist/dev/network/bandwidth-estimator.js.map +1 -0
- package/dist/{default/dom → dev}/network/chunked-stream-iterable.js +1 -1
- package/dist/dev/network/chunked-stream-iterable.js.map +1 -0
- package/dist/{default/core/abr → dev/network}/ewma.js +1 -1
- package/dist/dev/network/ewma.js.map +1 -0
- package/dist/dev/network/fetch.js +115 -0
- package/dist/dev/network/fetch.js.map +1 -0
- package/dist/dev/playback/actors/dom/segment-loader.d.ts +36 -0
- package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -0
- package/dist/dev/{dom/features/segment-loader-actor.js → playback/actors/dom/segment-loader.js} +63 -23
- package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -0
- package/dist/dev/{dom/media/source-buffer-actor.d.ts → playback/actors/dom/source-buffer.d.ts} +20 -5
- package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -0
- package/dist/dev/{dom/media/source-buffer-actor.js → playback/actors/dom/source-buffer.js} +10 -9
- package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -0
- package/dist/dev/playback/actors/dom/text-tracks.d.ts +1 -0
- package/dist/{default/dom/features/text-tracks-actor.js → dev/playback/actors/dom/text-tracks.js} +7 -3
- package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -0
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts +59 -0
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -0
- package/dist/dev/playback/actors/text-track-segment-loader.js +135 -0
- package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -0
- package/dist/dev/playback/actors/text-tracks.d.ts +42 -0
- package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +25 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js +36 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -0
- package/dist/dev/playback/behaviors/derive-cdn-priority.js +68 -0
- package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/end-of-stream.js +90 -0
- package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts +62 -0
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/load-segments.js +177 -0
- package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +192 -0
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js +89 -0
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +31 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js +54 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +124 -0
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +34 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.js +52 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +48 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js +94 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +34 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js +37 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +90 -0
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts +7 -0
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/resolve-presentation.js +85 -0
- package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -0
- package/dist/dev/playback/behaviors/resolve-track.js +120 -0
- package/dist/dev/playback/behaviors/resolve-track.js.map +1 -0
- package/dist/dev/playback/behaviors/select-tracks.d.ts +13 -0
- package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/select-tracks.js +101 -0
- package/dist/dev/playback/behaviors/select-tracks.js.map +1 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +12 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.js +66 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -0
- package/dist/dev/playback/behaviors/sync-preload.js +59 -0
- package/dist/dev/playback/behaviors/sync-preload.js.map +1 -0
- package/dist/dev/playback/behaviors/track-switching.js +341 -0
- package/dist/dev/playback/behaviors/track-switching.js.map +1 -0
- package/dist/dev/playback/engines/background-video/adapter.d.ts +60 -0
- package/dist/dev/playback/engines/background-video/adapter.d.ts.map +1 -0
- package/dist/dev/playback/engines/background-video/adapter.js +158 -0
- package/dist/dev/playback/engines/background-video/adapter.js.map +1 -0
- package/dist/dev/playback/engines/background-video/engine.d.ts +107 -0
- package/dist/dev/playback/engines/background-video/engine.d.ts.map +1 -0
- package/dist/dev/playback/engines/background-video/engine.js +75 -0
- package/dist/dev/playback/engines/background-video/engine.js.map +1 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.d.ts +45 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.js +119 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.js.map +1 -0
- package/dist/dev/{dom/playback-engine → playback/engines/hls}/adapter.d.ts +13 -12
- package/dist/dev/playback/engines/hls/adapter.d.ts.map +1 -0
- package/dist/dev/{dom/playback-engine → playback/engines/hls}/adapter.js +40 -26
- package/dist/dev/playback/engines/hls/adapter.js.map +1 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +127 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.js +80 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -0
- package/dist/dev/playback/engines/hls/engine.d.ts +236 -0
- package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/engine.js +115 -0
- package/dist/dev/playback/engines/hls/engine.js.map +1 -0
- package/dist/dev/playback/primitives/failover-fetch.js +42 -0
- package/dist/dev/playback/primitives/failover-fetch.js.map +1 -0
- package/dist/dev/playback/primitives/track-types.js +61 -0
- package/dist/dev/playback/primitives/track-types.js.map +1 -0
- package/package.json +12 -7
- package/dist/default/core/abr/bandwidth-estimator.js.map +0 -1
- package/dist/default/core/abr/ewma.js.map +0 -1
- package/dist/default/core/abr/quality-selection.js +0 -53
- package/dist/default/core/abr/quality-selection.js.map +0 -1
- package/dist/default/core/buffer/back-buffer.js.map +0 -1
- package/dist/default/core/buffer/forward-buffer.js.map +0 -1
- package/dist/default/core/create-machine-actor.js.map +0 -1
- package/dist/default/core/create-machine-reactor.js.map +0 -1
- package/dist/default/core/create-transition-actor.js.map +0 -1
- package/dist/default/core/features/calculate-presentation-duration.js +0 -53
- package/dist/default/core/features/calculate-presentation-duration.js.map +0 -1
- package/dist/default/core/features/quality-switching.js +0 -69
- package/dist/default/core/features/quality-switching.js.map +0 -1
- package/dist/default/core/features/resolve-presentation.js +0 -73
- package/dist/default/core/features/resolve-presentation.js.map +0 -1
- package/dist/default/core/features/resolve-track.js +0 -66
- package/dist/default/core/features/resolve-track.js.map +0 -1
- package/dist/default/core/features/select-tracks.js +0 -130
- package/dist/default/core/features/select-tracks.js.map +0 -1
- package/dist/default/core/features/sync-preload-attribute.js +0 -26
- package/dist/default/core/features/sync-preload-attribute.js.map +0 -1
- package/dist/default/core/hls/parse-attributes.js.map +0 -1
- package/dist/default/core/hls/parse-media-playlist.js.map +0 -1
- package/dist/default/core/hls/parse-multivariant.js.map +0 -1
- package/dist/default/core/hls/resolve-url.js.map +0 -1
- package/dist/default/core/task.js.map +0 -1
- package/dist/default/core/types/index.js +0 -15
- package/dist/default/core/types/index.js.map +0 -1
- package/dist/default/core/utils/generate-id.js +0 -21
- package/dist/default/core/utils/generate-id.js.map +0 -1
- package/dist/default/core/utils/track-selection.js +0 -39
- package/dist/default/core/utils/track-selection.js.map +0 -1
- package/dist/default/dom/features/end-of-stream.js +0 -145
- package/dist/default/dom/features/end-of-stream.js.map +0 -1
- package/dist/default/dom/features/load-segments.js +0 -192
- package/dist/default/dom/features/load-segments.js.map +0 -1
- package/dist/default/dom/features/load-text-track-cues.js +0 -104
- package/dist/default/dom/features/load-text-track-cues.js.map +0 -1
- package/dist/default/dom/features/segment-loader-actor.js.map +0 -1
- package/dist/default/dom/features/setup-mediasource.js +0 -48
- package/dist/default/dom/features/setup-mediasource.js.map +0 -1
- package/dist/default/dom/features/setup-sourcebuffer.js +0 -78
- package/dist/default/dom/features/setup-sourcebuffer.js.map +0 -1
- package/dist/default/dom/features/sync-text-tracks.js +0 -95
- package/dist/default/dom/features/sync-text-tracks.js.map +0 -1
- package/dist/default/dom/features/text-track-segment-loader-actor.js +0 -55
- package/dist/default/dom/features/text-track-segment-loader-actor.js.map +0 -1
- package/dist/default/dom/features/text-tracks-actor.js.map +0 -1
- package/dist/default/dom/features/track-current-time.js +0 -49
- package/dist/default/dom/features/track-current-time.js.map +0 -1
- package/dist/default/dom/features/track-playback-initiated.js +0 -66
- package/dist/default/dom/features/track-playback-initiated.js.map +0 -1
- package/dist/default/dom/features/track-playback-rate.js +0 -32
- package/dist/default/dom/features/track-playback-rate.js.map +0 -1
- package/dist/default/dom/features/update-duration.js +0 -78
- package/dist/default/dom/features/update-duration.js.map +0 -1
- package/dist/default/dom/media/append-segment.js.map +0 -1
- package/dist/default/dom/media/buffer-flusher.js.map +0 -1
- package/dist/default/dom/media/mediasource-setup.js.map +0 -1
- package/dist/default/dom/media/source-buffer-actor.js.map +0 -1
- package/dist/default/dom/network/chunked-stream-iterable.js.map +0 -1
- package/dist/default/dom/network/fetch.js +0 -54
- package/dist/default/dom/network/fetch.js.map +0 -1
- package/dist/default/dom/playback-engine/adapter.js.map +0 -1
- package/dist/default/dom/playback-engine/engine.js +0 -142
- package/dist/default/dom/playback-engine/engine.js.map +0 -1
- package/dist/default/dom/playback-engine.js +0 -4
- package/dist/default/dom/text/parse-vtt-segment.js.map +0 -1
- package/dist/dev/core/abr/bandwidth-estimator.d.ts.map +0 -1
- package/dist/dev/core/abr/bandwidth-estimator.js.map +0 -1
- package/dist/dev/core/abr/ewma.js.map +0 -1
- package/dist/dev/core/abr/quality-selection.js +0 -53
- package/dist/dev/core/abr/quality-selection.js.map +0 -1
- package/dist/dev/core/actor.d.ts.map +0 -1
- package/dist/dev/core/buffer/back-buffer.js.map +0 -1
- package/dist/dev/core/buffer/forward-buffer.js.map +0 -1
- package/dist/dev/core/create-machine-actor.d.ts +0 -12
- package/dist/dev/core/create-machine-actor.d.ts.map +0 -1
- package/dist/dev/core/create-machine-actor.js.map +0 -1
- package/dist/dev/core/create-machine-reactor.d.ts +0 -8
- package/dist/dev/core/create-machine-reactor.d.ts.map +0 -1
- package/dist/dev/core/create-machine-reactor.js.map +0 -1
- package/dist/dev/core/create-transition-actor.d.ts +0 -23
- package/dist/dev/core/create-transition-actor.d.ts.map +0 -1
- package/dist/dev/core/create-transition-actor.js.map +0 -1
- package/dist/dev/core/features/calculate-presentation-duration.js +0 -53
- package/dist/dev/core/features/calculate-presentation-duration.js.map +0 -1
- package/dist/dev/core/features/quality-switching.js +0 -69
- package/dist/dev/core/features/quality-switching.js.map +0 -1
- package/dist/dev/core/features/resolve-presentation.js +0 -73
- package/dist/dev/core/features/resolve-presentation.js.map +0 -1
- package/dist/dev/core/features/resolve-track.js +0 -66
- package/dist/dev/core/features/resolve-track.js.map +0 -1
- package/dist/dev/core/features/select-tracks.js +0 -130
- package/dist/dev/core/features/select-tracks.js.map +0 -1
- package/dist/dev/core/features/sync-preload-attribute.js +0 -26
- package/dist/dev/core/features/sync-preload-attribute.js.map +0 -1
- package/dist/dev/core/hls/parse-attributes.js.map +0 -1
- package/dist/dev/core/hls/parse-media-playlist.js.map +0 -1
- package/dist/dev/core/hls/parse-multivariant.js.map +0 -1
- package/dist/dev/core/hls/resolve-url.js.map +0 -1
- package/dist/dev/core/task.js.map +0 -1
- package/dist/dev/core/types/index.d.ts.map +0 -1
- package/dist/dev/core/types/index.js +0 -15
- package/dist/dev/core/types/index.js.map +0 -1
- package/dist/dev/core/utils/generate-id.js +0 -21
- package/dist/dev/core/utils/generate-id.js.map +0 -1
- package/dist/dev/core/utils/track-selection.d.ts +0 -16
- package/dist/dev/core/utils/track-selection.d.ts.map +0 -1
- package/dist/dev/core/utils/track-selection.js +0 -39
- package/dist/dev/core/utils/track-selection.js.map +0 -1
- package/dist/dev/dom/features/end-of-stream.js +0 -145
- package/dist/dev/dom/features/end-of-stream.js.map +0 -1
- package/dist/dev/dom/features/load-segments.d.ts +0 -72
- package/dist/dev/dom/features/load-segments.d.ts.map +0 -1
- package/dist/dev/dom/features/load-segments.js +0 -192
- package/dist/dev/dom/features/load-segments.js.map +0 -1
- package/dist/dev/dom/features/load-text-track-cues.d.ts +0 -85
- package/dist/dev/dom/features/load-text-track-cues.d.ts.map +0 -1
- package/dist/dev/dom/features/load-text-track-cues.js +0 -104
- package/dist/dev/dom/features/load-text-track-cues.js.map +0 -1
- package/dist/dev/dom/features/segment-loader-actor.d.ts +0 -1
- package/dist/dev/dom/features/segment-loader-actor.js.map +0 -1
- package/dist/dev/dom/features/setup-mediasource.js +0 -48
- package/dist/dev/dom/features/setup-mediasource.js.map +0 -1
- package/dist/dev/dom/features/setup-sourcebuffer.d.ts +0 -9
- package/dist/dev/dom/features/setup-sourcebuffer.d.ts.map +0 -1
- package/dist/dev/dom/features/setup-sourcebuffer.js +0 -78
- package/dist/dev/dom/features/setup-sourcebuffer.js.map +0 -1
- package/dist/dev/dom/features/sync-text-tracks.js +0 -95
- package/dist/dev/dom/features/sync-text-tracks.js.map +0 -1
- package/dist/dev/dom/features/text-track-segment-loader-actor.d.ts +0 -12
- package/dist/dev/dom/features/text-track-segment-loader-actor.d.ts.map +0 -1
- package/dist/dev/dom/features/text-track-segment-loader-actor.js +0 -55
- package/dist/dev/dom/features/text-track-segment-loader-actor.js.map +0 -1
- package/dist/dev/dom/features/text-tracks-actor.d.ts +0 -31
- package/dist/dev/dom/features/text-tracks-actor.d.ts.map +0 -1
- package/dist/dev/dom/features/text-tracks-actor.js.map +0 -1
- package/dist/dev/dom/features/track-current-time.d.ts +0 -40
- package/dist/dev/dom/features/track-current-time.d.ts.map +0 -1
- package/dist/dev/dom/features/track-current-time.js +0 -49
- package/dist/dev/dom/features/track-current-time.js.map +0 -1
- package/dist/dev/dom/features/track-playback-initiated.d.ts +0 -46
- package/dist/dev/dom/features/track-playback-initiated.d.ts.map +0 -1
- package/dist/dev/dom/features/track-playback-initiated.js +0 -66
- package/dist/dev/dom/features/track-playback-initiated.js.map +0 -1
- package/dist/dev/dom/features/track-playback-rate.d.ts +0 -34
- package/dist/dev/dom/features/track-playback-rate.d.ts.map +0 -1
- package/dist/dev/dom/features/track-playback-rate.js +0 -32
- package/dist/dev/dom/features/track-playback-rate.js.map +0 -1
- package/dist/dev/dom/features/update-duration.js +0 -78
- package/dist/dev/dom/features/update-duration.js.map +0 -1
- package/dist/dev/dom/media/append-segment.d.ts.map +0 -1
- package/dist/dev/dom/media/append-segment.js.map +0 -1
- package/dist/dev/dom/media/buffer-flusher.d.ts.map +0 -1
- package/dist/dev/dom/media/buffer-flusher.js.map +0 -1
- package/dist/dev/dom/media/mediasource-setup.js.map +0 -1
- package/dist/dev/dom/media/source-buffer-actor.d.ts.map +0 -1
- package/dist/dev/dom/media/source-buffer-actor.js.map +0 -1
- package/dist/dev/dom/network/chunked-stream-iterable.js.map +0 -1
- package/dist/dev/dom/network/fetch.js +0 -54
- package/dist/dev/dom/network/fetch.js.map +0 -1
- package/dist/dev/dom/playback-engine/adapter.d.ts.map +0 -1
- package/dist/dev/dom/playback-engine/adapter.js.map +0 -1
- package/dist/dev/dom/playback-engine/engine.d.ts +0 -124
- package/dist/dev/dom/playback-engine/engine.d.ts.map +0 -1
- package/dist/dev/dom/playback-engine/engine.js +0 -142
- package/dist/dev/dom/playback-engine/engine.js.map +0 -1
- package/dist/dev/dom/playback-engine.d.ts +0 -4
- package/dist/dev/dom/playback-engine.js +0 -4
- package/dist/dev/dom/text/parse-vtt-segment.d.ts +0 -12
- package/dist/dev/dom/text/parse-vtt-segment.d.ts.map +0 -1
- package/dist/dev/dom/text/parse-vtt-segment.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { TaskLike } from "../tasks/task.js";
|
|
2
|
+
import { SignalActor } from "./actor.js";
|
|
3
|
+
|
|
4
|
+
//#region src/core/actors/create-machine-actor.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Minimal interface for any runner that can be used with createMachineActor.
|
|
7
|
+
*/
|
|
8
|
+
interface RunnerLike {
|
|
9
|
+
schedule<Value = void, Err = unknown>(task: TaskLike<Value, Err>): Promise<Value>;
|
|
10
|
+
abortAll(): void;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
whenSettled(callback: () => void): void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Context passed to message handlers.
|
|
16
|
+
* `runner` is present and typed as the exact runner instance only when the
|
|
17
|
+
* definition includes a runner factory.
|
|
18
|
+
*/
|
|
19
|
+
type HandlerContext<UserState extends string, Context extends object, RunnerFactory extends (() => RunnerLike) | undefined> = {
|
|
20
|
+
transition: (to: UserState) => void; /** Context snapshot captured at dispatch time. Stale after any `setContext` call. */
|
|
21
|
+
context: Context;
|
|
22
|
+
/**
|
|
23
|
+
* Live untracked read of the current context. Use in async task closures that
|
|
24
|
+
* execute after the handler returns — e.g. `getCtx: getContext` passed to tasks
|
|
25
|
+
* scheduled on the runner, so each task reads the context committed by the
|
|
26
|
+
* previous task rather than the stale snapshot from dispatch time.
|
|
27
|
+
*/
|
|
28
|
+
getContext: () => Context;
|
|
29
|
+
setContext: (next: Context) => void;
|
|
30
|
+
} & (RunnerFactory extends (() => infer R) ? {
|
|
31
|
+
runner: R;
|
|
32
|
+
} : object);
|
|
33
|
+
/**
|
|
34
|
+
* Definition for a single user-defined state.
|
|
35
|
+
*/
|
|
36
|
+
type ActorStateDefinition<UserState extends string, Context extends object, Message extends {
|
|
37
|
+
type: string;
|
|
38
|
+
}, RunnerFactory extends (() => RunnerLike) | undefined> = {
|
|
39
|
+
/**
|
|
40
|
+
* When the actor's runner settles while in this state, automatically
|
|
41
|
+
* transition to this state. The framework owns the generation-token logic —
|
|
42
|
+
* re-registering after each `runner.schedule()` call so that
|
|
43
|
+
* `abortAll()` + reschedule correctly supersedes stale callbacks.
|
|
44
|
+
*/
|
|
45
|
+
onSettled?: UserState; /** Message handlers active in this state. Messages with no handler are silently dropped. */
|
|
46
|
+
on?: { [M in Message as M['type']]?: (message: Extract<Message, {
|
|
47
|
+
type: M['type'];
|
|
48
|
+
}>, ctx: HandlerContext<UserState, Context, RunnerFactory>) => void };
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Full actor definition passed to `createMachineActor`.
|
|
52
|
+
*
|
|
53
|
+
* `UserState` is the set of domain-meaningful states. `'destroyed'` is always
|
|
54
|
+
* added by the framework as the implicit terminal state — do not include it here.
|
|
55
|
+
*/
|
|
56
|
+
type ActorDefinition<UserState extends string, Context extends object, Message extends {
|
|
57
|
+
type: string;
|
|
58
|
+
}, RunnerFactory extends (() => RunnerLike) | undefined = undefined> = {
|
|
59
|
+
/**
|
|
60
|
+
* Runner factory — called once at `createMachineActor()` time.
|
|
61
|
+
* The runner lives for the full actor lifetime and is destroyed with it.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* runner: () => new SerialRunner()
|
|
65
|
+
*/
|
|
66
|
+
runner?: RunnerFactory; /** Initial state. */
|
|
67
|
+
initial: UserState; /** Initial context. */
|
|
68
|
+
context: Context;
|
|
69
|
+
/**
|
|
70
|
+
* Per-state definitions. States with no definition silently drop all messages.
|
|
71
|
+
* All user-defined states must appear as keys in the `UserState` union.
|
|
72
|
+
*/
|
|
73
|
+
states: Partial<Record<UserState, ActorStateDefinition<UserState, Context, Message, RunnerFactory>>>;
|
|
74
|
+
};
|
|
75
|
+
/** Live actor instance returned by `createMachineActor`. */
|
|
76
|
+
interface MessageActor<State extends string, Context extends object, Message extends {
|
|
77
|
+
type: string;
|
|
78
|
+
}> extends SignalActor<State, Context> {
|
|
79
|
+
send(message: Message): void;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Creates a message-driven actor from a declarative definition.
|
|
83
|
+
*
|
|
84
|
+
* The actor owns a reactive snapshot signal (state + context), an optional
|
|
85
|
+
* runner, and dispatches incoming messages to per-state handlers. `'destroyed'`
|
|
86
|
+
* is always the implicit terminal state — `destroy()` transitions there
|
|
87
|
+
* unconditionally and all subsequent `send()` calls are no-ops.
|
|
88
|
+
*
|
|
89
|
+
* When a state declares `onSettled`, the framework calls `runner.whenSettled()`
|
|
90
|
+
* after the handler returns. The runner owns the generation-token logic — if
|
|
91
|
+
* new tasks are scheduled before the current batch settles, the callback is
|
|
92
|
+
* automatically superseded.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* const actor = createMachineActor({
|
|
96
|
+
* runner: () => new SerialRunner(),
|
|
97
|
+
* initial: 'idle',
|
|
98
|
+
* context: {},
|
|
99
|
+
* states: {
|
|
100
|
+
* idle: {
|
|
101
|
+
* on: {
|
|
102
|
+
* load: (msg, { transition, runner }) => {
|
|
103
|
+
* segments.forEach(s => runner.schedule(new Task(...)));
|
|
104
|
+
* transition('loading');
|
|
105
|
+
* }
|
|
106
|
+
* }
|
|
107
|
+
* },
|
|
108
|
+
* loading: {
|
|
109
|
+
* onSettled: 'idle',
|
|
110
|
+
* on: {
|
|
111
|
+
* load: (msg, { runner }) => {
|
|
112
|
+
* runner.abortAll();
|
|
113
|
+
* segments.forEach(s => runner.schedule(new Task(...)));
|
|
114
|
+
* }
|
|
115
|
+
* }
|
|
116
|
+
* }
|
|
117
|
+
* }
|
|
118
|
+
* });
|
|
119
|
+
*/
|
|
120
|
+
declare function createMachineActor<UserState extends string, Context extends object, Message extends {
|
|
121
|
+
type: string;
|
|
122
|
+
}, RunnerFactory extends (() => RunnerLike) | undefined = undefined>(def: ActorDefinition<UserState, Context, Message, RunnerFactory>): MessageActor<UserState | 'destroyed', Context, Message>;
|
|
123
|
+
//#endregion
|
|
124
|
+
export { ActorDefinition, ActorStateDefinition, HandlerContext, MessageActor, RunnerLike, createMachineActor };
|
|
125
|
+
//# sourceMappingURL=create-machine-actor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-machine-actor.d.ts","names":[],"sources":["../../../../src/core/actors/create-machine-actor.ts"],"mappings":";;;;;;AAYA;UAAiB,UAAA;EACf,QAAA,8BAAsC,IAAA,EAAM,QAAA,CAAS,KAAA,EAAO,GAAA,IAAO,OAAA,CAAQ,KAAA;EAC3E,QAAA;EACA,OAAA;EACA,WAAA,CAAY,QAAA;AAAA;;;;;;KAYF,cAAA,gFAGmB,UAAA;EAE7B,UAAA,GAAa,EAAA,EAAI,SAAA,WApBoC;EAsBrD,OAAA,EAAS,OAAA;EAtB6B;;;;;;EA6BtC,UAAA,QAAkB,OAAA;EAClB,UAAA,GAAa,IAAA,EAAM,OAAA;AAAA,KAChB,aAAA;EAAwC,MAAA,EAAQ,CAAA;AAAA;;;;KAKzC,oBAAA;EAGQ,IAAA;AAAA,gCACW,UAAA;EAT1B;;;;;;EAiBH,SAAA,GAAY,SAAA,EA9BiB;EAgC7B,EAAA,WACQ,OAAA,IAAW,CAAA,aACf,OAAA,EAAS,OAAA,CAAQ,OAAA;IAAW,IAAA,EAAM,CAAA;EAAA,IAClC,GAAA,EAAK,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,aAAA;AAAA;;;;;;;KAWlC,eAAA;EAGQ,IAAA;AAAA,gCACW,UAAA;EArCuB;AAKtD;;;;;;EAyCE,MAAA,GAAS,aAAA,EAzBY;EA2BrB,OAAA,EAAS,SAAA,EA3BI;EA6Bb,OAAA,EAAS,OAAA;EA5B0B;;;;EAiCnC,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,oBAAA,CAAqB,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,aAAA;AAAA;;UAQrE,YAAA;EAA6E,IAAA;AAAA,WACpF,WAAA,CAAY,KAAA,EAAO,OAAA;EAC3B,IAAA,CAAK,OAAA,EAAS,OAAA;AAAA;;;;;;;;;;;;;;;;;;AAhChB;;;;;;;;;;;;;;;;;;;;;;iBA8EgB,kBAAA;EAGI,IAAA;AAAA,gCACW,UAAA,0BAAA,CAE7B,GAAA,EAAK,eAAA,CAAgB,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,aAAA,IACjD,YAAA,CAAa,SAAA,gBAAyB,OAAA,EAAS,OAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { untrack, update } from "
|
|
2
|
-
import { createMachineCore } from "
|
|
3
|
-
//#region src/core/create-machine-actor.ts
|
|
1
|
+
import { untrack, update } from "../signals/primitives.js";
|
|
2
|
+
import { createMachineCore } from "../machine.js";
|
|
3
|
+
//#region src/core/actors/create-machine-actor.ts
|
|
4
4
|
/**
|
|
5
5
|
* Creates a message-driven actor from a declarative definition.
|
|
6
6
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-machine-actor.js","names":[],"sources":["../../../../src/core/actors/create-machine-actor.ts"],"sourcesContent":["import { createMachineCore } from '../machine';\nimport { untrack, update } from '../signals/primitives';\nimport type { TaskLike } from '../tasks/task';\nimport type { ActorSnapshot, SignalActor } from './actor';\n\n// =============================================================================\n// Runner interfaces\n// =============================================================================\n\n/**\n * Minimal interface for any runner that can be used with createMachineActor.\n */\nexport interface RunnerLike {\n schedule<Value = void, Err = unknown>(task: TaskLike<Value, Err>): Promise<Value>;\n abortAll(): void;\n destroy(): void;\n whenSettled(callback: () => void): void;\n}\n\n// =============================================================================\n// Definition types\n// =============================================================================\n\n/**\n * Context passed to message handlers.\n * `runner` is present and typed as the exact runner instance only when the\n * definition includes a runner factory.\n */\nexport type HandlerContext<\n UserState extends string,\n Context extends object,\n RunnerFactory extends (() => RunnerLike) | undefined,\n> = {\n transition: (to: UserState) => void;\n /** Context snapshot captured at dispatch time. Stale after any `setContext` call. */\n context: Context;\n /**\n * Live untracked read of the current context. Use in async task closures that\n * execute after the handler returns — e.g. `getCtx: getContext` passed to tasks\n * scheduled on the runner, so each task reads the context committed by the\n * previous task rather than the stale snapshot from dispatch time.\n */\n getContext: () => Context;\n setContext: (next: Context) => void;\n} & (RunnerFactory extends () => infer R ? { runner: R } : object);\n\n/**\n * Definition for a single user-defined state.\n */\nexport type ActorStateDefinition<\n UserState extends string,\n Context extends object,\n Message extends { type: string },\n RunnerFactory extends (() => RunnerLike) | undefined,\n> = {\n /**\n * When the actor's runner settles while in this state, automatically\n * transition to this state. The framework owns the generation-token logic —\n * re-registering after each `runner.schedule()` call so that\n * `abortAll()` + reschedule correctly supersedes stale callbacks.\n */\n onSettled?: UserState;\n /** Message handlers active in this state. Messages with no handler are silently dropped. */\n on?: {\n [M in Message as M['type']]?: (\n message: Extract<Message, { type: M['type'] }>,\n ctx: HandlerContext<UserState, Context, RunnerFactory>\n ) => void;\n };\n};\n\n/**\n * Full actor definition passed to `createMachineActor`.\n *\n * `UserState` is the set of domain-meaningful states. `'destroyed'` is always\n * added by the framework as the implicit terminal state — do not include it here.\n */\nexport type ActorDefinition<\n UserState extends string,\n Context extends object,\n Message extends { type: string },\n RunnerFactory extends (() => RunnerLike) | undefined = undefined,\n> = {\n /**\n * Runner factory — called once at `createMachineActor()` time.\n * The runner lives for the full actor lifetime and is destroyed with it.\n *\n * @example\n * runner: () => new SerialRunner()\n */\n runner?: RunnerFactory;\n /** Initial state. */\n initial: UserState;\n /** Initial context. */\n context: Context;\n /**\n * Per-state definitions. States with no definition silently drop all messages.\n * All user-defined states must appear as keys in the `UserState` union.\n */\n states: Partial<Record<UserState, ActorStateDefinition<UserState, Context, Message, RunnerFactory>>>;\n};\n\n// =============================================================================\n// Live actor interface\n// =============================================================================\n\n/** Live actor instance returned by `createMachineActor`. */\nexport interface MessageActor<State extends string, Context extends object, Message extends { type: string }>\n extends SignalActor<State, Context> {\n send(message: Message): void;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Creates a message-driven actor from a declarative definition.\n *\n * The actor owns a reactive snapshot signal (state + context), an optional\n * runner, and dispatches incoming messages to per-state handlers. `'destroyed'`\n * is always the implicit terminal state — `destroy()` transitions there\n * unconditionally and all subsequent `send()` calls are no-ops.\n *\n * When a state declares `onSettled`, the framework calls `runner.whenSettled()`\n * after the handler returns. The runner owns the generation-token logic — if\n * new tasks are scheduled before the current batch settles, the callback is\n * automatically superseded.\n *\n * @example\n * const actor = createMachineActor({\n * runner: () => new SerialRunner(),\n * initial: 'idle',\n * context: {},\n * states: {\n * idle: {\n * on: {\n * load: (msg, { transition, runner }) => {\n * segments.forEach(s => runner.schedule(new Task(...)));\n * transition('loading');\n * }\n * }\n * },\n * loading: {\n * onSettled: 'idle',\n * on: {\n * load: (msg, { runner }) => {\n * runner.abortAll();\n * segments.forEach(s => runner.schedule(new Task(...)));\n * }\n * }\n * }\n * }\n * });\n */\nexport function createMachineActor<\n UserState extends string,\n Context extends object,\n Message extends { type: string },\n RunnerFactory extends (() => RunnerLike) | undefined = undefined,\n>(\n def: ActorDefinition<UserState, Context, Message, RunnerFactory>\n): MessageActor<UserState | 'destroyed', Context, Message> {\n type FullState = UserState | 'destroyed';\n\n const runner = def.runner?.() as RunnerLike | undefined;\n const { snapshotSignal, getState, transition } = createMachineCore<FullState, ActorSnapshot<FullState, Context>>({\n value: def.initial as FullState,\n context: def.context,\n });\n\n const getContext = (): Context => untrack(() => snapshotSignal.get().context);\n\n const setContext = (context: Context): void => {\n update(snapshotSignal, { context });\n };\n\n return {\n get snapshot() {\n return snapshotSignal;\n },\n\n send(message: Message): void {\n const state = getState();\n if (state === 'destroyed') return;\n const stateDef = def.states[state as UserState];\n const handler = stateDef?.on?.[message.type as keyof typeof stateDef.on] as\n | ((msg: Message, ctx: HandlerContext<UserState, Context, RunnerFactory>) => void)\n | undefined;\n if (!handler) return;\n handler(message, {\n context: getContext(),\n getContext,\n transition: (to: UserState) => transition(to as FullState),\n setContext,\n ...(runner ? { runner } : {}),\n } as HandlerContext<UserState, Context, RunnerFactory>);\n // Register onSettled after the handler so we read the post-transition state.\n const newState = getState();\n if (newState !== 'destroyed') {\n const newStateDef = def.states[newState as UserState];\n if (newStateDef?.onSettled && runner) {\n const targetState = newStateDef.onSettled as FullState;\n runner.whenSettled(() => {\n if (getState() !== newState) return;\n transition(targetState);\n });\n }\n }\n },\n\n destroy(): void {\n if (getState() === 'destroyed') return;\n runner?.destroy();\n transition('destroyed');\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2JA,SAAgB,mBAMd,KACyD;CAGzD,MAAM,SAAS,IAAI,UAAU;CAC7B,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAAgE;EAC/G,OAAO,IAAI;EACX,SAAS,IAAI;EACd,CAAC;CAEF,MAAM,mBAA4B,cAAc,eAAe,KAAK,CAAC,QAAQ;CAE7E,MAAM,cAAc,YAA2B;AAC7C,SAAO,gBAAgB,EAAE,SAAS,CAAC;;AAGrC,QAAO;EACL,IAAI,WAAW;AACb,UAAO;;EAGT,KAAK,SAAwB;GAC3B,MAAM,QAAQ,UAAU;AACxB,OAAI,UAAU,YAAa;GAE3B,MAAM,UADW,IAAI,OAAO,QACF,KAAK,QAAQ;AAGvC,OAAI,CAAC,QAAS;AACd,WAAQ,SAAS;IACf,SAAS,YAAY;IACrB;IACA,aAAa,OAAkB,WAAW,GAAgB;IAC1D;IACA,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;IAC7B,CAAsD;GAEvD,MAAM,WAAW,UAAU;AAC3B,OAAI,aAAa,aAAa;IAC5B,MAAM,cAAc,IAAI,OAAO;AAC/B,QAAI,aAAa,aAAa,QAAQ;KACpC,MAAM,cAAc,YAAY;AAChC,YAAO,kBAAkB;AACvB,UAAI,UAAU,KAAK,SAAU;AAC7B,iBAAW,YAAY;OACvB;;;;EAKR,UAAgB;AACd,OAAI,UAAU,KAAK,YAAa;AAChC,WAAQ,SAAS;AACjB,cAAW,YAAY;;EAE1B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ActorSnapshot } from "./actor.js";
|
|
2
|
+
import { Machine } from "../machine.js";
|
|
3
|
+
|
|
4
|
+
//#region src/core/actors/create-transition-actor.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* A reducer-shaped actor: `(context, message) => context`.
|
|
7
|
+
*
|
|
8
|
+
* No finite states — the snapshot carries `value: 'active' | 'destroyed'`
|
|
9
|
+
* as a universal lifecycle marker rather than domain state. The interesting
|
|
10
|
+
* state is entirely in the context, which is reactive via `snapshot`.
|
|
11
|
+
*
|
|
12
|
+
* Use this when the actor has context that needs to be reactive but no
|
|
13
|
+
* meaningful state machine (e.g., a message-driven model with DOM side
|
|
14
|
+
* effects). For actors that need per-state behavior, use `createMachineActor`.
|
|
15
|
+
*/
|
|
16
|
+
interface TransitionActor<Context extends object, Message extends {
|
|
17
|
+
type: string;
|
|
18
|
+
}> extends Machine<ActorSnapshot<'active' | 'destroyed', Context>> {
|
|
19
|
+
send(message: Message): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a reducer-shaped actor from an initial context and a reducer function.
|
|
23
|
+
*
|
|
24
|
+
* The reducer receives the current context and a message and returns the next
|
|
25
|
+
* context. Returning the same reference (by identity) skips the signal update —
|
|
26
|
+
* so early-returning `context` unchanged is both the no-op and the optimization.
|
|
27
|
+
*
|
|
28
|
+
* Side effects (e.g. DOM mutations) may be performed inside the reducer.
|
|
29
|
+
* They run synchronously before the signal is updated.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const actor = createTransitionActor(
|
|
33
|
+
* { count: 0 },
|
|
34
|
+
* (context, message: { type: 'increment' }) => ({ count: context.count + 1 })
|
|
35
|
+
* );
|
|
36
|
+
*/
|
|
37
|
+
declare function createTransitionActor<Context extends object, Message extends {
|
|
38
|
+
type: string;
|
|
39
|
+
}>(initialContext: Context, reducer: (context: Context, message: Message) => Context): TransitionActor<Context, Message>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { TransitionActor, createTransitionActor };
|
|
42
|
+
//# sourceMappingURL=create-transition-actor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-transition-actor.d.ts","names":[],"sources":["../../../../src/core/actors/create-transition-actor.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;UAAiB,eAAA;EAA0D,IAAA;AAAA,WACjE,OAAA,CAAQ,aAAA,yBAAsC,OAAA;EACtD,IAAA,CAAK,OAAA,EAAS,OAAA;AAAA;;;;;;;AAuBhB;;;;;;;;;;iBAAgB,qBAAA;EAAgE,IAAA;AAAA,EAAA,CAC9E,cAAA,EAAgB,OAAA,EAChB,OAAA,GAAU,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAA,KAAY,OAAA,GAChD,eAAA,CAAgB,OAAA,EAAS,OAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { untrack, update } from "
|
|
2
|
-
import { createMachineCore } from "
|
|
3
|
-
//#region src/core/create-transition-actor.ts
|
|
1
|
+
import { untrack, update } from "../signals/primitives.js";
|
|
2
|
+
import { createMachineCore } from "../machine.js";
|
|
3
|
+
//#region src/core/actors/create-transition-actor.ts
|
|
4
4
|
/**
|
|
5
5
|
* Creates a reducer-shaped actor from an initial context and a reducer function.
|
|
6
6
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-transition-actor.js","names":[],"sources":["../../../../src/core/actors/create-transition-actor.ts"],"sourcesContent":["import type { Machine } from '../machine';\nimport { createMachineCore } from '../machine';\nimport { untrack, update } from '../signals/primitives';\nimport type { ActorSnapshot } from './actor';\n\n// =============================================================================\n// Definition types\n// =============================================================================\n\n/**\n * A reducer-shaped actor: `(context, message) => context`.\n *\n * No finite states — the snapshot carries `value: 'active' | 'destroyed'`\n * as a universal lifecycle marker rather than domain state. The interesting\n * state is entirely in the context, which is reactive via `snapshot`.\n *\n * Use this when the actor has context that needs to be reactive but no\n * meaningful state machine (e.g., a message-driven model with DOM side\n * effects). For actors that need per-state behavior, use `createMachineActor`.\n */\nexport interface TransitionActor<Context extends object, Message extends { type: string }>\n extends Machine<ActorSnapshot<'active' | 'destroyed', Context>> {\n send(message: Message): void;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Creates a reducer-shaped actor from an initial context and a reducer function.\n *\n * The reducer receives the current context and a message and returns the next\n * context. Returning the same reference (by identity) skips the signal update —\n * so early-returning `context` unchanged is both the no-op and the optimization.\n *\n * Side effects (e.g. DOM mutations) may be performed inside the reducer.\n * They run synchronously before the signal is updated.\n *\n * @example\n * const actor = createTransitionActor(\n * { count: 0 },\n * (context, message: { type: 'increment' }) => ({ count: context.count + 1 })\n * );\n */\nexport function createTransitionActor<Context extends object, Message extends { type: string }>(\n initialContext: Context,\n reducer: (context: Context, message: Message) => Context\n): TransitionActor<Context, Message> {\n const { snapshotSignal, getState, transition } = createMachineCore<\n 'active' | 'destroyed',\n ActorSnapshot<'active' | 'destroyed', Context>\n >({ value: 'active', context: initialContext });\n\n const getContext = (): Context => untrack(() => snapshotSignal.get().context);\n const setContext = (context: Context): void => update(snapshotSignal, { context });\n\n return {\n get snapshot() {\n return snapshotSignal;\n },\n\n send(message: Message): void {\n if (getState() === 'destroyed') return;\n const context = getContext();\n const newContext = reducer(context, message);\n if (newContext !== context) setContext(newContext);\n },\n\n destroy(): void {\n if (getState() === 'destroyed') return;\n transition('destroyed');\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,sBACd,gBACA,SACmC;CACnC,MAAM,EAAE,gBAAgB,UAAU,eAAe,kBAG/C;EAAE,OAAO;EAAU,SAAS;EAAgB,CAAC;CAE/C,MAAM,mBAA4B,cAAc,eAAe,KAAK,CAAC,QAAQ;CAC7E,MAAM,cAAc,YAA2B,OAAO,gBAAgB,EAAE,SAAS,CAAC;AAElF,QAAO;EACL,IAAI,WAAW;AACb,UAAO;;EAGT,KAAK,SAAwB;AAC3B,OAAI,UAAU,KAAK,YAAa;GAChC,MAAM,UAAU,YAAY;GAC5B,MAAM,aAAa,QAAQ,SAAS,QAAQ;AAC5C,OAAI,eAAe,QAAS,YAAW,WAAW;;EAGpD,UAAgB;AACd,OAAI,UAAU,KAAK,YAAa;AAChC,cAAW,YAAY;;EAE1B"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { ReadonlySignal, Signal } from "../signals/primitives.js";
|
|
2
|
+
|
|
3
|
+
//#region src/core/composition/create-composition.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Cleanup returned by a behavior. Behaviors may return:
|
|
6
|
+
* - `void` / `undefined` — no cleanup needed
|
|
7
|
+
* - A function — called on destroy (may return a Promise)
|
|
8
|
+
* - An object with `destroy()` — called on destroy (may return a Promise)
|
|
9
|
+
*/
|
|
10
|
+
type BehaviorCleanup = void | (() => void | Promise<void>) | {
|
|
11
|
+
destroy(): void | Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* A signal map keyed by the fields of `S`. Each field is a writable signal.
|
|
15
|
+
*
|
|
16
|
+
* Optional fields on `S` map to required signal slots whose value type
|
|
17
|
+
* includes `undefined`, ensuring every key has a signal even when the
|
|
18
|
+
* underlying value is absent.
|
|
19
|
+
*
|
|
20
|
+
* Used in two roles:
|
|
21
|
+
* - Engine-side **construction**: `Composition<S, C>` exposes its public
|
|
22
|
+
* surface as `StateSignals<S>` (everything writable) so external code
|
|
23
|
+
* can read or write any slot.
|
|
24
|
+
* - Behavior **input convenience**: a behavior that writes to every slot
|
|
25
|
+
* can type its setup state param as `StateSignals<{ ... }>` rather than
|
|
26
|
+
* spelling out per-slot `Signal<T>` types.
|
|
27
|
+
*
|
|
28
|
+
* Behaviors that mix read-only and writable slots type the setup param
|
|
29
|
+
* directly as a slot map (`{ x: Signal<T>; y: ReadonlySignal<U> }`)
|
|
30
|
+
* instead of going through `StateSignals<>`.
|
|
31
|
+
*/
|
|
32
|
+
type StateSignals<S extends object> = { [K in keyof S]-?: Signal<S[K]> };
|
|
33
|
+
/**
|
|
34
|
+
* A signal map keyed by the fields of `C`. Each field is a writable signal
|
|
35
|
+
* for a platform object or actor reference. Same dual role as
|
|
36
|
+
* `StateSignals<S>` — see its docblock.
|
|
37
|
+
*/
|
|
38
|
+
type ContextSignals<C extends object> = { [K in keyof C]-?: Signal<C[K]> };
|
|
39
|
+
/**
|
|
40
|
+
* Slot-map shape — a record where each value is at least a `ReadonlySignal`.
|
|
41
|
+
* `Signal<T>` is structurally a subtype of `ReadonlySignal<T>` (it adds
|
|
42
|
+
* `.set()`), so a writable slot satisfies this bound too.
|
|
43
|
+
*
|
|
44
|
+
* This is the bound used for behavior `state` / `context` slot maps. It
|
|
45
|
+
* lets a single behavior declare a *heterogeneous* slot map where some
|
|
46
|
+
* slots are `Signal<T>` (writable) and others are `ReadonlySignal<T>`
|
|
47
|
+
* (read-only) — making read/write intent explicit at the call site and
|
|
48
|
+
* giving body-level enforcement (TS rejects `.set()` on a read-only slot).
|
|
49
|
+
*/
|
|
50
|
+
type AnySlotMap = Record<PropertyKey, ReadonlySignal<unknown>>;
|
|
51
|
+
/**
|
|
52
|
+
* The deps object passed to each behavior by the composition.
|
|
53
|
+
*
|
|
54
|
+
* - `state` — slot map for state fields (reactive data). Per-slot read/
|
|
55
|
+
* write intent expressed via `Signal<T>` vs `ReadonlySignal<T>`.
|
|
56
|
+
* - `context` — slot map for platform objects and actor references.
|
|
57
|
+
* - `config` — static configuration, passed once at composition creation.
|
|
58
|
+
*/
|
|
59
|
+
interface BehaviorDeps<StateMap extends AnySlotMap, ContextMap extends AnySlotMap, Cfg extends object> {
|
|
60
|
+
state: StateMap;
|
|
61
|
+
context: ContextMap;
|
|
62
|
+
config: Cfg;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A behavior announces the state and context keys it needs alongside a
|
|
66
|
+
* `setup` function that receives deps (state, context, config) and
|
|
67
|
+
* returns an optional cleanup handle.
|
|
68
|
+
*
|
|
69
|
+
* The `stateKeys` / `contextKeys` declarations are the runtime expression
|
|
70
|
+
* of the behavior's contract — the caller (e.g. `createComposition`) uses
|
|
71
|
+
* them to know which signals to provide. The setup parameter type
|
|
72
|
+
* declares the *slot map* (per-slot `Signal<T>` vs `ReadonlySignal<T>`);
|
|
73
|
+
* together they form a complete contract.
|
|
74
|
+
*
|
|
75
|
+
* Manual `Behavior<>` literals (e.g. engine wrappers that forward keys
|
|
76
|
+
* from a wrapped behavior, or pass-through behaviors like `shareSignals`)
|
|
77
|
+
* opt out of exhaustiveness — the type alias is permissive (subset).
|
|
78
|
+
* Source behaviors should use `defineBehavior` to get exhaustiveness
|
|
79
|
+
* enforcement at the call site.
|
|
80
|
+
*/
|
|
81
|
+
interface Behavior<StateMap extends AnySlotMap = Empty, ContextMap extends AnySlotMap = Empty, Cfg extends object = Empty> {
|
|
82
|
+
/** State keys this behavior reads/writes. Subset of `keyof StateMap`. */
|
|
83
|
+
stateKeys: readonly (keyof StateMap)[];
|
|
84
|
+
/** Context keys this behavior reads/writes. Subset of `keyof ContextMap`. */
|
|
85
|
+
contextKeys: readonly (keyof ContextMap)[];
|
|
86
|
+
setup: (deps: BehaviorDeps<StateMap, ContextMap, Cfg>) => BehaviorCleanup;
|
|
87
|
+
}
|
|
88
|
+
/** A behavior with an unconstrained setup — used as a generic bound. */
|
|
89
|
+
type AnyBehavior = {
|
|
90
|
+
stateKeys: readonly PropertyKey[];
|
|
91
|
+
contextKeys: readonly PropertyKey[];
|
|
92
|
+
setup: (deps: any) => BehaviorCleanup;
|
|
93
|
+
};
|
|
94
|
+
/** Extract the deps type from a behavior's setup function. */
|
|
95
|
+
type DepsOf<B> = B extends {
|
|
96
|
+
setup: (deps: infer D, ...args: any[]) => any;
|
|
97
|
+
} ? D : never;
|
|
98
|
+
/**
|
|
99
|
+
* Empty-object fallback used when a behavior omits state, context, or config.
|
|
100
|
+
*
|
|
101
|
+
* Using `{}` rather than `object` is deliberate — `object & {x: T}` collapses
|
|
102
|
+
* to `{x: never}` under TS's union-to-intersection conversion in some inference
|
|
103
|
+
* contexts (likely a TS quirk around the `object` upper bound), whereas
|
|
104
|
+
* `{} & {x: T}` simplifies cleanly to `{x: T}`.
|
|
105
|
+
*/
|
|
106
|
+
type Empty = {};
|
|
107
|
+
/**
|
|
108
|
+
* Unwrap a signal map back to its state/context shape.
|
|
109
|
+
*
|
|
110
|
+
* Inferring through `{ get(): infer V }` rather than `Signal<infer V>`
|
|
111
|
+
* sidesteps `Signal`'s nominal/invariance behaviour — the conditional
|
|
112
|
+
* matches structurally on the read side, and `V` is inferred covariantly.
|
|
113
|
+
*/
|
|
114
|
+
type UnwrapSignals<M> = M extends object ? { [K in keyof M]: M[K] extends {
|
|
115
|
+
get(): infer V;
|
|
116
|
+
} ? V : never } : Empty;
|
|
117
|
+
/** Infer the state shape a behavior requires from its deps parameter. */
|
|
118
|
+
type InferBehaviorState<F> = DepsOf<F> extends {
|
|
119
|
+
state: infer M;
|
|
120
|
+
} ? UnwrapSignals<M> : Empty;
|
|
121
|
+
/** Infer the context shape a behavior requires from its deps parameter. */
|
|
122
|
+
type InferBehaviorContext<F> = DepsOf<F> extends {
|
|
123
|
+
context: infer M;
|
|
124
|
+
} ? UnwrapSignals<M> : Empty;
|
|
125
|
+
/** Infer the config shape a behavior requires from its deps parameter. */
|
|
126
|
+
type InferBehaviorConfig<F> = DepsOf<F> extends {
|
|
127
|
+
config: infer C extends object;
|
|
128
|
+
} ? C : Empty;
|
|
129
|
+
/**
|
|
130
|
+
* Recursively intersect a per-behavior projection across the tuple.
|
|
131
|
+
*
|
|
132
|
+
* Iterating over the tuple directly avoids `UnionToIntersection`'s
|
|
133
|
+
* function-contravariance trick, which produces unstable intersections
|
|
134
|
+
* (collapsing concrete fields to `never` or unrelated types) when one of the
|
|
135
|
+
* union members is the empty `{}` fallback.
|
|
136
|
+
*/
|
|
137
|
+
type IntersectBehaviors<Behaviors extends readonly AnyBehavior[], Project extends object> = Behaviors extends readonly [infer First extends AnyBehavior, ...infer Rest extends readonly AnyBehavior[]] ? Apply<Project, First> & IntersectBehaviors<Rest, Project> : Empty;
|
|
138
|
+
/**
|
|
139
|
+
* Apply a projection (one of the marker types below) to a single behavior.
|
|
140
|
+
* Encoded as a discriminated dispatch so the recursion above can stay generic
|
|
141
|
+
* and we don't have to write three near-identical recursive types.
|
|
142
|
+
*/
|
|
143
|
+
type Apply<Project extends object, F> = Project extends {
|
|
144
|
+
kind: 'state';
|
|
145
|
+
} ? InferBehaviorState<F> : Project extends {
|
|
146
|
+
kind: 'context';
|
|
147
|
+
} ? InferBehaviorContext<F> : Project extends {
|
|
148
|
+
kind: 'config';
|
|
149
|
+
} ? InferBehaviorConfig<F> : never;
|
|
150
|
+
type StateProjection = {
|
|
151
|
+
kind: 'state';
|
|
152
|
+
};
|
|
153
|
+
type ContextProjection = {
|
|
154
|
+
kind: 'context';
|
|
155
|
+
};
|
|
156
|
+
type ConfigProjection = {
|
|
157
|
+
kind: 'config';
|
|
158
|
+
};
|
|
159
|
+
/** Resolve the combined state shape from an array of behaviors (intersection of all requirements). */
|
|
160
|
+
type ResolveBehaviorState<Behaviors extends readonly AnyBehavior[]> = IntersectBehaviors<Behaviors, StateProjection> extends infer R extends object ? R : Empty;
|
|
161
|
+
/** Resolve the combined context shape from an array of behaviors (intersection of all requirements). */
|
|
162
|
+
type ResolveBehaviorContext<Behaviors extends readonly AnyBehavior[]> = IntersectBehaviors<Behaviors, ContextProjection> extends infer R extends object ? R : Empty;
|
|
163
|
+
/** Resolve the combined config shape from an array of behaviors (intersection of all requirements). */
|
|
164
|
+
type ResolveBehaviorConfig<Behaviors extends readonly AnyBehavior[]> = IntersectBehaviors<Behaviors, ConfigProjection> extends infer R extends object ? R : Empty;
|
|
165
|
+
/**
|
|
166
|
+
* True if any property in `T` collapsed to `undefined` or `never` — indicating
|
|
167
|
+
* a type conflict from intersecting incompatible behavior requirements.
|
|
168
|
+
*
|
|
169
|
+
* - Required conflicts: `{ v: number } & { v: string }` → `{ v: never }` — caught via `[never] extends [undefined]`
|
|
170
|
+
* - Optional conflicts: `{ v?: number } & { v?: string }` → `{ v?: undefined }` — caught directly
|
|
171
|
+
*/
|
|
172
|
+
type HasConflict<T extends object> = true extends { [K in keyof T]: [T[K]] extends [undefined] ? true : never }[keyof T] ? true : false;
|
|
173
|
+
/**
|
|
174
|
+
* Validate that a behavior composition has no type conflicts.
|
|
175
|
+
* Returns the behaviors tuple if valid, or an error message type if conflicts are detected.
|
|
176
|
+
*
|
|
177
|
+
* State, context, and config are all checked the same way — by intersecting
|
|
178
|
+
* each behavior's requirement and looking for collapsed fields. The
|
|
179
|
+
* intersection-based check applies the same rule to context as to state, so
|
|
180
|
+
* two behaviors that disagree on a context field's type (e.g. `Surface` vs
|
|
181
|
+
* `VideoSurface`) surface a conflict at compose time. The prior subtype-based
|
|
182
|
+
* approach for owners is gone — the unified rule is simpler and catches the
|
|
183
|
+
* cases where two behaviors silently agreed on a wider supertype.
|
|
184
|
+
*/
|
|
185
|
+
type ValidateComposition<Behaviors extends readonly AnyBehavior[]> = HasConflict<ResolveBehaviorState<Behaviors>> extends true ? 'Error: behaviors have conflicting state types' : HasConflict<ResolveBehaviorContext<Behaviors>> extends true ? 'Error: behaviors have conflicting context types' : HasConflict<ResolveBehaviorConfig<Behaviors>> extends true ? 'Error: behaviors have conflicting config types' : [...Behaviors];
|
|
186
|
+
/**
|
|
187
|
+
* A composition of behaviors with shared state and context signal maps.
|
|
188
|
+
*/
|
|
189
|
+
interface Composition<S extends object, C extends object> {
|
|
190
|
+
state: StateSignals<S>;
|
|
191
|
+
context: ContextSignals<C>;
|
|
192
|
+
destroy(): Promise<void>;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Options for `createComposition`.
|
|
196
|
+
*
|
|
197
|
+
* Composition derives the state and context signal maps from each
|
|
198
|
+
* behavior's declared `stateKeys` / `contextKeys`; `initialState` and
|
|
199
|
+
* `initialContext` seed those signals at creation time. Any unseeded
|
|
200
|
+
* signal starts as `undefined`.
|
|
201
|
+
*/
|
|
202
|
+
interface CompositionOptions<S extends object, C extends object, Cfg extends object> {
|
|
203
|
+
/** Static configuration passed to every behavior. */
|
|
204
|
+
config?: Cfg;
|
|
205
|
+
/** Initial values for state signals — any subset of `keyof S`. */
|
|
206
|
+
initialState?: Partial<S>;
|
|
207
|
+
/** Initial values for context signals — any subset of `keyof C`. */
|
|
208
|
+
initialContext?: Partial<C>;
|
|
209
|
+
}
|
|
210
|
+
declare function createComposition<const Behaviors extends readonly AnyBehavior[]>(behaviors: ValidateComposition<Behaviors>, options?: CompositionOptions<ResolveBehaviorState<Behaviors>, ResolveBehaviorContext<Behaviors>, ResolveBehaviorConfig<Behaviors>>): Composition<ResolveBehaviorState<Behaviors>, ResolveBehaviorContext<Behaviors>>;
|
|
211
|
+
/**
|
|
212
|
+
* Compose-time exhaustiveness check.
|
|
213
|
+
*
|
|
214
|
+
* Adds a phantom error tag to the parameter shape when `Keys` does not
|
|
215
|
+
* cover every key in `Slot`. The user's value won't satisfy the phantom
|
|
216
|
+
* field requirement, so TS surfaces the failure at the call site with a
|
|
217
|
+
* descriptive message. When exhaustive, the tag is `Empty` and adds no
|
|
218
|
+
* constraint.
|
|
219
|
+
*/
|
|
220
|
+
type ExhaustiveKeys<Keys extends readonly PropertyKey[], Slot extends object, Name extends string> = [keyof Slot] extends [Keys[number]] ? Empty : { [K in `Error: ${Name}Keys must list every key in the typed slice`]: Exclude<keyof Slot, Keys[number]> };
|
|
221
|
+
/**
|
|
222
|
+
* Typed factory for behaviors that enforces single-behavior key/param
|
|
223
|
+
* consistency: declared `stateKeys` must equal `keyof S` (where `S` is
|
|
224
|
+
* inferred from the setup's `state` parameter type), and same for
|
|
225
|
+
* `contextKeys` / `C`.
|
|
226
|
+
*
|
|
227
|
+
* The `const` modifier on `SK` / `CK` captures literal tuples so e.g.
|
|
228
|
+
* `stateKeys: ['preload']` infers as `readonly ['preload']`, no `as
|
|
229
|
+
* const` needed at the call site.
|
|
230
|
+
*
|
|
231
|
+
* Cross-behavior consistency at `createComposition` is unchanged — the
|
|
232
|
+
* existing `IntersectBehaviors` machinery still runs over each
|
|
233
|
+
* behavior's setup param type.
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```ts
|
|
237
|
+
* export const syncPreload = defineBehavior({
|
|
238
|
+
* stateKeys: ['preload'],
|
|
239
|
+
* contextKeys: ['mediaElement'],
|
|
240
|
+
* setup: ({ state, context }: {
|
|
241
|
+
* state: StateSignals<{ preload?: 'auto' | 'metadata' | 'none' }>;
|
|
242
|
+
* context: ContextSignals<{ mediaElement?: HTMLMediaElement | undefined }>;
|
|
243
|
+
* }) => { ... },
|
|
244
|
+
* });
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
/**
|
|
248
|
+
* Deps shape for a behavior whose deps slot is empty (no keys). When a
|
|
249
|
+
* slot is empty, the corresponding deps field is optional — callers
|
|
250
|
+
* (typically tests) can omit it, and it defaults to `{}` at runtime via
|
|
251
|
+
* `createComposition`.
|
|
252
|
+
*
|
|
253
|
+
* When a slot has at least one key, the behavior reads `state.foo` /
|
|
254
|
+
* `context.bar` / `config.baz` and we need the field to be required so
|
|
255
|
+
* the access is type-safe.
|
|
256
|
+
*/
|
|
257
|
+
type RequireIfNonEmpty<Key extends string, T extends object> = keyof T extends never ? { [K in Key]?: T } : { [K in Key]: T };
|
|
258
|
+
type DepsForCfg<StateMap extends AnySlotMap, ContextMap extends AnySlotMap, Cfg extends object> = RequireIfNonEmpty<'state', StateMap> & RequireIfNonEmpty<'context', ContextMap> & RequireIfNonEmpty<'config', Cfg>;
|
|
259
|
+
declare function defineBehavior<StateMap extends AnySlotMap = Empty, ContextMap extends AnySlotMap = Empty, Cfg extends object = Empty, const SK extends readonly (keyof StateMap)[] = readonly [], const CK extends readonly (keyof ContextMap)[] = readonly [], R extends BehaviorCleanup = BehaviorCleanup>(behavior: {
|
|
260
|
+
stateKeys: SK;
|
|
261
|
+
contextKeys: CK;
|
|
262
|
+
setup: (deps: {
|
|
263
|
+
state: StateMap;
|
|
264
|
+
context: ContextMap;
|
|
265
|
+
config: Cfg;
|
|
266
|
+
}) => R;
|
|
267
|
+
} & ExhaustiveKeys<SK, StateMap, 'state'> & ExhaustiveKeys<CK, ContextMap, 'context'>): {
|
|
268
|
+
stateKeys: SK;
|
|
269
|
+
contextKeys: CK;
|
|
270
|
+
setup: (deps: DepsForCfg<StateMap, ContextMap, Cfg>) => R;
|
|
271
|
+
};
|
|
272
|
+
//#endregion
|
|
273
|
+
export { Behavior, BehaviorCleanup, BehaviorDeps, Composition, CompositionOptions, ContextSignals, InferBehaviorConfig, InferBehaviorContext, InferBehaviorState, ResolveBehaviorConfig, ResolveBehaviorContext, ResolveBehaviorState, StateSignals, createComposition, defineBehavior };
|
|
274
|
+
//# sourceMappingURL=create-composition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-composition.d.ts","names":[],"sources":["../../../../src/core/composition/create-composition.ts"],"mappings":";;;;;AAQA;;;;KAAY,eAAA,wBAAuC,OAAA;EAAmB,OAAA,WAAkB,OAAA;AAAA;;;AAqBxF;;;;;;;;;;;;;;;;;KAAY,YAAA,mCAA+C,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,CAAA;;;;;;KAO9D,cAAA,mCAAiD,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,CAAA;;;;;;;AAa5E;;;;;KAAY,UAAA,GAAa,MAAA,CAAO,WAAA,EAAa,cAAA;;;;;;;;AAU7C;UAAiB,YAAA,kBAA8B,UAAA,qBAA+B,UAAA;EAC5E,KAAA,EAAO,QAAA;EACP,OAAA,EAAS,UAAA;EACT,MAAA,EAAQ,GAAA;AAAA;;;;;;;;;;;;;;;;;;UAoBO,QAAA,kBACE,UAAA,GAAa,KAAA,qBACX,UAAA,GAAa,KAAA,uBACX,KAAA;EAHE;EAMvB,SAAA,kBAA2B,QAAA;EALV;EAOjB,WAAA,kBAA6B,UAAA;EAC7B,KAAA,GAAQ,IAAA,EAAM,YAAA,CAAa,QAAA,EAAU,UAAA,EAAY,GAAA,MAAS,eAAA;AAAA;;KAQvD,WAAA;EACH,SAAA,WAAoB,WAAA;EACpB,WAAA,WAAsB,WAAA;EACtB,KAAA,GAAQ,IAAA,UAAc,eAAA;AAAA;;KAInB,MAAA,MAAY,CAAA;EAAY,KAAA,GAAQ,IAAA,cAAkB,IAAA;AAAA,IAAwB,CAAA;;;;;;;;;KAW1E,KAAA;;;;;;;;KASA,aAAA,MAAmB,CAAA,gCAAiC,CAAA,GAAI,CAAA,CAAE,CAAA;EAAa,GAAA;AAAA,IAAmB,CAAA,aAAc,KAAA;AAlC5G;AAAA,KAqCW,kBAAA,MAAwB,MAAA,CAAO,CAAA;EAAa,KAAA;AAAA,IAAmB,aAAA,CAAc,CAAA,IAAK,KAAA;;KAGlF,oBAAA,MAA0B,MAAA,CAAO,CAAA;EAAa,OAAA;AAAA,IAAqB,aAAA,CAAc,CAAA,IAAK,KAAA;;KAGtF,mBAAA,MAAyB,MAAA,CAAO,CAAA;EAAa,MAAA;AAAA,IAAmC,CAAA,GAAI,KAAA;;;;;;AAjCzD;;;KA2ClC,kBAAA,4BAA8C,WAAA,8BAAyC,SAAA,uCACtE,WAAA,iCACW,WAAA,MAE7B,KAAA,CAAM,OAAA,EAAS,KAAA,IAAS,kBAAA,CAAmB,IAAA,EAAM,OAAA,IACjD,KAAA;;;;;;KAOC,KAAA,8BAAmC,OAAA;EAAkB,IAAA;AAAA,IACtD,kBAAA,CAAmB,CAAA,IACnB,OAAA;EAAkB,IAAA;AAAA,IAChB,oBAAA,CAAqB,CAAA,IACrB,OAAA;EAAkB,IAAA;AAAA,IAChB,mBAAA,CAAoB,CAAA;AAAA,KAGvB,eAAA;EAAoB,IAAA;AAAA;AAAA,KACpB,iBAAA;EAAsB,IAAA;AAAA;AAAA,KACtB,gBAAA;EAAqB,IAAA;AAAA;;KAGd,oBAAA,4BAAgD,WAAA,MAC1D,kBAAA,CAAmB,SAAA,EAAW,eAAA,mCAAkD,CAAA,GAAI,KAAA;;KAG1E,sBAAA,4BAAkD,WAAA,MAC5D,kBAAA,CAAmB,SAAA,EAAW,iBAAA,mCAAoD,CAAA,GAAI,KAAA;;KAG5E,qBAAA,4BAAiD,WAAA,MAC3D,kBAAA,CAAmB,SAAA,EAAW,gBAAA,mCAAmD,CAAA,GAAI,KAAA;;;;;;;AAlDvF;KA2DK,WAAA,gDACS,CAAA,IAAK,CAAA,CAAE,CAAA,8CACb,CAAA;;;;;;;;;;;;;KAoBH,mBAAA,4BAA+C,WAAA,MAClD,WAAA,CAAY,oBAAA,CAAqB,SAAA,oEAE7B,WAAA,CAAY,sBAAA,CAAuB,SAAA,sEAEjC,WAAA,CAAY,qBAAA,CAAsB,SAAA,yEAE5B,SAAA;;;;UASG,WAAA;EACf,KAAA,EAAO,YAAA,CAAa,CAAA;EACpB,OAAA,EAAS,cAAA,CAAe,CAAA;EACxB,OAAA,IAAW,OAAA;AAAA;;;;;;;;;UAWI,kBAAA;EA5GwD;EA8GvE,MAAA,GAAS,GAAA;EA9GkF;EAgH3F,YAAA,GAAe,OAAA,CAAQ,CAAA;EAhH8E;EAkHrG,cAAA,GAAiB,OAAA,CAAQ,CAAA;AAAA;AAAA,iBA2DX,iBAAA,kCAAmD,WAAA,GAAA,CACjE,SAAA,EAAW,mBAAA,CAAoB,SAAA,GAC/B,OAAA,GAAU,kBAAA,CACR,oBAAA,CAAqB,SAAA,GACrB,sBAAA,CAAuB,SAAA,GACvB,qBAAA,CAAsB,SAAA,KAEvB,WAAA,CAAY,oBAAA,CAAqB,SAAA,GAAY,sBAAA,CAAuB,SAAA;AAlK9D;;;;;;;;;AAAA,KAgOJ,cAAA,uBAAqC,WAAA,uDAClC,IAAA,WACG,IAAA,YACP,KAAA,qBACkB,IAAA,gDAAoD,OAAA,OAAc,IAAA,EAAM,IAAA;;;;;;;;;;;;;;;;;AAxNjE;;;;;AAGA;;;;;AACE;;;;;AAI/B;;;;;AAJ+B,KA0P1B,iBAAA,+CAAgE,CAAA,yBACzD,GAAA,IAAO,CAAA,aACP,GAAA,GAAM,CAAA;AAAA,KAEb,UAAA,kBAA4B,UAAA,qBAA+B,UAAA,wBAAkC,iBAAA,UAEhG,QAAA,IAEA,iBAAA,YAA6B,UAAA,IAC7B,iBAAA,WAA4B,GAAA;AAAA,iBAEd,cAAA,kBACG,UAAA,GAAa,KAAA,qBACX,UAAA,GAAa,KAAA,uBACX,KAAA,mCACY,QAAA,oDACA,UAAA,6BACvB,eAAA,GAAkB,eAAA,CAAA,CAE5B,QAAA;EACE,SAAA,EAAW,EAAA;EACX,WAAA,EAAa,EAAA;EACb,KAAA,GAAQ,IAAA;IAAQ,KAAA,EAAO,QAAA;IAAU,OAAA,EAAS,UAAA;IAAY,MAAA,EAAQ,GAAA;EAAA,MAAU,CAAA;AAAA,IACtE,cAAA,CAAe,EAAA,EAAI,QAAA,aACrB,cAAA,CAAe,EAAA,EAAI,UAAA;EAErB,SAAA,EAAW,EAAA;EACX,WAAA,EAAa,EAAA;EACb,KAAA,GAAQ,IAAA,EAAM,UAAA,CAAW,QAAA,EAAU,UAAA,EAAY,GAAA,MAAS,CAAA;AAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { signal } from "../signals/primitives.js";
|
|
2
|
+
//#region src/core/composition/create-composition.ts
|
|
3
|
+
/**
|
|
4
|
+
* Create a composition from a set of behaviors.
|
|
5
|
+
*
|
|
6
|
+
* Composition unions the behaviors' declared `stateKeys` / `contextKeys`
|
|
7
|
+
* to know which signals to create. Each signal is seeded from
|
|
8
|
+
* `initialState` / `initialContext` when supplied, defaulting to
|
|
9
|
+
* `undefined`. Behaviors are responsible for writing their own slots
|
|
10
|
+
* once their preconditions are met.
|
|
11
|
+
*
|
|
12
|
+
* Cross-behavior type conflicts (e.g. two behaviors disagreeing on a
|
|
13
|
+
* field's type) surface as a compose-time type error via
|
|
14
|
+
* `ValidateComposition`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const composition = createComposition([resolvePresentation, switchVideoTrack], {
|
|
19
|
+
* config: { parsePresentation: parseMultivariantPlaylist, initialBandwidth: 2_000_000 },
|
|
20
|
+
* initialState: { bandwidthState: { fastEstimate: 0, ... } },
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Create a typed signal map for a given set of keys, seeded from an
|
|
26
|
+
* optional partial initial value.
|
|
27
|
+
*
|
|
28
|
+
* Pipeline: `Set` dedupes the iterable (insertion order preserved, so
|
|
29
|
+
* first occurrence wins) → `Object.fromEntries` materializes one
|
|
30
|
+
* `signal()` per unique key, seeded from `initial[key]` or `undefined`.
|
|
31
|
+
*
|
|
32
|
+
* Per-key value types live in TypeScript only — at runtime every signal
|
|
33
|
+
* is `Signal<unknown>`. The boundary cast at the return narrows the wide
|
|
34
|
+
* `Record<PropertyKey, Signal<unknown>>` shape to the caller's expected
|
|
35
|
+
* per-key types from `S`.
|
|
36
|
+
*
|
|
37
|
+
* Used by `createComposition` to derive engine state/context maps from
|
|
38
|
+
* the union of behaviors' declared `stateKeys` / `contextKeys`.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* interface State { count?: number; label?: string }
|
|
43
|
+
* const state = buildSignalMap<State>(['count', 'label'], { count: 5 });
|
|
44
|
+
* state.count.get(); // 5
|
|
45
|
+
* state.label.get(); // undefined
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
function buildSignalMap(keys, initial) {
|
|
49
|
+
const init = initial;
|
|
50
|
+
const uniqueKeys = new Set(keys);
|
|
51
|
+
return Object.fromEntries([...uniqueKeys].map((key) => [key, signal(init[key])]));
|
|
52
|
+
}
|
|
53
|
+
function createComposition(behaviors, options) {
|
|
54
|
+
const validBehaviors = behaviors;
|
|
55
|
+
const state = buildSignalMap(validBehaviors.flatMap((b) => b.stateKeys), options?.initialState ?? {});
|
|
56
|
+
const context = buildSignalMap(validBehaviors.flatMap((b) => b.contextKeys), options?.initialContext ?? {});
|
|
57
|
+
const deps = {
|
|
58
|
+
state,
|
|
59
|
+
context,
|
|
60
|
+
config: options?.config ?? {}
|
|
61
|
+
};
|
|
62
|
+
const cleanups = validBehaviors.map((behavior) => behavior.setup(deps));
|
|
63
|
+
return {
|
|
64
|
+
state,
|
|
65
|
+
context,
|
|
66
|
+
async destroy() {
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const cleanup of cleanups) {
|
|
69
|
+
if (cleanup == null) continue;
|
|
70
|
+
if (typeof cleanup === "function") results.push(cleanup());
|
|
71
|
+
else if ("destroy" in cleanup) results.push(cleanup.destroy());
|
|
72
|
+
}
|
|
73
|
+
await Promise.all(results);
|
|
74
|
+
for (const sig of Object.values(state)) sig.set(void 0);
|
|
75
|
+
for (const sig of Object.values(context)) sig.set(void 0);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function defineBehavior(behavior) {
|
|
80
|
+
return behavior;
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { createComposition, defineBehavior };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=create-composition.js.map
|