Implement chrome.cast.Session#leave

This commit is contained in:
hensm
2022-09-11 13:42:04 +01:00
parent 0505b0d0b5
commit 16d11651da
4 changed files with 162 additions and 46 deletions

View File

@@ -100,6 +100,11 @@ export const SessionSendMessageCallbacks = new WeakMap<
Map<string, SendMessageCallback>
>();
export const SessionLeaveSuccessCallback = new WeakMap<
Session,
Optional<() => void>
>();
/** Creates a Session object and initializes private data. */
export function createSession(
sessionArgs: ConstructorParameters<typeof Session>
@@ -139,6 +144,13 @@ export default class Session {
return sendMessageCallback;
}
get #leaveSuccessCallback() {
return SessionLeaveSuccessCallback.get(this);
}
set #leaveSuccessCallback(successCallback: Optional<() => void>) {
SessionLeaveSuccessCallback.set(this, successCallback);
}
media: Media[] = [];
namespaces: Array<{ name: string }> = [];
senderApps: SenderApplication[] = [];
@@ -257,10 +269,21 @@ export default class Session {
}
leave(
_successCallback?: () => void,
_errorCallback?: (err: CastError) => void
successCallback?: () => void,
errorCallback?: (err: CastError) => void
) {
logger.info("STUB :: Session#leave");
if (!this.sessionId) {
errorCallback?.(
new CastError(ErrorCode.INVALID_PARAMETER, "Session not active")
);
return;
}
this.#leaveSuccessCallback = successCallback;
pageMessaging.page.sendMessage({
subject: "main:leaveSession"
});
}
loadMedia(

View File

@@ -33,6 +33,7 @@ import {
import Session, {
createSession,
SessionLeaveSuccessCallback,
SessionMessageListeners,
SessionSendMessageCallbacks,
SessionUpdateListeners
@@ -220,8 +221,7 @@ export default class {
}
case "cast:sessionStopped": {
const { sessionId } = message.data;
const session = this.#sessions.get(sessionId);
const session = this.#sessions.get(message.data.sessionId);
if (session?.status === SessionStatus.CONNECTED) {
session.status = SessionStatus.STOPPED;
@@ -236,6 +236,24 @@ export default class {
break;
}
case "cast:sessionDisconnected": {
const session = this.#sessions.get(message.data.sessionId);
if (session?.status === SessionStatus.CONNECTED) {
session.status = SessionStatus.DISCONNECTED;
SessionLeaveSuccessCallback.get(session)?.();
const updateListeners = SessionUpdateListeners.get(session);
if (updateListeners) {
for (const listener of updateListeners) {
listener(true);
}
}
}
break;
}
case "cast:sessionMessageReceived": {
const { sessionId, namespace, messageData } = message.data;
const session = this.#sessions.get(sessionId);