mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-08 08:39:59 +00:00
Reorganize cast sender code
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -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,
|
||||
@@ -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 {
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user