{"version":3,"sources":["../../../../src/sensors/useDisplayMedia/core.ts"],"sourcesContent":["import { batch, observable, ObservableHint } from \"@legendapp/state\";\nimport type { OpaqueObject } from \"@legendapp/state\";\nimport {\n  createSupported,\n  onMount,\n  type DeepMaybeObservable,\n  type ReadonlyObservable,\n  type Supportable,\n} from \"@usels/core\";\nimport { defaultNavigator } from \"@shared/configurable\";\n\nexport interface UseDisplayMediaOptions {\n  /** Video constraint. Default: true */\n  video?: boolean | MediaTrackConstraints;\n  /** Audio constraint. Default: false */\n  audio?: boolean | MediaTrackConstraints;\n  /** Auto-start on mount. Default: false */\n  immediate?: boolean;\n}\n\nexport interface UseDisplayMediaReturn extends Supportable {\n  /** Current display media stream */\n  stream$: ReadonlyObservable<OpaqueObject<MediaStream> | null>;\n  /** Whether stream is currently active */\n  enabled$: ReadonlyObservable<boolean>;\n  /** Start screen sharing. Throws if getDisplayMedia fails. */\n  start: () => Promise<MediaStream>;\n  /** Stop screen sharing */\n  stop: () => void;\n}\n\n/**\n * Framework-agnostic reactive wrapper around\n * [MediaDevices.getDisplayMedia()](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia).\n *\n * Provides start/stop controls and automatically handles the browser's\n * \"Stop sharing\" button via a per-track `ended` listener.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createDisplayMedia(\n  options?: DeepMaybeObservable<UseDisplayMediaOptions>\n): UseDisplayMediaReturn {\n  const opts$ = observable(options);\n\n  const isSupported$ = createSupported(() => !!defaultNavigator?.mediaDevices?.getDisplayMedia);\n\n  const stream$ = observable<OpaqueObject<MediaStream> | null>(null);\n  const enabled$ = observable(false);\n\n  const stop = () => {\n    const currentStream = stream$.peek();\n    if (currentStream) {\n      currentStream.getTracks().forEach((t) => t.stop());\n    }\n    batch(() => {\n      stream$.set(null);\n      enabled$.set(false);\n    });\n  };\n\n  const start = async (): Promise<MediaStream> => {\n    if (!isSupported$.peek() || !defaultNavigator?.mediaDevices?.getDisplayMedia) {\n      throw new Error(\"getDisplayMedia is not supported\");\n    }\n    const existing = stream$.peek();\n    if (existing) return existing;\n\n    stop();\n\n    try {\n      const video = opts$.peek()?.video ?? true;\n      const audio = opts$.peek()?.audio ?? false;\n\n      const mediaStream = await defaultNavigator.mediaDevices.getDisplayMedia({\n        video,\n        audio,\n      });\n\n      // Listen for track ended (user clicks browser's \"Stop sharing\")\n      mediaStream.getTracks().forEach((track) => {\n        track.addEventListener(\"ended\", stop, { once: true });\n      });\n\n      batch(() => {\n        stream$.set(ObservableHint.opaque(mediaStream));\n        enabled$.set(true);\n      });\n      return mediaStream;\n    } catch (err) {\n      batch(() => {\n        stream$.set(null);\n        enabled$.set(false);\n      });\n      throw err;\n    }\n  };\n\n  onMount(() => {\n    if (opts$.peek()?.immediate) {\n      start();\n    }\n    return () => {\n      stop();\n    };\n  });\n\n  return {\n    isSupported$,\n    stream$: stream$ as ReadonlyObservable<OpaqueObject<MediaStream> | null>,\n    enabled$: enabled$ as ReadonlyObservable<boolean>,\n    start,\n    stop,\n  };\n}\n"],"mappings":"AAAA,SAAS,OAAO,YAAY,sBAAsB;AAElD;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP,SAAS,wBAAwB;AAAA;AA8B1B,SAAS,mBACd,SACuB;AACvB,QAAM,QAAQ,WAAW,OAAO;AAEhC,QAAM,eAAe,gBAAgB,MAAM,CAAC,CAAC,kBAAkB,cAAc,eAAe;AAE5F,QAAM,UAAU,WAA6C,IAAI;AACjE,QAAM,WAAW,WAAW,KAAK;AAEjC,QAAM,OAAO,MAAM;AACjB,UAAM,gBAAgB,QAAQ,KAAK;AACnC,QAAI,eAAe;AACjB,oBAAc,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACnD;AACA,UAAM,MAAM;AACV,cAAQ,IAAI,IAAI;AAChB,eAAS,IAAI,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,YAAkC;AAC9C,QAAI,CAAC,aAAa,KAAK,KAAK,CAAC,kBAAkB,cAAc,iBAAiB;AAC5E,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,UAAM,WAAW,QAAQ,KAAK;AAC9B,QAAI,SAAU,QAAO;AAErB,SAAK;AAEL,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,GAAG,SAAS;AACrC,YAAM,QAAQ,MAAM,KAAK,GAAG,SAAS;AAErC,YAAM,cAAc,MAAM,iBAAiB,aAAa,gBAAgB;AAAA,QACtE;AAAA,QACA;AAAA,MACF,CAAC;AAGD,kBAAY,UAAU,EAAE,QAAQ,CAAC,UAAU;AACzC,cAAM,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,MACtD,CAAC;AAED,YAAM,MAAM;AACV,gBAAQ,IAAI,eAAe,OAAO,WAAW,CAAC;AAC9C,iBAAS,IAAI,IAAI;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,MAAM;AACV,gBAAQ,IAAI,IAAI;AAChB,iBAAS,IAAI,KAAK;AAAA,MACpB,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,UAAQ,MAAM;AACZ,QAAI,MAAM,KAAK,GAAG,WAAW;AAC3B,YAAM;AAAA,IACR;AACA,WAAO,MAAM;AACX,WAAK;AAAA,IACP;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}