From dbcf3b14597312f37e6b3d978561cdfd4b46cfa8 Mon Sep 17 00:00:00 2001 From: hensm Date: Mon, 3 May 2021 16:58:17 +0100 Subject: [PATCH] Fix extension cast senders --- ext/src/senders/media/index.ts | 17 +++----- ext/src/senders/mirroring.ts | 8 ++-- ext/src/shim/cast/index.ts | 80 +++++++++++++++++++--------------- 3 files changed, 56 insertions(+), 49 deletions(-) diff --git a/ext/src/senders/media/index.ts b/ext/src/senders/media/index.ts index f18f1c3..1c646da 100644 --- a/ext/src/senders/media/index.ts +++ b/ext/src/senders/media/index.ts @@ -63,16 +63,11 @@ function getSession(opts: InitOptions): Promise { */ function receiverListener(availability: string) { if (availability === cast.ReceiverAvailability.AVAILABLE) { - if (opts.receiver) { - /*cast._requestSession( - opts.receiver - , onRequestSessionSuccess - , onRequestSessionError);*/ - } else { - cast.requestSession( - onRequestSessionSuccess - , onRequestSessionError); - } + cast.requestSession( + onRequestSessionSuccess + , onRequestSessionError + , undefined + , opts.receiver); } } @@ -340,7 +335,7 @@ async function registerMediaElementListeners() { interface InitOptions { mediaUrl: string; - receiver: ReceiverDevice; + receiver?: ReceiverDevice; targetElementId?: number; } diff --git a/ext/src/senders/mirroring.ts b/ext/src/senders/mirroring.ts index 7f3bd4c..5248cd1 100644 --- a/ext/src/senders/mirroring.ts +++ b/ext/src/senders/mirroring.ts @@ -162,10 +162,10 @@ function receiverListener(availability: string) { if (availability === cast.ReceiverAvailability.AVAILABLE) { wasSessionRequested = true; - /*cast._requestSession( - selectedReceiver - , onRequestSessionSuccess - , onRequestSessionError);*/ + cast.requestSession(onRequestSessionSuccess + , onRequestSessionError + , undefined + , selectedReceiver); } } diff --git a/ext/src/shim/cast/index.ts b/ext/src/shim/cast/index.ts index c7ba796..5cb7760 100755 --- a/ext/src/shim/cast/index.ts +++ b/ext/src/shim/cast/index.ts @@ -3,6 +3,7 @@ import logger from "../../lib/logger"; import { ReceiverDevice } from "../../types"; +import { ErrorCallback, SuccessCallback } from "../types"; import { onMessage, sendMessageResponse } from "../eventMessageChannel"; @@ -23,9 +24,6 @@ type ReceiverActionListener = ( type RequestSessionSuccessCallback = (session: Session) => void; -type SuccessCallback = () => void; -type ErrorCallback = (err: Error_) => void; - let apiConfig: Nullable; let sessionRequest: Nullable; @@ -57,6 +55,26 @@ export const timeout = new Timeout(); export * as media from "./media"; +function sendSessionRequest(sessionRequest: SessionRequest + , receiverDevice: ReceiverDevice) { + + for (const listener of receiverActionListeners) { + const receiver = new Receiver( + receiverDevice.id + , receiverDevice.friendlyName); + + listener(receiver, ReceiverAction.CAST); + } + + sendMessageResponse({ + subject: "bridge:createCastSession" + , data: { + appId: sessionRequest.appId + , receiverDevice: receiverDevice + } + }); +} + export function initialize(newApiConfig: ApiConfig , successCallback?: SuccessCallback , errorCallback?: ErrorCallback) { @@ -85,7 +103,8 @@ export function initialize(newApiConfig: ApiConfig export function requestSession(successCallback: RequestSessionSuccessCallback , errorCallback: ErrorCallback - , newSessionRequest?: SessionRequest) { + , newSessionRequest?: SessionRequest + , receiverDevice?: ReceiverDevice) { logger.info("cast.requestSession"); @@ -118,10 +137,20 @@ export function requestSession(successCallback: RequestSessionSuccessCallback requestSessionSuccessCallback = successCallback; requestSessionErrorCallback = errorCallback; - // Open receiver selector UI - sendMessageResponse({ - subject: "main:selectReceiver" - }); + /** + * If a receiver was provided, skip the receiver selector + * process. + */ + if (receiverDevice) { + if (receiverDevice?.id && receiverDevices.has(receiverDevice.id)) { + sendSessionRequest(sessionRequest, receiverDevice); + } + } else { + // Open receiver selector UI + sendMessageResponse({ + subject: "main:selectReceiver" + }); + } } export function requestSessionById(_sessionId: string): void { @@ -183,18 +212,18 @@ onMessage(message => { // TODO: Implement persistent per-origin receiver IDs const receiver = new Receiver( - status.receiverFriendlyName // label - , status.receiverFriendlyName // friendlyName - , [ Capability.VIDEO_OUT + status.receiverFriendlyName // label + , status.receiverFriendlyName // friendlyName + , [ Capability.VIDEO_OUT , Capability.AUDIO_OUT ] // capabilities - , status.volume); // volume + , status.volume); // volume const session = new Session( status.sessionId // sessionId - , status.appId // appId - , status.displayName // displayName - , status.appImages // appImages - , receiver); // receiver + , status.appId // appId + , status.displayName // displayName + , status.appImages // appImages + , receiver); // receiver session.senderApps = status.senderApps; session.transportId = status.transportId; @@ -316,24 +345,7 @@ onMessage(message => { break; } - const { receiver: receiverDevice } = message.data; - - for (const listener of receiverActionListeners) { - const receiver = new Receiver( - receiverDevice.id - , receiverDevice.friendlyName); - - listener(receiver, ReceiverAction.CAST); - } - - sendMessageResponse({ - subject: "bridge:createCastSession" - , data: { - appId: sessionRequest.appId - , receiverDevice: receiverDevice - } - }); - + sendSessionRequest(sessionRequest, message.data.receiver); break; }