diff --git a/ext/src/background/receiverSelector/ReceiverSelector.ts b/ext/src/background/receiverSelector/ReceiverSelector.ts index 189e396..618986d 100644 --- a/ext/src/background/receiverSelector/ReceiverSelector.ts +++ b/ext/src/background/receiverSelector/ReceiverSelector.ts @@ -16,13 +16,6 @@ import { const POPUP_URL = browser.runtime.getURL("ui/popup/index.html"); -interface ReceiverSelectorEvents { - selected: ReceiverSelectionCast; - error: string; - cancelled: void; - stop: ReceiverSelectionStop; -} - export interface PageInfo { url: string; tabId: number; @@ -30,17 +23,27 @@ export interface PageInfo { sessionRequest?: SessionRequest; } +interface ReceiverSelectorEvents { + selected: ReceiverSelectionCast; + error: string; + cancelled: void; + stop: ReceiverSelectionStop; +} + /** * Manages the receiver selector popup window and communication with the * extension page hosted within. */ export default class ReceiverSelector extends TypedEventTarget { + /** Popup window ID. */ private windowId?: number; + /** Message port to extension page within popup window. */ private messagePort?: Port; private messagePortDisconnected?: boolean; private receiverDevices?: ReceiverDevice[]; + private defaultMediaType?: ReceiverSelectorMediaType; private availableMediaTypes?: ReceiverSelectorMediaType; @@ -68,6 +71,7 @@ export default class ReceiverSelector extends TypedEventTarget) { + logger.info("Selected receiver", ev.detail); - type EvParamsType = Parameters< - typeof sharedSelector.addEventListener - >[0]; + removeListeners(); + resolve({ + actionType: ReceiverSelectionActionType.Cast, + receiverDevice: ev.detail.receiverDevice, + mediaType: ev.detail.mediaType, + filePath: ev.detail.filePath + }); + } + function onSelectorStop(ev: CustomEvent) { + logger.info("Stopping receiver app...", ev.detail); - function storeListener(type: EvParamsType, fn: T) { - if (type === "selected") { - onSelected = fn; - } else if (type === "cancelled") { - onCancelled = fn; - } else if (type === "error") { - onError = fn; - } else if (type === "stop") { - onStop = fn; - } + receiverDevices.stopReceiverApp(ev.detail.receiverDevice.id); - return fn; + removeListeners(); + resolve({ + actionType: ReceiverSelectionActionType.Stop, + receiverDevice: ev.detail.receiverDevice + }); + } + function onSelectorCancelled() { + logger.info("Cancelled receiver selection"); + + removeListeners(); + resolve(null); + } + function onSelectorError(ev: CustomEvent) { + removeListeners(); + reject(ev.detail); } + sharedSelector.addEventListener("selected", onSelectorSelected); + sharedSelector.addEventListener("stop", onSelectorStop); + sharedSelector.addEventListener("cancelled", onSelectorCancelled); + sharedSelector.addEventListener("error", onSelectorError); + function removeListeners() { - sharedSelector.removeEventListener("selected", onSelected); - sharedSelector.removeEventListener("cancelled", onCancelled); - sharedSelector.removeEventListener("error", onError); - sharedSelector.removeEventListener("stop", onStop); + sharedSelector.removeEventListener("selected", onSelectorSelected); + sharedSelector.removeEventListener("stop", onSelectorStop); + sharedSelector.removeEventListener( + "cancelled", + onSelectorCancelled + ); + sharedSelector.removeEventListener("error", onSelectorError); receiverDevices.removeEventListener( "receiverDeviceUp", @@ -172,70 +186,24 @@ async function getSelection( ); } - sharedSelector.addEventListener( - "selected", - storeListener("selected", ev => { - logger.info("Selected receiver", ev.detail); - resolve({ - actionType: ReceiverSelectionActionType.Cast, - receiverDevice: ev.detail.receiverDevice, - mediaType: ev.detail.mediaType, - filePath: ev.detail.filePath - }); - removeListeners(); - }) - ); - - sharedSelector.addEventListener( - "cancelled", - storeListener("cancelled", () => { - logger.info("Cancelled receiver selection"); - resolve(null); - removeListeners(); - }) - ); - - sharedSelector.addEventListener( - "error", - storeListener("error", ev => { - reject(ev.detail); - removeListeners(); - }) - ); - - sharedSelector.addEventListener( - "stop", - storeListener("stop", async ev => { - logger.info("Stopping receiver app...", ev.detail); - receiverDevices.stopReceiverApp(ev.detail.receiverDevice.id); - - resolve({ - actionType: ReceiverSelectionActionType.Stop, - receiverDevice: ev.detail.receiverDevice - }); - removeListeners(); - }) - ); - // Ensure status manager is initialized await receiverDevices.init(); - const pageInfo = pageUrl - ? { - url: pageUrl, - tabId: contextTabId, - frameId: contextFrameId, - sessionRequest: selectionOpts?.sessionRequest - } - : undefined; - - sharedSelector.open( - receiverDevices.getDevices(), + sharedSelector.open({ + receiverDevices: receiverDevices.getDevices(), defaultMediaType, availableMediaTypes, - castInstance?.appId, - pageInfo - ); + appId: castInstance?.appId, + // Create page info + pageInfo: pageUrl + ? { + url: pageUrl, + tabId: contextTabId, + frameId: contextFrameId, + sessionRequest: selectionOpts?.sessionRequest + } + : undefined + }); }); }