From d4246371915c60260355e44560918a5b2b367f2a Mon Sep 17 00:00:00 2001 From: hensm Date: Sun, 25 Apr 2021 02:49:22 +0100 Subject: [PATCH] Cleanup additional messages and add messagr types to MessagePort --- app/src/bridge/index.ts | 8 +-- app/src/bridge/messaging.ts | 17 +++--- .../NativeReceiverSelector.ts | 4 +- ext/src/lib/TypedMessagePort.ts | 6 ++ ext/src/lib/TypedPort.ts | 58 +++++-------------- ext/src/lib/nativeMessaging.ts | 17 +++--- ext/src/messaging.ts | 17 +++--- ext/src/senders/media/index.ts | 8 +-- ext/src/shim/export.ts | 3 +- 9 files changed, 64 insertions(+), 74 deletions(-) create mode 100644 ext/src/lib/TypedMessagePort.ts diff --git a/app/src/bridge/index.ts b/app/src/bridge/index.ts index dc2f778..8801510 100755 --- a/app/src/bridge/index.ts +++ b/app/src/bridge/index.ts @@ -57,20 +57,20 @@ decodeTransform.on("data", (message: Message) => { } // Receiver selector - case "bridge:receiverSelector/open": { + case "bridge:openReceiverSelector": { startReceiverSelector(message.data); break; } - case "bridge:receiverSelector/close": { + case "bridge:closeReceiverSelector": { stopReceiverSelector(); break; } // Media server - case "bridge:mediaServer/start": { + case "bridge:startMediaServer": { const { filePath, port } = message.data; startMediaServer(filePath, port); break; } - case "bridge:mediaServer/stop": { + case "bridge:stopMediaServer": { stopMediaServer(); break; } diff --git a/app/src/bridge/messaging.ts b/app/src/bridge/messaging.ts index a3a49a8..4d901f2 100644 --- a/app/src/bridge/messaging.ts +++ b/app/src/bridge/messaging.ts @@ -124,23 +124,26 @@ type MessageDefinitions = { shouldWatchStatus: boolean } - , "bridge:receiverSelector/open": any - , "bridge:receiverSelector/close": {} + , "bridge:openReceiverSelector": string + , "bridge:closeReceiverSelector": {} , "bridge:stopReceiverApp": { receiver: Receiver } - , "bridge:mediaServer/start": { + + , "bridge:startMediaServer": { filePath: string , port: number } - , "bridge:mediaServer/stop": {} - , "mediaCast:mediaServer/started": { + , "bridge:stopMediaServer": {} + + , "mediaCast:mediaServerStarted": { mediaPath: string , subtitlePaths: string[] , localAddress: string } - , "mediaCast:mediaServer/stopped": {} - , "mediaCast:mediaServer/error": {} + , "mediaCast:mediaServerStopped": {} + , "mediaCast:mediaServerError": {} + , "main:serviceUp": Receiver , "main:serviceDown": { id: string } diff --git a/ext/src/background/receiverSelector/NativeReceiverSelector.ts b/ext/src/background/receiverSelector/NativeReceiverSelector.ts index 4515743..78dfcce 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:openReceiverSelector" , 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:closeReceiverSelector" }); } diff --git a/ext/src/lib/TypedMessagePort.ts b/ext/src/lib/TypedMessagePort.ts new file mode 100644 index 0000000..0d0f0b5 --- /dev/null +++ b/ext/src/lib/TypedMessagePort.ts @@ -0,0 +1,6 @@ +"use strict"; + +export interface TypedMessagePort extends MessagePort { + postMessage(message: T, transfer: Transferable[]): void; + postMessage(message: T, options?: PostMessageOptions): void; +} diff --git a/ext/src/lib/TypedPort.ts b/ext/src/lib/TypedPort.ts index c7ef03c..5b23f3d 100644 --- a/ext/src/lib/TypedPort.ts +++ b/ext/src/lib/TypedPort.ts @@ -1,53 +1,27 @@ "use strict"; -const portMap = new WeakMap, browser.runtime.Port>(); - /** * Allows typed access to a runtime.Port object. */ -export class TypedPort { - public name: string; - public error?: { message: string }; - public sender?: browser.runtime.MessageSender; +export interface TypedPort + extends Omit { - constructor (port: browser.runtime.Port) { - portMap.set(this, port); - this.name = port.name; - - // @ts-ignore - this.error = null; + onDisconnect: { + addListener (cb: (port: TypedPort) => void): void | Promise + , removeListener (cb: (port: TypedPort) => void): void | Promise + , hasListener (cb: (port: TypedPort) => void): boolean + , hasListeners (): boolean } - public disconnect () { - portMap.get(this)?.disconnect(); + , onMessage: { + addListener (cb: (message: T) => void): void | Promise + , removeListener (cb: (message: T) => void): void | Promise + , hasListener (cb: (message: T) => void): boolean + , hasListeners (): boolean } - public onDisconnect = { - addListener: (cb: (port: TypedPort) => void) => { - portMap.get(this)?.onDisconnect.addListener(cb as any); - } - , removeListener: (cb: (port: TypedPort) => void) => { - portMap.get(this)?.onDisconnect.addListener(cb as any); - } - , hasListener: (cb: (port: TypedPort) => void) => { - return portMap.get(this)?.onDisconnect.hasListener(cb as any) - ?? false; - } - }; - - public onMessage = { - addListener: (cb: (message: T) => void) => { - portMap.get(this)?.onMessage.addListener(cb as any); - } - , removeListener: (cb: (message: T) => void) => { - portMap.get(this)?.onMessage.removeListener(cb as any); - } - , hasListener: (cb: (message: T) => void) => { - return portMap.get(this)?.onMessage.hasListener(cb as any) ?? false; - } - }; - - public postMessage (message: T) { - portMap.get(this)?.postMessage(message as any); - } + , postMessage (message: T): void } diff --git a/ext/src/lib/nativeMessaging.ts b/ext/src/lib/nativeMessaging.ts index a32013e..21cc17f 100644 --- a/ext/src/lib/nativeMessaging.ts +++ b/ext/src/lib/nativeMessaging.ts @@ -3,14 +3,14 @@ import logger from "./logger"; import options from "./options"; -import { Message } from "../messaging"; +import { Message, Port } from "../messaging"; -type DisconnectListener = (port: browser.runtime.Port) => void; +type DisconnectListener = (port: Port) => void; type MessageListener = (message: Message) => void; -function connectNative (application: string) { +function connectNative (application: string): Port { /** * In order to preserve the synchronous API, messages are * queued before either the native messaging host or the @@ -34,7 +34,7 @@ function connectNative (application: string) { const onMessageListeners = new Set(); // Port proxy API - const portObject: browser.runtime.Port = { + const portObject: Port = { error: null as any , name: "" @@ -48,6 +48,9 @@ function connectNative (application: string) { , hasListener (cb: DisconnectListener) { return onDisconnectListeners.has(cb); } + , hasListeners () { + return onDisconnectListeners.size > 0; + } } , onMessage: { addListener (cb: MessageListener) { @@ -59,9 +62,9 @@ function connectNative (application: string) { , hasListener (cb: MessageListener) { return onMessageListeners.has(cb); } - - // Workaround for modified types - , hasListeners () { return false; } + , hasListeners () { + return onMessageListeners.size > 0; + } } , disconnect () { diff --git a/ext/src/messaging.ts b/ext/src/messaging.ts index 3af6ec8..880beca 100644 --- a/ext/src/messaging.ts +++ b/ext/src/messaging.ts @@ -181,23 +181,26 @@ type AppMessageDefinitions = { shouldWatchStatus: boolean } - , "bridge:receiverSelector/open": any - , "bridge:receiverSelector/close": {} + , "bridge:openReceiverSelector": string + , "bridge:closeReceiverSelector": {} , "bridge:stopReceiverApp": { receiver: Receiver } - , "bridge:mediaServer/start": { + + , "bridge:startMediaServer": { filePath: string , port: number } - , "bridge:mediaServer/stop": {} - , "mediaCast:mediaServer/started": { + , "bridge:stopMediaServer": {} + + , "mediaCast:mediaServerStarted": { mediaPath: string , subtitlePaths: string[] , localAddress: string } - , "mediaCast:mediaServer/stopped": {} - , "mediaCast:mediaServer/error": {} + , "mediaCast:mediaServerStopped": {} + , "mediaCast:mediaServerError": {} + , "main:serviceUp": Receiver , "main:serviceDown": { id: string } diff --git a/ext/src/senders/media/index.ts b/ext/src/senders/media/index.ts index 166ea62..79672a1 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:startMediaServer" , 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:mediaServerStarted": { resolve(message.data); break; } - case "mediaCast:mediaServer/error": { + case "mediaCast:mediaServerError": { reject(); break; } diff --git a/ext/src/shim/export.ts b/ext/src/shim/export.ts index 4450944..6b33344 100644 --- a/ext/src/shim/export.ts +++ b/ext/src/shim/export.ts @@ -4,6 +4,7 @@ import * as cast from "./cast"; import { Message } from "../messaging"; import { BridgeInfo } from "../lib/bridge"; +import { TypedMessagePort } from "../lib/TypedMessagePort"; import { onMessage , onMessageResponse @@ -20,7 +21,7 @@ let initializedBackgroundPort: MessagePort; * for and emits these messages, and changing that behavior * is too messy. */ -export function ensureInit (): Promise { +export function ensureInit (): Promise> { return new Promise(async (resolve, reject) => { // If already initialized, just return existing bridge info