mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-08 08:39:59 +00:00
Fix existing media not set for auto join sessions
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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">
|
||||||
) => {
|
) => {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user