From d48efe4840445bb1895d083ed3e5d95fae15430e Mon Sep 17 00:00:00 2001 From: hensm Date: Sat, 24 Apr 2021 04:16:20 +0100 Subject: [PATCH] Remove leading slash from message names --- app/src/bridge/components/chromecast/Media.ts | 6 +- .../bridge/components/chromecast/Session.ts | 28 ++--- app/src/bridge/components/chromecast/index.ts | 4 +- app/src/bridge/components/discovery.ts | 6 +- app/src/bridge/components/mediaServer.ts | 14 +-- app/src/bridge/components/receiverSelector.ts | 8 +- app/src/bridge/index.ts | 18 +-- app/src/bridge/types.ts | 80 +++++++------- ext/src/background/ShimManager.ts | 14 +-- ext/src/background/StatusManager.ts | 10 +- .../NativeReceiverSelector.ts | 12 +- .../receiverSelector/PopupReceiverSelector.ts | 10 +- ext/src/lib/bridge.ts | 2 +- ext/src/lib/loadSender.ts | 2 +- ext/src/lib/nativeMessaging.ts | 6 +- ext/src/messaging.ts | 103 ++++++++++-------- ext/src/senders/media/index.ts | 10 +- ext/src/shim/cast/classes/Session.ts | 30 ++--- ext/src/shim/cast/index.ts | 14 +-- ext/src/shim/cast/media/classes/Media.ts | 8 +- ext/src/shim/export.ts | 2 +- ext/src/shim/index.ts | 2 +- ext/src/ui/popup/index.tsx | 10 +- 23 files changed, 207 insertions(+), 192 deletions(-) diff --git a/app/src/bridge/components/chromecast/Media.ts b/app/src/bridge/components/chromecast/Media.ts index 7b57fec..d222eac 100644 --- a/app/src/bridge/components/chromecast/Media.ts +++ b/app/src/bridge/components/chromecast/Media.ts @@ -62,14 +62,14 @@ export default class Media { messageData.mediaSessionId = status.mediaSessionId; } - this.sendMessage("shim:/media/update", messageData); + this.sendMessage("shim:media/update", messageData); } }); } public messageHandler (message: Message) { switch (message.subject) { - case "bridge:/media/sendMediaMessage": { + case "bridge:media/sendMediaMessage": { let error = false; try { this.channel.send(message.data.message); @@ -77,7 +77,7 @@ export default class Media { error = true; } - this.sendMessage("shim:/media/sendMediaMessageResponse", { + this.sendMessage("shim:media/sendMediaMessageResponse", { messageId: message.data.messageId , error }); diff --git a/app/src/bridge/components/chromecast/Session.ts b/app/src/bridge/components/chromecast/Session.ts index b8ca90d..48d4784 100644 --- a/app/src/bridge/components/chromecast/Session.ts +++ b/app/src/bridge/components/chromecast/Session.ts @@ -69,7 +69,7 @@ export default class Session { this.clientReceiver.on("message", (message: any) => { if (message.type === "RECEIVER_STATUS") { - this.sendMessage("shim:/session/updateStatus", message.status); + this.sendMessage("shim:session/updateStatus", message.status); if (message.status.applications) { const receiverApp = message.status.applications[0]; @@ -79,7 +79,7 @@ export default class Session { if (receiverAppId !== this.appId) { // Close session - this.sendMessage("shim:/session/stopped"); + this.sendMessage("shim:session/stopped"); this.client.close(); clearInterval(this.clientHeartbeatIntervalId!); return; @@ -103,7 +103,7 @@ export default class Session { this.sessionId = this.app.sessionId; - this.sendMessage("shim:/session/connected", { + this.sendMessage("shim:session/connected", { sessionId: this.app.sessionId , namespaces: this.app.namespaces , displayName: this.app.displayName @@ -117,34 +117,34 @@ export default class Session { public messageHandler (message: Message) { switch (message.subject) { - case "bridge:/session/close": + case "bridge:session/close": this.close(); break; - case "bridge:/session/impl_addMessageListener": + case "bridge:session/impl_addMessageListener": this._impl_addMessageListener(message.data.namespace); break; - case "bridge:/session/impl_sendMessage": + case "bridge:session/impl_sendMessage": this._impl_sendMessage( message.data.namespace , message.data.message , message.data.messageId); break; - case "bridge:/session/impl_setReceiverMuted": + case "bridge:session/impl_setReceiverMuted": this._impl_setReceiverMuted( message.data.muted , message.data.volumeId); break; - case "bridge:/session/impl_setReceiverVolumeLevel": + case "bridge:session/impl_setReceiverVolumeLevel": this._impl_setReceiverVolumeLevel( message.data.newLevel , message.data.volumeId); break; - case "bridge:/session/impl_stop": + case "bridge:session/impl_stop": this._impl_stop(message.data.stopId); break; } @@ -179,7 +179,7 @@ export default class Session { private _impl_addMessageListener (namespace: string) { this.createChannel(namespace); this.channelMap.get(namespace)?.on("message", (data: any) => { - this.sendMessage("shim:/session/impl_addMessageListener", { + this.sendMessage("shim:session/impl_addMessageListener", { namespace , data: JSON.stringify(data) }); @@ -205,7 +205,7 @@ export default class Session { error = true; } - this.sendMessage("shim:/session/impl_sendMessage", { + this.sendMessage("shim:session/impl_sendMessage", { messageId , error }); @@ -225,7 +225,7 @@ export default class Session { error = true; } - this.sendMessage("shim:/session/impl_setReceiverMuted", { + this.sendMessage("shim:session/impl_setReceiverMuted", { volumeId , error }); @@ -245,7 +245,7 @@ export default class Session { error = true; } - this.sendMessage("shim:/session/impl_setReceiverVolumeLevel", { + this.sendMessage("shim:session/impl_setReceiverVolumeLevel", { volumeId , error }); @@ -268,7 +268,7 @@ export default class Session { clearInterval(this.clientHeartbeatIntervalId!); - this.sendMessage("shim:/session/impl_stop", { + this.sendMessage("shim:session/impl_stop", { stopId , error }); diff --git a/app/src/bridge/components/chromecast/index.ts b/app/src/bridge/components/chromecast/index.ts index e4b5554..72c5270 100644 --- a/app/src/bridge/components/chromecast/index.ts +++ b/app/src/bridge/components/chromecast/index.ts @@ -23,7 +23,7 @@ export function handleSessionMessage (message: any) { // Forward message to instance message handler existingSessions.get(sessionId)?.messageHandler(message); } else { - if (message.subject === "bridge:/session/initialize") { + if (message.subject === "bridge:session/initialize") { existingSessions.set(sessionId, new Session( message.data.address , message.data.port @@ -46,7 +46,7 @@ export function handleMediaMessage (message: any) { // Forward message to instance message handler existingMedia.get(mediaId)!.messageHandler(message); } else { - if (message.subject === "bridge:/media/initialize") { + if (message.subject === "bridge:media/initialize") { // Get Session object media belongs to const parentSession = existingSessions.get( message.data._internalSessionId); diff --git a/app/src/bridge/components/discovery.ts b/app/src/bridge/components/discovery.ts index f1c978b..862df4b 100644 --- a/app/src/bridge/components/discovery.ts +++ b/app/src/bridge/components/discovery.ts @@ -20,7 +20,7 @@ const browser = mdns.createBrowser(mdns.tcp("googlecast"), { function onBrowserServiceUp (service: mdns.Service) { sendMessage({ - subject: "main:/serviceUp" + subject: "main:serviceUp" , data: { host: service.addresses[0] , port: service.port @@ -32,7 +32,7 @@ function onBrowserServiceUp (service: mdns.Service) { function onBrowserServiceDown (service: mdns.Service) { sendMessage({ - subject: "main:/serviceDown" + subject: "main:serviceDown" , data: { id: service.txtRecord.id } @@ -67,7 +67,7 @@ export function startDiscovery (options: InitializeOptions) { listener.on("receiverStatus", (status: ReceiverStatus) => { const receiverStatusMessage: any = { - subject: "main:/receiverStatus" + subject: "main:receiverStatus" , data: { id , status: { diff --git a/app/src/bridge/components/mediaServer.ts b/app/src/bridge/components/mediaServer.ts index 04ba12c..e8b56c5 100644 --- a/app/src/bridge/components/mediaServer.ts +++ b/app/src/bridge/components/mediaServer.ts @@ -33,7 +33,7 @@ export async function startMediaServer (filePath: string, port: number) { } else { console.error("Error: Media path is not a file."); sendMessage({ - subject: "mediaCast:/mediaServer/error" + subject: "mediaCast:mediaServer/error" }); return; @@ -41,7 +41,7 @@ export async function startMediaServer (filePath: string, port: number) { } catch (err) { console.error("Error: Failed to find media path."); sendMessage({ - subject: "mediaCast:/mediaServer/error" + subject: "mediaCast:mediaServer/error" }); return; @@ -51,7 +51,7 @@ export async function startMediaServer (filePath: string, port: number) { if (!contentType) { console.error("Error: Failed to find media type."); sendMessage({ - subject: "mediaCast:/mediaServer/error" + subject: "mediaCast:mediaServer/error" }); return; @@ -146,14 +146,14 @@ export async function startMediaServer (filePath: string, port: number) { if (!localAddress) { console.error("Failed to get local address."); sendMessage({ - subject: "mediaCast:/mediaServer/error" + subject: "mediaCast:mediaServer/error" }); stopMediaServer(); return; } sendMessage({ - subject: "mediaCast:/mediaServer/started" + subject: "mediaCast:mediaServer/started" , data: { mediaPath: fileName , subtitlePaths: Array.from(subtitles.keys()) @@ -163,10 +163,10 @@ export async function startMediaServer (filePath: string, port: number) { }); mediaServer.on("close", () => sendMessage({ - subject: "mediaCast:/mediaServer/stopped" + subject: "mediaCast:mediaServer/stopped" })); mediaServer.on("error", () => sendMessage({ - subject: "mediaCast:/mediaServer/error" + subject: "mediaCast:mediaServer/error" })); mediaServer.listen(port); diff --git a/app/src/bridge/components/receiverSelector.ts b/app/src/bridge/components/receiverSelector.ts index 59d42b7..76fd22f 100644 --- a/app/src/bridge/components/receiverSelector.ts +++ b/app/src/bridge/components/receiverSelector.ts @@ -48,7 +48,7 @@ export function startReceiverSelector (data: string) { if (!jsonData.mediaType) { sendMessage({ - subject: "main:/receiverSelector/stop" + subject: "main:receiverSelector/stop" , data: jsonData }); @@ -56,7 +56,7 @@ export function startReceiverSelector (data: string) { } sendMessage({ - subject: "main:/receiverSelector/selected" + subject: "main:receiverSelector/selected" , data: jsonData }); }); @@ -64,7 +64,7 @@ export function startReceiverSelector (data: string) { selectorApp.on("error", err => { sendMessage({ - subject: "main:/receiverSelector/error" + subject: "main:receiverSelector/error" , data: err.message }); }); @@ -74,7 +74,7 @@ export function startReceiverSelector (data: string) { selectorAppOpen = false; sendMessage({ - subject: "main:/receiverSelector/close" + subject: "main:receiverSelector/close" }); } }); diff --git a/app/src/bridge/index.ts b/app/src/bridge/index.ts index da82d57..27615fb 100755 --- a/app/src/bridge/index.ts +++ b/app/src/bridge/index.ts @@ -28,47 +28,47 @@ process.on("SIGTERM", () => { * for managing existing ones. */ decodeTransform.on("data", (message: Message) => { - if (message.subject.startsWith("bridge:/session/")) { + if (message.subject.startsWith("bridge:session/")) { handleSessionMessage(message); return; } - if (message.subject.startsWith("bridge:/media/")) { + if (message.subject.startsWith("bridge:media/")) { handleMediaMessage(message); return; } switch (message.subject) { - case "bridge:/getInfo": { + case "bridge:getInfo": { encodeTransform.write(__applicationVersion); break; } - case "bridge:/initialize": { + case "bridge:initialize": { startDiscovery(message.data); break; } - case "bridge:/stopReceiverApp": { + case "bridge:stopReceiverApp": { stopReceiverApp(message.data.receiver.host , message.data.receiver.port); break; } // Receiver selector - case "bridge:/receiverSelector/open": { + case "bridge:receiverSelector/open": { startReceiverSelector(message.data); break; } - case "bridge:/receiverSelector/close": { + case "bridge:receiverSelector/close": { stopReceiverSelector(); break; } // Media server - case "bridge:/mediaServer/start": { + case "bridge:mediaServer/start": { startMediaServer(message.data.filePath, message.data.port); break; } - case "bridge:/mediaServer/stop": { + case "bridge:mediaServer/stop": { stopMediaServer(); break; } diff --git a/app/src/bridge/types.ts b/app/src/bridge/types.ts index b57a3c1..beb4bc7 100644 --- a/app/src/bridge/types.ts +++ b/app/src/bridge/types.ts @@ -88,24 +88,24 @@ export interface Receiver { export type Messages = [ { - subject: "shim:/serviceUp" + subject: "shim:serviceUp" , data: { id: Receiver["id"] } } , { - subject: "shim:/serviceDown" + subject: "shim:serviceDown" , data: { id: Receiver["id"] } } , { - subject: "shim:/launchApp" + subject: "shim:launchApp" , data: { receiver: Receiver } } // Session messages , { - subject: "shim:/session/stopped" + subject: "shim:session/stopped" } , { - subject: "shim:/session/connected" + subject: "shim:session/connected" , data: { sessionId: string; namespaces: Array<{ name: string }>; @@ -114,33 +114,33 @@ export type Messages = [ } } , { - subject: "shim:/session/updateStatus" + subject: "shim:session/updateStatus" , data: any } , { - subject: "shim:/session/impl_addMessageListener" + subject: "shim:session/impl_addMessageListener" , data: { namespace: string, data: string } } , { - subject: "shim:/session/impl_sendMessage" + subject: "shim:session/impl_sendMessage" , data: { messageId: string, error: boolean } } , { - subject: "shim:/session/impl_setReceiverMuted" + subject: "shim:session/impl_setReceiverMuted" , data: { volumeId: string, error: boolean } } , { - subject: "shim:/session/impl_setReceiverVolumeLevel" + subject: "shim:session/impl_setReceiverVolumeLevel" , data: { volumeId: string, error: boolean } } , { - subject: "shim:/session/impl_stop" + subject: "shim:session/impl_stop" , data: { stopId: string, error: boolean } } // Bridge session messages , { - subject: "bridge:/session/initialize" + subject: "bridge:session/initialize" , data: { address: string , port: number @@ -150,43 +150,43 @@ export type Messages = [ , _id: string; } , { - subject: "bridge:/session/close" + subject: "bridge:session/close" , _id: string; } , { - subject: "bridge:/session/impl_leave" + subject: "bridge:session/impl_leave" , data: { id: string } , _id: string } , { - subject: "bridge:/session/impl_sendMessage" + subject: "bridge:session/impl_sendMessage" , data: { namespace: string, message: any, messageId: string } , _id: string } , { - subject: "bridge:/session/impl_setReceiverMuted" + subject: "bridge:session/impl_setReceiverMuted" , data: { muted: boolean, volumeId: string } , _id: string } , { - subject: "bridge:/session/impl_setReceiverVolumeLevel" + subject: "bridge:session/impl_setReceiverVolumeLevel" , data: { newLevel: number, volumeId: string } , _id: string } , { - subject: "bridge:/session/impl_stop" + subject: "bridge:session/impl_stop" , data: { stopId: string } , _id: string } , { - subject: "bridge:/session/impl_addMessageListener" + subject: "bridge:session/impl_addMessageListener" , data: { namespace: string } , _id: string } // Media messages , { - subject: "shim:/media/update" + subject: "shim:media/update" , data: { currentTime: number , _lastCurrentTime: number @@ -201,13 +201,13 @@ export type Messages = [ } } , { - subject: "shim:/media/sendMediaMessageResponse" + subject: "shim:media/sendMediaMessageResponse" , data: { messageId: string, error: boolean } } // Bridge media messages , { - subject: "bridge:/media/initialize" + subject: "bridge:media/initialize" , data: { sessionId: string , mediaSessionId: number @@ -216,54 +216,54 @@ export type Messages = [ , _id: string; } , { - subject: "bridge:/media/sendMediaMessage" + subject: "bridge:media/sendMediaMessage" , data: { message: any, messageId: string } , _id: string; } // Bridge messages , { - subject: "main:/receiverSelector/selected" + subject: "main:receiverSelector/selected" , data: ReceiverSelectionCast } , { - subject: "main:/receiverSelector/error" + subject: "main:receiverSelector/error" , data: string } , { - subject: "main:/receiverSelector/close" + subject: "main:receiverSelector/close" } , { - subject: "main:/receiverSelector/stop" + subject: "main:receiverSelector/stop" , data: ReceiverSelectionStop } , { - subject: "bridge:/getInfo" + subject: "bridge:getInfo" } , { - subject: "bridge:/initialize" + subject: "bridge:initialize" , data: { shouldWatchStatus: boolean } } , { - subject: "bridge:/receiverSelector/open" + subject: "bridge:receiverSelector/open" , data: any } , { - subject: "bridge:/receiverSelector/close" + subject: "bridge:receiverSelector/close" } , { - subject: "bridge:/stopReceiverApp" + subject: "bridge:stopReceiverApp" , data: { receiver: Receiver } } , { - subject: "bridge:/mediaServer/start" + subject: "bridge:mediaServer/start" , data: { filePath: string, port: number } } , { - subject: "bridge:/mediaServer/stop" + subject: "bridge:mediaServer/stop" } , { - subject: "mediaCast:/mediaServer/started" + subject: "mediaCast:mediaServer/started" , data: { mediaPath: string , subtitlePaths: string[] @@ -271,22 +271,22 @@ export type Messages = [ } } , { - subject: "mediaCast:/mediaServer/stopped" + subject: "mediaCast:mediaServer/stopped" } , { - subject: "mediaCast:/mediaServer/error" + subject: "mediaCast:mediaServer/error" } , { - subject: "main:/serviceUp" + subject: "main:serviceUp" , data: Receiver } , { - subject: "main:/serviceDown" + subject: "main:serviceDown" , data: { id: string } } , { - subject: "main:/receiverStatus" + subject: "main:receiverStatus" , data: { id: string, status: ReceiverStatus } } ]; diff --git a/ext/src/background/ShimManager.ts b/ext/src/background/ShimManager.ts index b718be5..2a9de1b 100644 --- a/ext/src/background/ShimManager.ts +++ b/ext/src/background/ShimManager.ts @@ -52,7 +52,7 @@ export default new class ShimManager { : this.createShimFromContent(port)); shim.contentPort.postMessage({ - subject: "shim:/initialized" + subject: "shim:initialized" , data: await bridge.getInfo() }); @@ -139,18 +139,18 @@ export default new class ShimManager { } private async handleContentMessage (shim: Shim, message: Message) { - const [ destination ] = message.subject.split(":/"); + const [ destination ] = message.subject.split(":"); if (destination === "bridge") { shim.bridgePort.postMessage(message); } switch (message.subject) { - case "main:/shimReady": { + case "main:shimReady": { shim.requestedAppId = message.data.appId; for (const receiver of StatusManager.getReceivers()) { shim.contentPort.postMessage({ - subject: "shim:/serviceUp" + subject: "shim:serviceUp" , data: { id: receiver.id } }); } @@ -234,7 +234,7 @@ export default new class ShimManager { * TODO: If we're closing a selector, make sure it's the * same one that caused the session creation. */ - case "main:/sessionCreated": { + case "main:sessionCreated": { const selector = await ReceiverSelectorManager.getSelector(); const shouldClose = await options.get( "receiverSelectorWaitForConnection"); @@ -252,7 +252,7 @@ export default new class ShimManager { StatusManager.addEventListener("serviceUp", ev => { for (const shim of this.activeShims) { shim.contentPort.postMessage({ - subject: "shim:/serviceUp" + subject: "shim:serviceUp" , data: { id: ev.detail.id } }); } @@ -261,7 +261,7 @@ export default new class ShimManager { StatusManager.addEventListener("serviceDown", ev => { for (const shim of this.activeShims) { shim.contentPort.postMessage({ - subject: "shim:/serviceDown" + subject: "shim:serviceDown" , data: { id: ev.detail.id } }); } diff --git a/ext/src/background/StatusManager.ts b/ext/src/background/StatusManager.ts index 4f7c5c1..3ccfe2f 100644 --- a/ext/src/background/StatusManager.ts +++ b/ext/src/background/StatusManager.ts @@ -50,7 +50,7 @@ export default new class StatusManager } this.bridgePort.postMessage({ - subject: "bridge:/stopReceiverApp" + subject: "bridge:stopReceiverApp" , data: { receiver } }); } @@ -61,7 +61,7 @@ export default new class StatusManager bridgePort.onDisconnect.addListener(this.onBridgePortDisconnect); bridgePort.postMessage({ - subject: "bridge:/initialize" + subject: "bridge:initialize" , data: { shouldWatchStatus: true } @@ -76,7 +76,7 @@ export default new class StatusManager */ private onBridgePortMessage (message: Message) { switch (message.subject) { - case "main:/serviceUp": { + case "main:serviceUp": { const { data: receiver } = message; this.receivers.set(receiver.id, receiver); @@ -87,7 +87,7 @@ export default new class StatusManager break; } - case "main:/serviceDown": { + case "main:serviceDown": { const { data: { id }} = message; if (this.receivers.has(id)) { @@ -101,7 +101,7 @@ export default new class StatusManager break; } - case "main:/receiverStatus": { + case "main:receiverStatus": { const { data: { id, status }} = message; const receiver = this.receivers.get(id); diff --git a/ext/src/background/receiverSelector/NativeReceiverSelector.ts b/ext/src/background/receiverSelector/NativeReceiverSelector.ts index 7c14c59..c63e9dc 100644 --- a/ext/src/background/receiverSelector/NativeReceiverSelector.ts +++ b/ext/src/background/receiverSelector/NativeReceiverSelector.ts @@ -57,7 +57,7 @@ export default class NativeReceiverSelector extends ReceiverSelector { "receiverSelectorCloseIfFocusLost"); this.bridgePort.postMessage({ - subject: "bridge:/receiverSelector/open" + subject: "bridge:receiverSelector/open" , data: JSON.stringify({ receivers , defaultMediaType @@ -93,7 +93,7 @@ export default class NativeReceiverSelector extends ReceiverSelector { public close (): void { if (this.bridgePort) { this.bridgePort.postMessage({ - subject: "bridge:/receiverSelector/close" + subject: "bridge:receiverSelector/close" }); } @@ -102,7 +102,7 @@ export default class NativeReceiverSelector extends ReceiverSelector { private async onBridgePortMessage (message: Message) { switch (message.subject) { - case "main:/receiverSelector/selected": { + case "main:receiverSelector/selected": { this.wasReceiverSelected = true; this.dispatchEvent(new CustomEvent("selected", { detail: message.data @@ -114,12 +114,12 @@ export default class NativeReceiverSelector extends ReceiverSelector { break; } - case "main:/receiverSelector/error": { + case "main:receiverSelector/error": { logger.error("Native receiver selector error", message.data); this.dispatchEvent(new CustomEvent("error")); break; } - case "main:/receiverSelector/close": { + case "main:receiverSelector/close": { if (!this.wasReceiverSelected) { this.dispatchEvent(new CustomEvent("cancelled")); } @@ -134,7 +134,7 @@ export default class NativeReceiverSelector extends ReceiverSelector { break; } - case "main:/receiverSelector/stop": { + case "main:receiverSelector/stop": { this.dispatchEvent(new CustomEvent("stop", { detail: message.data })); diff --git a/ext/src/background/receiverSelector/PopupReceiverSelector.ts b/ext/src/background/receiverSelector/PopupReceiverSelector.ts index 199921f..0167754 100644 --- a/ext/src/background/receiverSelector/PopupReceiverSelector.ts +++ b/ext/src/background/receiverSelector/PopupReceiverSelector.ts @@ -118,7 +118,7 @@ export default class PopupReceiverSelector extends ReceiverSelector { public update (receivers: Receiver[]) { this.receivers = receivers; this.messagePort?.postMessage({ - subject: "popup:/update" + subject: "popup:update" , data: { receivers: this.receivers } @@ -162,12 +162,12 @@ export default class PopupReceiverSelector extends ReceiverSelector { } this.messagePort.postMessage({ - subject: "popup:/init" + subject: "popup:init" , data: { appId: this.appId } }); this.messagePort.postMessage({ - subject: "popup:/update" + subject: "popup:update" , data: { receivers: this.receivers , defaultMediaType: this.defaultMediaType @@ -183,7 +183,7 @@ export default class PopupReceiverSelector extends ReceiverSelector { */ private onPopupMessage (message: Message) { switch (message.subject) { - case "receiverSelector:/selected": { + case "receiverSelector:selected": { this.wasReceiverSelected = true; this.dispatchEvent(new CustomEvent("selected", { detail: message.data @@ -192,7 +192,7 @@ export default class PopupReceiverSelector extends ReceiverSelector { break; } - case "receiverSelector:/stop": { + case "receiverSelector:stop": { this.dispatchEvent(new CustomEvent("stop", { detail: message.data })); diff --git a/ext/src/lib/bridge.ts b/ext/src/lib/bridge.ts index 8facb32..f7c988a 100644 --- a/ext/src/lib/bridge.ts +++ b/ext/src/lib/bridge.ts @@ -65,7 +65,7 @@ const getInfo = () => new Promise(async (resolve, reject) => { applicationVersion = await nativeMessaging.sendNativeMessage( applicationName - , { subject: "bridge:/getInfo" + , { subject: "bridge:getInfo" , data: version }); } catch (err) { logger.error("Bridge connection failed."); diff --git a/ext/src/lib/loadSender.ts b/ext/src/lib/loadSender.ts index 94c11ee..edff7c5 100644 --- a/ext/src/lib/loadSender.ts +++ b/ext/src/lib/loadSender.ts @@ -39,7 +39,7 @@ export default async function loadSender (opts: LoadSenderOptions) { } shim.contentPort.postMessage({ - subject: "shim:/launchApp" + subject: "shim:launchApp" , data: { receiver: opts.selection.receiver } }); diff --git a/ext/src/lib/nativeMessaging.ts b/ext/src/lib/nativeMessaging.ts index 4a4c094..a32013e 100644 --- a/ext/src/lib/nativeMessaging.ts +++ b/ext/src/lib/nativeMessaging.ts @@ -3,10 +3,12 @@ import logger from "./logger"; import options from "./options"; +import { Message } from "../messaging"; + type DisconnectListener = (port: browser.runtime.Port) => void; -type MessageListener = (message: any) => void; +type MessageListener = (message: Message) => void; function connectNative (application: string) { /** @@ -165,7 +167,7 @@ function connectNative (application: string) { async function sendNativeMessage ( application: string - , message: any) { + , message: Message) { try { return await browser.runtime.sendNativeMessage(application, message); diff --git a/ext/src/messaging.ts b/ext/src/messaging.ts index ba96d27..28855f6 100644 --- a/ext/src/messaging.ts +++ b/ext/src/messaging.ts @@ -13,102 +13,114 @@ import Volume from "./shim/cast/classes/Volume"; import { MediaInfo } from "./shim/cast/media"; +/** + * Messages are JSON objects with a `subject` string key and a + * generic `data` key. + * + * Message subjects may include an optional destination and response + * name formatted like this: + * ^(destination:)?messageName(\/responseName)?$ + * + * Message formats are specified with subject as a key and data as the + * value in the message table. + */ + type MessagesBase = { - "popup:/init": { appId?: string } - , "popup:/update": { + "popup:init": { appId?: string } + , "popup:update": { receivers: Receiver[] , defaultMediaType?: ReceiverSelectorMediaType , availableMediaTypes?: ReceiverSelectorMediaType } - , "popup:/close": {} + , "popup:close": {} - , "receiverSelector:/selected": ReceiverSelection - , "receiverSelector:/stop": ReceiverSelection + , "receiverSelector:selected": ReceiverSelection + , "receiverSelector:stop": ReceiverSelection - , "main:/shimReady": { appId: string } + , "main:shimReady": { appId: string } , "main:selectReceiver": {} , "shim:selectReceiver/selected": ReceiverSelectionCast , "shim:selectReceiver/stopped": ReceiverSelectionStop , "shim:selectReceiver/cancelled": {} - , "main:/sessionCreated": {} + , "main:sessionCreated": {} - , "shim:/serviceUp": { id: Receiver["id"] } - , "shim:/serviceDown": { id: Receiver["id"] } + , "shim:serviceUp": { id: Receiver["id"] } + , "shim:serviceDown": { id: Receiver["id"] } - , "shim:/initialized": BridgeInfo - , "shim:/launchApp": { receiver: Receiver } + , "shim:initialized": BridgeInfo + , "shim:launchApp": { receiver: Receiver } // Session messages - , "shim:/session/stopped": {} - , "shim:/session/connected": { + , "shim:session/stopped": {} + , "shim:session/connected": { sessionId: string , namespaces: Array<{ name: string }> , displayName: string , statusText: string } - , "shim:/session/updateStatus": { volume: Volume } - , "shim:/session/impl_addMessageListener": { + , "shim:session/updateStatus": { volume: Volume } + , "shim:session/impl_addMessageListener": { namespace: string , data: string } - , "shim:/session/impl_sendMessage": { + , "shim:session/impl_sendMessage": { messageId: string , error: boolean } - , "shim:/session/impl_setReceiverMuted": { + , "shim:session/impl_setReceiverMuted": { volumeId: string , error: boolean } - , "shim:/session/impl_setReceiverVolumeLevel": { + , "shim:session/impl_setReceiverVolumeLevel": { volumeId: string , error: boolean } - , "shim:/session/impl_stop": { + , "shim:session/impl_stop": { stopId: string , error: boolean } // Bridge session messages - , "bridge:/session/initialize": { + , "bridge:session/initialize": { address: string , port: number , appId: string , sessionId: string , _id: string } - , "bridge:/session/impl_leave": { + , "bridge:session/impl_leave": { id: string , _id: string } - , "bridge:/session/impl_sendMessage": { + , "bridge:session/impl_sendMessage": { namespace: string , message: any , messageId: string , _id: string } - , "bridge:/session/impl_setReceiverMuted": { + , "bridge:session/impl_setReceiverMuted": { muted: boolean , volumeId: string , _id: string } - , "bridge:/session/impl_setReceiverVolumeLevel": { + , "bridge:session/impl_setReceiverVolumeLevel": { newLevel: number , volumeId: string , _id: string } - , "bridge:/session/impl_stop": { + , "bridge:session/impl_stop": { stopId: string; _id: string; } - , "bridge:/session/impl_addMessageListener": { + , "bridge:session/impl_addMessageListener": { namespace: string; _id: string; } // Media messages - , "shim:/media/update": { + , "shim:media/update": { currentTime: number , _lastCurrentTime: number , customData: any @@ -120,53 +132,54 @@ type MessagesBase = { , media: MediaInfo , mediaSessionId: number } - , "shim:/media/sendMediaMessageResponse": { + , "shim:media/sendMediaMessageResponse": { messageId: string , error: boolean } // Bridge media messages - , "bridge:/media/initialize": { + , "bridge:media/initialize": { sessionId: string , mediaSessionId: number , _internalSessionId: string , _id: string } - , "bridge:/media/sendMediaMessage": { + , "bridge:media/sendMediaMessage": { message: any , messageId: string , _id: string } // Bridge messages - , "main:/receiverSelector/selected": ReceiverSelectionCast - , "main:/receiverSelector/error": string - , "main:/receiverSelector/close": {} - , "main:/receiverSelector/stop": ReceiverSelectionStop + , "main:receiverSelector/selected": ReceiverSelectionCast + , "main:receiverSelector/error": string + , "main:receiverSelector/close": {} + , "main:receiverSelector/stop": ReceiverSelectionStop - , "bridge:/initialize": { shouldWatchStatus: boolean } + , "bridge:getInfo": string + , "bridge:initialize": { shouldWatchStatus: boolean } - , "bridge:/receiverSelector/open": any - , "bridge:/receiverSelector/close": {} + , "bridge:receiverSelector/open": any + , "bridge:receiverSelector/close": {} - , "bridge:/stopReceiverApp": { receiver: Receiver } + , "bridge:stopReceiverApp": { receiver: Receiver } - , "bridge:/mediaServer/start": { + , "bridge:mediaServer/start": { filePath: string , port: number } - , "mediaCast:/mediaServer/started": { + , "mediaCast:mediaServer/started": { mediaPath: string , subtitlePaths: string[] , localAddress: string } - , "mediaCast:/mediaServer/stopped": {} - , "mediaCast:/mediaServer/error": {} + , "mediaCast:mediaServer/stopped": {} + , "mediaCast:mediaServer/error": {} - , "main:/serviceUp": Receiver - , "main:/serviceDown": { id: string } + , "main:serviceUp": Receiver + , "main:serviceDown": { id: string } - , "main:/receiverStatus": { + , "main:receiverStatus": { id: string , status: ReceiverStatus } diff --git a/ext/src/senders/media/index.ts b/ext/src/senders/media/index.ts index 0ab094f..166ea62 100644 --- a/ext/src/senders/media/index.ts +++ b/ext/src/senders/media/index.ts @@ -15,7 +15,7 @@ function startMediaServer (filePath: string, port: number) return new Promise((resolve, reject) => { backgroundPort.postMessage({ - subject: "bridge:/mediaServer/start" + subject: "bridge:mediaServer/start" , data: { filePath: decodeURI(filePath) , port @@ -25,16 +25,16 @@ function startMediaServer (filePath: string, port: number) backgroundPort.addEventListener("message", function onMessage (ev) { const message = ev.data as Message; - if (message.subject.startsWith("mediaCast:/mediaServer/")) { + if (message.subject.startsWith("mediaCast:mediaServer/")) { backgroundPort.removeEventListener("message", onMessage); } switch (message.subject) { - case "mediaCast:/mediaServer/started": { + case "mediaCast:mediaServer/started": { resolve(message.data); break; } - case "mediaCast:/mediaServer/error": { + case "mediaCast:mediaServer/error": { reject(); break; } @@ -376,7 +376,7 @@ export async function init (opts: InitOptions) { window.addEventListener("beforeunload", async () => { backgroundPort.postMessage({ - subject: "bridge:/mediaServer/stop" + subject: "bridge:mediaServer/stop" }); if (await options.get("mediaStopOnUnload")) { diff --git a/ext/src/shim/cast/classes/Session.ts b/ext/src/shim/cast/classes/Session.ts index 8b7ec04..4fb8438 100755 --- a/ext/src/shim/cast/classes/Session.ts +++ b/ext/src/shim/cast/classes/Session.ts @@ -55,7 +55,7 @@ export default class Session { } switch (message.subject) { - case "shim:/session/stopped": { + case "shim:session/stopped": { // Disconnect from extension messages this.#listener.disconnect(); @@ -68,7 +68,7 @@ export default class Session { break; } - case "shim:/session/connected": { + case "shim:session/connected": { this.status = SessionStatus.CONNECTED; this.sessionId = message.data.sessionId; this.transportId = message.data.sessionId; @@ -83,7 +83,7 @@ export default class Session { break; } - case "shim:/session/updateStatus": { + case "shim:session/updateStatus": { const volume: Volume = message.data.volume; if (volume) { @@ -110,7 +110,7 @@ export default class Session { } - case "shim:/session/impl_addMessageListener": { + case "shim:session/impl_addMessageListener": { const { namespace, data } = message.data; const messageListeners = this.#messageListeners.get(namespace); @@ -123,7 +123,7 @@ export default class Session { break; } - case "shim:/session/impl_sendMessage": { + case "shim:session/impl_sendMessage": { const { messageId, error } = message.data; const [ successCallback, errorCallback ] = this.#sendMessageCallbacks.get(messageId) ?? []; @@ -139,7 +139,7 @@ export default class Session { break; } - case "shim:/session/impl_setReceiverMuted": { + case "shim:session/impl_setReceiverMuted": { const { volumeId, error } = message.data; const [ successCallback, errorCallback ] = this.#setReceiverMutedCallbacks.get(volumeId) ?? []; @@ -155,7 +155,7 @@ export default class Session { break; } - case "shim:/session/impl_setReceiverVolumeLevel": { + case "shim:session/impl_setReceiverVolumeLevel": { const { volumeId, error } = message.data; const [ successCallback, errorCallback ] = this.#setReceiverVolumeLevelCallbacks @@ -172,7 +172,7 @@ export default class Session { break; } - case "shim:/session/impl_stop": { + case "shim:session/impl_stop": { const { stopId, error } = message.data; const [ successCallback, errorCallback ] = this.#stopCallbacks.get(stopId) ?? []; @@ -227,7 +227,7 @@ export default class Session { if (receiver) { sendMessageResponse({ - subject: "bridge:/session/initialize" + subject: "bridge:session/initialize" , data: { address: (receiver as any)._address , port: (receiver as any)._port @@ -255,7 +255,7 @@ export default class Session { this.#messageListeners.get(namespace)?.add(listener); sendMessageResponse({ - subject: "bridge:/session/impl_addMessageListener" + subject: "bridge:session/impl_addMessageListener" , data: { namespace , _id: this.#id @@ -274,7 +274,7 @@ export default class Session { const id = uuid(); sendMessageResponse({ - subject: "bridge:/session/impl_leave" + subject: "bridge:session/impl_leave" , data: { id , _id: this.#id @@ -380,7 +380,7 @@ export default class Session { const messageId = uuid(); sendMessageResponse({ - subject: "bridge:/session/impl_sendMessage" + subject: "bridge:session/impl_sendMessage" , data: { namespace , message @@ -403,7 +403,7 @@ export default class Session { const volumeId = uuid(); sendMessageResponse({ - subject: "bridge:/session/impl_setReceiverMuted" + subject: "bridge:session/impl_setReceiverMuted" , data: { muted , volumeId @@ -425,7 +425,7 @@ export default class Session { const volumeId = uuid(); sendMessageResponse({ - subject: "bridge:/session/impl_setReceiverVolumeLevel" + subject: "bridge:session/impl_setReceiverVolumeLevel" , data: { newLevel , volumeId @@ -446,7 +446,7 @@ export default class Session { const stopId = uuid(); sendMessageResponse({ - subject: "bridge:/session/impl_stop" + subject: "bridge:session/impl_stop" , data: { stopId , _id: this.#id diff --git a/ext/src/shim/cast/index.ts b/ext/src/shim/cast/index.ts index 2a84953..cec8699 100755 --- a/ext/src/shim/cast/index.ts +++ b/ext/src/shim/cast/index.ts @@ -102,7 +102,7 @@ export function initialize ( apiConfig = newApiConfig; sendMessageResponse({ - subject: "main:/shimReady" + subject: "main:shimReady" , data: { appId: apiConfig.sessionRequest.appId } }); @@ -227,7 +227,7 @@ export function _requestSession ( , selectedReceiver // receiver , (session: Session) => { sendMessageResponse({ - subject: "main:/sessionCreated" + subject: "main:sessionCreated" }); sessionRequestInProgress = false; @@ -277,7 +277,7 @@ export function unescape (escaped: string): string { onMessage(async message => { switch (message.subject) { - case "shim:/initialized": { + case "shim:initialized": { isAvailable = true; break; } @@ -286,7 +286,7 @@ onMessage(async message => { * Cast destination found (serviceUp). Set the API availability * property and call the page event function (__onGCastApiAvailable). */ - case "shim:/serviceUp": { + case "shim:serviceUp": { const receiver = message.data; if (receiverList.find(r => r.id === receiver.id)) { @@ -307,7 +307,7 @@ onMessage(async message => { * Cast destination lost (serviceDown). Remove from the receiver list * and update availability state. */ - case "shim:/serviceDown": { + case "shim:serviceDown": { const receiverIndex = receiverList.findIndex( receiver => receiver.id === message.data.id); @@ -352,7 +352,7 @@ onMessage(async message => { , selectedReceiver // receiver , (session: Session) => { sendMessageResponse({ - subject: "main:/sessionCreated" + subject: "main:sessionCreated" }); sessionRequestInProgress = false; @@ -412,7 +412,7 @@ onMessage(async message => { break; } - case "shim:/launchApp": { + case "shim:launchApp": { const receiver: Receiver = message.data.receiver; _requestSession(receiver , session => { diff --git a/ext/src/shim/cast/media/classes/Media.ts b/ext/src/shim/cast/media/classes/Media.ts index ae956ea..558e800 100644 --- a/ext/src/shim/cast/media/classes/Media.ts +++ b/ext/src/shim/cast/media/classes/Media.ts @@ -50,7 +50,7 @@ export default class Media { } switch (message.subject) { - case "shim:/media/update": { + case "shim:media/update": { const status = message.data; this.currentTime = status.currentTime; @@ -81,7 +81,7 @@ export default class Media { break; } - case "shim:/media/sendMediaMessageResponse": { + case "shim:media/sendMediaMessageResponse": { const { messageId, error } = message.data; const [ successCallback, errorCallback ] = this.#sendMediaMessageCallbacks @@ -125,7 +125,7 @@ export default class Media { , _internalSessionId: string) { sendMessageResponse({ - subject: "bridge:/media/initialize" + subject: "bridge:media/initialize" , data: { sessionId , mediaSessionId @@ -344,7 +344,7 @@ export default class Media { ]); sendMessageResponse({ - subject: "bridge:/media/sendMediaMessage" + subject: "bridge:media/sendMediaMessage" , data: { message , messageId diff --git a/ext/src/shim/export.ts b/ext/src/shim/export.ts index 714ac5c..4450944 100644 --- a/ext/src/shim/export.ts +++ b/ext/src/shim/export.ts @@ -89,7 +89,7 @@ export function ensureInit (): Promise { function handleIncomingMessageToShim (message: Message) { switch (message.subject) { - case "shim:/initialized": { + case "shim:initialized": { initializedBridgeInfo = message.data; if (initializedBridgeInfo.isVersionCompatible) { diff --git a/ext/src/shim/index.ts b/ext/src/shim/index.ts index 9f628cb..762447e 100755 --- a/ext/src/shim/index.ts +++ b/ext/src/shim/index.ts @@ -67,7 +67,7 @@ if (document.currentScript) { onMessage(message => { switch (message.subject) { - case "shim:/initialized": { + case "shim:initialized": { bridgeInfo = message.data; if (!isFramework) { diff --git a/ext/src/ui/popup/index.tsx b/ext/src/ui/popup/index.tsx index c09c225..d15fa72 100755 --- a/ext/src/ui/popup/index.tsx +++ b/ext/src/ui/popup/index.tsx @@ -73,7 +73,7 @@ class PopupApp extends Component<{}, PopupAppState> { this.port.onMessage.addListener((message: Message) => { switch (message.subject) { - case "popup:/init": { + case "popup:init": { this.setState({ requestedAppId: message.data?.appId }); @@ -81,7 +81,7 @@ class PopupApp extends Component<{}, PopupAppState> { break; } - case "popup:/update": { + case "popup:update": { const { receivers , availableMediaTypes , defaultMediaType } = message.data; @@ -100,7 +100,7 @@ class PopupApp extends Component<{}, PopupAppState> { break; } - case "popup:/close": { + case "popup:close": { window.close(); break; } @@ -217,7 +217,7 @@ class PopupApp extends Component<{}, PopupAppState> { }); this.port?.postMessage({ - subject: "receiverSelector:/selected" + subject: "receiverSelector:selected" , data: { receiver , mediaType: this.state.mediaType @@ -228,7 +228,7 @@ class PopupApp extends Component<{}, PopupAppState> { private onStop (receiver: Receiver) { this.port?.postMessage({ - subject: "receiverSelector:/stop" + subject: "receiverSelector:stop" , data: { receiver } }); }