Reorganize cast sender code

This commit is contained in:
hensm
2022-04-18 03:01:56 +01:00
parent 514b382344
commit abf657c0d4
7 changed files with 90 additions and 106 deletions

View File

@@ -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`

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}
}
}
})();

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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;
}
}
}