Fix existing media not set for auto join sessions

This commit is contained in:
hensm
2022-09-11 14:39:33 +01:00
parent 16d11651da
commit bd777e80ea
4 changed files with 49 additions and 22 deletions

View File

@@ -131,14 +131,16 @@ function joinSession(instance: CastInstance, session: CastSession) {
appImages: [], appImages: [],
displayName: application.displayName, displayName: application.displayName,
namespaces: application.namespaces, namespaces: application.namespaces,
receiver: createReceiver(device),
receiverFriendlyName: device.friendlyName, receiverFriendlyName: device.friendlyName,
receiverId: device.id, receiverId: device.id,
senderApps: [], senderApps: [],
sessionId: session.sessionId, sessionId: session.sessionId,
statusText: application.statusText, statusText: application.statusText,
transportId: session.sessionId, 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, instance: CastInstance,
context: ContentContext context: ContentContext
) { ) {
if (!instance.apiConfig?.autoJoinPolicy) return; if (!instance.apiConfig?.autoJoinPolicy) return false;
const { autoJoinPolicy } = instance.apiConfig; const { autoJoinPolicy } = instance.apiConfig;
if ( if (
autoJoinPolicy === AutoJoinPolicy.ORIGIN_SCOPED || autoJoinPolicy === AutoJoinPolicy.ORIGIN_SCOPED ||
autoJoinPolicy === AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED autoJoinPolicy === AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED
) { ) {
// Check origin
if (context.origin !== instance.contentContext?.origin) return false; if (context.origin !== instance.contentContext?.origin) return false;
// If tab-scoped, check context
if ( if (
autoJoinPolicy === AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED && autoJoinPolicy === AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED &&
!isSameContext(context, instance.contentContext) !isSameContext(context, instance.contentContext)

View File

@@ -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 * Takes a media object and a media status object and merges the status
* with the existing media object, updating it with new properties. * 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) { if (status.currentTime) {
MediaLastUpdateTimes.set(media, Date.now()); MediaLastUpdateTimes.set(media, Date.now());
} }
@@ -105,6 +105,11 @@ export const SessionLeaveSuccessCallback = new WeakMap<
Optional<() => void> Optional<() => void>
>(); >();
type SendMediaMessage = (
message: DistributiveOmit<SenderMediaMessage, "requestId">
) => Promise<void>;
export const SessionSendMediaMessage = new WeakMap<Session, SendMediaMessage>();
/** Creates a Session object and initializes private data. */ /** Creates a Session object and initializes private data. */
export function createSession( export function createSession(
sessionArgs: ConstructorParameters<typeof Session> sessionArgs: ConstructorParameters<typeof Session>
@@ -113,6 +118,17 @@ export function createSession(
SessionUpdateListeners.set(session, new Set()); SessionUpdateListeners.set(session, new Set());
SessionSendMessageCallbacks.set(session, new Map()); SessionSendMessageCallbacks.set(session, new Map());
SessionSendMediaMessage.set(session, message => {
return new Promise<void>((resolve, reject) => {
session.sendMessage(
NS_MEDIA,
{ ...message, requestId: 0 },
resolve,
reject
);
});
});
return session; return session;
} }
@@ -144,6 +160,13 @@ export default class Session {
return sendMessageCallback; return sendMessageCallback;
} }
get #sendMediaMessage() {
const sendMediaMessage = SessionSendMediaMessage.get(this);
if (!sendMediaMessage)
throw logger.error("Missing send media message function!");
return sendMediaMessage;
}
get #leaveSuccessCallback() { get #leaveSuccessCallback() {
return SessionLeaveSuccessCallback.get(this); return SessionLeaveSuccessCallback.get(this);
} }
@@ -208,22 +231,6 @@ export default class Session {
} }
}; };
/**
* Sends a media message to the app receiver.
*/
#sendMediaMessage = (
message: DistributiveOmit<SenderMediaMessage, "requestId">
) => {
return new Promise<void>((resolve, reject) => {
this.sendMessage(
NS_MEDIA,
{ ...message, requestId: 0 },
resolve,
reject
);
});
};
#sendReceiverMessage = ( #sendReceiverMessage = (
message: DistributiveOmit<SenderMessage, "requestId"> message: DistributiveOmit<SenderMessage, "requestId">
) => { ) => {

View File

@@ -35,11 +35,14 @@ import Session, {
createSession, createSession,
SessionLeaveSuccessCallback, SessionLeaveSuccessCallback,
SessionMessageListeners, SessionMessageListeners,
SessionSendMediaMessage,
SessionSendMessageCallbacks, SessionSendMessageCallbacks,
SessionUpdateListeners SessionUpdateListeners,
updateMedia
} from "./Session"; } from "./Session";
import * as media from "./media"; import * as media from "./media";
import { createMedia } from "./media/Media";
const logger = new Logger("fx_cast [sdk]"); const logger = new Logger("fx_cast [sdk]");
@@ -179,6 +182,16 @@ export default class {
session.statusText = status.statusText; session.statusText = status.statusText;
session.transportId = status.transportId; 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); this.#sessions.set(session.sessionId, session);
/** /**

View File

@@ -98,7 +98,10 @@ type ExtMessageDefinitions = {
"cast:instanceCreated": { isAvailable: boolean }; "cast:instanceCreated": { isAvailable: boolean };
"cast:receiverAvailabilityUpdated": { isAvailable: boolean }; "cast:receiverAvailabilityUpdated": { isAvailable: boolean };
"cast:sessionCreated": CastSessionCreatedDetails & { receiver: Receiver }; "cast:sessionCreated": CastSessionCreatedDetails & {
receiver: Receiver;
media?: MediaStatus;
};
"cast:sessionUpdated": CastSessionUpdatedDetails; "cast:sessionUpdated": CastSessionUpdatedDetails;
"cast:sessionDisconnected": { sessionId: string }; "cast:sessionDisconnected": { sessionId: string };