@thewhateverapp/tile-sdk 0.15.4 → 0.15.6
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.
|
@@ -107,6 +107,11 @@ export declare class TileBridge {
|
|
|
107
107
|
* Handle keyboard state message from parent (mobile app)
|
|
108
108
|
*/
|
|
109
109
|
private handleKeyboard;
|
|
110
|
+
/**
|
|
111
|
+
* Handle audio status request from parent
|
|
112
|
+
* Returns actual muted state of all media for verification
|
|
113
|
+
*/
|
|
114
|
+
private handleAudioStatusRequest;
|
|
110
115
|
/**
|
|
111
116
|
* Handle visibility state message from parent (mobile app)
|
|
112
117
|
* Used for TikTok-style feeds where tiles are preloaded but not visible
|
|
@@ -120,7 +125,8 @@ export declare class TileBridge {
|
|
|
120
125
|
private patchAudioContext;
|
|
121
126
|
/**
|
|
122
127
|
* ROBUST: MutationObserver to watch for dynamically added media elements
|
|
123
|
-
*
|
|
128
|
+
* Ensures new video/audio elements respect current visibility state
|
|
129
|
+
* Critical for race conditions where video is created AFTER visibility message
|
|
124
130
|
*/
|
|
125
131
|
private setupMediaObserver;
|
|
126
132
|
/**
|
|
@@ -381,6 +387,30 @@ export declare class TileBridge {
|
|
|
381
387
|
* Unregister an AudioContext (e.g., when closing it)
|
|
382
388
|
*/
|
|
383
389
|
unregisterAudioContext(ctx: AudioContext): void;
|
|
390
|
+
/**
|
|
391
|
+
* Get actual audio status of all media elements and AudioContexts.
|
|
392
|
+
* This reports the ACTUAL muted state, not just what the parent requested.
|
|
393
|
+
* Useful for debugging race conditions.
|
|
394
|
+
*/
|
|
395
|
+
getActualAudioStatus(): {
|
|
396
|
+
expectedMuted: boolean;
|
|
397
|
+
mediaElements: Array<{
|
|
398
|
+
tagName: string;
|
|
399
|
+
src: string;
|
|
400
|
+
muted: boolean;
|
|
401
|
+
paused: boolean;
|
|
402
|
+
}>;
|
|
403
|
+
audioContexts: Array<{
|
|
404
|
+
state: AudioContextState;
|
|
405
|
+
}>;
|
|
406
|
+
allMuted: boolean;
|
|
407
|
+
mismatch: boolean;
|
|
408
|
+
};
|
|
409
|
+
/**
|
|
410
|
+
* Force re-sync audio state to match visibility.
|
|
411
|
+
* Call this if getActualAudioStatus() shows a mismatch.
|
|
412
|
+
*/
|
|
413
|
+
forceSyncAudioState(): void;
|
|
384
414
|
/**
|
|
385
415
|
* Wait for ready state
|
|
386
416
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,iGAAiG;IACjG,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAA2B;IAGzC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,cAAc,CAAqB;IAG3C,OAAO,CAAC,aAAa,CAAgD;IAMrE,OAAO,CAAC,eAAe,CAAmD;IAG1E,OAAO,CAAC,yBAAyB,CAAkB;IAGnD,OAAO,CAAC,uBAAuB,CAAqD;IAEpF,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,mBAAmB,CAAkB;IAG7C,OAAO,CAAC,sBAAsB,CAAa;IAC3C,OAAO,CAAC,wBAAwB,CAAkB;IAClD,OAAO,CAAC,yBAAyB,CAAuE;IACxG,OAAO,CAAC,qBAAqB,CAA8C;IAC3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAO;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IAGnC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAAwB;gBAElC,cAAc,GAAE,MAAkC,EAAE,MAAM,CAAC,EAAE,UAAU;IAiCnF,OAAO,CAAC,UAAU;IA4ClB;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAwDnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;OAEG;IACH,OAAO,CAAC,aAAa;IA+BrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgCtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -310,6 +310,12 @@ export class TileBridge {
|
|
|
310
310
|
case 'parent:visibility':
|
|
311
311
|
this.handleVisibility(message.payload);
|
|
312
312
|
break;
|
|
313
|
+
case 'parent:request-audio-status':
|
|
314
|
+
this.handleAudioStatusRequest(message.id);
|
|
315
|
+
break;
|
|
316
|
+
case 'parent:force-audio-sync':
|
|
317
|
+
this.forceSyncAudioState();
|
|
318
|
+
break;
|
|
313
319
|
case 'parent:navigateToPage':
|
|
314
320
|
this.handleParentNavigate({ target: 'page' });
|
|
315
321
|
break;
|
|
@@ -403,6 +409,25 @@ export class TileBridge {
|
|
|
403
409
|
// Emit keyboard update event for listeners
|
|
404
410
|
this.emitEvent('keyboard:update', this.keyboardState);
|
|
405
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Handle audio status request from parent
|
|
414
|
+
* Returns actual muted state of all media for verification
|
|
415
|
+
*/
|
|
416
|
+
handleAudioStatusRequest(requestId) {
|
|
417
|
+
const status = this.getActualAudioStatus();
|
|
418
|
+
console.log('[TileBridge] 📊 Audio status requested:', status);
|
|
419
|
+
this.sendToParent({
|
|
420
|
+
type: 'tile:audio-status',
|
|
421
|
+
payload: status,
|
|
422
|
+
id: requestId,
|
|
423
|
+
});
|
|
424
|
+
// If there's a mismatch, log a warning and auto-fix
|
|
425
|
+
if (status.mismatch) {
|
|
426
|
+
console.warn('[TileBridge] ⚠️ AUDIO MISMATCH DETECTED! Expected:', status.expectedMuted, 'Actual:', status.allMuted);
|
|
427
|
+
console.warn('[TileBridge] 🔄 Auto-fixing mismatch...');
|
|
428
|
+
this.forceSyncAudioState();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
406
431
|
/**
|
|
407
432
|
* Handle visibility state message from parent (mobile app)
|
|
408
433
|
* Used for TikTok-style feeds where tiles are preloaded but not visible
|
|
@@ -479,37 +504,60 @@ export class TileBridge {
|
|
|
479
504
|
}
|
|
480
505
|
/**
|
|
481
506
|
* ROBUST: MutationObserver to watch for dynamically added media elements
|
|
482
|
-
*
|
|
507
|
+
* Ensures new video/audio elements respect current visibility state
|
|
508
|
+
* Critical for race conditions where video is created AFTER visibility message
|
|
483
509
|
*/
|
|
484
510
|
setupMediaObserver() {
|
|
485
511
|
if (typeof document === 'undefined' || typeof MutationObserver === 'undefined')
|
|
486
512
|
return;
|
|
487
513
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
488
514
|
const bridge = this;
|
|
515
|
+
const applyMuteStateToElement = (media) => {
|
|
516
|
+
const shouldBeMuted = bridge.visibilityState.muted ?? true;
|
|
517
|
+
const wasMuted = media.muted;
|
|
518
|
+
// Always apply current state to new elements
|
|
519
|
+
if (media.muted !== shouldBeMuted) {
|
|
520
|
+
media.muted = shouldBeMuted;
|
|
521
|
+
console.log(`[TileBridge] 🎬 New ${media.tagName.toLowerCase()} detected - set muted=${shouldBeMuted} (was ${wasMuted})`);
|
|
522
|
+
// If unmuting, also try to play
|
|
523
|
+
if (!shouldBeMuted && media.paused) {
|
|
524
|
+
media.play().then(() => {
|
|
525
|
+
console.log(`[TileBridge] ▶️ Auto-played new ${media.tagName.toLowerCase()} (unmuted)`);
|
|
526
|
+
}).catch((err) => {
|
|
527
|
+
console.log(`[TileBridge] ⚠️ Auto-play failed:`, err.message);
|
|
528
|
+
// Retry after delay - do NOT fall back to muted
|
|
529
|
+
setTimeout(() => {
|
|
530
|
+
if (!bridge.visibilityState.muted && media.paused) {
|
|
531
|
+
media.muted = false;
|
|
532
|
+
media.play().catch(() => { });
|
|
533
|
+
}
|
|
534
|
+
}, 500);
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
else if (!shouldBeMuted && media.paused) {
|
|
539
|
+
// Element already unmuted but paused - try to play
|
|
540
|
+
media.play().then(() => {
|
|
541
|
+
console.log(`[TileBridge] ▶️ Started paused ${media.tagName.toLowerCase()}`);
|
|
542
|
+
}).catch(() => { });
|
|
543
|
+
}
|
|
544
|
+
// Track original state for restoration
|
|
545
|
+
if (shouldBeMuted && !bridge.mediaOriginalMutedState.has(media)) {
|
|
546
|
+
bridge.mediaOriginalMutedState.set(media, wasMuted);
|
|
547
|
+
}
|
|
548
|
+
};
|
|
489
549
|
const observer = new MutationObserver((mutations) => {
|
|
490
|
-
// Only process if we're currently muted
|
|
491
|
-
if (!bridge.visibilityState.muted)
|
|
492
|
-
return;
|
|
493
550
|
mutations.forEach((mutation) => {
|
|
494
551
|
mutation.addedNodes.forEach((node) => {
|
|
495
552
|
// Check if the added node is a media element
|
|
496
553
|
if (node instanceof HTMLMediaElement) {
|
|
497
|
-
|
|
498
|
-
bridge.mediaOriginalMutedState.set(node, node.muted);
|
|
499
|
-
node.muted = true;
|
|
500
|
-
console.log('[TileBridge] 🔇 Auto-muted dynamically added media element');
|
|
501
|
-
}
|
|
554
|
+
applyMuteStateToElement(node);
|
|
502
555
|
}
|
|
503
556
|
// Also check children of added nodes
|
|
504
557
|
if (node instanceof Element) {
|
|
505
558
|
const mediaElements = node.querySelectorAll('video, audio');
|
|
506
559
|
mediaElements.forEach((element) => {
|
|
507
|
-
|
|
508
|
-
if (!media.muted) {
|
|
509
|
-
bridge.mediaOriginalMutedState.set(media, media.muted);
|
|
510
|
-
media.muted = true;
|
|
511
|
-
console.log('[TileBridge] 🔇 Auto-muted dynamically added media element (child)');
|
|
512
|
-
}
|
|
560
|
+
applyMuteStateToElement(element);
|
|
513
561
|
});
|
|
514
562
|
}
|
|
515
563
|
});
|
|
@@ -1423,6 +1471,59 @@ export class TileBridge {
|
|
|
1423
1471
|
this.trackedAudioContexts.delete(ctx);
|
|
1424
1472
|
console.log(`[TileBridge] 🎵 AudioContext unregistered (${this.trackedAudioContexts.size} remaining)`);
|
|
1425
1473
|
}
|
|
1474
|
+
/**
|
|
1475
|
+
* Get actual audio status of all media elements and AudioContexts.
|
|
1476
|
+
* This reports the ACTUAL muted state, not just what the parent requested.
|
|
1477
|
+
* Useful for debugging race conditions.
|
|
1478
|
+
*/
|
|
1479
|
+
getActualAudioStatus() {
|
|
1480
|
+
const expectedMuted = this.visibilityState.muted ?? true;
|
|
1481
|
+
const mediaElements = [];
|
|
1482
|
+
const audioContexts = [];
|
|
1483
|
+
// Check all media elements
|
|
1484
|
+
if (typeof document !== 'undefined') {
|
|
1485
|
+
const elements = document.querySelectorAll('video, audio');
|
|
1486
|
+
elements.forEach((el) => {
|
|
1487
|
+
const media = el;
|
|
1488
|
+
mediaElements.push({
|
|
1489
|
+
tagName: media.tagName.toLowerCase(),
|
|
1490
|
+
src: media.src?.slice(-50) || 'no-src',
|
|
1491
|
+
muted: media.muted,
|
|
1492
|
+
paused: media.paused,
|
|
1493
|
+
});
|
|
1494
|
+
});
|
|
1495
|
+
}
|
|
1496
|
+
// Check all AudioContexts
|
|
1497
|
+
this.trackedAudioContexts.forEach((ctx) => {
|
|
1498
|
+
audioContexts.push({ state: ctx.state });
|
|
1499
|
+
});
|
|
1500
|
+
// Determine if all audio is actually muted
|
|
1501
|
+
const allMediaMuted = mediaElements.every((m) => m.muted || m.paused);
|
|
1502
|
+
const allContextsSuspended = audioContexts.every((c) => c.state === 'suspended' || c.state === 'closed');
|
|
1503
|
+
const allMuted = allMediaMuted && allContextsSuspended;
|
|
1504
|
+
// Check for mismatch between expected and actual
|
|
1505
|
+
const mismatch = expectedMuted !== allMuted;
|
|
1506
|
+
return {
|
|
1507
|
+
expectedMuted,
|
|
1508
|
+
mediaElements,
|
|
1509
|
+
audioContexts,
|
|
1510
|
+
allMuted,
|
|
1511
|
+
mismatch,
|
|
1512
|
+
};
|
|
1513
|
+
}
|
|
1514
|
+
/**
|
|
1515
|
+
* Force re-sync audio state to match visibility.
|
|
1516
|
+
* Call this if getActualAudioStatus() shows a mismatch.
|
|
1517
|
+
*/
|
|
1518
|
+
forceSyncAudioState() {
|
|
1519
|
+
console.log('[TileBridge] 🔄 Force syncing audio state');
|
|
1520
|
+
if (this.visibilityState.muted) {
|
|
1521
|
+
this.muteAllMedia();
|
|
1522
|
+
}
|
|
1523
|
+
else {
|
|
1524
|
+
this.unmuteAllMedia();
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1426
1527
|
/**
|
|
1427
1528
|
* Wait for ready state
|
|
1428
1529
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayer.d.ts","sourceRoot":"","sources":["../../../src/react/overlay/VideoPlayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAOf,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,CAAC,EAAE,WAAW,CAAC;QACzB,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;KACxC;CACF;AASD,UAAU,WAAW;IACnB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IACpE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,SAAS;IACjB,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,WAAW,CAAC;CAClF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,GAAG,EAAE,SAAS,CAAC;KAChB;CACF;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAEjD;;;;;;GAMG;AACH,cAAM,mBAAmB;IACvB,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,YAAY,CASlB;IACF,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;IAEhC;;OAEG;IACH,QAAQ,IAAI,gBAAgB;IAwD5B;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7D;;OAEG;YACW,OAAO;IA2DrB;;OAEG;IACH,uBAAuB,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"VideoPlayer.d.ts","sourceRoot":"","sources":["../../../src/react/overlay/VideoPlayer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -196,16 +196,23 @@ class VideoSingletonClass {
|
|
|
196
196
|
console.log('[VideoPlayer] ✅ Play succeeded (unmuted)');
|
|
197
197
|
})
|
|
198
198
|
.catch((err) => {
|
|
199
|
-
console.log('[VideoPlayer] ⚠️ Unmuted play failed:', err.message, '-
|
|
200
|
-
//
|
|
201
|
-
video
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
199
|
+
console.log('[VideoPlayer] ⚠️ Unmuted play failed:', err.message, '- will retry unmuted');
|
|
200
|
+
// IMPORTANT: Do NOT fall back to muted playback!
|
|
201
|
+
// If play fails, it's likely because video isn't ready yet.
|
|
202
|
+
// Retry unmuted after a delay - TileBridge will also retry via MutationObserver
|
|
203
|
+
setTimeout(() => {
|
|
204
|
+
if (!video.muted && video.paused) {
|
|
205
|
+
console.log('[VideoPlayer] 🔄 Retrying unmuted play...');
|
|
206
|
+
video.muted = false;
|
|
207
|
+
video.play()
|
|
208
|
+
.then(() => {
|
|
209
|
+
console.log('[VideoPlayer] ✅ Retry play succeeded (unmuted)');
|
|
210
|
+
})
|
|
211
|
+
.catch((err2) => {
|
|
212
|
+
console.error('[VideoPlayer] ❌ Retry play failed:', err2.message);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}, 500);
|
|
209
216
|
});
|
|
210
217
|
}
|
|
211
218
|
else {
|