diff --git a/README.md b/README.md index cd02ecf..3953d51 100644 --- a/README.md +++ b/README.md @@ -216,7 +216,7 @@ Netflix / HTML5: ## Credit -_**Note**: Since it seems to be causing confusion, this project does not use electron. The electron-chromecast library was only used as a reference for the initial implementation of the API shim._ +_**Note**: Since it seems to be causing confusion, this project does not use electron. The electron-chromecast library was only used as a reference for the initial implementation of the API._ * [electron-chromecast](https://github.com/GPMDP/electron-chromecast) * [node-castv2](https://github.com/thibauts/node-castv2) diff --git a/app/src/bridge/components/cast/Session.ts b/app/src/bridge/components/cast/Session.ts index 76546c5..7954dfb 100644 --- a/app/src/bridge/components/cast/Session.ts +++ b/app/src/bridge/components/cast/Session.ts @@ -79,7 +79,7 @@ export default class Session extends CastClient { const { friendlyName } = this.receiverDevice; sendMessage({ - subject: "shim:castSessionCreated", + subject: "cast:sessionCreated", data: { sessionId: this.sessionId, statusText: application.statusText, @@ -107,7 +107,7 @@ export default class Session extends CastClient { } sendMessage({ - subject: "shim:castSessionUpdated", + subject: "cast:sessionUpdated", data: { sessionId: this.sessionId, statusText: application.statusText, @@ -144,7 +144,7 @@ export default class Session extends CastClient { messageData = JSON.stringify(messageData); sendMessage({ - subject: "shim:receivedCastSessionMessage", + subject: "cast:receivedSessionMessage", data: { sessionId: this.sessionId, namespace, @@ -181,7 +181,7 @@ export default class Session extends CastClient { this.client.on("close", () => { if (this.sessionId) { sendMessage({ - subject: "shim:castSessionStopped", + subject: "cast:sessionStopped", data: { sessionId: this.sessionId } }); } diff --git a/app/src/bridge/components/cast/index.ts b/app/src/bridge/components/cast/index.ts index 30b28c7..c6aa771 100644 --- a/app/src/bridge/components/cast/index.ts +++ b/app/src/bridge/components/cast/index.ts @@ -30,7 +30,7 @@ export function handleCastMessage(message: Message) { const session = sessions.get(sessionId); if (!session) { sendMessage({ - subject: "shim:impl_sendCastMessage", + subject: "cast:impl_sendMessage", data: { error: "Session does not exist", sessionId, @@ -45,7 +45,7 @@ export function handleCastMessage(message: Message) { session.sendReceiverMessage(messageData); } catch (err) { sendMessage({ - subject: "shim:impl_sendCastMessage", + subject: "cast:impl_sendMessage", data: { error: `Failed to send message (${err})`, sessionId, @@ -58,7 +58,7 @@ export function handleCastMessage(message: Message) { // Success sendMessage({ - subject: "shim:impl_sendCastMessage", + subject: "cast:impl_sendMessage", data: { sessionId, messageId } }); @@ -71,7 +71,7 @@ export function handleCastMessage(message: Message) { const session = sessions.get(sessionId); if (!session) { sendMessage({ - subject: "shim:impl_sendCastMessage", + subject: "cast:impl_sendMessage", data: { error: "Session does not exist", sessionId, @@ -92,7 +92,7 @@ export function handleCastMessage(message: Message) { session.sendMessage(namespace, messageData); } catch (err) { sendMessage({ - subject: "shim:impl_sendCastMessage", + subject: "cast:impl_sendMessage", data: { error: `Failed to send message (${err})`, sessionId, @@ -105,7 +105,7 @@ export function handleCastMessage(message: Message) { // Success sendMessage({ - subject: "shim:impl_sendCastMessage", + subject: "cast:impl_sendMessage", data: { sessionId, messageId } }); diff --git a/app/src/bridge/messaging.ts b/app/src/bridge/messaging.ts index d7832f3..9739f28 100644 --- a/app/src/bridge/messaging.ts +++ b/app/src/bridge/messaging.ts @@ -33,17 +33,17 @@ interface CastSessionCreated extends CastSessionUpdated { * ext/src/messaging.ts > MessageDefinitions */ type MessageDefinitions = { - "shim:castSessionCreated": CastSessionCreated; - "shim:castSessionUpdated": CastSessionUpdated; - "shim:castSessionStopped": { + "cast:sessionCreated": CastSessionCreated; + "cast:sessionUpdated": CastSessionUpdated; + "cast:sessionStopped": { sessionId: string; }; - "shim:receivedCastSessionMessage": { + "cast:receivedSessionMessage": { sessionId: string; namespace: string; messageData: string; }; - "shim:impl_sendCastMessage": { + "cast:impl_sendMessage": { sessionId: string; messageId: string; error?: string; diff --git a/diagram.png b/diagram.png deleted file mode 100644 index 69f31d4..0000000 Binary files a/diagram.png and /dev/null differ diff --git a/diagram_module.svg b/diagram_module.svg deleted file mode 100644 index b736fd7..0000000 --- a/diagram_module.svg +++ /dev/null @@ -1 +0,0 @@ -
background context
background context
content script context
<div>content script context</div>
ShimManager
[Not supported by viewer]
shim/export.ts
[Not supported by viewer]
shim/index.ts
[Not supported by viewer]
MessageChannel
[Not supported by viewer]
port1
[Not supported by viewer]
port2
[Not supported by viewer]
eventMessageChannel
<font>eventMessageChannel</font>
createShim
createShim
shim/export.ts
[Not supported by viewer]
thru background
thru background
shim/contentBridge.ts
<div><font>shim/contentBridge.ts</font></div>
MessageChannel
[Not supported by viewer]
port1
[Not supported by viewer]
port2
[Not supported by viewer]
backgroundPort
<font>backgroundPort</font>
ensureInit()
.then(backgroundPort=> {})
[Not supported by viewer]
diff --git a/ext/bin/build.js b/ext/bin/build.js index 0d574fe..78be7d9 100644 --- a/ext/bin/build.js +++ b/ext/bin/build.js @@ -78,10 +78,10 @@ const buildOpts = { `${srcPath}/senders/media/overlay/overlayContentLoader.ts`, // Mirroring sender `${srcPath}/senders/mirroring.ts`, - // Shim - `${srcPath}/shim/index.ts`, - `${srcPath}/shim/content.ts`, - `${srcPath}/shim/contentBridge.ts`, + // Cast + `${srcPath}/cast/index.ts`, + `${srcPath}/cast/content.ts`, + `${srcPath}/cast/contentBridge.ts`, // UI `${srcPath}/ui/popup/index.tsx`, `${srcPath}/ui/options/index.tsx` diff --git a/ext/src/background/ShimManager.ts b/ext/src/background/CastManager.ts similarity index 56% rename from ext/src/background/ShimManager.ts rename to ext/src/background/CastManager.ts index c006c65..ebc2c1c 100644 --- a/ext/src/background/ShimManager.ts +++ b/ext/src/background/CastManager.ts @@ -17,7 +17,7 @@ import receiverDevices from "./receiverDevices"; type AnyPort = Port | MessagePort; -export interface Shim { +export interface CastInstance { bridgePort: Port; contentPort: AnyPort; contentTabId?: number; @@ -25,109 +25,109 @@ export interface Shim { appId?: string; } -export default new (class ShimManager { - private activeShims = new Set(); +export default new (class CastManager { + private activeInstances = new Set(); public async init() { - // Wait for "shim" ports + // Wait for "cast" ports messaging.onConnect.addListener(async port => { - if (port.name === "shim") { - this.createShim(port); + if (port.name === "cast") { + this.createInstance(port); } }); receiverDevices.addEventListener("receiverDeviceUp", ev => { - for (const shim of this.activeShims) { - shim.contentPort.postMessage({ - subject: "shim:serviceUp", - data: { receiverDevice: ev.detail.receiverDevice } + for (const instance of this.activeInstances) { + instance.contentPort.postMessage({ + subject: "cast:serviceUp", + data: { receiverDevice: ev.detail.deviceInfo } }); } }); receiverDevices.addEventListener("receiverDeviceDown", ev => { - for (const shim of this.activeShims) { - shim.contentPort.postMessage({ - subject: "shim:serviceDown", - data: { receiverDeviceId: ev.detail.receiverDeviceId } + for (const instance of this.activeInstances) { + instance.contentPort.postMessage({ + subject: "cast:serviceDown", + data: { receiverDeviceId: ev.detail.deviceId } }); } }); } - public getShim(tabId: number, frameId?: number) { - for (const activeShim of this.activeShims) { - if (activeShim.contentTabId === tabId) { - if (frameId && activeShim.contentFrameId !== frameId) { + public getInstance(tabId: number, frameId?: number) { + for (const instance of this.activeInstances) { + if (instance.contentTabId === tabId) { + if (frameId && instance.contentFrameId !== frameId) { continue; } - return activeShim; + return instance; } } } - public async createShim(port: AnyPort) { - const shim = await (port instanceof MessagePort - ? this.createShimFromBackground(port) - : this.createShimFromContent(port)); + public async createInstance(port: AnyPort) { + const instance = await (port instanceof MessagePort + ? this.createInstanceFromBackground(port) + : this.createInstanceFromContent(port)); - shim.contentPort.postMessage({ - subject: "shim:initialized", + instance.contentPort.postMessage({ + subject: "cast:initialized", data: await bridge.getInfo() }); - this.activeShims.add(shim); + this.activeInstances.add(instance); } - private async createShimFromBackground( + private async createInstanceFromBackground( contentPort: MessagePort - ): Promise { - const shim: Shim = { + ): Promise { + const instance: CastInstance = { bridgePort: await bridge.connect(), contentPort }; - shim.bridgePort.onDisconnect.addListener(() => { + instance.bridgePort.onDisconnect.addListener(() => { contentPort.close(); - this.activeShims.delete(shim); + this.activeInstances.delete(instance); }); - shim.bridgePort.onMessage.addListener(message => { + instance.bridgePort.onMessage.addListener(message => { contentPort.postMessage(message); }); contentPort.addEventListener("message", ev => { - this.handleContentMessage(shim, ev.data); + this.handleContentMessage(instance, ev.data); }); - return shim; + return instance; } - private async createShimFromContent(contentPort: Port): Promise { + private async createInstanceFromContent(contentPort: Port): Promise { if ( contentPort.sender?.tab?.id === undefined || contentPort.sender?.frameId === undefined ) { throw logger.error( - "Content shim created with an invalid port context." + "Cast instance created from content with an invalid port context." ); } /** - * If there's already an active shim for the sender + * If there's already an active instance for the sender * tab/frame ID, disconnect it. */ - for (const activeShim of this.activeShims) { + for (const instance of this.activeInstances) { if ( - activeShim.contentTabId === contentPort.sender.tab.id && - activeShim.contentFrameId === contentPort.sender.frameId + instance.contentTabId === contentPort.sender.tab.id && + instance.contentFrameId === contentPort.sender.frameId ) { - activeShim.bridgePort.disconnect(); + instance.bridgePort.disconnect(); } } - const shim: Shim = { + const instance: CastInstance = { bridgePort: await bridge.connect(), contentPort, contentTabId: contentPort.sender.tab.id, @@ -135,7 +135,7 @@ export default new (class ShimManager { }; const onContentPortMessage = (message: Message) => { - this.handleContentMessage(shim, message); + this.handleContentMessage(instance, message); }; const onBridgePortMessage = (message: Message) => { @@ -143,37 +143,37 @@ export default new (class ShimManager { }; const onDisconnect = () => { - shim.bridgePort.onMessage.removeListener(onBridgePortMessage); + instance.bridgePort.onMessage.removeListener(onBridgePortMessage); contentPort.onMessage.removeListener(onContentPortMessage); - shim.bridgePort.disconnect(); + instance.bridgePort.disconnect(); contentPort.disconnect(); - this.activeShims.delete(shim); + this.activeInstances.delete(instance); }; - shim.bridgePort.onDisconnect.addListener(onDisconnect); - shim.bridgePort.onMessage.addListener(onBridgePortMessage); + instance.bridgePort.onDisconnect.addListener(onDisconnect); + instance.bridgePort.onMessage.addListener(onBridgePortMessage); contentPort.onDisconnect.addListener(onDisconnect); contentPort.onMessage.addListener(onContentPortMessage); - return shim; + return instance; } - private async handleContentMessage(shim: Shim, message: Message) { + private async handleContentMessage(instance: CastInstance, message: Message) { const [destination] = message.subject.split(":"); if (destination === "bridge") { - shim.bridgePort.postMessage(message); + instance.bridgePort.postMessage(message); } switch (message.subject) { - case "main:shimReady": { - shim.appId = message.data.appId; + case "main:castReady": { + instance.appId = message.data.appId; for (const receiverDevice of receiverDevices.getDevices()) { - shim.contentPort.postMessage({ - subject: "shim:serviceUp", + instance.contentPort.postMessage({ + subject: "cast:serviceUp", data: { receiverDevice } }); } @@ -183,25 +183,25 @@ export default new (class ShimManager { case "main:selectReceiver": { if ( - shim.contentTabId === undefined || - shim.contentFrameId === undefined + instance.contentTabId === undefined || + instance.contentFrameId === undefined ) { throw logger.error( - "Shim associated with content sender missing tab/frame ID" + "Cast instance associated with content sender missing tab/frame ID" ); } try { const selection = await ReceiverSelectorManager.getSelection( - shim.contentTabId, - shim.contentFrameId + instance.contentTabId, + instance.contentFrameId ); // Handle cancellation if (!selection) { - shim.contentPort.postMessage({ - subject: "shim:selectReceiver/cancelled" + instance.contentPort.postMessage({ + subject: "cast:selectReceiver/cancelled" }); break; @@ -218,21 +218,21 @@ export default new (class ShimManager { selection.mediaType !== ReceiverSelectorMediaType.App ) { - shim.contentPort.postMessage({ - subject: "shim:selectReceiver/cancelled" + instance.contentPort.postMessage({ + subject: "cast:selectReceiver/cancelled" }); loadSender({ - tabId: shim.contentTabId, - frameId: shim.contentFrameId, + tabId: instance.contentTabId, + frameId: instance.contentFrameId, selection }); break; } - shim.contentPort.postMessage({ - subject: "shim:selectReceiver/selected", + instance.contentPort.postMessage({ + subject: "cast:selectReceiver/selected", data: selection }); @@ -240,8 +240,8 @@ export default new (class ShimManager { } case ReceiverSelectionActionType.Stop: { - shim.contentPort.postMessage({ - subject: "shim:selectReceiver/stopped", + instance.contentPort.postMessage({ + subject: "cast:selectReceiver/stopped", data: selection }); @@ -250,8 +250,8 @@ export default new (class ShimManager { } } catch (err) { // TODO: Report errors properly - shim.contentPort.postMessage({ - subject: "shim:selectReceiver/cancelled" + instance.contentPort.postMessage({ + subject: "cast:selectReceiver/cancelled" }); } diff --git a/ext/src/background/background.ts b/ext/src/background/background.ts index e47cbc5..6d5c5c3 100755 --- a/ext/src/background/background.ts +++ b/ext/src/background/background.ts @@ -3,13 +3,12 @@ import defaultOptions from "../defaultOptions"; import loadSender from "../lib/loadSender"; import logger from "../lib/logger"; -import messaging from "../messaging"; import options from "../lib/options"; import bridge, { BridgeInfo } from "../lib/bridge"; import ReceiverSelectorManager from "./receiverSelector/ReceiverSelectorManager"; -import ShimManager from "./ShimManager"; +import CastManager from "./CastManager"; import receiverDevices from "./receiverDevices"; @@ -150,7 +149,7 @@ async function init() { await notifyBridgeCompat(); await receiverDevices.init(); - await ShimManager.init(); + await CastManager.init(); await initMenus(); await initWhitelist(); diff --git a/ext/src/background/receiverDevices.ts b/ext/src/background/receiverDevices.ts index 8400c61..d54a01a 100644 --- a/ext/src/background/receiverDevices.ts +++ b/ext/src/background/receiverDevices.ts @@ -6,7 +6,7 @@ import { TypedEventTarget } from "../lib/TypedEventTarget"; import { Message, Port } from "../messaging"; import { ReceiverDevice } from "../types"; -import { ReceiverStatus } from "../shim/cast/types"; +import { ReceiverStatus } from "../cast/api/types"; interface EventMap { receiverDeviceUp: { deviceInfo: ReceiverDevice }; diff --git a/ext/src/background/receiverSelector/ReceiverSelectorManager.ts b/ext/src/background/receiverSelector/ReceiverSelectorManager.ts index ffe275e..abd2712 100644 --- a/ext/src/background/receiverSelector/ReceiverSelectorManager.ts +++ b/ext/src/background/receiverSelector/ReceiverSelectorManager.ts @@ -3,7 +3,7 @@ import options from "../../lib/options"; import logger from "../../lib/logger"; -import ShimManager from "../ShimManager"; +import CastManager from "../CastManager"; import receiverDevices from "../receiverDevices"; import { getMediaTypesForPageUrl } from "../../lib/utils"; @@ -50,14 +50,17 @@ async function getSelection( withMediaSender = false ): Promise { return new Promise(async (resolve, reject) => { - let currentShim = ShimManager.getShim(contextTabId, contextFrameId); + let castInstance = CastManager.getInstance( + contextTabId, + contextFrameId + ); /** * If the current context is running the mirroring app, pretend * it doesn't exist because it shouldn't be launched like this. */ - if (currentShim?.appId === (await options.get("mirroringAppId"))) { - currentShim = undefined; + if (castInstance?.appId === (await options.get("mirroringAppId"))) { + castInstance = undefined; } let defaultMediaType = ReceiverSelectorMediaType.Tab; @@ -78,7 +81,7 @@ async function getSelection( } // Enable app media type if initialized sender app is found - if (currentShim || withMediaSender) { + if (castInstance || withMediaSender) { defaultMediaType = ReceiverSelectorMediaType.App; availableMediaTypes |= ReceiverSelectorMediaType.App; } @@ -215,7 +218,7 @@ async function getSelection( receiverDevices.getDevices(), defaultMediaType, availableMediaTypes, - currentShim?.appId + castInstance?.appId ); }); } diff --git a/ext/src/background/whitelist.ts b/ext/src/background/whitelist.ts index 09ad4d2..9a78467 100644 --- a/ext/src/background/whitelist.ts +++ b/ext/src/background/whitelist.ts @@ -141,7 +141,7 @@ function onWhitelistedChildBeforeSendHeaders( * hosted script. * * We can redirect this and inject our own script to setup - * the API shim. + * the API. */ async function onBeforeCastSDKRequest(details: OnBeforeRequestDetails) { if (!details.originUrl || details.tabId === -1) { @@ -179,13 +179,13 @@ async function onBeforeCastSDKRequest(details: OnBeforeRequestDetails) { }); await browser.tabs.executeScript(details.tabId, { - file: "shim/contentBridge.js", + file: "cast/contentBridge.js", frameId: details.frameId, runAt: "document_start" }); return { - redirectUrl: browser.runtime.getURL("shim/index.js") + redirectUrl: browser.runtime.getURL("cast/index.js") }; } diff --git a/ext/src/shim/cast/Session.ts b/ext/src/cast/api/Session.ts similarity index 100% rename from ext/src/shim/cast/Session.ts rename to ext/src/cast/api/Session.ts diff --git a/ext/src/shim/cast/dataClasses.ts b/ext/src/cast/api/dataClasses.ts similarity index 100% rename from ext/src/shim/cast/dataClasses.ts rename to ext/src/cast/api/dataClasses.ts diff --git a/ext/src/shim/cast/enums.ts b/ext/src/cast/api/enums.ts old mode 100755 new mode 100644 similarity index 100% rename from ext/src/shim/cast/enums.ts rename to ext/src/cast/api/enums.ts diff --git a/ext/src/shim/cast/index.ts b/ext/src/cast/api/index.ts old mode 100755 new mode 100644 similarity index 95% rename from ext/src/shim/cast/index.ts rename to ext/src/cast/api/index.ts index 76281c9..879468a --- a/ext/src/shim/cast/index.ts +++ b/ext/src/cast/api/index.ts @@ -133,7 +133,7 @@ export function initialize( apiConfig = newApiConfig; sendMessageResponse({ - subject: "main:shimReady", + subject: "main:castReady", data: { appId: apiConfig.sessionRequest.appId } }); @@ -243,7 +243,7 @@ export function precache(_data: string) { onMessage(message => { switch (message.subject) { - case "shim:initialized": { + case "cast:initialized": { isAvailable = true; break; } @@ -252,7 +252,7 @@ onMessage(message => { * Once the bridge detects a session creation, session info * and data needed to create cast API objects is sent. */ - case "shim:castSessionCreated": { + case "cast:sessionCreated": { // Notify background to close UI sendMessageResponse({ subject: "main:sessionCreated" @@ -282,7 +282,7 @@ onMessage(message => { sessions.set(session.sessionId, session); } // eslint-disable-next-line no-fallthrough - case "shim:castSessionUpdated": { + case "cast:sessionUpdated": { const status = message.data; const session = sessions.get(status.sessionId); if (!session) { @@ -303,7 +303,7 @@ onMessage(message => { break; } - case "shim:castSessionStopped": { + case "cast:sessionStopped": { const { sessionId } = message.data; const session = sessions.get(sessionId); if (session) { @@ -320,7 +320,7 @@ onMessage(message => { break; } - case "shim:receivedCastSessionMessage": { + case "cast:receivedSessionMessage": { const { sessionId, namespace, messageData } = message.data; const session = sessions.get(sessionId); if (session) { @@ -337,7 +337,7 @@ onMessage(message => { break; } - case "shim:impl_sendCastMessage": { + case "cast:impl_sendMessage": { const { sessionId, messageId, error } = message.data; const session = sessions.get(sessionId); @@ -360,7 +360,7 @@ onMessage(message => { break; } - case "shim:serviceUp": { + case "cast:serviceUp": { const { receiverDevice } = message.data; if (receiverDevices.has(receiverDevice.id)) { break; @@ -376,7 +376,7 @@ onMessage(message => { break; } - case "shim:serviceDown": { + case "cast:serviceDown": { const { receiverDeviceId } = message.data; receiverDevices.delete(receiverDeviceId); @@ -392,7 +392,7 @@ onMessage(message => { break; } - case "shim:selectReceiver/selected": { + case "cast:selectReceiver/selected": { logger.info("Selected receiver"); if (!sessionRequest) { @@ -403,7 +403,7 @@ onMessage(message => { break; } - case "shim:selectReceiver/stopped": { + case "cast:selectReceiver/stopped": { const { receiver } = message.data; logger.info("Stopped receiver"); @@ -427,7 +427,7 @@ onMessage(message => { /** * Popup closed before session established. */ - case "shim:selectReceiver/cancelled": { + case "cast:selectReceiver/cancelled": { if (sessionRequest) { sessionRequest = null; diff --git a/ext/src/shim/cast/media/Media.ts b/ext/src/cast/api/media/Media.ts similarity index 100% rename from ext/src/shim/cast/media/Media.ts rename to ext/src/cast/api/media/Media.ts diff --git a/ext/src/shim/cast/media/dataClasses.ts b/ext/src/cast/api/media/dataClasses.ts similarity index 100% rename from ext/src/shim/cast/media/dataClasses.ts rename to ext/src/cast/api/media/dataClasses.ts diff --git a/ext/src/shim/cast/media/enums.ts b/ext/src/cast/api/media/enums.ts old mode 100755 new mode 100644 similarity index 100% rename from ext/src/shim/cast/media/enums.ts rename to ext/src/cast/api/media/enums.ts diff --git a/ext/src/shim/cast/media/index.ts b/ext/src/cast/api/media/index.ts old mode 100755 new mode 100644 similarity index 100% rename from ext/src/shim/cast/media/index.ts rename to ext/src/cast/api/media/index.ts diff --git a/ext/src/shim/cast/types.ts b/ext/src/cast/api/types.ts similarity index 100% rename from ext/src/shim/cast/types.ts rename to ext/src/cast/api/types.ts diff --git a/ext/src/shim/content.ts b/ext/src/cast/content.ts similarity index 100% rename from ext/src/shim/content.ts rename to ext/src/cast/content.ts diff --git a/ext/src/shim/contentBridge.ts b/ext/src/cast/contentBridge.ts similarity index 60% rename from ext/src/shim/contentBridge.ts rename to ext/src/cast/contentBridge.ts index c4e8499..7a9b157 100644 --- a/ext/src/shim/contentBridge.ts +++ b/ext/src/cast/contentBridge.ts @@ -1,22 +1,21 @@ "use strict"; -import { loadScript } from "../lib/utils"; import { onMessageResponse, sendMessage } from "./eventMessageChannel"; import messaging, { Message } from "../messaging"; // Message port to background script -export const backgroundPort = messaging.connect({ name: "shim" }); +export const backgroundPort = messaging.connect({ name: "cast" }); -const forwardToShim = (message: Message) => sendMessage(message); +const forwardToCast = (message: Message) => sendMessage(message); const forwardToMain = (message: Message) => backgroundPort.postMessage(message); // Add message listeners -backgroundPort.onMessage.addListener(forwardToShim); +backgroundPort.onMessage.addListener(forwardToCast); const listener = onMessageResponse(forwardToMain); // Remove listeners backgroundPort.onDisconnect.addListener(() => { - backgroundPort.onMessage.removeListener(forwardToShim); + backgroundPort.onMessage.removeListener(forwardToCast); listener.disconnect(); }); diff --git a/ext/src/shim/eventMessageChannel.ts b/ext/src/cast/eventMessageChannel.ts similarity index 100% rename from ext/src/shim/eventMessageChannel.ts rename to ext/src/cast/eventMessageChannel.ts diff --git a/ext/src/shim/export.ts b/ext/src/cast/export.ts similarity index 78% rename from ext/src/shim/export.ts rename to ext/src/cast/export.ts index 518c834..41c1827 100644 --- a/ext/src/shim/export.ts +++ b/ext/src/cast/export.ts @@ -1,6 +1,6 @@ "use strict"; -import * as cast from "./cast"; +import * as cast from "./api"; import { Message } from "../messaging"; import { BridgeInfo } from "../lib/bridge"; @@ -18,9 +18,9 @@ let initializedBackgroundPort: MessagePort; /** * To support exporting an API from a module, we need to * retain the event-based message passing despite not - * actually crossing any context boundaries. The shim listens - * for and emits these messages, and changing that behavior - * is too messy. + * actually crossing any context boundaries. The cast instance + * listens for and emits these messages, and changing that + * behavior is too messy. */ export function ensureInit(): Promise> { return new Promise(async (resolve, reject) => { @@ -45,24 +45,24 @@ export function ensureInit(): Promise> { * URL. */ if (window.location.protocol === "moz-extension:") { - const { default: ShimManager } = await import( - "../background/ShimManager" + const { default: CastManager } = await import( + "../background/CastManager" ); // port2 will post bridge messages to port 1 - await ShimManager.init(); - await ShimManager.createShim(channel.port2); + await CastManager.init(); + await CastManager.createInstance(channel.port2); - // bridge -> shim + // bridge -> cast instance channel.port1.onmessage = ev => { const message = ev.data as Message; - // Send message to shim + // Send message to cast instance sendMessage(message); - handleIncomingMessageToShim(message); + handleIncomingMessageToCast(message); }; - // shim -> bridge + // cast instance -> bridge onMessageResponse(message => { channel.port1.postMessage(message); }); @@ -85,13 +85,13 @@ export function ensureInit(): Promise> { backgroundPort.postMessage(message); }; - // Handle shim messages - onMessage(handleIncomingMessageToShim); + // Handle cast messages + onMessage(handleIncomingMessageToCast); } - function handleIncomingMessageToShim(message: Message) { + function handleIncomingMessageToCast(message: Message) { switch (message.subject) { - case "shim:initialized": { + case "cast:initialized": { initializedBridgeInfo = message.data; if (initializedBridgeInfo.isVersionCompatible) { diff --git a/ext/src/shim/framework/GoogleCastLauncher.ts b/ext/src/cast/framework/GoogleCastLauncher.ts similarity index 100% rename from ext/src/shim/framework/GoogleCastLauncher.ts rename to ext/src/cast/framework/GoogleCastLauncher.ts diff --git a/ext/src/shim/framework/classes/ActiveInputStateEventData.ts b/ext/src/cast/framework/classes/ActiveInputStateEventData.ts similarity index 100% rename from ext/src/shim/framework/classes/ActiveInputStateEventData.ts rename to ext/src/cast/framework/classes/ActiveInputStateEventData.ts diff --git a/ext/src/shim/framework/classes/ApplicationMetadata.ts b/ext/src/cast/framework/classes/ApplicationMetadata.ts similarity index 93% rename from ext/src/shim/framework/classes/ApplicationMetadata.ts rename to ext/src/cast/framework/classes/ApplicationMetadata.ts index 79edc18..46622ce 100644 --- a/ext/src/shim/framework/classes/ApplicationMetadata.ts +++ b/ext/src/cast/framework/classes/ApplicationMetadata.ts @@ -1,6 +1,6 @@ "use strict"; -import * as cast from "../../cast"; +import * as cast from "../../api"; export default class ApplicationMetadata { public applicationId: string; diff --git a/ext/src/shim/framework/classes/ApplicationMetadataEventData.ts b/ext/src/cast/framework/classes/ApplicationMetadataEventData.ts similarity index 100% rename from ext/src/shim/framework/classes/ApplicationMetadataEventData.ts rename to ext/src/cast/framework/classes/ApplicationMetadataEventData.ts diff --git a/ext/src/shim/framework/classes/ApplicationStatusEventData.ts b/ext/src/cast/framework/classes/ApplicationStatusEventData.ts similarity index 100% rename from ext/src/shim/framework/classes/ApplicationStatusEventData.ts rename to ext/src/cast/framework/classes/ApplicationStatusEventData.ts diff --git a/ext/src/shim/framework/classes/CastContext.ts b/ext/src/cast/framework/classes/CastContext.ts similarity index 100% rename from ext/src/shim/framework/classes/CastContext.ts rename to ext/src/cast/framework/classes/CastContext.ts diff --git a/ext/src/shim/framework/classes/CastOptions.ts b/ext/src/cast/framework/classes/CastOptions.ts similarity index 95% rename from ext/src/shim/framework/classes/CastOptions.ts rename to ext/src/cast/framework/classes/CastOptions.ts index dc46d46..7ba0363 100644 --- a/ext/src/shim/framework/classes/CastOptions.ts +++ b/ext/src/cast/framework/classes/CastOptions.ts @@ -1,6 +1,6 @@ "use strict"; -import * as cast from "../../cast"; +import * as cast from "../../api"; export default class CastOptions { public autoJoinPolicy: string = cast.AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED; diff --git a/ext/src/shim/framework/classes/CastSession.ts b/ext/src/cast/framework/classes/CastSession.ts similarity index 93% rename from ext/src/shim/framework/classes/CastSession.ts rename to ext/src/cast/framework/classes/CastSession.ts index a274fa0..21448c5 100644 --- a/ext/src/shim/framework/classes/CastSession.ts +++ b/ext/src/cast/framework/classes/CastSession.ts @@ -2,7 +2,7 @@ import logger from "../../../lib/logger"; -import * as cast from "../../cast"; +import * as cast from "../../api"; import ApplicationMetadata from "./ApplicationMetadata"; @@ -91,17 +91,17 @@ export default class CastSession extends EventTarget { _namespace: string, // @ts-ignore _data: any - ): Promise { + ): Promise { logger.info("STUB :: CastSession#sendMessage"); } // @ts-ignore - public setMute(_isMute: boolean): Promise { + public setMute(_isMute: boolean): Promise { logger.info("STUB :: CastSession#setMute"); } // @ts-ignore - public setVolume(_volume: number): Promise { + public setVolume(_volume: number): Promise { logger.info("STUB :: CastSession#setVolume"); } } diff --git a/ext/src/shim/framework/classes/CastStateEventData.ts b/ext/src/cast/framework/classes/CastStateEventData.ts similarity index 100% rename from ext/src/shim/framework/classes/CastStateEventData.ts rename to ext/src/cast/framework/classes/CastStateEventData.ts diff --git a/ext/src/shim/framework/classes/EventData.ts b/ext/src/cast/framework/classes/EventData.ts similarity index 100% rename from ext/src/shim/framework/classes/EventData.ts rename to ext/src/cast/framework/classes/EventData.ts diff --git a/ext/src/shim/framework/classes/MediaSessionEventData.ts b/ext/src/cast/framework/classes/MediaSessionEventData.ts similarity index 88% rename from ext/src/shim/framework/classes/MediaSessionEventData.ts rename to ext/src/cast/framework/classes/MediaSessionEventData.ts index 2897d42..dd88ff5 100644 --- a/ext/src/shim/framework/classes/MediaSessionEventData.ts +++ b/ext/src/cast/framework/classes/MediaSessionEventData.ts @@ -1,6 +1,6 @@ "use strict"; -import * as cast from "../../cast"; +import * as cast from "../../api"; import EventData from "./EventData"; diff --git a/ext/src/shim/framework/classes/RemotePlayer.ts b/ext/src/cast/framework/classes/RemotePlayer.ts similarity index 96% rename from ext/src/shim/framework/classes/RemotePlayer.ts rename to ext/src/cast/framework/classes/RemotePlayer.ts index d375a52..832a5a7 100644 --- a/ext/src/shim/framework/classes/RemotePlayer.ts +++ b/ext/src/cast/framework/classes/RemotePlayer.ts @@ -1,6 +1,6 @@ "use strict"; -import * as cast from "../../cast"; +import * as cast from "../../api"; import RemotePlayerController from "./RemotePlayerController"; diff --git a/ext/src/shim/framework/classes/RemotePlayerChangedEvent.ts b/ext/src/cast/framework/classes/RemotePlayerChangedEvent.ts similarity index 100% rename from ext/src/shim/framework/classes/RemotePlayerChangedEvent.ts rename to ext/src/cast/framework/classes/RemotePlayerChangedEvent.ts diff --git a/ext/src/shim/framework/classes/RemotePlayerController.ts b/ext/src/cast/framework/classes/RemotePlayerController.ts similarity index 100% rename from ext/src/shim/framework/classes/RemotePlayerController.ts rename to ext/src/cast/framework/classes/RemotePlayerController.ts diff --git a/ext/src/shim/framework/classes/SessionStateEventData.ts b/ext/src/cast/framework/classes/SessionStateEventData.ts similarity index 100% rename from ext/src/shim/framework/classes/SessionStateEventData.ts rename to ext/src/cast/framework/classes/SessionStateEventData.ts diff --git a/ext/src/shim/framework/classes/VolumeEventData.ts b/ext/src/cast/framework/classes/VolumeEventData.ts similarity index 100% rename from ext/src/shim/framework/classes/VolumeEventData.ts rename to ext/src/cast/framework/classes/VolumeEventData.ts diff --git a/ext/src/shim/framework/enums.ts b/ext/src/cast/framework/enums.ts similarity index 100% rename from ext/src/shim/framework/enums.ts rename to ext/src/cast/framework/enums.ts diff --git a/ext/src/shim/framework/index.ts b/ext/src/cast/framework/index.ts similarity index 100% rename from ext/src/shim/framework/index.ts rename to ext/src/cast/framework/index.ts diff --git a/ext/src/shim/index.ts b/ext/src/cast/index.ts old mode 100755 new mode 100644 similarity index 96% rename from ext/src/shim/index.ts rename to ext/src/cast/index.ts index 9889084..3c1e0bb --- a/ext/src/shim/index.ts +++ b/ext/src/cast/index.ts @@ -1,6 +1,6 @@ "use strict"; -import * as cast from "./cast"; +import * as cast from "./api"; import { CAST_FRAMEWORK_SCRIPT_URL } from "../lib/endpoints"; import { loadScript } from "../lib/utils"; @@ -60,7 +60,7 @@ if (document.currentScript) { onMessage(message => { switch (message.subject) { - case "shim:initialized": { + case "cast:initialized": { bridgeInfo = message.data; if (!isFramework) { diff --git a/ext/src/shim/types.ts b/ext/src/cast/types.ts similarity index 79% rename from ext/src/shim/types.ts rename to ext/src/cast/types.ts index 1d51268..db5422c 100644 --- a/ext/src/shim/types.ts +++ b/ext/src/cast/types.ts @@ -1,7 +1,7 @@ "use strict"; -import { Error as Error_ } from "./cast/dataClasses"; -import { Media } from "./cast/media"; +import { Error as Error_ } from "./api/dataClasses"; +import { Media } from "./api/media"; export type SuccessCallback = () => void; export type ErrorCallback = (err: Error_) => void; diff --git a/ext/src/lib/loadSender.ts b/ext/src/lib/loadSender.ts index 2ec5fa4..e6f5bcb 100644 --- a/ext/src/lib/loadSender.ts +++ b/ext/src/lib/loadSender.ts @@ -9,7 +9,7 @@ import { ReceiverSelectorMediaType } from "../background/receiverSelector"; -import ShimManager from "../background/ShimManager"; +import CastManager from "../background/CastManager"; interface LoadSenderOptions { tabId: number; @@ -33,15 +33,15 @@ export default async function loadSender(opts: LoadSenderOptions) { switch (opts.selection.mediaType) { case ReceiverSelectorMediaType.App: { - const shim = ShimManager.getShim(opts.tabId, opts.frameId); - if (!shim) { + const instance = CastManager.getInstance(opts.tabId, opts.frameId); + if (!instance) { throw logger.error( - `Shim not found at tabId ${opts.tabId} / frameId ${opts.frameId}` + `Cast instance not found at tabId ${opts.tabId} / frameId ${opts.frameId}` ); } - shim.contentPort.postMessage({ - subject: "shim:launchApp", + instance.contentPort.postMessage({ + subject: "cast:launchApp", data: { receiver: opts.selection.receiver } }); diff --git a/ext/src/manifest.json b/ext/src/manifest.json index 3234da3..dbda0ac 100755 --- a/ext/src/manifest.json +++ b/ext/src/manifest.json @@ -32,7 +32,7 @@ { "all_frames": true , "js": [ - "shim/content.js" + "cast/content.js" ] , "matches": [ "" ] , "run_at": "document_start" @@ -65,7 +65,7 @@ , "" ] , "web_accessible_resources": [ - "shim/index.js" + "cast/index.js" , "senders/media/overlay/overlayContent.js" , "senders/media/overlay/AirPlay_Audio.svg" , "senders/media/overlay/AirPlay_Video.svg" diff --git a/ext/src/messaging.ts b/ext/src/messaging.ts index 83d58d0..8d46871 100644 --- a/ext/src/messaging.ts +++ b/ext/src/messaging.ts @@ -16,7 +16,7 @@ import { MediaStatus, ReceiverStatus, SenderMessage -} from "./shim/cast/types"; +} from "./cast/api/types"; import { ReceiverDevice } from "./types"; @@ -47,18 +47,23 @@ type ExtMessageDefinitions = { availableMediaTypes?: ReceiverSelectorMediaType; }; "popup:close": {}; + "receiverSelector:selected": ReceiverSelection; "receiverSelector:stop": ReceiverSelection; - "main:shimReady": { appId: string }; + + "main:castReady": { appId: string }; + "main:selectReceiver": {}; - "shim:selectReceiver/selected": ReceiverSelectionCast; - "shim:selectReceiver/stopped": ReceiverSelectionStop; - "shim:selectReceiver/cancelled": {}; + "cast:selectReceiver/selected": ReceiverSelectionCast; + "cast:selectReceiver/stopped": ReceiverSelectionStop; + "cast:selectReceiver/cancelled": {}; + "main:sessionCreated": {}; - "shim:initialized": BridgeInfo; - "shim:serviceUp": { receiverDevice: ReceiverDevice }; - "shim:serviceDown": { receiverDeviceId: ReceiverDevice["id"] }; - "shim:launchApp": { receiver: ReceiverDevice }; + + "cast:initialized": BridgeInfo; + "cast:serviceUp": { receiverDevice: ReceiverDevice }; + "cast:serviceDown": { receiverDeviceId: ReceiverDevice["id"] }; + "cast:launchApp": { receiver: ReceiverDevice }; }; /** @@ -67,17 +72,17 @@ type ExtMessageDefinitions = { * app/src/bridge/messaging.ts > MessageDefinitions */ type AppMessageDefinitions = { - "shim:castSessionCreated": CastSessionCreated; - "shim:castSessionUpdated": CastSessionUpdated; - "shim:castSessionStopped": { + "cast:sessionCreated": CastSessionCreated; + "cast:sessionUpdated": CastSessionUpdated; + "cast:sessionStopped": { sessionId: string; }; - "shim:receivedCastSessionMessage": { + "cast:receivedSessionMessage": { sessionId: string; namespace: string; messageData: string; }; - "shim:impl_sendCastMessage": { + "cast:impl_sendMessage": { sessionId: string; messageId: string; error?: string; diff --git a/ext/src/senders/media/index.ts b/ext/src/senders/media/index.ts index b273ce2..6c6a408 100644 --- a/ext/src/senders/media/index.ts +++ b/ext/src/senders/media/index.ts @@ -2,7 +2,7 @@ import logger from "../../lib/logger"; import options from "../../lib/options"; -import cast, { ensureInit } from "../../shim/export"; +import cast, { ensureInit } from "../../cast/export"; import { Message } from "../../messaging"; import { ReceiverDevice } from "../../types"; @@ -363,7 +363,7 @@ export async function init(opts: InitOptions) { if (targetElement instanceof HTMLMediaElement) { registerMediaElementListeners(targetElement); - if (options.get("mediaOverlayEnabled")) { + if (await options.get("mediaOverlayEnabled")) { // TODO: Un-hide overlay here } } diff --git a/ext/src/senders/mirroring.ts b/ext/src/senders/mirroring.ts index 96eba0f..9a15338 100644 --- a/ext/src/senders/mirroring.ts +++ b/ext/src/senders/mirroring.ts @@ -1,7 +1,7 @@ "use strict"; import options from "../lib/options"; -import cast, { ensureInit } from "../shim/export"; +import cast, { ensureInit } from "../cast/export"; import { ReceiverSelectorMediaType } from "../background/receiverSelector"; import { ReceiverDevice } from "../types"; diff --git a/ext/src/types.ts b/ext/src/types.ts index fba6385..4e2b85c 100644 --- a/ext/src/types.ts +++ b/ext/src/types.ts @@ -1,6 +1,6 @@ "use strict"; -import { ReceiverStatus } from "./shim/cast/types"; +import { ReceiverStatus } from "./cast/api/types"; export interface ReceiverDevice { host: string;