Primitives / foldkit-primitives/device
mediaStream
function · packages/primitives/src/device/media-stream.ts:73
function mediaStream<const Name extends string>(config: {
readonly name: Name
readonly request?:
| ((constraints: MediaStreamConstraints) => Promise<MediaStreamHandle>)
| undefined
}): Bundle.Bundle<
Name,
{ readonly audio: boolean; readonly video: boolean },
{
readonly status: 'denied' | 'idle' | 'requesting' | 'live'
readonly lastError: string | null
},
| { readonly _tag: 'Denied' }
| { readonly _tag: 'Live' }
| { readonly _tag: 'Failed'; readonly message: string }
| { readonly _tag: 'Started' }
| { readonly _tag: 'Stopped' }
| { readonly _tag: 'Ended' },
never,
never,
never,
void,
{
stream: ManagedResource.Entry<
{
readonly status: 'denied' | 'idle' | 'requesting' | 'live'
readonly lastError: string | null
},
| { readonly _tag: 'Denied' }
| { readonly _tag: 'Live' }
| { readonly _tag: 'Failed'; readonly message: string }
| { readonly _tag: 'Started' }
| { readonly _tag: 'Stopped' }
| { readonly _tag: 'Ended' },
Option.Option<{ readonly audio: boolean; readonly video: boolean }>,
MediaStreamHandle,
ManagedResource.ManagedResourceService<'media-stream'>,
() => { readonly _tag: 'Live' }
>
},
{}
>A camera/mic stream as a bundle factory: one live MediaStream held in a
Managed Resource while the Model asks for it. Started requests,
Stopped releases; denial parks at denied (actionable UI), any other
acquire failure parks at idle with the error noted — both clear
requirements, so a failing device never spins an acquire loop. Release
stops every track. No media-devices API fails the acquire instead of
throwing.