Primitives / foldkit-primitives/device

permissions

function · packages/primitives/src/device/permissions.ts:78

function permissions<const Name extends string>(config: {
  readonly name: Name
  readonly create?:
    ((navigator: Navigator) => PermissionsHandle | null) | undefined
}): Bundle.Bundle<
  Name,
  { readonly names: ReadonlyArray<string> },
  {
    readonly states: { readonly [x: string]: 'denied' | 'granted' | 'prompt' }
    readonly lastError: string | null
  },
  | { readonly _tag: 'Cleared' }
  | {
      readonly _tag: 'Changed'
      readonly name: string
      readonly state: 'denied' | 'granted' | 'prompt'
    }
  | { readonly _tag: 'Failed'; readonly message: string }
  | {
      readonly _tag: 'Snapshot'
      readonly states: { readonly [x: string]: 'denied' | 'granted' | 'prompt' }
    },
  never,
  never,
  ManagedResource.ManagedResourceService<'permissions'>,
  void,
  Readonly<{
    watch: ManagedResource.Entry<
      PermissionsModel,
      PermissionsMessage,
      Option.Option<ReadonlyArray<string>>,
      Acquired,
      WatchService,
      (acquired: Acquired) => PermissionsMessage
    >
  }>,
  {}
>

Permission states as a bundle factory: queried on placement, kept current by each status object's onchange. A resource holds the status objects (they cannot live in the Model); its queue feeds the subscription, and release detaches every handler. An unknown permission name fails the acquire; an unknown state string fails it too — both become Failed, never Model facts.