@kieransimkin/dancemoves 3.1.20 → 3.1.22
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/README.md +12 -0
- package/docs/child-playback.md +94 -0
- package/docs/playback-sources.md +7 -0
- package/docs/shared-feature-coverage.md +1 -0
- package/docs/wordpress-org.md +6 -0
- package/lib/build-manifest.json +11 -11
- package/lib/dancemoves.min.js +3 -3
- package/lib/index.cjs +435 -5
- package/lib/index.d.ts +17 -0
- package/lib/index.mjs +435 -5
- package/lib/wordpress.js +3 -3
- package/package.json +1 -1
- package/readme.txt +6 -2
package/lib/index.mjs
CHANGED
|
@@ -6176,12 +6176,14 @@ function installPlayback(scope, api, host = scope.document.defaultView) {
|
|
|
6176
6176
|
groups.set(master, group);
|
|
6177
6177
|
return group;
|
|
6178
6178
|
}
|
|
6179
|
-
function
|
|
6179
|
+
function registerEndpoint(options, provider = false) {
|
|
6180
6180
|
if (!options || options.masterVerified !== true) throw new TypeError("An explicitly verified master association is required");
|
|
6181
6181
|
const group = groupFor(options.master), mapping = validatePlaybackMapping(options, group.duration());
|
|
6182
6182
|
const element = options.player;
|
|
6183
6183
|
if (!element?.addEventListener || !["AUDIO", "VIDEO"].includes(element.tagName)) throw new TypeError("player must be native audio or video");
|
|
6184
|
-
if (element.ownerDocument !== host.document || !scope.legacyGlobals && !scope.root.contains(element)) throw new TypeError("The player must belong to this runtime root");
|
|
6184
|
+
if (element.ownerDocument !== host.document || !provider && !scope.legacyGlobals && !scope.root.contains(element)) throw new TypeError("The player must belong to this runtime root");
|
|
6185
|
+
if (provider && (!element.removeEventListener || typeof element.play !== "function" || typeof element.pause !== "function")) throw new TypeError("An event-driven playback provider is required");
|
|
6186
|
+
if (provider && typeof host.Node === "function" && element instanceof host.Node) throw new TypeError("Use registerPlayer for native DOM players");
|
|
6185
6187
|
if (registered.has(element)) throw new Error("Player already has a playback owner");
|
|
6186
6188
|
if (element === options.master || element === group.transport.element) throw new TypeError("The master is already registered");
|
|
6187
6189
|
const previousGroup = groups.get(element);
|
|
@@ -6201,7 +6203,7 @@ function installPlayback(scope, api, host = scope.document.defaultView) {
|
|
|
6201
6203
|
registered.delete(element);
|
|
6202
6204
|
controllers.delete(controller);
|
|
6203
6205
|
}, snapshot() {
|
|
6204
|
-
return { kind: "native", mapping, active: group.isActive(source), destroyed };
|
|
6206
|
+
return { kind: provider ? "provider" : "native", mapping, active: group.isActive(source), destroyed };
|
|
6205
6207
|
} };
|
|
6206
6208
|
registered.set(element, controller);
|
|
6207
6209
|
if (!element.paused && !element.ended) group.forward(source, "playing");
|
|
@@ -6211,6 +6213,8 @@ function installPlayback(scope, api, host = scope.document.defaultView) {
|
|
|
6211
6213
|
controllers.add(controller);
|
|
6212
6214
|
return controller;
|
|
6213
6215
|
}
|
|
6216
|
+
const registerPlayer = (options) => registerEndpoint(options);
|
|
6217
|
+
const registerPlaybackProvider = (options) => registerEndpoint(options, true);
|
|
6214
6218
|
function registerYouTube(options) {
|
|
6215
6219
|
if (!options || options.masterVerified !== true) throw new TypeError("An explicitly verified master association is required");
|
|
6216
6220
|
const group = groupFor(options.master), mapping = validatePlaybackMapping(options, group.duration());
|
|
@@ -6390,7 +6394,7 @@ function installPlayback(scope, api, host = scope.document.defaultView) {
|
|
|
6390
6394
|
let source = transports.has(master) ? master : groupFor(master).transport;
|
|
6391
6395
|
while (aliases.has(source)) source = aliases.get(source);
|
|
6392
6396
|
return source;
|
|
6393
|
-
}, registerPlayer, registerYouTube });
|
|
6397
|
+
}, registerPlayer, registerPlaybackProvider, registerYouTube });
|
|
6394
6398
|
scope.onDispose(() => {
|
|
6395
6399
|
disposed = true;
|
|
6396
6400
|
for (const controller of [...controllers]) controller.teardown();
|
|
@@ -6399,8 +6403,431 @@ function installPlayback(scope, api, host = scope.document.defaultView) {
|
|
|
6399
6403
|
});
|
|
6400
6404
|
}
|
|
6401
6405
|
|
|
6406
|
+
// .build/modules/child-playback.mjs
|
|
6407
|
+
var PROTOCOL = "dancemoves.child-playback.v1";
|
|
6408
|
+
var EVENTS = /* @__PURE__ */ new Set(["snapshot", "loadedmetadata", "durationchange", "play", "playing", "pause", "ended", "seeking", "seeked", "ratechange", "timeupdate", "waiting", "error"]);
|
|
6409
|
+
var MAX_SECONDS = 86400;
|
|
6410
|
+
var publisherOwners = /* @__PURE__ */ new WeakMap();
|
|
6411
|
+
var receiverOwners = /* @__PURE__ */ new WeakMap();
|
|
6412
|
+
function identity(value, name) {
|
|
6413
|
+
if (typeof value !== "string" || !value.trim() || value.length > 200) throw new TypeError(`${name} must be a nonempty string of at most 200 characters`);
|
|
6414
|
+
return value;
|
|
6415
|
+
}
|
|
6416
|
+
function exactOrigin(value) {
|
|
6417
|
+
const url2 = new URL(value);
|
|
6418
|
+
if (!["http:", "https:"].includes(url2.protocol) || url2.origin !== value) throw new TypeError("An exact HTTP(S) origin is required");
|
|
6419
|
+
return value;
|
|
6420
|
+
}
|
|
6421
|
+
function context(options) {
|
|
6422
|
+
const host = options.window || globalThis.window;
|
|
6423
|
+
if (!host?.document || !host.crypto?.randomUUID) throw new TypeError("A browser Window with crypto.randomUUID is required");
|
|
6424
|
+
return { host, channel: identity(options.channel, "channel"), assetId: identity(options.assetId, "assetId"), origin: exactOrigin(options.origin) };
|
|
6425
|
+
}
|
|
6426
|
+
function validState(value) {
|
|
6427
|
+
return value && typeof value === "object" && typeof value.time === "number" && Number.isFinite(value.time) && value.time >= 0 && typeof value.duration === "number" && Number.isFinite(value.duration) && value.duration > 0 && value.duration <= MAX_SECONDS && value.time <= value.duration + 0.25 && typeof value.rate === "number" && Number.isFinite(value.rate) && value.rate >= 0.0625 && value.rate <= 16 && ["paused", "ended", "seeking", "buffering", "error"].every((key) => typeof value[key] === "boolean");
|
|
6428
|
+
}
|
|
6429
|
+
function packet(data, channel, assetId) {
|
|
6430
|
+
return data && typeof data === "object" && data.protocol === PROTOCOL && data.channel === channel && data.assetId === assetId;
|
|
6431
|
+
}
|
|
6432
|
+
function resources(host) {
|
|
6433
|
+
const removers = [], timers = /* @__PURE__ */ new Set();
|
|
6434
|
+
return {
|
|
6435
|
+
listen(target, type, callback) {
|
|
6436
|
+
target.addEventListener(type, callback);
|
|
6437
|
+
removers.push(() => target.removeEventListener(type, callback));
|
|
6438
|
+
},
|
|
6439
|
+
later(callback, delay) {
|
|
6440
|
+
const id = host.setTimeout(() => {
|
|
6441
|
+
timers.delete(id);
|
|
6442
|
+
callback();
|
|
6443
|
+
}, delay);
|
|
6444
|
+
timers.add(id);
|
|
6445
|
+
return id;
|
|
6446
|
+
},
|
|
6447
|
+
cancel(id) {
|
|
6448
|
+
if (id) {
|
|
6449
|
+
host.clearTimeout(id);
|
|
6450
|
+
timers.delete(id);
|
|
6451
|
+
}
|
|
6452
|
+
},
|
|
6453
|
+
dispose() {
|
|
6454
|
+
removers.splice(0).forEach((remove) => remove());
|
|
6455
|
+
for (const id of timers) host.clearTimeout(id);
|
|
6456
|
+
timers.clear();
|
|
6457
|
+
},
|
|
6458
|
+
snapshot() {
|
|
6459
|
+
return { listeners: removers.length, timers: timers.size };
|
|
6460
|
+
}
|
|
6461
|
+
};
|
|
6462
|
+
}
|
|
6463
|
+
function createPlaybackPublisher(options = {}) {
|
|
6464
|
+
const { host, channel, assetId, origin } = context(options), source = options.source;
|
|
6465
|
+
const target = options.targetWindow || host.parent;
|
|
6466
|
+
if (!source?.addEventListener || !source?.pause || !target?.postMessage || target === host) throw new TypeError("A playback source and distinct target Window are required");
|
|
6467
|
+
const owners = publisherOwners.get(host) || /* @__PURE__ */ new Map(), key = JSON.stringify([origin, channel, assetId]);
|
|
6468
|
+
const routes = owners.get(target) || /* @__PURE__ */ new Set();
|
|
6469
|
+
if (routes.has(key)) throw new Error("Child playback route already has a publisher");
|
|
6470
|
+
const owned = resources(host);
|
|
6471
|
+
let session = null, sequence = 0, commandSequence = 0, timer = 0, destroyed = false, suspended = false, lastPublished = null;
|
|
6472
|
+
const envelope = (type, extra = {}) => ({ protocol: PROTOCOL, channel, assetId, session, type, ...extra });
|
|
6473
|
+
function send(type, extra) {
|
|
6474
|
+
target.postMessage(envelope(type, extra), origin);
|
|
6475
|
+
}
|
|
6476
|
+
function stop() {
|
|
6477
|
+
owned.cancel(timer);
|
|
6478
|
+
timer = 0;
|
|
6479
|
+
}
|
|
6480
|
+
function sample(event = "snapshot") {
|
|
6481
|
+
if (event === "timeupdate" && lastPublished !== null && host.performance.now() - lastPublished < 250) return;
|
|
6482
|
+
stop();
|
|
6483
|
+
if (destroyed || suspended || !session) return;
|
|
6484
|
+
const state = { time: Number(source.currentTime), duration: Number(source.duration), rate: Number(source.playbackRate), paused: !!source.paused, ended: !!source.ended, seeking: !!source.seeking, buffering: event === "waiting", error: !!source.error };
|
|
6485
|
+
if (!validState(state)) return;
|
|
6486
|
+
lastPublished = host.performance.now();
|
|
6487
|
+
send("state", { sequence: ++sequence, event, state });
|
|
6488
|
+
if (!state.paused && !state.ended && !state.error && !state.buffering && !host.document.hidden) timer = owned.later(() => sample(), 250);
|
|
6489
|
+
}
|
|
6490
|
+
function disconnect(reason) {
|
|
6491
|
+
stop();
|
|
6492
|
+
source.pause();
|
|
6493
|
+
if (session) send("disconnect", { reason });
|
|
6494
|
+
session = null;
|
|
6495
|
+
}
|
|
6496
|
+
function message(event) {
|
|
6497
|
+
const data = event.data;
|
|
6498
|
+
if (destroyed || suspended || event.source !== target || event.origin !== origin || !packet(data, channel, assetId)) return;
|
|
6499
|
+
if (data.type === "connect" && typeof data.session === "string" && /^[0-9a-f-]{36}$/i.test(data.session)) {
|
|
6500
|
+
if (session !== data.session) {
|
|
6501
|
+
session = data.session;
|
|
6502
|
+
sequence = 0;
|
|
6503
|
+
commandSequence = 0;
|
|
6504
|
+
lastPublished = null;
|
|
6505
|
+
}
|
|
6506
|
+
sample();
|
|
6507
|
+
return;
|
|
6508
|
+
}
|
|
6509
|
+
if (data.session !== session || !session) return;
|
|
6510
|
+
if (data.type === "disconnect") {
|
|
6511
|
+
disconnect("parent-disconnected");
|
|
6512
|
+
return;
|
|
6513
|
+
}
|
|
6514
|
+
if (data.type !== "command" || !Number.isSafeInteger(data.sequence) || data.sequence <= commandSequence) return;
|
|
6515
|
+
if (!["pause", "seek", "play"].includes(data.command)) return;
|
|
6516
|
+
if (data.command === "seek" && (typeof data.time !== "number" || !Number.isFinite(data.time) || data.time < 0 || data.time > Number(source.duration))) return;
|
|
6517
|
+
commandSequence = data.sequence;
|
|
6518
|
+
const currentSession = session;
|
|
6519
|
+
Promise.resolve().then(() => {
|
|
6520
|
+
if (destroyed || session !== currentSession) return;
|
|
6521
|
+
if (data.command === "pause") source.pause();
|
|
6522
|
+
else if (data.command === "seek") source.currentTime = data.time;
|
|
6523
|
+
else if (options.allowPlayCommands === true) return source.play();
|
|
6524
|
+
else throw new Error("Parent play commands are disabled");
|
|
6525
|
+
}).then(() => {
|
|
6526
|
+
if (!destroyed && session === currentSession) {
|
|
6527
|
+
sample();
|
|
6528
|
+
send("ack", { sequence: data.sequence, ok: true });
|
|
6529
|
+
}
|
|
6530
|
+
}, () => {
|
|
6531
|
+
if (!destroyed && session === currentSession) send("ack", { sequence: data.sequence, ok: false });
|
|
6532
|
+
});
|
|
6533
|
+
}
|
|
6534
|
+
owned.listen(host, "message", message);
|
|
6535
|
+
function requestClose() {
|
|
6536
|
+
if (!destroyed && !suspended && session) send("dismiss", { sequence: ++sequence });
|
|
6537
|
+
}
|
|
6538
|
+
if (options.notifyEscape === true) owned.listen(host.document, "keydown", (event) => {
|
|
6539
|
+
if (event.key === "Escape" && !event.defaultPrevented && !host.document.fullscreenElement) requestClose();
|
|
6540
|
+
});
|
|
6541
|
+
for (const event of EVENTS) if (event !== "snapshot") owned.listen(source, event, () => sample(event));
|
|
6542
|
+
owned.listen(host.document, "visibilitychange", () => {
|
|
6543
|
+
if (host.document.hidden) {
|
|
6544
|
+
stop();
|
|
6545
|
+
if (session) {
|
|
6546
|
+
sample("waiting");
|
|
6547
|
+
stop();
|
|
6548
|
+
}
|
|
6549
|
+
} else sample();
|
|
6550
|
+
});
|
|
6551
|
+
owned.listen(host, "pagehide", () => {
|
|
6552
|
+
suspended = true;
|
|
6553
|
+
disconnect("pagehide");
|
|
6554
|
+
});
|
|
6555
|
+
owned.listen(host, "pageshow", () => {
|
|
6556
|
+
if (!destroyed) {
|
|
6557
|
+
suspended = false;
|
|
6558
|
+
send("available");
|
|
6559
|
+
}
|
|
6560
|
+
});
|
|
6561
|
+
routes.add(key);
|
|
6562
|
+
owners.set(target, routes);
|
|
6563
|
+
publisherOwners.set(host, owners);
|
|
6564
|
+
send("available");
|
|
6565
|
+
return { requestClose, teardown() {
|
|
6566
|
+
if (destroyed) return;
|
|
6567
|
+
disconnect("teardown");
|
|
6568
|
+
destroyed = true;
|
|
6569
|
+
owned.dispose();
|
|
6570
|
+
routes.delete(key);
|
|
6571
|
+
if (!routes.size) owners.delete(target);
|
|
6572
|
+
}, snapshot() {
|
|
6573
|
+
return { kind: "child-publisher", connected: !!session, destroyed, suspended, ...owned.snapshot() };
|
|
6574
|
+
} };
|
|
6575
|
+
}
|
|
6576
|
+
function createPlaybackReceiver(options = {}) {
|
|
6577
|
+
const { host, channel, assetId, origin } = context(options), iframe = options.iframe;
|
|
6578
|
+
if (iframe?.tagName !== "IFRAME" || !iframe.contentWindow) throw new TypeError("An attached iframe is required");
|
|
6579
|
+
if (receiverOwners.has(iframe)) throw new Error("The child frame already has a playback receiver");
|
|
6580
|
+
const staleAfter = options.staleAfterMilliseconds ?? 1500;
|
|
6581
|
+
if (typeof staleAfter !== "number" || !Number.isFinite(staleAfter) || staleAfter < 750 || staleAfter > 1e4) throw new RangeError("staleAfterMilliseconds must be between 750 and 10000");
|
|
6582
|
+
const owned = resources(host), player = new host.EventTarget(), pending = /* @__PURE__ */ new Map();
|
|
6583
|
+
let session = "", sequence = 0, commands = 0, lastWall = 0, timer = 0, connectTimer = 0, destroyed = false, connected = false, status = "connecting";
|
|
6584
|
+
let state = { time: 0, duration: 0, rate: 1, paused: true, ended: false, seeking: false, buffering: false, error: false };
|
|
6585
|
+
let resolveReady, rejectReady, ready, readySettled = false;
|
|
6586
|
+
function prepareReady() {
|
|
6587
|
+
readySettled = false;
|
|
6588
|
+
ready = new Promise((resolve, reject) => {
|
|
6589
|
+
resolveReady = (value) => {
|
|
6590
|
+
readySettled = true;
|
|
6591
|
+
resolve(value);
|
|
6592
|
+
};
|
|
6593
|
+
rejectReady = (error) => {
|
|
6594
|
+
readySettled = true;
|
|
6595
|
+
reject(error);
|
|
6596
|
+
};
|
|
6597
|
+
});
|
|
6598
|
+
ready.catch(() => {
|
|
6599
|
+
});
|
|
6600
|
+
}
|
|
6601
|
+
prepareReady();
|
|
6602
|
+
const emit = (event) => player.dispatchEvent(new host.Event(event));
|
|
6603
|
+
const envelope = (type, extra = {}) => ({ protocol: PROTOCOL, channel, assetId, session, type, ...extra });
|
|
6604
|
+
function send(type, extra) {
|
|
6605
|
+
iframe.contentWindow?.postMessage(envelope(type, extra), origin);
|
|
6606
|
+
}
|
|
6607
|
+
function cancelPending() {
|
|
6608
|
+
for (const request of pending.values()) {
|
|
6609
|
+
owned.cancel(request.timer);
|
|
6610
|
+
request.reject(new Error("Child playback disconnected"));
|
|
6611
|
+
}
|
|
6612
|
+
pending.clear();
|
|
6613
|
+
}
|
|
6614
|
+
function stop(reason) {
|
|
6615
|
+
owned.cancel(timer);
|
|
6616
|
+
owned.cancel(connectTimer);
|
|
6617
|
+
timer = connectTimer = 0;
|
|
6618
|
+
const playing = !player.paused;
|
|
6619
|
+
state = { ...state, time: player.currentTime, paused: true, buffering: false };
|
|
6620
|
+
connected = false;
|
|
6621
|
+
status = reason;
|
|
6622
|
+
cancelPending();
|
|
6623
|
+
if (playing) emit("pause");
|
|
6624
|
+
}
|
|
6625
|
+
function connect() {
|
|
6626
|
+
if (destroyed) return ready;
|
|
6627
|
+
if (readySettled) prepareReady();
|
|
6628
|
+
stop("connecting");
|
|
6629
|
+
session = host.crypto.randomUUID();
|
|
6630
|
+
sequence = 0;
|
|
6631
|
+
send("connect");
|
|
6632
|
+
const started = host.performance.now();
|
|
6633
|
+
const retry = () => {
|
|
6634
|
+
if (destroyed || connected) return;
|
|
6635
|
+
if (host.performance.now() - started >= 1e4) {
|
|
6636
|
+
send("disconnect");
|
|
6637
|
+
stop("unavailable");
|
|
6638
|
+
session = "";
|
|
6639
|
+
rejectReady(new Error("Child playback did not become ready"));
|
|
6640
|
+
return;
|
|
6641
|
+
}
|
|
6642
|
+
send("connect");
|
|
6643
|
+
connectTimer = owned.later(retry, 500);
|
|
6644
|
+
};
|
|
6645
|
+
connectTimer = owned.later(retry, 500);
|
|
6646
|
+
return ready;
|
|
6647
|
+
}
|
|
6648
|
+
function command(name, time) {
|
|
6649
|
+
if (destroyed || !connected) return Promise.reject(new Error("Child playback is unavailable"));
|
|
6650
|
+
if (pending.size >= 16) return Promise.reject(new Error("Too many pending child playback commands"));
|
|
6651
|
+
const id = ++commands;
|
|
6652
|
+
return new Promise((resolve, reject) => {
|
|
6653
|
+
const timeout = owned.later(() => {
|
|
6654
|
+
pending.delete(id);
|
|
6655
|
+
reject(new Error("Child playback command timed out"));
|
|
6656
|
+
}, 2e3);
|
|
6657
|
+
pending.set(id, { resolve, reject, timer: timeout });
|
|
6658
|
+
send("command", { sequence: id, command: name, ...name === "seek" ? { time } : {} });
|
|
6659
|
+
});
|
|
6660
|
+
}
|
|
6661
|
+
Object.defineProperties(player, {
|
|
6662
|
+
nodeType: { value: 1 },
|
|
6663
|
+
tagName: { value: "VIDEO" },
|
|
6664
|
+
ownerDocument: { value: host.document },
|
|
6665
|
+
isConnected: { get: () => !destroyed && iframe.isConnected },
|
|
6666
|
+
currentTime: { get: () => Math.min(state.duration || MAX_SECONDS, state.time + (!player.paused && !state.seeking ? Math.min(500, Math.max(0, host.performance.now() - lastWall)) / 1e3 * state.rate : 0)), set: (value) => {
|
|
6667
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > state.duration) throw new RangeError("Seek must be inside the child duration");
|
|
6668
|
+
command("seek", value).catch(() => {
|
|
6669
|
+
});
|
|
6670
|
+
} },
|
|
6671
|
+
duration: { get: () => state.duration },
|
|
6672
|
+
paused: { get: () => state.paused || state.buffering || state.error || !connected },
|
|
6673
|
+
ended: { get: () => state.ended },
|
|
6674
|
+
seeking: { get: () => state.seeking },
|
|
6675
|
+
playbackRate: { get: () => state.rate },
|
|
6676
|
+
error: { get: () => state.error ? new Error("Child media error") : null }
|
|
6677
|
+
});
|
|
6678
|
+
player.play = () => command("play");
|
|
6679
|
+
player.pause = () => {
|
|
6680
|
+
command("pause").catch(() => {
|
|
6681
|
+
});
|
|
6682
|
+
};
|
|
6683
|
+
function message(event) {
|
|
6684
|
+
const data = event.data;
|
|
6685
|
+
if (destroyed || event.source !== iframe.contentWindow || event.origin !== origin || !packet(data, channel, assetId)) return;
|
|
6686
|
+
if (data.type === "available") {
|
|
6687
|
+
if (!host.document.hidden) {
|
|
6688
|
+
if (connected) send("connect");
|
|
6689
|
+
else connect();
|
|
6690
|
+
}
|
|
6691
|
+
return;
|
|
6692
|
+
}
|
|
6693
|
+
if (data.session !== session) return;
|
|
6694
|
+
if (data.type === "dismiss" && Number.isSafeInteger(data.sequence) && data.sequence > sequence) {
|
|
6695
|
+
sequence = data.sequence;
|
|
6696
|
+
emit("dismiss");
|
|
6697
|
+
return;
|
|
6698
|
+
}
|
|
6699
|
+
if (data.type === "disconnect") {
|
|
6700
|
+
stop("disconnected");
|
|
6701
|
+
session = "";
|
|
6702
|
+
return;
|
|
6703
|
+
}
|
|
6704
|
+
if (data.type === "ack" && Number.isSafeInteger(data.sequence) && typeof data.ok === "boolean") {
|
|
6705
|
+
const request = pending.get(data.sequence);
|
|
6706
|
+
if (request) {
|
|
6707
|
+
owned.cancel(request.timer);
|
|
6708
|
+
pending.delete(data.sequence);
|
|
6709
|
+
data.ok ? request.resolve() : request.reject(new Error("Child playback rejected the command"));
|
|
6710
|
+
}
|
|
6711
|
+
return;
|
|
6712
|
+
}
|
|
6713
|
+
if (data.type !== "state" || !Number.isSafeInteger(data.sequence) || data.sequence <= sequence || !EVENTS.has(data.event) || !validState(data.state)) return;
|
|
6714
|
+
const previous = state, wasConnected = connected, wasPaused = player.paused;
|
|
6715
|
+
sequence = data.sequence;
|
|
6716
|
+
state = { ...data.state };
|
|
6717
|
+
lastWall = host.performance.now();
|
|
6718
|
+
connected = true;
|
|
6719
|
+
status = "connected";
|
|
6720
|
+
owned.cancel(connectTimer);
|
|
6721
|
+
connectTimer = 0;
|
|
6722
|
+
owned.cancel(timer);
|
|
6723
|
+
timer = 0;
|
|
6724
|
+
if (!wasConnected) {
|
|
6725
|
+
emit("loadedmetadata");
|
|
6726
|
+
resolveReady(controller);
|
|
6727
|
+
} else if (previous.duration !== state.duration) emit("durationchange");
|
|
6728
|
+
if (previous.rate !== state.rate) emit("ratechange");
|
|
6729
|
+
if (state.seeking && !previous.seeking) emit("seeking");
|
|
6730
|
+
if (!state.seeking && previous.seeking) emit("seeked");
|
|
6731
|
+
if (!state.seeking && !previous.seeking && wasConnected && Math.abs(state.time - previous.time - (wasPaused ? 0 : (lastWall - previousWall) / 1e3 * previous.rate)) > 0.4) {
|
|
6732
|
+
emit("seeking");
|
|
6733
|
+
emit("seeked");
|
|
6734
|
+
}
|
|
6735
|
+
previousWall = lastWall;
|
|
6736
|
+
if (wasPaused && !player.paused) {
|
|
6737
|
+
emit("play");
|
|
6738
|
+
emit("playing");
|
|
6739
|
+
}
|
|
6740
|
+
if (!wasPaused && player.paused) emit("pause");
|
|
6741
|
+
if (state.ended && !previous.ended) emit("ended");
|
|
6742
|
+
if (data.event === "waiting") emit("waiting");
|
|
6743
|
+
if (state.error && !previous.error) emit("error");
|
|
6744
|
+
emit("timeupdate");
|
|
6745
|
+
if (!player.paused) timer = owned.later(() => {
|
|
6746
|
+
send("disconnect");
|
|
6747
|
+
stop("stale");
|
|
6748
|
+
session = "";
|
|
6749
|
+
emit("waiting");
|
|
6750
|
+
}, staleAfter);
|
|
6751
|
+
}
|
|
6752
|
+
let previousWall = 0;
|
|
6753
|
+
owned.listen(host, "message", message);
|
|
6754
|
+
owned.listen(iframe, "load", connect);
|
|
6755
|
+
owned.listen(host, "pagehide", () => {
|
|
6756
|
+
send("disconnect");
|
|
6757
|
+
stop("suspended");
|
|
6758
|
+
session = "";
|
|
6759
|
+
});
|
|
6760
|
+
owned.listen(host, "pageshow", connect);
|
|
6761
|
+
owned.listen(host.document, "visibilitychange", () => {
|
|
6762
|
+
if (host.document.hidden) {
|
|
6763
|
+
send("command", { sequence: ++commands, command: "pause" });
|
|
6764
|
+
stop("hidden");
|
|
6765
|
+
session = "";
|
|
6766
|
+
} else connect();
|
|
6767
|
+
});
|
|
6768
|
+
const observer = new host.MutationObserver(() => {
|
|
6769
|
+
if (!iframe.isConnected) controller.teardown();
|
|
6770
|
+
});
|
|
6771
|
+
observer.observe(host.document.documentElement, { childList: true, subtree: true });
|
|
6772
|
+
const controller = { player, get ready() {
|
|
6773
|
+
return ready;
|
|
6774
|
+
}, reconnect: connect, teardown() {
|
|
6775
|
+
if (destroyed) return;
|
|
6776
|
+
send("command", { sequence: ++commands, command: "pause" });
|
|
6777
|
+
send("disconnect");
|
|
6778
|
+
stop("destroyed");
|
|
6779
|
+
destroyed = true;
|
|
6780
|
+
session = "";
|
|
6781
|
+
rejectReady(new Error("Child playback owner removed"));
|
|
6782
|
+
observer.disconnect();
|
|
6783
|
+
owned.dispose();
|
|
6784
|
+
receiverOwners.delete(iframe);
|
|
6785
|
+
}, snapshot() {
|
|
6786
|
+
return { kind: "child-receiver", status, connected, destroyed, time: player.currentTime, paused: player.paused, assetId, ...owned.snapshot() };
|
|
6787
|
+
} };
|
|
6788
|
+
receiverOwners.set(iframe, controller);
|
|
6789
|
+
connect();
|
|
6790
|
+
return controller;
|
|
6791
|
+
}
|
|
6792
|
+
function installChildPlayback(scope, api, host) {
|
|
6793
|
+
function own(controller) {
|
|
6794
|
+
const teardown = controller.teardown.bind(controller);
|
|
6795
|
+
const remove = scope.onDispose(() => teardown());
|
|
6796
|
+
controller.teardown = () => {
|
|
6797
|
+
remove();
|
|
6798
|
+
teardown();
|
|
6799
|
+
};
|
|
6800
|
+
return controller;
|
|
6801
|
+
}
|
|
6802
|
+
api.publishPlayback = (options) => {
|
|
6803
|
+
if (api.destroyed) throw new Error("DanceMoves owner is destroyed");
|
|
6804
|
+
return own(createPlaybackPublisher({ ...options, window: host }));
|
|
6805
|
+
};
|
|
6806
|
+
api.receiveChildPlayback = (options) => {
|
|
6807
|
+
if (api.destroyed) throw new Error("DanceMoves owner is destroyed");
|
|
6808
|
+
if (typeof api.registerPlaybackProvider !== "function") throw new Error("The shared playback provider API is required");
|
|
6809
|
+
if (options?.masterVerified !== true) throw new TypeError("An explicitly verified master association is required");
|
|
6810
|
+
const receiver = createPlaybackReceiver({ ...options, window: host });
|
|
6811
|
+
let registration;
|
|
6812
|
+
try {
|
|
6813
|
+
registration = api.registerPlaybackProvider({ ...options, player: receiver.player });
|
|
6814
|
+
} catch (error) {
|
|
6815
|
+
receiver.teardown();
|
|
6816
|
+
throw error;
|
|
6817
|
+
}
|
|
6818
|
+
return own({ source: registration.source, player: receiver.player, get ready() {
|
|
6819
|
+
return receiver.ready;
|
|
6820
|
+
}, mapping: registration.mapping, reconnect: receiver.reconnect, teardown() {
|
|
6821
|
+
receiver.teardown();
|
|
6822
|
+
registration.teardown();
|
|
6823
|
+
}, snapshot() {
|
|
6824
|
+
return { ...receiver.snapshot(), mapping: registration.mapping };
|
|
6825
|
+
} });
|
|
6826
|
+
};
|
|
6827
|
+
}
|
|
6828
|
+
|
|
6402
6829
|
// .build/modules/version.mjs
|
|
6403
|
-
var VERSION = "3.1.
|
|
6830
|
+
var VERSION = "3.1.22";
|
|
6404
6831
|
|
|
6405
6832
|
// .build/modules/index.mjs
|
|
6406
6833
|
var mounted = /* @__PURE__ */ new WeakMap();
|
|
@@ -6468,6 +6895,7 @@ function createDanceMoves(options = {}) {
|
|
|
6468
6895
|
}
|
|
6469
6896
|
});
|
|
6470
6897
|
Object.defineProperty(api, "destroyed", { get: () => scope.disposed });
|
|
6898
|
+
installChildPlayback(scope, api, ownerDocument.defaultView);
|
|
6471
6899
|
api.ready = Promise.resolve(api.ready).then(() => {
|
|
6472
6900
|
if (!scope.disposed) scope.document.dispatchEvent(new w.CustomEvent("dance-moves-ready", {
|
|
6473
6901
|
bubbles: true,
|
|
@@ -6490,6 +6918,8 @@ export {
|
|
|
6490
6918
|
VERSION,
|
|
6491
6919
|
createDanceMoves,
|
|
6492
6920
|
createMemoryPageStore,
|
|
6921
|
+
createPlaybackPublisher,
|
|
6922
|
+
createPlaybackReceiver,
|
|
6493
6923
|
fromWordPressMeta,
|
|
6494
6924
|
validatePageConfig
|
|
6495
6925
|
};
|