{"version":3,"file":"index.js","names":["unavailable"],"sources":["esm/platform/audio/index.js"],"sourcesContent":["import { Audio as unavailable } from \"./unavailable\";\nimport { validateCallback } from \"../validateCallback\";\nimport { AudioPlayer, createPlayer } from \"./player\";\nlet player;\nlet playbackError;\nlet permission = \"undetermined\";\nlet openingRecording = false;\nlet recording;\nconst remoteListeners = /* @__PURE__ */ new Set();\nlet remoteInstalled = false;\nasync function getRecordingPermissionStatus() {\n  if (typeof window === \"undefined\" || !navigator.mediaDevices?.getUserMedia)\n    return \"denied\";\n  try {\n    const status = await navigator.permissions.query({\n      name: \"microphone\"\n    });\n    permission = status.state === \"prompt\" ? \"undetermined\" : status.state;\n  } catch {\n  }\n  return permission;\n}\nasync function microphone() {\n  if (!navigator.mediaDevices?.getUserMedia)\n    throw new Error(\"Audio: microphone recording is unavailable\");\n  try {\n    const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n    permission = \"granted\";\n    return stream;\n  } catch (error) {\n    if (error.name === \"NotAllowedError\") permission = \"denied\";\n    throw error;\n  }\n}\nasync function requestRecordingPermission() {\n  if (typeof window === \"undefined\" || !navigator.mediaDevices?.getUserMedia)\n    return \"denied\";\n  try {\n    const stream = await microphone();\n    stream.getTracks().forEach((track) => track.stop());\n  } catch (error) {\n    if (error.name !== \"NotAllowedError\") throw error;\n  }\n  return permission;\n}\nfunction playbackStatus() {\n  if (!player) return { state: \"idle\", positionMs: 0 };\n  return {\n    state: player.error || playbackError ? \"failed\" : player.ended ? \"ended\" : player.readyState < 2 ? \"loading\" : player.paused ? \"paused\" : \"playing\",\n    uri: player.src,\n    positionMs: player.currentTime * 1e3,\n    ...Number.isFinite(player.duration) && { durationMs: player.duration * 1e3 },\n    ...playbackError && { error: playbackError }\n  };\n}\nfunction requirePlayer() {\n  if (!player) throw new Error(\"Audio: the playback operation is not ready\");\n  return player;\n}\nfunction clearPlayer() {\n  clearNowPlaying();\n  if (player) {\n    player.pause();\n    player.removeAttribute(\"src\");\n    player.load();\n    player = void 0;\n  }\n  playbackError = void 0;\n}\nfunction recordingDuration() {\n  if (!recording) return 0;\n  return recording.duration + (recording.recorder.state === \"recording\" ? performance.now() - recording.since : 0);\n}\nfunction recordingStatus() {\n  if (!recording) return { state: \"idle\", durationMs: 0 };\n  if (recording.error) throw recording.error;\n  return {\n    state: recording.recorder.state === \"paused\" ? \"paused\" : recording.recorder.state === \"recording\" ? \"recording\" : \"idle\",\n    durationMs: recordingDuration()\n  };\n}\nfunction requireRecorder() {\n  if (!recording || recording.stopping || recording.recorder.state === \"inactive\")\n    throw recording?.error ?? new Error(\"Audio: the recording operation is not ready\");\n  return recording;\n}\nfunction recorderChange(event) {\n  const session = requireRecorder();\n  const target = event === \"pause\" ? \"paused\" : \"recording\";\n  if (session.recorder.state === target) return Promise.resolve(recordingStatus());\n  return new Promise((resolve, reject) => {\n    const cleanup = () => {\n      session.recorder.removeEventListener(event, done);\n      session.recorder.removeEventListener(\"error\", failed);\n    };\n    const done = () => {\n      cleanup();\n      resolve(recordingStatus());\n    };\n    const failed = () => {\n      cleanup();\n      reject(session.error ?? new Error(\"Audio: recording failed\"));\n    };\n    session.recorder.addEventListener(event, done, { once: true });\n    session.recorder.addEventListener(\"error\", failed, { once: true });\n    if (event === \"pause\") {\n      session.duration += performance.now() - session.since;\n      session.recorder.pause();\n    } else {\n      session.since = performance.now();\n      session.recorder.resume();\n    }\n  });\n}\nfunction mediaSession() {\n  if (!navigator.mediaSession) throw new Error(\"Audio: Media Session is unavailable\");\n  return navigator.mediaSession;\n}\nfunction clearNowPlaying() {\n  if (typeof window === \"undefined\" || !navigator.mediaSession) return;\n  const session = navigator.mediaSession;\n  if (remoteInstalled)\n    for (const action of [\"play\", \"pause\", \"seekto\"])\n      session.setActionHandler(action, null);\n  remoteInstalled = false;\n  session.metadata = null;\n  session.playbackState = \"none\";\n}\nfunction syncNowPlaying() {\n  if (!navigator.mediaSession?.metadata || !player) return;\n  navigator.mediaSession.playbackState = player.paused || player.ended ? \"paused\" : \"playing\";\n}\nasync function remote(event) {\n  if (!player || !navigator.mediaSession?.metadata) return;\n  const audio = player;\n  try {\n    if (event.type === \"play\") await Audio.resume();\n    else if (event.type === \"pause\") await Audio.pause();\n    else await Audio.seek(event.positionMs);\n  } catch {\n    return;\n  }\n  if (player !== audio) return;\n  syncNowPlaying();\n  for (const listener of [...remoteListeners]) listener(event);\n}\nfunction installRemote() {\n  if (remoteInstalled) return;\n  const session = mediaSession();\n  session.setActionHandler(\"play\", () => remote({ type: \"play\" }));\n  session.setActionHandler(\"pause\", () => remote({ type: \"pause\" }));\n  session.setActionHandler(\n    \"seekto\",\n    (event) => remote({ type: \"seek\", positionMs: (event.seekTime ?? 0) * 1e3 })\n  );\n  remoteInstalled = true;\n}\nconst Audio = Object.freeze({\n  getRecordingPermissionStatus,\n  requestRecordingPermission,\n  play: async (uri) => {\n    if (typeof window === \"undefined\") return unavailable.play(uri);\n    if (openingRecording || recording)\n      throw new Error(\"Audio.play: stop the current recording first\");\n    const url = new URL(uri, document.baseURI);\n    if (![\"https:\", \"http:\", \"blob:\", \"data:\"].includes(url.protocol))\n      throw new Error(\"Audio.play: invalid browser audio URI\");\n    clearPlayer();\n    const audio = new window.Audio(url.href);\n    player = audio;\n    for (const event of [\"play\", \"pause\", \"ended\"])\n      audio.addEventListener(event, syncNowPlaying);\n    audio.addEventListener(\"error\", () => {\n      if (player === audio)\n        playbackError = audio.error?.message ?? \"Audio.play: decoding failed\";\n    });\n    try {\n      await audio.play();\n    } catch (error) {\n      if (player === audio) playbackError = String(error);\n      throw error;\n    }\n    if (player !== audio) throw new Error(\"Audio.play: playback was replaced\");\n    return playbackStatus();\n  },\n  getPlaybackStatus: async () => playbackStatus(),\n  pause: async () => {\n    if (typeof window === \"undefined\") return unavailable.pause();\n    const audio = requirePlayer();\n    if (!audio.paused)\n      await new Promise((resolve) => {\n        audio.addEventListener(\"pause\", () => resolve(), { once: true });\n        audio.pause();\n      });\n    return playbackStatus();\n  },\n  resume: async () => {\n    if (typeof window === \"undefined\") return unavailable.resume();\n    const audio = requirePlayer();\n    if (audio.ended) audio.currentTime = 0;\n    await audio.play();\n    if (player !== audio) throw new Error(\"Audio.resume: playback was replaced\");\n    return playbackStatus();\n  },\n  seek: async (positionMs) => {\n    if (typeof window === \"undefined\") return unavailable.seek(positionMs);\n    if (!Number.isFinite(positionMs) || positionMs < 0)\n      throw new Error(\"Audio.seek: position must be finite and nonnegative\");\n    const audio = requirePlayer();\n    if (audio.readyState < 1) throw new Error(\"Audio.seek: playback is not ready\");\n    const seconds = Math.min(\n      positionMs / 1e3,\n      Number.isFinite(audio.duration) ? audio.duration : Infinity\n    );\n    if (audio.currentTime === seconds) return playbackStatus();\n    await new Promise((resolve, reject) => {\n      const cleanup = () => {\n        audio.removeEventListener(\"seeked\", done);\n        audio.removeEventListener(\"error\", failed);\n        audio.removeEventListener(\"emptied\", failed);\n      };\n      const done = () => {\n        cleanup();\n        player === audio ? resolve() : reject(new Error(\"Audio.seek: playback was replaced\"));\n      };\n      const failed = () => {\n        cleanup();\n        reject(new Error(\"Audio.seek: playback failed or stopped\"));\n      };\n      audio.addEventListener(\"seeked\", done, { once: true });\n      audio.addEventListener(\"error\", failed, { once: true });\n      audio.addEventListener(\"emptied\", failed, { once: true });\n      audio.currentTime = seconds;\n    });\n    return playbackStatus();\n  },\n  stop: async () => {\n    clearPlayer();\n  },\n  startRecording: async () => {\n    if (typeof window === \"undefined\") return unavailable.startRecording();\n    if (player?.ended || player?.error || playbackError) clearPlayer();\n    if (player || recording || openingRecording)\n      throw new Error(\"Audio.startRecording: stop the current audio operation first\");\n    if (!window.MediaRecorder)\n      throw new Error(\"Audio.startRecording: MediaRecorder is unavailable\");\n    openingRecording = true;\n    let stream;\n    try {\n      stream = await microphone();\n      const recorder = new MediaRecorder(stream);\n      const session = {\n        recorder,\n        stream,\n        chunks: [],\n        duration: 0,\n        since: performance.now(),\n        stopping: false,\n        error: void 0\n      };\n      recording = session;\n      recorder.addEventListener(\"dataavailable\", (event) => {\n        if (event.data.size) session.chunks.push(event.data);\n      });\n      recorder.addEventListener(\"error\", (event) => {\n        session.error = event.error ?? new Error(\"Audio: recording failed\");\n        stream.getTracks().forEach((track) => track.stop());\n      });\n      recorder.start(250);\n      return recordingStatus();\n    } catch (error) {\n      stream?.getTracks().forEach((track) => track.stop());\n      recording = void 0;\n      throw error;\n    } finally {\n      openingRecording = false;\n    }\n  },\n  getRecordingStatus: async () => recordingStatus(),\n  pauseRecording: async () => typeof window === \"undefined\" ? unavailable.pauseRecording() : recorderChange(\"pause\"),\n  resumeRecording: async () => typeof window === \"undefined\" ? unavailable.resumeRecording() : recorderChange(\"resume\"),\n  stopRecording: async () => {\n    if (typeof window === \"undefined\") return unavailable.stopRecording();\n    if (!recording)\n      throw new Error(\"Audio.stopRecording: the recording operation is not ready\");\n    const session = recording;\n    if (session.stopping)\n      throw new Error(\"Audio.stopRecording: recording is already stopping\");\n    const durationMs = recordingDuration();\n    session.stopping = true;\n    try {\n      if (session.recorder.state !== \"inactive\")\n        await new Promise((resolve, reject) => {\n          const cleanup = () => {\n            session.recorder.removeEventListener(\"stop\", done);\n            session.recorder.removeEventListener(\"error\", failed);\n          };\n          const done = () => {\n            cleanup();\n            resolve();\n          };\n          const failed = () => {\n            cleanup();\n            reject(session.error ?? new Error(\"Audio: recording failed\"));\n          };\n          session.recorder.addEventListener(\"stop\", done, { once: true });\n          session.recorder.addEventListener(\"error\", failed, { once: true });\n          session.recorder.stop();\n        });\n      if (session.error) throw session.error;\n      const blob = new Blob(session.chunks, { type: session.recorder.mimeType });\n      if (!blob.size)\n        throw new Error(\"Audio.stopRecording: recording produced an empty file\");\n      const uri = URL.createObjectURL(blob);\n      const audio = new window.Audio();\n      try {\n        await new Promise((resolve, reject) => {\n          const cleanup = () => {\n            clearTimeout(deadline);\n            audio.onloadedmetadata = null;\n            audio.onerror = null;\n          };\n          const deadline = setTimeout(() => {\n            cleanup();\n            reject(new Error(\"Audio.stopRecording: recording did not decode\"));\n          }, 1e4);\n          audio.onloadedmetadata = () => {\n            cleanup();\n            resolve();\n          };\n          audio.onerror = () => {\n            cleanup();\n            reject(new Error(\"Audio.stopRecording: recording produced no playable audio\"));\n          };\n          audio.src = uri;\n          audio.load();\n        });\n        return { uri, durationMs, size: blob.size };\n      } catch (error) {\n        URL.revokeObjectURL(uri);\n        throw error;\n      } finally {\n        audio.removeAttribute(\"src\");\n        audio.load();\n      }\n    } finally {\n      session.stream.getTracks().forEach((track) => track.stop());\n      recording = void 0;\n    }\n  },\n  watchInterruptions: unavailable.watchInterruptions,\n  setNowPlayingInfo: async (info) => {\n    if (typeof window === \"undefined\") return unavailable.setNowPlayingInfo(info);\n    if (!info.title.trim())\n      throw new Error(\"Audio.setNowPlayingInfo: title must not be empty\");\n    const audio = requirePlayer();\n    if (info.artworkUri) {\n      const artwork = new window.Image();\n      artwork.src = info.artworkUri;\n      await artwork.decode();\n      if (player !== audio) throw new Error(\"Audio.setNowPlayingInfo: playback was replaced\");\n    }\n    mediaSession().metadata = new MediaMetadata({\n      title: info.title,\n      artist: info.artist,\n      album: info.albumTitle,\n      artwork: info.artworkUri ? [{ src: info.artworkUri }] : []\n    });\n    installRemote();\n    syncNowPlaying();\n  },\n  clearNowPlayingInfo: async () => {\n    if (typeof window === \"undefined\") return unavailable.clearNowPlayingInfo();\n    clearNowPlaying();\n  },\n  watchRemoteCommands: (onEvent) => {\n    validateCallback(onEvent, \"Audio.watchRemoteCommands: onEvent must be a function\");\n    if (typeof window === \"undefined\" || !navigator.mediaSession)\n      return unavailable.watchRemoteCommands(onEvent);\n    remoteListeners.add(onEvent);\n    return () => {\n      remoteListeners.delete(onEvent);\n    };\n  },\n  AudioPlayer,\n  createPlayer\n});\nexport {\n  Audio\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}