From abf657c0d4e738baca0a29e174c53a03f3d5f981 Mon Sep 17 00:00:00 2001 From: hensm Date: Mon, 18 Apr 2022 03:01:56 +0100 Subject: [PATCH] Reorganize cast sender code --- ext/bin/build.js | 8 +-- ext/src/background/background.ts | 8 +-- ext/src/background/menus.ts | 8 +-- ext/src/cast/CastManager.ts | 73 +++++++++++++++++++- ext/src/{ => cast}/senders/media/index.ts | 10 +-- ext/src/{ => cast}/senders/mirroring.ts | 8 +-- ext/src/lib/loadSender.ts | 81 ----------------------- 7 files changed, 90 insertions(+), 106 deletions(-) rename ext/src/{ => cast}/senders/media/index.ts (98%) rename ext/src/{ => cast}/senders/mirroring.ts (96%) delete mode 100644 ext/src/lib/loadSender.ts diff --git a/ext/bin/build.js b/ext/bin/build.js index 72d162b..7cc8ad2 100644 --- a/ext/bin/build.js +++ b/ext/bin/build.js @@ -72,14 +72,14 @@ const buildOpts = { entryPoints: [ // Main `${srcPath}/background/background.ts`, - // Media sender - `${srcPath}/senders/media/index.ts`, - // Mirroring sender - `${srcPath}/senders/mirroring.ts`, // Cast `${srcPath}/cast/index.ts`, `${srcPath}/cast/content.ts`, `${srcPath}/cast/contentBridge.ts`, + // Media sender + `${srcPath}/cast/senders/media/index.ts`, + // Mirroring sender + `${srcPath}/cast/senders/mirroring.ts`, // UI `${srcPath}/ui/popup/index.tsx`, `${srcPath}/ui/options/index.tsx` diff --git a/ext/src/background/background.ts b/ext/src/background/background.ts index f907914..8bc4e52 100755 --- a/ext/src/background/background.ts +++ b/ext/src/background/background.ts @@ -1,13 +1,10 @@ "use strict"; import defaultOptions from "../defaultOptions"; -import loadSender from "../lib/loadSender"; import logger from "../lib/logger"; import options from "../lib/options"; import bridge, { BridgeInfo } from "../lib/bridge"; -import { RemoteMatchPattern } from "../lib/matchPattern"; - import CastManager from "../cast/CastManager"; import receiverDevices from "./receiverDevices"; import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager"; @@ -119,12 +116,13 @@ async function init() { */ browser.browserAction.onClicked.addListener(async tab => { if (tab.id === undefined) { - throw logger.error("Tab ID not found in browser action handler."); + logger.error("Tab ID not found in browser action handler."); + return; } const selection = await ReceiverSelectorManager.getSelection(tab.id); if (selection) { - loadSender({ + CastManager.loadSender({ tabId: tab.id, frameId: 0, selection diff --git a/ext/src/background/menus.ts b/ext/src/background/menus.ts index 5281818..f11f790 100644 --- a/ext/src/background/menus.ts +++ b/ext/src/background/menus.ts @@ -1,6 +1,5 @@ "use strict"; -import loadSender from "../lib/loadSender"; import logger from "../lib/logger"; import options from "../lib/options"; @@ -12,6 +11,7 @@ import { } from "./receiverSelector"; import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager"; +import CastManager from "../cast/CastManager"; const _ = browser.i18n.getMessage; @@ -107,7 +107,7 @@ browser.menus.onClicked.addListener(async (info, tab) => { break; } - loadSender({ + CastManager.loadSender({ tabId: tab.id, frameId: info.frameId, selection @@ -145,12 +145,12 @@ browser.menus.onClicked.addListener(async (info, tab) => { }); await browser.tabs.executeScript(tab.id, { - file: "senders/media/index.js", + file: "cast/senders/media/index.js", frameId: info.frameId }); } else { // Handle other responses - loadSender({ + CastManager.loadSender({ tabId: tab.id, frameId: info.frameId, selection diff --git a/ext/src/cast/CastManager.ts b/ext/src/cast/CastManager.ts index 5d18c2e..da3a87f 100644 --- a/ext/src/cast/CastManager.ts +++ b/ext/src/cast/CastManager.ts @@ -1,18 +1,18 @@ "use strict"; import bridge from "../lib/bridge"; -import loadSender from "../lib/loadSender"; import logger from "../lib/logger"; import messaging, { Message, Port } from "../messaging"; import options from "../lib/options"; +import { stringify } from "../lib/utils"; import { + ReceiverSelection, ReceiverSelectionActionType, ReceiverSelectorMediaType } from "../background/receiverSelector"; import ReceiverSelectorManager from "../background/receiverSelector/ReceiverSelectorManager"; - import receiverDevices from "../background/receiverDevices"; type AnyPort = Port | MessagePort; @@ -261,7 +261,7 @@ export default new (class CastManager { subject: "cast:selectReceiver/cancelled" }); - loadSender({ + this.loadSender({ tabId: instance.contentTabId, frameId: instance.contentFrameId, selection @@ -315,4 +315,71 @@ export default new (class CastManager { } } } + + /** + * Loads the appropriate sender for a given receiver + * selector response. + */ + public async loadSender(opts: { + tabId: number; + frameId?: number; + selection: ReceiverSelection; + }) { + // Cancelled + if (!opts.selection) { + return; + } + + if (opts.selection.actionType !== ReceiverSelectionActionType.Cast) { + return; + } + + switch (opts.selection.mediaType) { + case ReceiverSelectorMediaType.App: { + const instance = this.getInstance(opts.tabId, opts.frameId); + if (!instance) { + throw logger.error( + `Cast instance not found at tabId ${opts.tabId} / frameId ${opts.frameId}` + ); + } + + instance.contentPort.postMessage({ + subject: "cast:launchApp", + data: { receiverDevice: opts.selection.receiverDevice } + }); + + break; + } + + case ReceiverSelectorMediaType.Tab: + case ReceiverSelectorMediaType.Screen: { + await browser.tabs.executeScript(opts.tabId, { + code: stringify` + window.selectedMedia = ${opts.selection.mediaType}; + window.selectedReceiver = ${opts.selection.receiverDevice}; + `, + frameId: opts.frameId + }); + + await browser.tabs.executeScript(opts.tabId, { + file: "cast/senders/mirroring.js", + frameId: opts.frameId + }); + + break; + } + + case ReceiverSelectorMediaType.File: { + const fileUrl = new URL(`file://${opts.selection.filePath}`); + const { init } = await import("./senders/media"); + + init({ + mediaUrl: fileUrl.href, + receiver: opts.selection.receiverDevice + }); + + break; + } + } + } })(); diff --git a/ext/src/senders/media/index.ts b/ext/src/cast/senders/media/index.ts similarity index 98% rename from ext/src/senders/media/index.ts rename to ext/src/cast/senders/media/index.ts index 1e41f89..eceeada 100644 --- a/ext/src/senders/media/index.ts +++ b/ext/src/cast/senders/media/index.ts @@ -1,11 +1,11 @@ "use strict"; -import logger from "../../lib/logger"; -import options from "../../lib/options"; -import cast, { ensureInit } from "../../cast/export"; +import logger from "../../../lib/logger"; +import options from "../../../lib/options"; +import cast, { ensureInit } from "../../export"; -import { Message } from "../../messaging"; -import { ReceiverDevice } from "../../types"; +import { Message } from "../../../messaging"; +import { ReceiverDevice } from "../../../types"; function startMediaServer( filePath: string, diff --git a/ext/src/senders/mirroring.ts b/ext/src/cast/senders/mirroring.ts similarity index 96% rename from ext/src/senders/mirroring.ts rename to ext/src/cast/senders/mirroring.ts index 6eea83a..db70ea4 100644 --- a/ext/src/senders/mirroring.ts +++ b/ext/src/cast/senders/mirroring.ts @@ -1,10 +1,10 @@ "use strict"; -import options from "../lib/options"; -import cast, { ensureInit } from "../cast/export"; +import options from "../../lib/options"; +import cast, { ensureInit } from "../export"; -import { ReceiverSelectorMediaType } from "../background/receiverSelector"; -import { ReceiverDevice } from "../types"; +import { ReceiverSelectorMediaType } from "../../background/receiverSelector"; +import { ReceiverDevice } from "../../types"; // Variables passed from background const { diff --git a/ext/src/lib/loadSender.ts b/ext/src/lib/loadSender.ts deleted file mode 100644 index 76be275..0000000 --- a/ext/src/lib/loadSender.ts +++ /dev/null @@ -1,81 +0,0 @@ -"use strict"; - -import logger from "./logger"; -import { stringify } from "./utils"; - -import { - ReceiverSelection, - ReceiverSelectionActionType, - ReceiverSelectorMediaType -} from "../background/receiverSelector"; - -import CastManager from "../cast/CastManager"; - -interface LoadSenderOptions { - tabId: number; - frameId?: number; - selection: ReceiverSelection; -} - -/** - * Loads the appropriate sender for a given receiver - * selector response. - */ -export default async function loadSender(opts: LoadSenderOptions) { - // Cancelled - if (!opts.selection) { - return; - } - - if (opts.selection.actionType !== ReceiverSelectionActionType.Cast) { - return; - } - - switch (opts.selection.mediaType) { - case ReceiverSelectorMediaType.App: { - const instance = CastManager.getInstance(opts.tabId, opts.frameId); - if (!instance) { - throw logger.error( - `Cast instance not found at tabId ${opts.tabId} / frameId ${opts.frameId}` - ); - } - - instance.contentPort.postMessage({ - subject: "cast:launchApp", - data: { receiverDevice: opts.selection.receiverDevice } - }); - - break; - } - - case ReceiverSelectorMediaType.Tab: - case ReceiverSelectorMediaType.Screen: { - await browser.tabs.executeScript(opts.tabId, { - code: stringify` - window.selectedMedia = ${opts.selection.mediaType}; - window.selectedReceiver = ${opts.selection.receiverDevice}; - `, - frameId: opts.frameId - }); - - await browser.tabs.executeScript(opts.tabId, { - file: "senders/mirroring.js", - frameId: opts.frameId - }); - - break; - } - - case ReceiverSelectorMediaType.File: { - const fileUrl = new URL(`file://${opts.selection.filePath}`); - const { init } = await import("../senders/media"); - - init({ - mediaUrl: fileUrl.href, - receiver: opts.selection.receiverDevice - }); - - break; - } - } -}