From bd777e80ea67e744c4f5816f810e11af7cf3ea9a Mon Sep 17 00:00:00 2001 From: hensm Date: Sun, 11 Sep 2022 14:39:33 +0100 Subject: [PATCH] Fix existing media not set for auto join sessions --- ext/src/background/castManager.ts | 10 +++++--- ext/src/cast/sdk/Session.ts | 41 ++++++++++++++++++------------- ext/src/cast/sdk/index.ts | 15 ++++++++++- ext/src/messaging.ts | 5 +++- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/ext/src/background/castManager.ts b/ext/src/background/castManager.ts index 724cc58..0bd0e87 100644 --- a/ext/src/background/castManager.ts +++ b/ext/src/background/castManager.ts @@ -131,14 +131,16 @@ function joinSession(instance: CastInstance, session: CastSession) { appImages: [], displayName: application.displayName, namespaces: application.namespaces, - receiver: createReceiver(device), receiverFriendlyName: device.friendlyName, receiverId: device.id, senderApps: [], sessionId: session.sessionId, statusText: application.statusText, transportId: session.sessionId, - volume: device.status.volume + volume: device.status.volume, + + receiver: createReceiver(device), + media: device.mediaStatus } }); @@ -252,14 +254,16 @@ function isValidAutoJoinContext( instance: CastInstance, context: ContentContext ) { - if (!instance.apiConfig?.autoJoinPolicy) return; + if (!instance.apiConfig?.autoJoinPolicy) return false; const { autoJoinPolicy } = instance.apiConfig; if ( autoJoinPolicy === AutoJoinPolicy.ORIGIN_SCOPED || autoJoinPolicy === AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED ) { + // Check origin if (context.origin !== instance.contentContext?.origin) return false; + // If tab-scoped, check context if ( autoJoinPolicy === AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED && !isSameContext(context, instance.contentContext) diff --git a/ext/src/cast/sdk/Session.ts b/ext/src/cast/sdk/Session.ts index 3409796..a4407f9 100644 --- a/ext/src/cast/sdk/Session.ts +++ b/ext/src/cast/sdk/Session.ts @@ -34,7 +34,7 @@ const logger = new Logger("fx_cast [sdk :: cast.Session]"); * Takes a media object and a media status object and merges the status * with the existing media object, updating it with new properties. */ -function updateMedia(media: Media, status: MediaStatus) { +export function updateMedia(media: Media, status: MediaStatus) { if (status.currentTime) { MediaLastUpdateTimes.set(media, Date.now()); } @@ -105,6 +105,11 @@ export const SessionLeaveSuccessCallback = new WeakMap< Optional<() => void> >(); +type SendMediaMessage = ( + message: DistributiveOmit +) => Promise; +export const SessionSendMediaMessage = new WeakMap(); + /** Creates a Session object and initializes private data. */ export function createSession( sessionArgs: ConstructorParameters @@ -113,6 +118,17 @@ export function createSession( SessionUpdateListeners.set(session, new Set()); SessionSendMessageCallbacks.set(session, new Map()); + SessionSendMediaMessage.set(session, message => { + return new Promise((resolve, reject) => { + session.sendMessage( + NS_MEDIA, + { ...message, requestId: 0 }, + resolve, + reject + ); + }); + }); + return session; } @@ -144,6 +160,13 @@ export default class Session { return sendMessageCallback; } + get #sendMediaMessage() { + const sendMediaMessage = SessionSendMediaMessage.get(this); + if (!sendMediaMessage) + throw logger.error("Missing send media message function!"); + return sendMediaMessage; + } + get #leaveSuccessCallback() { return SessionLeaveSuccessCallback.get(this); } @@ -208,22 +231,6 @@ export default class Session { } }; - /** - * Sends a media message to the app receiver. - */ - #sendMediaMessage = ( - message: DistributiveOmit - ) => { - return new Promise((resolve, reject) => { - this.sendMessage( - NS_MEDIA, - { ...message, requestId: 0 }, - resolve, - reject - ); - }); - }; - #sendReceiverMessage = ( message: DistributiveOmit ) => { diff --git a/ext/src/cast/sdk/index.ts b/ext/src/cast/sdk/index.ts index 2437e2a..856e920 100644 --- a/ext/src/cast/sdk/index.ts +++ b/ext/src/cast/sdk/index.ts @@ -35,11 +35,14 @@ import Session, { createSession, SessionLeaveSuccessCallback, SessionMessageListeners, + SessionSendMediaMessage, SessionSendMessageCallbacks, - SessionUpdateListeners + SessionUpdateListeners, + updateMedia } from "./Session"; import * as media from "./media"; +import { createMedia } from "./media/Media"; const logger = new Logger("fx_cast [sdk]"); @@ -179,6 +182,16 @@ export default class { session.statusText = status.statusText; session.transportId = status.transportId; + if (status.media) { + const media = createMedia( + [status.sessionId, status.media.mediaSessionId], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + SessionSendMediaMessage.get(session)! + ); + updateMedia(media, status.media); + session.media = [media]; + } + this.#sessions.set(session.sessionId, session); /** diff --git a/ext/src/messaging.ts b/ext/src/messaging.ts index 56d395b..817ef30 100644 --- a/ext/src/messaging.ts +++ b/ext/src/messaging.ts @@ -98,7 +98,10 @@ type ExtMessageDefinitions = { "cast:instanceCreated": { isAvailable: boolean }; "cast:receiverAvailabilityUpdated": { isAvailable: boolean }; - "cast:sessionCreated": CastSessionCreatedDetails & { receiver: Receiver }; + "cast:sessionCreated": CastSessionCreatedDetails & { + receiver: Receiver; + media?: MediaStatus; + }; "cast:sessionUpdated": CastSessionUpdatedDetails; "cast:sessionDisconnected": { sessionId: string };