UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

1 lines • 23.2 kB
{"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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"}