one 2.11.5 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/android/src/main/java/com/margelo/nitro/one/HybridOneAudio.kt +309 -124
  2. package/dist/cjs/cli/build.cjs +31 -33
  3. package/dist/cjs/cli/build.native.cjs +31 -33
  4. package/dist/cjs/cli/build.native.js +31 -33
  5. package/dist/cjs/cli/build.native.js.map +1 -1
  6. package/dist/cjs/cli/buildPage.cjs +11 -7
  7. package/dist/cjs/cli/buildPage.native.cjs +11 -7
  8. package/dist/cjs/cli/buildPage.native.js +11 -7
  9. package/dist/cjs/cli/buildPage.native.js.map +1 -1
  10. package/dist/cjs/cli/buildPageWorker.cjs +1 -1
  11. package/dist/cjs/cli/buildPageWorker.native.cjs +1 -1
  12. package/dist/cjs/cli/buildPageWorker.native.js +1 -1
  13. package/dist/cjs/cli/buildPageWorker.native.js.map +1 -1
  14. package/dist/cjs/cli-dev-memory.cjs +43 -0
  15. package/dist/cjs/cli-dev-memory.native.cjs +84 -0
  16. package/dist/cjs/cli-dev-memory.native.js +86 -0
  17. package/dist/cjs/cli-dev-memory.native.js.map +1 -0
  18. package/dist/cjs/headless-server.cjs +2 -5
  19. package/dist/cjs/headless-server.native.cjs +2 -5
  20. package/dist/cjs/headless-server.native.js +2 -5
  21. package/dist/cjs/headless-server.native.js.map +1 -1
  22. package/dist/cjs/platform/audio/index.cjs +83 -76
  23. package/dist/cjs/platform/audio/index.native.cjs +2 -2
  24. package/dist/cjs/platform/audio/index.native.js +2 -2
  25. package/dist/cjs/platform/audio/index.native.js.map +1 -1
  26. package/dist/cjs/platform/audio/nowPlaying.cjs +126 -0
  27. package/dist/cjs/platform/audio/nowPlaying.native.cjs +160 -0
  28. package/dist/cjs/platform/audio/nowPlaying.native.js +162 -0
  29. package/dist/cjs/platform/audio/nowPlaying.native.js.map +1 -0
  30. package/dist/cjs/platform/audio/player.cjs +15 -0
  31. package/dist/cjs/platform/audio/player.native.cjs +14 -0
  32. package/dist/cjs/platform/audio/player.native.js +14 -0
  33. package/dist/cjs/platform/audio/player.native.js.map +1 -1
  34. package/dist/cjs/platform/audio/unavailable.cjs +1 -1
  35. package/dist/cjs/platform/audio/unavailable.native.cjs +1 -1
  36. package/dist/cjs/platform/audio/unavailable.native.js +1 -1
  37. package/dist/cjs/platform/audio/unavailable.native.js.map +1 -1
  38. package/dist/cjs/serve-worker.cjs +0 -3
  39. package/dist/cjs/serve-worker.native.cjs +0 -3
  40. package/dist/cjs/serve-worker.native.js +0 -3
  41. package/dist/cjs/serve-worker.native.js.map +1 -1
  42. package/dist/cjs/server/oneServe.cjs +0 -6
  43. package/dist/cjs/server/oneServe.native.cjs +0 -6
  44. package/dist/cjs/server/oneServe.native.js +0 -6
  45. package/dist/cjs/server/oneServe.native.js.map +1 -1
  46. package/dist/cjs/server/workerHandler.cjs +12 -10
  47. package/dist/cjs/server/workerHandler.native.cjs +14 -10
  48. package/dist/cjs/server/workerHandler.native.js +14 -10
  49. package/dist/cjs/server/workerHandler.native.js.map +1 -1
  50. package/dist/cjs/vite/plugins/workerdDevPlugin.cjs +33 -37
  51. package/dist/cjs/vite/plugins/workerdDevPlugin.native.cjs +33 -37
  52. package/dist/cjs/vite/plugins/workerdDevPlugin.native.js +33 -37
  53. package/dist/cjs/vite/plugins/workerdDevPlugin.native.js.map +1 -1
  54. package/dist/esm/cli/build.mjs +31 -33
  55. package/dist/esm/cli/build.mjs.map +1 -1
  56. package/dist/esm/cli/build.native.js +31 -33
  57. package/dist/esm/cli/build.native.js.map +1 -1
  58. package/dist/esm/cli/buildPage.mjs +11 -7
  59. package/dist/esm/cli/buildPage.mjs.map +1 -1
  60. package/dist/esm/cli/buildPage.native.js +11 -7
  61. package/dist/esm/cli/buildPage.native.js.map +1 -1
  62. package/dist/esm/cli/buildPageWorker.mjs +1 -1
  63. package/dist/esm/cli/buildPageWorker.mjs.map +1 -1
  64. package/dist/esm/cli/buildPageWorker.native.js +1 -1
  65. package/dist/esm/cli/buildPageWorker.native.js.map +1 -1
  66. package/dist/esm/cli-dev-memory.mjs +23 -0
  67. package/dist/esm/cli-dev-memory.mjs.map +1 -0
  68. package/dist/esm/cli-dev-memory.native.js +62 -0
  69. package/dist/esm/cli-dev-memory.native.js.map +1 -0
  70. package/dist/esm/headless-server.mjs +2 -3
  71. package/dist/esm/headless-server.mjs.map +1 -1
  72. package/dist/esm/headless-server.native.js +2 -3
  73. package/dist/esm/headless-server.native.js.map +1 -1
  74. package/dist/esm/platform/audio/index.mjs +83 -76
  75. package/dist/esm/platform/audio/index.mjs.map +1 -1
  76. package/dist/esm/platform/audio/index.native.js +2 -2
  77. package/dist/esm/platform/audio/index.native.js.map +1 -1
  78. package/dist/esm/platform/audio/nowPlaying.mjs +102 -0
  79. package/dist/esm/platform/audio/nowPlaying.mjs.map +1 -0
  80. package/dist/esm/platform/audio/nowPlaying.native.js +134 -0
  81. package/dist/esm/platform/audio/nowPlaying.native.js.map +1 -0
  82. package/dist/esm/platform/audio/player.mjs +15 -0
  83. package/dist/esm/platform/audio/player.mjs.map +1 -1
  84. package/dist/esm/platform/audio/player.native.js +14 -0
  85. package/dist/esm/platform/audio/player.native.js.map +1 -1
  86. package/dist/esm/platform/audio/unavailable.mjs +1 -1
  87. package/dist/esm/platform/audio/unavailable.mjs.map +1 -1
  88. package/dist/esm/platform/audio/unavailable.native.js +1 -1
  89. package/dist/esm/platform/audio/unavailable.native.js.map +1 -1
  90. package/dist/esm/serve-worker.mjs +1 -2
  91. package/dist/esm/serve-worker.mjs.map +1 -1
  92. package/dist/esm/serve-worker.native.js +1 -2
  93. package/dist/esm/serve-worker.native.js.map +1 -1
  94. package/dist/esm/server/oneServe.mjs +0 -6
  95. package/dist/esm/server/oneServe.mjs.map +1 -1
  96. package/dist/esm/server/oneServe.native.js +0 -6
  97. package/dist/esm/server/oneServe.native.js.map +1 -1
  98. package/dist/esm/server/workerHandler.mjs +12 -10
  99. package/dist/esm/server/workerHandler.mjs.map +1 -1
  100. package/dist/esm/server/workerHandler.native.js +14 -10
  101. package/dist/esm/server/workerHandler.native.js.map +1 -1
  102. package/dist/esm/vite/plugins/workerdDevPlugin.mjs +33 -37
  103. package/dist/esm/vite/plugins/workerdDevPlugin.mjs.map +1 -1
  104. package/dist/esm/vite/plugins/workerdDevPlugin.native.js +33 -37
  105. package/dist/esm/vite/plugins/workerdDevPlugin.native.js.map +1 -1
  106. package/ios/Nitro/HybridOneAudio.swift +309 -96
  107. package/nitrogen/generated/android/c++/JAudioPlayOptions.hpp +61 -0
  108. package/nitrogen/generated/android/c++/JAudioRemoteCommandEvent.hpp +8 -3
  109. package/nitrogen/generated/android/c++/JFunc_void_AudioRemoteCommandEvent.hpp +1 -0
  110. package/nitrogen/generated/android/c++/JHybridOneAudioSpec.cpp +37 -3
  111. package/nitrogen/generated/android/c++/JHybridOneAudioSpec.hpp +3 -1
  112. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AudioPlayOptions.kt +56 -0
  113. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AudioRemoteCommandEvent.kt +9 -4
  114. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneAudioSpec.kt +40 -32
  115. package/nitrogen/generated/ios/One-Swift-Cxx-Umbrella.hpp +3 -0
  116. package/nitrogen/generated/ios/c++/HybridOneAudioSpecSwift.hpp +21 -2
  117. package/nitrogen/generated/ios/swift/AudioPlayOptions.swift +60 -0
  118. package/nitrogen/generated/ios/swift/AudioRemoteCommandEvent.swift +19 -1
  119. package/nitrogen/generated/ios/swift/HybridOneAudioSpec.swift +3 -1
  120. package/nitrogen/generated/ios/swift/HybridOneAudioSpec_cxx.swift +70 -32
  121. package/nitrogen/generated/shared/c++/AudioPlayOptions.hpp +87 -0
  122. package/nitrogen/generated/shared/c++/AudioRemoteCommandEvent.hpp +7 -2
  123. package/nitrogen/generated/shared/c++/HybridOneAudioSpec.cpp +2 -0
  124. package/nitrogen/generated/shared/c++/HybridOneAudioSpec.hpp +6 -1
  125. package/package.json +13 -13
  126. package/run.mjs +5 -1
  127. package/src/cli/build.ts +35 -32
  128. package/src/cli/buildPage.test.ts +152 -0
  129. package/src/cli/buildPage.ts +14 -9
  130. package/src/cli/buildPageWorker.ts +2 -1
  131. package/src/cli/workerPool.ts +1 -0
  132. package/src/cli-dev-memory.ts +24 -0
  133. package/src/headless-server.ts +2 -2
  134. package/src/index.ts +1 -0
  135. package/src/platform/audio/index.native.ts +4 -2
  136. package/src/platform/audio/index.ts +102 -74
  137. package/src/platform/audio/nowPlaying.ts +122 -0
  138. package/src/platform/audio/player.native.ts +17 -1
  139. package/src/platform/audio/player.ts +23 -1
  140. package/src/platform/audio/types.ts +6 -1
  141. package/src/platform/audio/unavailable.ts +3 -1
  142. package/src/platform/index.native.ts +1 -0
  143. package/src/platform/index.ts +1 -0
  144. package/src/platform/specs/OneAudio.nitro.ts +11 -1
  145. package/src/serve-worker.ts +2 -3
  146. package/src/server/oneServe.ts +0 -6
  147. package/src/server/workerHandler.ts +34 -18
  148. package/src/vite/plugins/workerdDevPlugin.ts +33 -37
  149. package/src/vite/resolveResponse.ts +2 -2
  150. package/types/cli/build.d.ts.map +1 -1
  151. package/types/cli/buildPage.d.ts +1 -1
  152. package/types/cli/buildPage.d.ts.map +1 -1
  153. package/types/cli/workerPool.d.ts +1 -0
  154. package/types/cli/workerPool.d.ts.map +1 -1
  155. package/types/cli-dev-memory.d.ts +2 -0
  156. package/types/cli-dev-memory.d.ts.map +1 -0
  157. package/types/headless-server.d.ts +3 -3
  158. package/types/headless-server.d.ts.map +1 -1
  159. package/types/index.d.ts +1 -1
  160. package/types/index.d.ts.map +1 -1
  161. package/types/platform/audio/index.d.ts +2 -2
  162. package/types/platform/audio/index.d.ts.map +1 -1
  163. package/types/platform/audio/index.native.d.ts +3 -3
  164. package/types/platform/audio/index.native.d.ts.map +1 -1
  165. package/types/platform/audio/nowPlaying.d.ts +12 -0
  166. package/types/platform/audio/nowPlaying.d.ts.map +1 -0
  167. package/types/platform/audio/player.d.ts +3 -1
  168. package/types/platform/audio/player.d.ts.map +1 -1
  169. package/types/platform/audio/player.native.d.ts +3 -1
  170. package/types/platform/audio/player.native.d.ts.map +1 -1
  171. package/types/platform/audio/types.d.ts +3 -1
  172. package/types/platform/audio/types.d.ts.map +1 -1
  173. package/types/platform/audio/unavailable.d.ts +3 -3
  174. package/types/platform/audio/unavailable.d.ts.map +1 -1
  175. package/types/platform/index.d.ts +1 -1
  176. package/types/platform/index.d.ts.map +1 -1
  177. package/types/platform/index.native.d.ts +1 -1
  178. package/types/platform/index.native.d.ts.map +1 -1
  179. package/types/platform/specs/OneAudio.nitro.d.ts +8 -1
  180. package/types/platform/specs/OneAudio.nitro.d.ts.map +1 -1
  181. package/types/serve-worker.d.ts +3 -3
  182. package/types/serve-worker.d.ts.map +1 -1
  183. package/types/server/oneServe.d.ts.map +1 -1
  184. package/types/server/workerHandler.d.ts +1 -1
  185. package/types/server/workerHandler.d.ts.map +1 -1
  186. package/types/vite/plugins/workerdDevPlugin.d.ts.map +1 -1
  187. package/types/vite/resolveResponse.d.ts +1 -1
  188. package/types/vite/resolveResponse.d.ts.map +1 -1
  189. package/dist/cjs/server/staticHtmlFetcher.cjs +0 -33
  190. package/dist/cjs/server/staticHtmlFetcher.native.cjs +0 -35
  191. package/dist/cjs/server/staticHtmlFetcher.native.js +0 -37
  192. package/dist/cjs/server/staticHtmlFetcher.native.js.map +0 -1
  193. package/dist/esm/server/staticHtmlFetcher.mjs +0 -10
  194. package/dist/esm/server/staticHtmlFetcher.mjs.map +0 -1
  195. package/dist/esm/server/staticHtmlFetcher.native.js +0 -10
  196. package/dist/esm/server/staticHtmlFetcher.native.js.map +0 -1
  197. package/src/server/staticHtmlFetcher.ts +0 -12
  198. package/types/server/staticHtmlFetcher.d.ts +0 -3
  199. package/types/server/staticHtmlFetcher.d.ts.map +0 -1
@@ -1,14 +1,14 @@
1
1
  import { Audio as Audio$1 } from "./unavailable.mjs";
2
2
  import { validateCallback } from "../validateCallback.mjs";
3
+ import { addRemoteListener, claimNowPlaying, releaseNowPlaying } from "./nowPlaying.mjs";
3
4
  import { AudioPlayer, createPlayer } from "./player.mjs";
4
5
 
5
6
  let player;
7
+ let pendingLoad;
6
8
  let playbackError;
7
9
  let permission = "undetermined";
8
10
  let openingRecording = false;
9
11
  let recording;
10
- const remoteListeners = /* @__PURE__ */ new Set();
11
- let remoteInstalled = false;
12
12
  async function getRecordingPermissionStatus() {
13
13
  if (typeof window === "undefined" || !navigator.mediaDevices?.getUserMedia) return "denied";
14
14
  try {
@@ -44,7 +44,7 @@ function playbackStatus() {
44
44
  positionMs: 0
45
45
  };
46
46
  return {
47
- state: player.error || playbackError ? "failed" : player.ended ? "ended" : player.readyState < 2 ? "loading" : player.paused ? "paused" : "playing",
47
+ state: player.error || playbackError ? "failed" : player.ended ? "ended" : pendingLoad || player.readyState < 2 ? "loading" : player.paused ? "paused" : "playing",
48
48
  uri: player.src,
49
49
  positionMs: player.currentTime * 1e3,
50
50
  ...Number.isFinite(player.duration) && { durationMs: player.duration * 1e3 },
@@ -56,7 +56,9 @@ function requirePlayer() {
56
56
  return player;
57
57
  }
58
58
  function clearPlayer() {
59
- clearNowPlaying();
59
+ releaseNowPlaying("global");
60
+ pendingLoad?.cancel?.();
61
+ pendingLoad = void 0;
60
62
  if (player) {
61
63
  player.pause();
62
64
  player.removeAttribute("src");
@@ -112,56 +114,46 @@ function recorderChange(event) {
112
114
  }
113
115
  });
114
116
  }
115
- function mediaSession() {
116
- if (!navigator.mediaSession) throw new Error("Audio: Media Session is unavailable");
117
- return navigator.mediaSession;
118
- }
119
- function clearNowPlaying() {
120
- if (typeof window === "undefined" || !navigator.mediaSession) return;
121
- const session = navigator.mediaSession;
122
- if (remoteInstalled) for (const action of [
123
- "play",
124
- "pause",
125
- "seekto"
126
- ]) session.setActionHandler(action, null);
127
- remoteInstalled = false;
128
- session.metadata = null;
129
- session.playbackState = "none";
130
- }
131
- function syncNowPlaying() {
132
- if (!navigator.mediaSession?.metadata || !player) return;
133
- navigator.mediaSession.playbackState = player.paused || player.ended ? "paused" : "playing";
134
- }
135
- async function remote(event) {
136
- if (!player || !navigator.mediaSession?.metadata) return;
137
- const audio = player;
138
- try {
139
- if (event.type === "play") await Audio.resume();
140
- else if (event.type === "pause") await Audio.pause();
141
- else await Audio.seek(event.positionMs);
142
- } catch {
143
- return;
144
- }
145
- if (player !== audio) return;
146
- syncNowPlaying();
147
- for (const listener of [...remoteListeners]) listener(event);
148
- }
149
- function installRemote() {
150
- if (remoteInstalled) return;
151
- const session = mediaSession();
152
- session.setActionHandler("play", () => remote({ type: "play" }));
153
- session.setActionHandler("pause", () => remote({ type: "pause" }));
154
- session.setActionHandler("seekto", (event) => remote({
155
- type: "seek",
156
- positionMs: (event.seekTime ?? 0) * 1e3
157
- }));
158
- remoteInstalled = true;
117
+ function prepareAt(load, positionMs) {
118
+ const { audio } = load;
119
+ return new Promise((resolve, reject) => {
120
+ const cleanup = () => {
121
+ audio.removeEventListener("loadedmetadata", ready);
122
+ audio.removeEventListener("seeked", done);
123
+ audio.removeEventListener("error", failed);
124
+ load.cancel = void 0;
125
+ };
126
+ let seconds = 0;
127
+ const done = () => {
128
+ cleanup();
129
+ if (Math.abs(audio.currentTime - seconds) > .25) reject(new Error("Audio.play: the source cannot seek to the position"));
130
+ else resolve();
131
+ };
132
+ const failed = () => {
133
+ cleanup();
134
+ reject(new Error(`Audio.play: ${audio.error?.message || "decoding failed"}`));
135
+ };
136
+ function ready() {
137
+ audio.removeEventListener("loadedmetadata", ready);
138
+ seconds = Math.min(positionMs / 1e3, Number.isFinite(audio.duration) ? audio.duration : Infinity);
139
+ if (audio.currentTime === seconds) return done();
140
+ audio.addEventListener("seeked", done, { once: true });
141
+ audio.currentTime = seconds;
142
+ }
143
+ load.cancel = () => {
144
+ cleanup();
145
+ reject(new Error("Audio.play: playback was replaced"));
146
+ };
147
+ audio.addEventListener("error", failed, { once: true });
148
+ if (audio.readyState >= 1) ready();
149
+ else audio.addEventListener("loadedmetadata", ready, { once: true });
150
+ });
159
151
  }
160
152
  const Audio = Object.freeze({
161
153
  getRecordingPermissionStatus,
162
154
  requestRecordingPermission,
163
- play: async (uri) => {
164
- if (typeof window === "undefined") return Audio$1.play(uri);
155
+ play: async (uri, options) => {
156
+ if (typeof window === "undefined") return Audio$1.play(uri, options);
165
157
  if (openingRecording || recording) throw new Error("Audio.play: stop the current recording first");
166
158
  const url = new URL(uri, document.baseURI);
167
159
  if (![
@@ -170,17 +162,35 @@ const Audio = Object.freeze({
170
162
  "blob:",
171
163
  "data:"
172
164
  ].includes(url.protocol)) throw new Error("Audio.play: invalid browser audio URI");
165
+ const prepare = options?.positionMs !== void 0 || options?.paused !== void 0;
166
+ const positionMs = options?.positionMs ?? 0;
167
+ if (typeof positionMs !== "number" || !Number.isFinite(positionMs) || positionMs < 0) throw new Error("Audio.play: position must be finite and nonnegative");
173
168
  clearPlayer();
174
169
  const audio = new window.Audio(url.href);
175
170
  player = audio;
176
- for (const event of [
177
- "play",
178
- "pause",
179
- "ended"
180
- ]) audio.addEventListener(event, syncNowPlaying);
181
171
  audio.addEventListener("error", () => {
182
172
  if (player === audio) playbackError = audio.error?.message ?? "Audio.play: decoding failed";
183
173
  });
174
+ if (prepare) {
175
+ const load = {
176
+ audio,
177
+ paused: options?.paused ?? false
178
+ };
179
+ pendingLoad = load;
180
+ audio.preload = "auto";
181
+ try {
182
+ await prepareAt(load, positionMs);
183
+ } catch (error) {
184
+ if (pendingLoad === load) {
185
+ pendingLoad = void 0;
186
+ playbackError = error.message;
187
+ }
188
+ throw error;
189
+ }
190
+ if (player !== audio || pendingLoad !== load) throw new Error("Audio.play: playback was replaced");
191
+ pendingLoad = void 0;
192
+ if (load.paused) return playbackStatus();
193
+ }
184
194
  try {
185
195
  await audio.play();
186
196
  } catch (error) {
@@ -194,6 +204,10 @@ const Audio = Object.freeze({
194
204
  pause: async () => {
195
205
  if (typeof window === "undefined") return Audio$1.pause();
196
206
  const audio = requirePlayer();
207
+ if (pendingLoad) {
208
+ pendingLoad.paused = true;
209
+ return playbackStatus();
210
+ }
197
211
  if (!audio.paused) await new Promise((resolve) => {
198
212
  audio.addEventListener("pause", () => resolve(), { once: true });
199
213
  audio.pause();
@@ -203,6 +217,10 @@ const Audio = Object.freeze({
203
217
  resume: async () => {
204
218
  if (typeof window === "undefined") return Audio$1.resume();
205
219
  const audio = requirePlayer();
220
+ if (pendingLoad) {
221
+ pendingLoad.paused = false;
222
+ return playbackStatus();
223
+ }
206
224
  if (audio.ended) audio.currentTime = 0;
207
225
  await audio.play();
208
226
  if (player !== audio) throw new Error("Audio.resume: playback was replaced");
@@ -212,7 +230,7 @@ const Audio = Object.freeze({
212
230
  if (typeof window === "undefined") return Audio$1.seek(positionMs);
213
231
  if (!Number.isFinite(positionMs) || positionMs < 0) throw new Error("Audio.seek: position must be finite and nonnegative");
214
232
  const audio = requirePlayer();
215
- if (audio.readyState < 1) throw new Error("Audio.seek: playback is not ready");
233
+ if (audio.readyState < 1 || pendingLoad) throw new Error("Audio.seek: playback is not ready");
216
234
  const seconds = Math.min(positionMs / 1e3, Number.isFinite(audio.duration) ? audio.duration : Infinity);
217
235
  if (audio.currentTime === seconds) return playbackStatus();
218
236
  await new Promise((resolve, reject) => {
@@ -351,34 +369,23 @@ const Audio = Object.freeze({
351
369
  watchInterruptions: Audio$1.watchInterruptions,
352
370
  setNowPlayingInfo: async (info) => {
353
371
  if (typeof window === "undefined") return Audio$1.setNowPlayingInfo(info);
354
- if (!info.title.trim()) throw new Error("Audio.setNowPlayingInfo: title must not be empty");
355
372
  const audio = requirePlayer();
356
- if (info.artworkUri) {
357
- const artwork = new window.Image();
358
- artwork.src = info.artworkUri;
359
- await artwork.decode();
360
- if (player !== audio) throw new Error("Audio.setNowPlayingInfo: playback was replaced");
361
- }
362
- mediaSession().metadata = new MediaMetadata({
363
- title: info.title,
364
- artist: info.artist,
365
- album: info.albumTitle,
366
- artwork: info.artworkUri ? [{ src: info.artworkUri }] : []
367
- });
368
- installRemote();
369
- syncNowPlaying();
373
+ await claimNowPlaying({
374
+ key: "global",
375
+ element: audio,
376
+ play: Audio.resume,
377
+ pause: Audio.pause,
378
+ seek: Audio.seek
379
+ }, info, "Audio.setNowPlayingInfo", () => player === audio);
370
380
  },
371
381
  clearNowPlayingInfo: async () => {
372
382
  if (typeof window === "undefined") return Audio$1.clearNowPlayingInfo();
373
- clearNowPlaying();
383
+ releaseNowPlaying("global");
374
384
  },
375
385
  watchRemoteCommands: (onEvent) => {
376
386
  validateCallback(onEvent, "Audio.watchRemoteCommands: onEvent must be a function");
377
387
  if (typeof window === "undefined" || !navigator.mediaSession) return Audio$1.watchRemoteCommands(onEvent);
378
- remoteListeners.add(onEvent);
379
- return () => {
380
- remoteListeners.delete(onEvent);
381
- };
388
+ return addRemoteListener(onEvent);
382
389
  },
383
390
  AudioPlayer,
384
391
  createPlayer
@@ -1 +1 @@
1
- {"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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"}
1
+ {"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 { addRemoteListener, claimNowPlaying, releaseNowPlaying } from \"./nowPlaying\";\nimport { AudioPlayer, createPlayer } from \"./player\";\nlet player;\nlet pendingLoad;\nlet playbackError;\nlet permission = \"undetermined\";\nlet openingRecording = false;\nlet recording;\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\" : pendingLoad || 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 releaseNowPlaying(\"global\");\n pendingLoad?.cancel?.();\n pendingLoad = void 0;\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 prepareAt(load, positionMs) {\n const { audio } = load;\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n audio.removeEventListener(\"loadedmetadata\", ready);\n audio.removeEventListener(\"seeked\", done);\n audio.removeEventListener(\"error\", failed);\n load.cancel = void 0;\n };\n let seconds = 0;\n const done = () => {\n cleanup();\n if (Math.abs(audio.currentTime - seconds) > 0.25)\n reject(new Error(\"Audio.play: the source cannot seek to the position\"));\n else resolve();\n };\n const failed = () => {\n cleanup();\n reject(new Error(`Audio.play: ${audio.error?.message || \"decoding failed\"}`));\n };\n function ready() {\n audio.removeEventListener(\"loadedmetadata\", ready);\n seconds = Math.min(\n positionMs / 1e3,\n Number.isFinite(audio.duration) ? audio.duration : Infinity\n );\n if (audio.currentTime === seconds) return done();\n audio.addEventListener(\"seeked\", done, { once: true });\n audio.currentTime = seconds;\n }\n load.cancel = () => {\n cleanup();\n reject(new Error(\"Audio.play: playback was replaced\"));\n };\n audio.addEventListener(\"error\", failed, { once: true });\n if (audio.readyState >= 1) ready();\n else audio.addEventListener(\"loadedmetadata\", ready, { once: true });\n });\n}\nconst Audio = Object.freeze({\n getRecordingPermissionStatus,\n requestRecordingPermission,\n play: async (uri, options) => {\n if (typeof window === \"undefined\") return unavailable.play(uri, options);\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 const prepare = options?.positionMs !== void 0 || options?.paused !== void 0;\n const positionMs = options?.positionMs ?? 0;\n if (typeof positionMs !== \"number\" || !Number.isFinite(positionMs) || positionMs < 0)\n throw new Error(\"Audio.play: position must be finite and nonnegative\");\n clearPlayer();\n const audio = new window.Audio(url.href);\n player = audio;\n audio.addEventListener(\"error\", () => {\n if (player === audio)\n playbackError = audio.error?.message ?? \"Audio.play: decoding failed\";\n });\n if (prepare) {\n const load = { audio, paused: options?.paused ?? false };\n pendingLoad = load;\n audio.preload = \"auto\";\n try {\n await prepareAt(load, positionMs);\n } catch (error) {\n if (pendingLoad === load) {\n pendingLoad = void 0;\n playbackError = error.message;\n }\n throw error;\n }\n if (player !== audio || pendingLoad !== load)\n throw new Error(\"Audio.play: playback was replaced\");\n pendingLoad = void 0;\n if (load.paused) return playbackStatus();\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 (pendingLoad) {\n pendingLoad.paused = true;\n return playbackStatus();\n }\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 (pendingLoad) {\n pendingLoad.paused = false;\n return playbackStatus();\n }\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 || pendingLoad)\n 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 const audio = requirePlayer();\n await claimNowPlaying(\n {\n key: \"global\",\n element: audio,\n play: Audio.resume,\n pause: Audio.pause,\n seek: Audio.seek\n },\n info,\n \"Audio.setNowPlayingInfo\",\n () => player === audio\n );\n },\n clearNowPlayingInfo: async () => {\n if (typeof window === \"undefined\") return unavailable.clearNowPlayingInfo();\n releaseNowPlaying(\"global\");\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 return addRemoteListener(onEvent);\n },\n AudioPlayer,\n createPlayer\n});\nexport {\n Audio\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
@@ -10,8 +10,8 @@ var Audio = Object.freeze({
10
10
  requestRecordingPermission: function requestRecordingPermission() {
11
11
  return audioNative().requestRecordingPermission().catch(rethrowNativeError);
12
12
  },
13
- play: function play(uri) {
14
- return audioNative().play(uri).catch(rethrowNativeError);
13
+ play: function play(uri, options) {
14
+ return audioNative().play(uri, options !== null && options !== void 0 ? options : {}).catch(rethrowNativeError);
15
15
  },
16
16
  getPlaybackStatus: function getPlaybackStatus() {
17
17
  return audioNative().getPlaybackStatus().catch(rethrowNativeError);
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.js","names":["native"],"sources":["esm/platform/audio/index.native.js"],"sourcesContent":["import { validateCallback } from \"../validateCallback\";\nimport { rethrowNativeError } from \"../nativeError\";\nimport { audioNative as native } from \"./hybrid.native\";\nimport { AudioPlayer, createPlayer } from \"./player.native\";\nvar Audio = Object.freeze({\n getRecordingPermissionStatus: function getRecordingPermissionStatus() {\n return native().getRecordingPermissionStatus().catch(rethrowNativeError);\n },\n requestRecordingPermission: function requestRecordingPermission() {\n return native().requestRecordingPermission().catch(rethrowNativeError);\n },\n play: function play(uri) {\n return native().play(uri).catch(rethrowNativeError);\n },\n getPlaybackStatus: function getPlaybackStatus() {\n return native().getPlaybackStatus().catch(rethrowNativeError);\n },\n pause: function pause() {\n return native().pause().catch(rethrowNativeError);\n },\n resume: function resume() {\n return native().resume().catch(rethrowNativeError);\n },\n seek: function seek(positionMs) {\n return native().seek(positionMs).catch(rethrowNativeError);\n },\n stop: function stop() {\n return native().stop().catch(rethrowNativeError);\n },\n startRecording: function startRecording() {\n return native().startRecording().catch(rethrowNativeError);\n },\n getRecordingStatus: function getRecordingStatus() {\n return native().getRecordingStatus().catch(rethrowNativeError);\n },\n pauseRecording: function pauseRecording() {\n return native().pauseRecording().catch(rethrowNativeError);\n },\n resumeRecording: function resumeRecording() {\n return native().resumeRecording().catch(rethrowNativeError);\n },\n stopRecording: function stopRecording() {\n return native().stopRecording().catch(rethrowNativeError);\n },\n watchInterruptions: function watchInterruptions(onEvent) {\n validateCallback(onEvent, \"Audio.watchInterruptions: onEvent must be a function\");\n return native().addInterruptionListener(onEvent);\n },\n setNowPlayingInfo: function setNowPlayingInfo(info) {\n return native().setNowPlayingInfo(info).catch(rethrowNativeError);\n },\n clearNowPlayingInfo: function clearNowPlayingInfo() {\n return native().clearNowPlayingInfo().catch(rethrowNativeError);\n },\n watchRemoteCommands: function watchRemoteCommands(onEvent) {\n validateCallback(onEvent, \"Audio.watchRemoteCommands: onEvent must be a function\");\n return native().addRemoteCommandListener(onEvent);\n },\n AudioPlayer,\n createPlayer\n});\nexport {\n Audio\n};\n//# sourceMappingURL=index.native.js.map\n"],"mappings":";;;;;;AAIA,IAAI,QAAQ,OAAO,OAAO;CACxB,8BAA8B,SAAS,+BAA+B;EACpE,OAAOA,YAAO,CAAC,CAAC,6BAA6B,CAAC,CAAC,MAAM,kBAAkB;CACzE;CACA,4BAA4B,SAAS,6BAA6B;EAChE,OAAOA,YAAO,CAAC,CAAC,2BAA2B,CAAC,CAAC,MAAM,kBAAkB;CACvE;CACA,MAAM,SAAS,KAAK,KAAK;EACvB,OAAOA,YAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,kBAAkB;CACpD;CACA,mBAAmB,SAAS,oBAAoB;EAC9C,OAAOA,YAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,kBAAkB;CAC9D;CACA,OAAO,SAAS,QAAQ;EACtB,OAAOA,YAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,kBAAkB;CAClD;CACA,QAAQ,SAAS,SAAS;EACxB,OAAOA,YAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,kBAAkB;CACnD;CACA,MAAM,SAAS,KAAK,YAAY;EAC9B,OAAOA,YAAO,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,MAAM,kBAAkB;CAC3D;CACA,MAAM,SAAS,OAAO;EACpB,OAAOA,YAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,kBAAkB;CACjD;CACA,gBAAgB,SAAS,iBAAiB;EACxC,OAAOA,YAAO,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,kBAAkB;CAC3D;CACA,oBAAoB,SAAS,qBAAqB;EAChD,OAAOA,YAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,kBAAkB;CAC/D;CACA,gBAAgB,SAAS,iBAAiB;EACxC,OAAOA,YAAO,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,kBAAkB;CAC3D;CACA,iBAAiB,SAAS,kBAAkB;EAC1C,OAAOA,YAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,kBAAkB;CAC5D;CACA,eAAe,SAAS,gBAAgB;EACtC,OAAOA,YAAO,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,kBAAkB;CAC1D;CACA,oBAAoB,SAAS,mBAAmB,SAAS;EACvD,iBAAiB,SAAS,sDAAsD;EAChF,OAAOA,YAAO,CAAC,CAAC,wBAAwB,OAAO;CACjD;CACA,mBAAmB,SAAS,kBAAkB,MAAM;EAClD,OAAOA,YAAO,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,MAAM,kBAAkB;CAClE;CACA,qBAAqB,SAAS,sBAAsB;EAClD,OAAOA,YAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,MAAM,kBAAkB;CAChE;CACA,qBAAqB,SAAS,oBAAoB,SAAS;EACzD,iBAAiB,SAAS,uDAAuD;EACjF,OAAOA,YAAO,CAAC,CAAC,yBAAyB,OAAO;CAClD;CACA;CACA;AACF,CAAC"}
1
+ {"version":3,"file":"index.native.js","names":["native"],"sources":["esm/platform/audio/index.native.js"],"sourcesContent":["import { validateCallback } from \"../validateCallback\";\nimport { rethrowNativeError } from \"../nativeError\";\nimport { audioNative as native } from \"./hybrid.native\";\nimport { AudioPlayer, createPlayer } from \"./player.native\";\nvar Audio = Object.freeze({\n getRecordingPermissionStatus: function getRecordingPermissionStatus() {\n return native().getRecordingPermissionStatus().catch(rethrowNativeError);\n },\n requestRecordingPermission: function requestRecordingPermission() {\n return native().requestRecordingPermission().catch(rethrowNativeError);\n },\n play: function play(uri, options) {\n return native().play(uri, options !== null && options !== void 0 ? options : {}).catch(rethrowNativeError);\n },\n getPlaybackStatus: function getPlaybackStatus() {\n return native().getPlaybackStatus().catch(rethrowNativeError);\n },\n pause: function pause() {\n return native().pause().catch(rethrowNativeError);\n },\n resume: function resume() {\n return native().resume().catch(rethrowNativeError);\n },\n seek: function seek(positionMs) {\n return native().seek(positionMs).catch(rethrowNativeError);\n },\n stop: function stop() {\n return native().stop().catch(rethrowNativeError);\n },\n startRecording: function startRecording() {\n return native().startRecording().catch(rethrowNativeError);\n },\n getRecordingStatus: function getRecordingStatus() {\n return native().getRecordingStatus().catch(rethrowNativeError);\n },\n pauseRecording: function pauseRecording() {\n return native().pauseRecording().catch(rethrowNativeError);\n },\n resumeRecording: function resumeRecording() {\n return native().resumeRecording().catch(rethrowNativeError);\n },\n stopRecording: function stopRecording() {\n return native().stopRecording().catch(rethrowNativeError);\n },\n watchInterruptions: function watchInterruptions(onEvent) {\n validateCallback(onEvent, \"Audio.watchInterruptions: onEvent must be a function\");\n return native().addInterruptionListener(onEvent);\n },\n setNowPlayingInfo: function setNowPlayingInfo(info) {\n return native().setNowPlayingInfo(info).catch(rethrowNativeError);\n },\n clearNowPlayingInfo: function clearNowPlayingInfo() {\n return native().clearNowPlayingInfo().catch(rethrowNativeError);\n },\n watchRemoteCommands: function watchRemoteCommands(onEvent) {\n validateCallback(onEvent, \"Audio.watchRemoteCommands: onEvent must be a function\");\n return native().addRemoteCommandListener(onEvent);\n },\n AudioPlayer,\n createPlayer\n});\nexport {\n Audio\n};\n//# sourceMappingURL=index.native.js.map\n"],"mappings":";;;;;;AAIA,IAAI,QAAQ,OAAO,OAAO;CACxB,8BAA8B,SAAS,+BAA+B;EACpE,OAAOA,YAAO,CAAC,CAAC,6BAA6B,CAAC,CAAC,MAAM,kBAAkB;CACzE;CACA,4BAA4B,SAAS,6BAA6B;EAChE,OAAOA,YAAO,CAAC,CAAC,2BAA2B,CAAC,CAAC,MAAM,kBAAkB;CACvE;CACA,MAAM,SAAS,KAAK,KAAK,SAAS;EAChC,OAAOA,YAAO,CAAC,CAAC,KAAK,KAAK,YAAY,QAAQ,YAAY,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,kBAAkB;CAC3G;CACA,mBAAmB,SAAS,oBAAoB;EAC9C,OAAOA,YAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,kBAAkB;CAC9D;CACA,OAAO,SAAS,QAAQ;EACtB,OAAOA,YAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,kBAAkB;CAClD;CACA,QAAQ,SAAS,SAAS;EACxB,OAAOA,YAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,kBAAkB;CACnD;CACA,MAAM,SAAS,KAAK,YAAY;EAC9B,OAAOA,YAAO,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,MAAM,kBAAkB;CAC3D;CACA,MAAM,SAAS,OAAO;EACpB,OAAOA,YAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,kBAAkB;CACjD;CACA,gBAAgB,SAAS,iBAAiB;EACxC,OAAOA,YAAO,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,kBAAkB;CAC3D;CACA,oBAAoB,SAAS,qBAAqB;EAChD,OAAOA,YAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,kBAAkB;CAC/D;CACA,gBAAgB,SAAS,iBAAiB;EACxC,OAAOA,YAAO,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,kBAAkB;CAC3D;CACA,iBAAiB,SAAS,kBAAkB;EAC1C,OAAOA,YAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,kBAAkB;CAC5D;CACA,eAAe,SAAS,gBAAgB;EACtC,OAAOA,YAAO,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,kBAAkB;CAC1D;CACA,oBAAoB,SAAS,mBAAmB,SAAS;EACvD,iBAAiB,SAAS,sDAAsD;EAChF,OAAOA,YAAO,CAAC,CAAC,wBAAwB,OAAO;CACjD;CACA,mBAAmB,SAAS,kBAAkB,MAAM;EAClD,OAAOA,YAAO,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,MAAM,kBAAkB;CAClE;CACA,qBAAqB,SAAS,sBAAsB;EAClD,OAAOA,YAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,MAAM,kBAAkB;CAChE;CACA,qBAAqB,SAAS,oBAAoB,SAAS;EACzD,iBAAiB,SAAS,uDAAuD;EACjF,OAAOA,YAAO,CAAC,CAAC,yBAAyB,OAAO;CAClD;CACA;CACA;AACF,CAAC"}
@@ -0,0 +1,102 @@
1
+ const listeners = /* @__PURE__ */ new Set();
2
+ const syncEvents = [
3
+ "play",
4
+ "pause",
5
+ "ended"
6
+ ];
7
+ let owner;
8
+ let claim = 0;
9
+ let pendingKey;
10
+ let installed = false;
11
+ function sync() {
12
+ if (!owner || !navigator.mediaSession?.metadata) return;
13
+ navigator.mediaSession.playbackState = owner.element.paused || owner.element.ended ? "paused" : "playing";
14
+ }
15
+ function setOwner(next) {
16
+ if (owner?.element !== next?.element) {
17
+ for (const event of syncEvents) {
18
+ owner?.element.removeEventListener(event, sync);
19
+ next?.element.addEventListener(event, sync);
20
+ }
21
+ }
22
+ owner = next;
23
+ }
24
+ async function remote(event) {
25
+ const current = owner;
26
+ if (!current || !navigator.mediaSession?.metadata) return;
27
+ try {
28
+ if (event.type === "play") await current.play();
29
+ else if (event.type === "pause") await current.pause();
30
+ else await current.seek(event.positionMs);
31
+ } catch {
32
+ return;
33
+ }
34
+ if (owner !== current) return;
35
+ sync();
36
+ const emitted = current.key === "global" ? event : {
37
+ ...event,
38
+ playerId: current.key
39
+ };
40
+ for (const listener of [...listeners]) listener(emitted);
41
+ }
42
+ function install(session) {
43
+ if (installed) return;
44
+ session.setActionHandler("play", () => remote({ type: "play" }));
45
+ session.setActionHandler("pause", () => remote({ type: "pause" }));
46
+ session.setActionHandler("seekto", (event) => remote({
47
+ type: "seek",
48
+ positionMs: (event.seekTime ?? 0) * 1e3
49
+ }));
50
+ installed = true;
51
+ }
52
+ async function claimNowPlaying(next, info, verb, alive) {
53
+ if (!info.title.trim()) throw new Error(`${verb}: title must not be empty`);
54
+ if (!navigator.mediaSession) throw new Error("Audio: Media Session is unavailable");
55
+ const ticket = ++claim;
56
+ pendingKey = next.key;
57
+ if (info.artworkUri) {
58
+ const artwork = new window.Image();
59
+ artwork.src = info.artworkUri;
60
+ await artwork.decode();
61
+ if (!alive()) throw new Error(`${verb}: playback was replaced`);
62
+ if (ticket !== claim) throw new Error(`${verb}: now playing was claimed or cleared again`);
63
+ }
64
+ if (pendingKey === next.key) pendingKey = void 0;
65
+ const session = navigator.mediaSession;
66
+ setOwner(next);
67
+ session.metadata = new MediaMetadata({
68
+ title: info.title,
69
+ artist: info.artist,
70
+ album: info.albumTitle,
71
+ artwork: info.artworkUri ? [{ src: info.artworkUri }] : []
72
+ });
73
+ install(session);
74
+ sync();
75
+ }
76
+ function releaseNowPlaying(key) {
77
+ if (pendingKey === key) {
78
+ claim++;
79
+ pendingKey = void 0;
80
+ }
81
+ if (owner?.key !== key) return;
82
+ setOwner(void 0);
83
+ if (typeof window === "undefined" || !navigator.mediaSession) return;
84
+ const session = navigator.mediaSession;
85
+ if (installed) for (const action of [
86
+ "play",
87
+ "pause",
88
+ "seekto"
89
+ ]) session.setActionHandler(action, null);
90
+ installed = false;
91
+ session.metadata = null;
92
+ session.playbackState = "none";
93
+ }
94
+ function addRemoteListener(onEvent) {
95
+ listeners.add(onEvent);
96
+ return () => {
97
+ listeners.delete(onEvent);
98
+ };
99
+ }
100
+
101
+ export { addRemoteListener, claimNowPlaying, releaseNowPlaying };
102
+ //# sourceMappingURL=nowPlaying.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nowPlaying.js","names":[],"sources":["esm/platform/audio/nowPlaying.js"],"sourcesContent":["const listeners = /* @__PURE__ */ new Set();\nconst syncEvents = [\"play\", \"pause\", \"ended\"];\nlet owner;\nlet claim = 0;\nlet pendingKey;\nlet installed = false;\nfunction sync() {\n if (!owner || !navigator.mediaSession?.metadata) return;\n navigator.mediaSession.playbackState = owner.element.paused || owner.element.ended ? \"paused\" : \"playing\";\n}\nfunction setOwner(next) {\n if (owner?.element !== next?.element) {\n for (const event of syncEvents) {\n owner?.element.removeEventListener(event, sync);\n next?.element.addEventListener(event, sync);\n }\n }\n owner = next;\n}\nasync function remote(event) {\n const current = owner;\n if (!current || !navigator.mediaSession?.metadata) return;\n try {\n if (event.type === \"play\") await current.play();\n else if (event.type === \"pause\") await current.pause();\n else await current.seek(event.positionMs);\n } catch {\n return;\n }\n if (owner !== current) return;\n sync();\n const emitted = current.key === \"global\" ? event : { ...event, playerId: current.key };\n for (const listener of [...listeners]) listener(emitted);\n}\nfunction install(session) {\n if (installed) return;\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 installed = true;\n}\nasync function claimNowPlaying(next, info, verb, alive) {\n if (!info.title.trim()) throw new Error(`${verb}: title must not be empty`);\n if (!navigator.mediaSession) throw new Error(\"Audio: Media Session is unavailable\");\n const ticket = ++claim;\n pendingKey = next.key;\n if (info.artworkUri) {\n const artwork = new window.Image();\n artwork.src = info.artworkUri;\n await artwork.decode();\n if (!alive()) throw new Error(`${verb}: playback was replaced`);\n if (ticket !== claim) throw new Error(`${verb}: now playing was claimed or cleared again`);\n }\n if (pendingKey === next.key) pendingKey = void 0;\n const session = navigator.mediaSession;\n setOwner(next);\n session.metadata = new MediaMetadata({\n title: info.title,\n artist: info.artist,\n album: info.albumTitle,\n artwork: info.artworkUri ? [{ src: info.artworkUri }] : []\n });\n install(session);\n sync();\n}\nfunction releaseNowPlaying(key) {\n if (pendingKey === key) {\n claim++;\n pendingKey = void 0;\n }\n if (owner?.key !== key) return;\n setOwner(void 0);\n if (typeof window === \"undefined\" || !navigator.mediaSession) return;\n const session = navigator.mediaSession;\n if (installed)\n for (const action of [\"play\", \"pause\", \"seekto\"])\n session.setActionHandler(action, null);\n installed = false;\n session.metadata = null;\n session.playbackState = \"none\";\n}\nfunction addRemoteListener(onEvent) {\n listeners.add(onEvent);\n return () => {\n listeners.delete(onEvent);\n };\n}\nexport {\n addRemoteListener,\n claimNowPlaying,\n releaseNowPlaying\n};\n//# sourceMappingURL=nowPlaying.js.map\n"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ var listeners = /* @__PURE__ */ new Set();
2
+ var syncEvents = [
3
+ "play",
4
+ "pause",
5
+ "ended"
6
+ ];
7
+ var owner;
8
+ var claim = 0;
9
+ var pendingKey;
10
+ var installed = false;
11
+ function sync() {
12
+ var _navigator_mediaSession;
13
+ if (!owner || !((_navigator_mediaSession = navigator.mediaSession) === null || _navigator_mediaSession === void 0 ? void 0 : _navigator_mediaSession.metadata)) return;
14
+ navigator.mediaSession.playbackState = owner.element.paused || owner.element.ended ? "paused" : "playing";
15
+ }
16
+ function setOwner(next) {
17
+ if ((owner === null || owner === void 0 ? void 0 : owner.element) !== (next === null || next === void 0 ? void 0 : next.element)) {
18
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
19
+ try {
20
+ for (var _iterator = syncEvents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
21
+ var event = _step.value;
22
+ owner === null || owner === void 0 ? void 0 : owner.element.removeEventListener(event, sync);
23
+ next === null || next === void 0 ? void 0 : next.element.addEventListener(event, sync);
24
+ }
25
+ } catch (err) {
26
+ _didIteratorError = true;
27
+ _iteratorError = err;
28
+ } finally {
29
+ try {
30
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
31
+ _iterator.return();
32
+ }
33
+ } finally {
34
+ if (_didIteratorError) {
35
+ throw _iteratorError;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ owner = next;
41
+ }
42
+ async function remote(event) {
43
+ var _navigator_mediaSession;
44
+ var current = owner;
45
+ if (!current || !((_navigator_mediaSession = navigator.mediaSession) === null || _navigator_mediaSession === void 0 ? void 0 : _navigator_mediaSession.metadata)) return;
46
+ try {
47
+ if (event.type === "play") await current.play();
48
+ else if (event.type === "pause") await current.pause();
49
+ else await current.seek(event.positionMs);
50
+ } catch (unused) {
51
+ return;
52
+ }
53
+ if (owner !== current) return;
54
+ sync();
55
+ var emitted = current.key === "global" ? event : {
56
+ ...event,
57
+ playerId: current.key
58
+ };
59
+ for (var _i = 0, _iter = [...listeners]; _i < _iter.length; _i++) {
60
+ var listener = _iter[_i];
61
+ listener(emitted);
62
+ }
63
+ }
64
+ function install(session) {
65
+ if (installed) return;
66
+ session.setActionHandler("play", function() {
67
+ return remote({ type: "play" });
68
+ });
69
+ session.setActionHandler("pause", function() {
70
+ return remote({ type: "pause" });
71
+ });
72
+ session.setActionHandler("seekto", function(event) {
73
+ var _event_seekTime;
74
+ return remote({
75
+ type: "seek",
76
+ positionMs: ((_event_seekTime = event.seekTime) !== null && _event_seekTime !== void 0 ? _event_seekTime : 0) * 1e3
77
+ });
78
+ });
79
+ installed = true;
80
+ }
81
+ async function claimNowPlaying(next, info, verb, alive) {
82
+ if (!info.title.trim()) throw new Error(`${verb}: title must not be empty`);
83
+ if (!navigator.mediaSession) throw new Error("Audio: Media Session is unavailable");
84
+ var ticket = ++claim;
85
+ pendingKey = next.key;
86
+ if (info.artworkUri) {
87
+ var artwork = new window.Image();
88
+ artwork.src = info.artworkUri;
89
+ await artwork.decode();
90
+ if (!alive()) throw new Error(`${verb}: playback was replaced`);
91
+ if (ticket !== claim) throw new Error(`${verb}: now playing was claimed or cleared again`);
92
+ }
93
+ if (pendingKey === next.key) pendingKey = void 0;
94
+ var session = navigator.mediaSession;
95
+ setOwner(next);
96
+ session.metadata = new MediaMetadata({
97
+ title: info.title,
98
+ artist: info.artist,
99
+ album: info.albumTitle,
100
+ artwork: info.artworkUri ? [{ src: info.artworkUri }] : []
101
+ });
102
+ install(session);
103
+ sync();
104
+ }
105
+ function releaseNowPlaying(key) {
106
+ if (pendingKey === key) {
107
+ claim++;
108
+ pendingKey = void 0;
109
+ }
110
+ if ((owner === null || owner === void 0 ? void 0 : owner.key) !== key) return;
111
+ setOwner(void 0);
112
+ if (typeof window === "undefined" || !navigator.mediaSession) return;
113
+ var session = navigator.mediaSession;
114
+ if (installed) for (var _i = 0, _iter = [
115
+ "play",
116
+ "pause",
117
+ "seekto"
118
+ ]; _i < _iter.length; _i++) {
119
+ var action = _iter[_i];
120
+ session.setActionHandler(action, null);
121
+ }
122
+ installed = false;
123
+ session.metadata = null;
124
+ session.playbackState = "none";
125
+ }
126
+ function addRemoteListener(onEvent) {
127
+ listeners.add(onEvent);
128
+ return function() {
129
+ listeners.delete(onEvent);
130
+ };
131
+ }
132
+
133
+ export { addRemoteListener, claimNowPlaying, releaseNowPlaying };
134
+ //# sourceMappingURL=nowPlaying.native.js.map