mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-11 10:09:59 +00:00
Reorganize cast sender code
This commit is contained in:
@@ -72,14 +72,14 @@ const buildOpts = {
|
|||||||
entryPoints: [
|
entryPoints: [
|
||||||
// Main
|
// Main
|
||||||
`${srcPath}/background/background.ts`,
|
`${srcPath}/background/background.ts`,
|
||||||
// Media sender
|
|
||||||
`${srcPath}/senders/media/index.ts`,
|
|
||||||
// Mirroring sender
|
|
||||||
`${srcPath}/senders/mirroring.ts`,
|
|
||||||
// Cast
|
// Cast
|
||||||
`${srcPath}/cast/index.ts`,
|
`${srcPath}/cast/index.ts`,
|
||||||
`${srcPath}/cast/content.ts`,
|
`${srcPath}/cast/content.ts`,
|
||||||
`${srcPath}/cast/contentBridge.ts`,
|
`${srcPath}/cast/contentBridge.ts`,
|
||||||
|
// Media sender
|
||||||
|
`${srcPath}/cast/senders/media/index.ts`,
|
||||||
|
// Mirroring sender
|
||||||
|
`${srcPath}/cast/senders/mirroring.ts`,
|
||||||
// UI
|
// UI
|
||||||
`${srcPath}/ui/popup/index.tsx`,
|
`${srcPath}/ui/popup/index.tsx`,
|
||||||
`${srcPath}/ui/options/index.tsx`
|
`${srcPath}/ui/options/index.tsx`
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
import defaultOptions from "../defaultOptions";
|
import defaultOptions from "../defaultOptions";
|
||||||
import loadSender from "../lib/loadSender";
|
|
||||||
import logger from "../lib/logger";
|
import logger from "../lib/logger";
|
||||||
import options from "../lib/options";
|
import options from "../lib/options";
|
||||||
import bridge, { BridgeInfo } from "../lib/bridge";
|
import bridge, { BridgeInfo } from "../lib/bridge";
|
||||||
|
|
||||||
import { RemoteMatchPattern } from "../lib/matchPattern";
|
|
||||||
|
|
||||||
import CastManager from "../cast/CastManager";
|
import CastManager from "../cast/CastManager";
|
||||||
import receiverDevices from "./receiverDevices";
|
import receiverDevices from "./receiverDevices";
|
||||||
import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager";
|
import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager";
|
||||||
@@ -119,12 +116,13 @@ async function init() {
|
|||||||
*/
|
*/
|
||||||
browser.browserAction.onClicked.addListener(async tab => {
|
browser.browserAction.onClicked.addListener(async tab => {
|
||||||
if (tab.id === undefined) {
|
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);
|
const selection = await ReceiverSelectorManager.getSelection(tab.id);
|
||||||
if (selection) {
|
if (selection) {
|
||||||
loadSender({
|
CastManager.loadSender({
|
||||||
tabId: tab.id,
|
tabId: tab.id,
|
||||||
frameId: 0,
|
frameId: 0,
|
||||||
selection
|
selection
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
import loadSender from "../lib/loadSender";
|
|
||||||
import logger from "../lib/logger";
|
import logger from "../lib/logger";
|
||||||
import options from "../lib/options";
|
import options from "../lib/options";
|
||||||
|
|
||||||
@@ -12,6 +11,7 @@ import {
|
|||||||
} from "./receiverSelector";
|
} from "./receiverSelector";
|
||||||
|
|
||||||
import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager";
|
import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager";
|
||||||
|
import CastManager from "../cast/CastManager";
|
||||||
|
|
||||||
const _ = browser.i18n.getMessage;
|
const _ = browser.i18n.getMessage;
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ browser.menus.onClicked.addListener(async (info, tab) => {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
loadSender({
|
CastManager.loadSender({
|
||||||
tabId: tab.id,
|
tabId: tab.id,
|
||||||
frameId: info.frameId,
|
frameId: info.frameId,
|
||||||
selection
|
selection
|
||||||
@@ -145,12 +145,12 @@ browser.menus.onClicked.addListener(async (info, tab) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await browser.tabs.executeScript(tab.id, {
|
await browser.tabs.executeScript(tab.id, {
|
||||||
file: "senders/media/index.js",
|
file: "cast/senders/media/index.js",
|
||||||
frameId: info.frameId
|
frameId: info.frameId
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Handle other responses
|
// Handle other responses
|
||||||
loadSender({
|
CastManager.loadSender({
|
||||||
tabId: tab.id,
|
tabId: tab.id,
|
||||||
frameId: info.frameId,
|
frameId: info.frameId,
|
||||||
selection
|
selection
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
import bridge from "../lib/bridge";
|
import bridge from "../lib/bridge";
|
||||||
import loadSender from "../lib/loadSender";
|
|
||||||
import logger from "../lib/logger";
|
import logger from "../lib/logger";
|
||||||
import messaging, { Message, Port } from "../messaging";
|
import messaging, { Message, Port } from "../messaging";
|
||||||
import options from "../lib/options";
|
import options from "../lib/options";
|
||||||
|
import { stringify } from "../lib/utils";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
ReceiverSelection,
|
||||||
ReceiverSelectionActionType,
|
ReceiverSelectionActionType,
|
||||||
ReceiverSelectorMediaType
|
ReceiverSelectorMediaType
|
||||||
} from "../background/receiverSelector";
|
} from "../background/receiverSelector";
|
||||||
|
|
||||||
import ReceiverSelectorManager from "../background/receiverSelector/ReceiverSelectorManager";
|
import ReceiverSelectorManager from "../background/receiverSelector/ReceiverSelectorManager";
|
||||||
|
|
||||||
import receiverDevices from "../background/receiverDevices";
|
import receiverDevices from "../background/receiverDevices";
|
||||||
|
|
||||||
type AnyPort = Port | MessagePort;
|
type AnyPort = Port | MessagePort;
|
||||||
@@ -261,7 +261,7 @@ export default new (class CastManager {
|
|||||||
subject: "cast:selectReceiver/cancelled"
|
subject: "cast:selectReceiver/cancelled"
|
||||||
});
|
});
|
||||||
|
|
||||||
loadSender({
|
this.loadSender({
|
||||||
tabId: instance.contentTabId,
|
tabId: instance.contentTabId,
|
||||||
frameId: instance.contentFrameId,
|
frameId: instance.contentFrameId,
|
||||||
selection
|
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";
|
"use strict";
|
||||||
|
|
||||||
import logger from "../../lib/logger";
|
import logger from "../../../lib/logger";
|
||||||
import options from "../../lib/options";
|
import options from "../../../lib/options";
|
||||||
import cast, { ensureInit } from "../../cast/export";
|
import cast, { ensureInit } from "../../export";
|
||||||
|
|
||||||
import { Message } from "../../messaging";
|
import { Message } from "../../../messaging";
|
||||||
import { ReceiverDevice } from "../../types";
|
import { ReceiverDevice } from "../../../types";
|
||||||
|
|
||||||
function startMediaServer(
|
function startMediaServer(
|
||||||
filePath: string,
|
filePath: string,
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
import options from "../lib/options";
|
import options from "../../lib/options";
|
||||||
import cast, { ensureInit } from "../cast/export";
|
import cast, { ensureInit } from "../export";
|
||||||
|
|
||||||
import { ReceiverSelectorMediaType } from "../background/receiverSelector";
|
import { ReceiverSelectorMediaType } from "../../background/receiverSelector";
|
||||||
import { ReceiverDevice } from "../types";
|
import { ReceiverDevice } from "../../types";
|
||||||
|
|
||||||
// Variables passed from background
|
// Variables passed from background
|
||||||
const {
|
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