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.
- package/android/src/main/java/com/margelo/nitro/one/HybridOneAudio.kt +309 -124
- package/dist/cjs/cli/build.cjs +31 -33
- package/dist/cjs/cli/build.native.cjs +31 -33
- package/dist/cjs/cli/build.native.js +31 -33
- package/dist/cjs/cli/build.native.js.map +1 -1
- package/dist/cjs/cli/buildPage.cjs +11 -7
- package/dist/cjs/cli/buildPage.native.cjs +11 -7
- package/dist/cjs/cli/buildPage.native.js +11 -7
- package/dist/cjs/cli/buildPage.native.js.map +1 -1
- package/dist/cjs/cli/buildPageWorker.cjs +1 -1
- package/dist/cjs/cli/buildPageWorker.native.cjs +1 -1
- package/dist/cjs/cli/buildPageWorker.native.js +1 -1
- package/dist/cjs/cli/buildPageWorker.native.js.map +1 -1
- package/dist/cjs/cli-dev-memory.cjs +43 -0
- package/dist/cjs/cli-dev-memory.native.cjs +84 -0
- package/dist/cjs/cli-dev-memory.native.js +86 -0
- package/dist/cjs/cli-dev-memory.native.js.map +1 -0
- package/dist/cjs/headless-server.cjs +2 -5
- package/dist/cjs/headless-server.native.cjs +2 -5
- package/dist/cjs/headless-server.native.js +2 -5
- package/dist/cjs/headless-server.native.js.map +1 -1
- package/dist/cjs/platform/audio/index.cjs +83 -76
- package/dist/cjs/platform/audio/index.native.cjs +2 -2
- package/dist/cjs/platform/audio/index.native.js +2 -2
- package/dist/cjs/platform/audio/index.native.js.map +1 -1
- package/dist/cjs/platform/audio/nowPlaying.cjs +126 -0
- package/dist/cjs/platform/audio/nowPlaying.native.cjs +160 -0
- package/dist/cjs/platform/audio/nowPlaying.native.js +162 -0
- package/dist/cjs/platform/audio/nowPlaying.native.js.map +1 -0
- package/dist/cjs/platform/audio/player.cjs +15 -0
- package/dist/cjs/platform/audio/player.native.cjs +14 -0
- package/dist/cjs/platform/audio/player.native.js +14 -0
- package/dist/cjs/platform/audio/player.native.js.map +1 -1
- package/dist/cjs/platform/audio/unavailable.cjs +1 -1
- package/dist/cjs/platform/audio/unavailable.native.cjs +1 -1
- package/dist/cjs/platform/audio/unavailable.native.js +1 -1
- package/dist/cjs/platform/audio/unavailable.native.js.map +1 -1
- package/dist/cjs/serve-worker.cjs +0 -3
- package/dist/cjs/serve-worker.native.cjs +0 -3
- package/dist/cjs/serve-worker.native.js +0 -3
- package/dist/cjs/serve-worker.native.js.map +1 -1
- package/dist/cjs/server/oneServe.cjs +0 -6
- package/dist/cjs/server/oneServe.native.cjs +0 -6
- package/dist/cjs/server/oneServe.native.js +0 -6
- package/dist/cjs/server/oneServe.native.js.map +1 -1
- package/dist/cjs/server/workerHandler.cjs +12 -10
- package/dist/cjs/server/workerHandler.native.cjs +14 -10
- package/dist/cjs/server/workerHandler.native.js +14 -10
- package/dist/cjs/server/workerHandler.native.js.map +1 -1
- package/dist/cjs/vite/plugins/workerdDevPlugin.cjs +33 -37
- package/dist/cjs/vite/plugins/workerdDevPlugin.native.cjs +33 -37
- package/dist/cjs/vite/plugins/workerdDevPlugin.native.js +33 -37
- package/dist/cjs/vite/plugins/workerdDevPlugin.native.js.map +1 -1
- package/dist/esm/cli/build.mjs +31 -33
- package/dist/esm/cli/build.mjs.map +1 -1
- package/dist/esm/cli/build.native.js +31 -33
- package/dist/esm/cli/build.native.js.map +1 -1
- package/dist/esm/cli/buildPage.mjs +11 -7
- package/dist/esm/cli/buildPage.mjs.map +1 -1
- package/dist/esm/cli/buildPage.native.js +11 -7
- package/dist/esm/cli/buildPage.native.js.map +1 -1
- package/dist/esm/cli/buildPageWorker.mjs +1 -1
- package/dist/esm/cli/buildPageWorker.mjs.map +1 -1
- package/dist/esm/cli/buildPageWorker.native.js +1 -1
- package/dist/esm/cli/buildPageWorker.native.js.map +1 -1
- package/dist/esm/cli-dev-memory.mjs +23 -0
- package/dist/esm/cli-dev-memory.mjs.map +1 -0
- package/dist/esm/cli-dev-memory.native.js +62 -0
- package/dist/esm/cli-dev-memory.native.js.map +1 -0
- package/dist/esm/headless-server.mjs +2 -3
- package/dist/esm/headless-server.mjs.map +1 -1
- package/dist/esm/headless-server.native.js +2 -3
- package/dist/esm/headless-server.native.js.map +1 -1
- package/dist/esm/platform/audio/index.mjs +83 -76
- package/dist/esm/platform/audio/index.mjs.map +1 -1
- package/dist/esm/platform/audio/index.native.js +2 -2
- package/dist/esm/platform/audio/index.native.js.map +1 -1
- package/dist/esm/platform/audio/nowPlaying.mjs +102 -0
- package/dist/esm/platform/audio/nowPlaying.mjs.map +1 -0
- package/dist/esm/platform/audio/nowPlaying.native.js +134 -0
- package/dist/esm/platform/audio/nowPlaying.native.js.map +1 -0
- package/dist/esm/platform/audio/player.mjs +15 -0
- package/dist/esm/platform/audio/player.mjs.map +1 -1
- package/dist/esm/platform/audio/player.native.js +14 -0
- package/dist/esm/platform/audio/player.native.js.map +1 -1
- package/dist/esm/platform/audio/unavailable.mjs +1 -1
- package/dist/esm/platform/audio/unavailable.mjs.map +1 -1
- package/dist/esm/platform/audio/unavailable.native.js +1 -1
- package/dist/esm/platform/audio/unavailable.native.js.map +1 -1
- package/dist/esm/serve-worker.mjs +1 -2
- package/dist/esm/serve-worker.mjs.map +1 -1
- package/dist/esm/serve-worker.native.js +1 -2
- package/dist/esm/serve-worker.native.js.map +1 -1
- package/dist/esm/server/oneServe.mjs +0 -6
- package/dist/esm/server/oneServe.mjs.map +1 -1
- package/dist/esm/server/oneServe.native.js +0 -6
- package/dist/esm/server/oneServe.native.js.map +1 -1
- package/dist/esm/server/workerHandler.mjs +12 -10
- package/dist/esm/server/workerHandler.mjs.map +1 -1
- package/dist/esm/server/workerHandler.native.js +14 -10
- package/dist/esm/server/workerHandler.native.js.map +1 -1
- package/dist/esm/vite/plugins/workerdDevPlugin.mjs +33 -37
- package/dist/esm/vite/plugins/workerdDevPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/workerdDevPlugin.native.js +33 -37
- package/dist/esm/vite/plugins/workerdDevPlugin.native.js.map +1 -1
- package/ios/Nitro/HybridOneAudio.swift +309 -96
- package/nitrogen/generated/android/c++/JAudioPlayOptions.hpp +61 -0
- package/nitrogen/generated/android/c++/JAudioRemoteCommandEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_AudioRemoteCommandEvent.hpp +1 -0
- package/nitrogen/generated/android/c++/JHybridOneAudioSpec.cpp +37 -3
- package/nitrogen/generated/android/c++/JHybridOneAudioSpec.hpp +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AudioPlayOptions.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AudioRemoteCommandEvent.kt +9 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneAudioSpec.kt +40 -32
- package/nitrogen/generated/ios/One-Swift-Cxx-Umbrella.hpp +3 -0
- package/nitrogen/generated/ios/c++/HybridOneAudioSpecSwift.hpp +21 -2
- package/nitrogen/generated/ios/swift/AudioPlayOptions.swift +60 -0
- package/nitrogen/generated/ios/swift/AudioRemoteCommandEvent.swift +19 -1
- package/nitrogen/generated/ios/swift/HybridOneAudioSpec.swift +3 -1
- package/nitrogen/generated/ios/swift/HybridOneAudioSpec_cxx.swift +70 -32
- package/nitrogen/generated/shared/c++/AudioPlayOptions.hpp +87 -0
- package/nitrogen/generated/shared/c++/AudioRemoteCommandEvent.hpp +7 -2
- package/nitrogen/generated/shared/c++/HybridOneAudioSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridOneAudioSpec.hpp +6 -1
- package/package.json +13 -13
- package/run.mjs +5 -1
- package/src/cli/build.ts +35 -32
- package/src/cli/buildPage.test.ts +152 -0
- package/src/cli/buildPage.ts +14 -9
- package/src/cli/buildPageWorker.ts +2 -1
- package/src/cli/workerPool.ts +1 -0
- package/src/cli-dev-memory.ts +24 -0
- package/src/headless-server.ts +2 -2
- package/src/index.ts +1 -0
- package/src/platform/audio/index.native.ts +4 -2
- package/src/platform/audio/index.ts +102 -74
- package/src/platform/audio/nowPlaying.ts +122 -0
- package/src/platform/audio/player.native.ts +17 -1
- package/src/platform/audio/player.ts +23 -1
- package/src/platform/audio/types.ts +6 -1
- package/src/platform/audio/unavailable.ts +3 -1
- package/src/platform/index.native.ts +1 -0
- package/src/platform/index.ts +1 -0
- package/src/platform/specs/OneAudio.nitro.ts +11 -1
- package/src/serve-worker.ts +2 -3
- package/src/server/oneServe.ts +0 -6
- package/src/server/workerHandler.ts +34 -18
- package/src/vite/plugins/workerdDevPlugin.ts +33 -37
- package/src/vite/resolveResponse.ts +2 -2
- package/types/cli/build.d.ts.map +1 -1
- package/types/cli/buildPage.d.ts +1 -1
- package/types/cli/buildPage.d.ts.map +1 -1
- package/types/cli/workerPool.d.ts +1 -0
- package/types/cli/workerPool.d.ts.map +1 -1
- package/types/cli-dev-memory.d.ts +2 -0
- package/types/cli-dev-memory.d.ts.map +1 -0
- package/types/headless-server.d.ts +3 -3
- package/types/headless-server.d.ts.map +1 -1
- package/types/index.d.ts +1 -1
- package/types/index.d.ts.map +1 -1
- package/types/platform/audio/index.d.ts +2 -2
- package/types/platform/audio/index.d.ts.map +1 -1
- package/types/platform/audio/index.native.d.ts +3 -3
- package/types/platform/audio/index.native.d.ts.map +1 -1
- package/types/platform/audio/nowPlaying.d.ts +12 -0
- package/types/platform/audio/nowPlaying.d.ts.map +1 -0
- package/types/platform/audio/player.d.ts +3 -1
- package/types/platform/audio/player.d.ts.map +1 -1
- package/types/platform/audio/player.native.d.ts +3 -1
- package/types/platform/audio/player.native.d.ts.map +1 -1
- package/types/platform/audio/types.d.ts +3 -1
- package/types/platform/audio/types.d.ts.map +1 -1
- package/types/platform/audio/unavailable.d.ts +3 -3
- package/types/platform/audio/unavailable.d.ts.map +1 -1
- package/types/platform/index.d.ts +1 -1
- package/types/platform/index.d.ts.map +1 -1
- package/types/platform/index.native.d.ts +1 -1
- package/types/platform/index.native.d.ts.map +1 -1
- package/types/platform/specs/OneAudio.nitro.d.ts +8 -1
- package/types/platform/specs/OneAudio.nitro.d.ts.map +1 -1
- package/types/serve-worker.d.ts +3 -3
- package/types/serve-worker.d.ts.map +1 -1
- package/types/server/oneServe.d.ts.map +1 -1
- package/types/server/workerHandler.d.ts +1 -1
- package/types/server/workerHandler.d.ts.map +1 -1
- package/types/vite/plugins/workerdDevPlugin.d.ts.map +1 -1
- package/types/vite/resolveResponse.d.ts +1 -1
- package/types/vite/resolveResponse.d.ts.map +1 -1
- package/dist/cjs/server/staticHtmlFetcher.cjs +0 -33
- package/dist/cjs/server/staticHtmlFetcher.native.cjs +0 -35
- package/dist/cjs/server/staticHtmlFetcher.native.js +0 -37
- package/dist/cjs/server/staticHtmlFetcher.native.js.map +0 -1
- package/dist/esm/server/staticHtmlFetcher.mjs +0 -10
- package/dist/esm/server/staticHtmlFetcher.mjs.map +0 -1
- package/dist/esm/server/staticHtmlFetcher.native.js +0 -10
- package/dist/esm/server/staticHtmlFetcher.native.js.map +0 -1
- package/src/server/staticHtmlFetcher.ts +0 -12
- package/types/server/staticHtmlFetcher.d.ts +0 -3
- 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
|
-
|
|
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
|
|
116
|
-
|
|
117
|
-
return
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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
|