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.