From 9af43c291006e189cd22e56eb8b8ea89f43a9ece Mon Sep 17 00:00:00 2001 From: hensm Date: Tue, 15 Mar 2022 07:00:45 +0000 Subject: [PATCH] Rename shim -> cast --- README.md | 2 +- app/src/bridge/components/cast/Session.ts | 8 +- app/src/bridge/components/cast/index.ts | 12 +- app/src/bridge/messaging.ts | 10 +- diagram.png | Bin 99395 -> 0 bytes diagram_module.svg | 1 - ext/bin/build.js | 8 +- .../{ShimManager.ts => CastManager.ts} | 144 +++++++++--------- ext/src/background/background.ts | 5 +- ext/src/background/receiverDevices.ts | 2 +- .../ReceiverSelectorManager.ts | 15 +- ext/src/background/whitelist.ts | 6 +- ext/src/{shim/cast => cast/api}/Session.ts | 0 .../{shim/cast => cast/api}/dataClasses.ts | 0 ext/src/{shim/cast => cast/api}/enums.ts | 0 ext/src/{shim/cast => cast/api}/index.ts | 24 +-- .../{shim/cast => cast/api}/media/Media.ts | 0 .../cast => cast/api}/media/dataClasses.ts | 0 .../{shim/cast => cast/api}/media/enums.ts | 0 .../{shim/cast => cast/api}/media/index.ts | 0 ext/src/{shim/cast => cast/api}/types.ts | 0 ext/src/{shim => cast}/content.ts | 0 ext/src/{shim => cast}/contentBridge.ts | 9 +- ext/src/{shim => cast}/eventMessageChannel.ts | 0 ext/src/{shim => cast}/export.ts | 32 ++-- .../framework/GoogleCastLauncher.ts | 0 .../classes/ActiveInputStateEventData.ts | 0 .../framework/classes/ApplicationMetadata.ts | 2 +- .../classes/ApplicationMetadataEventData.ts | 0 .../classes/ApplicationStatusEventData.ts | 0 .../framework/classes/CastContext.ts | 0 .../framework/classes/CastOptions.ts | 2 +- .../framework/classes/CastSession.ts | 8 +- .../framework/classes/CastStateEventData.ts | 0 .../framework/classes/EventData.ts | 0 .../classes/MediaSessionEventData.ts | 2 +- .../framework/classes/RemotePlayer.ts | 2 +- .../classes/RemotePlayerChangedEvent.ts | 0 .../classes/RemotePlayerController.ts | 0 .../classes/SessionStateEventData.ts | 0 .../framework/classes/VolumeEventData.ts | 0 ext/src/{shim => cast}/framework/enums.ts | 0 ext/src/{shim => cast}/framework/index.ts | 0 ext/src/{shim => cast}/index.ts | 4 +- ext/src/{shim => cast}/types.ts | 4 +- ext/src/lib/loadSender.ts | 12 +- ext/src/manifest.json | 4 +- ext/src/messaging.ts | 33 ++-- ext/src/senders/media/index.ts | 4 +- ext/src/senders/mirroring.ts | 2 +- ext/src/types.ts | 2 +- 51 files changed, 182 insertions(+), 177 deletions(-) delete mode 100644 diagram.png delete mode 100644 diagram_module.svg rename ext/src/background/{ShimManager.ts => CastManager.ts} (56%) rename ext/src/{shim/cast => cast/api}/Session.ts (100%) rename ext/src/{shim/cast => cast/api}/dataClasses.ts (100%) rename ext/src/{shim/cast => cast/api}/enums.ts (100%) mode change 100755 => 100644 rename ext/src/{shim/cast => cast/api}/index.ts (95%) mode change 100755 => 100644 rename ext/src/{shim/cast => cast/api}/media/Media.ts (100%) rename ext/src/{shim/cast => cast/api}/media/dataClasses.ts (100%) rename ext/src/{shim/cast => cast/api}/media/enums.ts (100%) mode change 100755 => 100644 rename ext/src/{shim/cast => cast/api}/media/index.ts (100%) mode change 100755 => 100644 rename ext/src/{shim/cast => cast/api}/types.ts (100%) rename ext/src/{shim => cast}/content.ts (100%) rename ext/src/{shim => cast}/contentBridge.ts (60%) rename ext/src/{shim => cast}/eventMessageChannel.ts (100%) rename ext/src/{shim => cast}/export.ts (78%) rename ext/src/{shim => cast}/framework/GoogleCastLauncher.ts (100%) rename ext/src/{shim => cast}/framework/classes/ActiveInputStateEventData.ts (100%) rename ext/src/{shim => cast}/framework/classes/ApplicationMetadata.ts (93%) rename ext/src/{shim => cast}/framework/classes/ApplicationMetadataEventData.ts (100%) rename ext/src/{shim => cast}/framework/classes/ApplicationStatusEventData.ts (100%) rename ext/src/{shim => cast}/framework/classes/CastContext.ts (100%) rename ext/src/{shim => cast}/framework/classes/CastOptions.ts (95%) rename ext/src/{shim => cast}/framework/classes/CastSession.ts (93%) rename ext/src/{shim => cast}/framework/classes/CastStateEventData.ts (100%) rename ext/src/{shim => cast}/framework/classes/EventData.ts (100%) rename ext/src/{shim => cast}/framework/classes/MediaSessionEventData.ts (88%) rename ext/src/{shim => cast}/framework/classes/RemotePlayer.ts (96%) rename ext/src/{shim => cast}/framework/classes/RemotePlayerChangedEvent.ts (100%) rename ext/src/{shim => cast}/framework/classes/RemotePlayerController.ts (100%) rename ext/src/{shim => cast}/framework/classes/SessionStateEventData.ts (100%) rename ext/src/{shim => cast}/framework/classes/VolumeEventData.ts (100%) rename ext/src/{shim => cast}/framework/enums.ts (100%) rename ext/src/{shim => cast}/framework/index.ts (100%) rename ext/src/{shim => cast}/index.ts (96%) mode change 100755 => 100644 rename ext/src/{shim => cast}/types.ts (79%) 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 69f31d47692c1661958f00d9d73fe3273f13989b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99395 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 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;