diff --git a/app/src/bridge/index.ts b/app/src/bridge/index.ts index fdee836..3a62240 100755 --- a/app/src/bridge/index.ts +++ b/app/src/bridge/index.ts @@ -26,18 +26,6 @@ import { __applicationName events.EventEmitter.defaultMaxListeners = 50; -const browser = new dnssd.Browser(dnssd.tcp("googlecast")); - -// Local media server -let mediaServer: http.Server; - -process.on("SIGTERM", () => { - if (mediaServer && mediaServer.listening) { - mediaServer.close(); - } -}); - - const decodeTransform = new DecodeTransform(); const encodeTransform = new EncodeTransform(); @@ -46,6 +34,10 @@ process.stdin.pipe(decodeTransform); decodeTransform.on("data", handleMessage); encodeTransform.pipe(process.stdout); +decodeTransform.on("error", err => { + console.error("Failed to decode message", err); +}); + /** * Encode and send a message to the extension. If message is * a string, send that as the message subject, else send a @@ -70,12 +62,33 @@ interface InitializeOptions { shouldWatchStatus?: boolean; } + +let receiverSelectorApp: child_process.ChildProcess; +let receiverSelectorAppClosed = true; + +// Local media server +let mediaServer: http.Server; + +let browser: dnssd.Browser; + + // Existing counterpart Media/Session objects const existingSessions: Map = new Map(); const existingMedia: Map = new Map(); -let receiverSelectorApp: child_process.ChildProcess; -let receiverSelectorAppClosed = true; + +process.on("SIGTERM", () => { + if (mediaServer && mediaServer.listening) { + mediaServer.close(); + } + + if (receiverSelectorApp && !receiverSelectorAppClosed) { + receiverSelectorApp.kill() + } + + browser.stop(); +}); + /** * Handle incoming messages from the extension and forward @@ -86,7 +99,12 @@ let receiverSelectorAppClosed = true; */ async function handleMessage (message: Message) { if (message.subject.startsWith("bridge:/media/")) { - const mediaId = message._id!; + if (!message._id) { + console.error("Media message missing _id"); + return; + } + + const mediaId = message._id; if (existingMedia.has(mediaId)) { // Forward message to instance message handler @@ -111,7 +129,12 @@ async function handleMessage (message: Message) { } if (message.subject.startsWith("bridge:/session/")) { - const sessionId = message._id!; + if (!message._id) { + console.error("Session message missing _id"); + return; + } + + const sessionId = message._id; if (existingSessions.has(sessionId)) { // Forward message to instance message handler @@ -175,6 +198,11 @@ function handleReceiverSelectorMessage (message: Message) { } } + // Kill existing process if it exists + if (receiverSelectorApp && !receiverSelectorAppClosed) { + receiverSelectorApp.kill(); + } + receiverSelectorApp = child_process.spawn( path.join(process.cwd(), "selector") , [ receiverSelectorData ]); @@ -290,6 +318,11 @@ function handleMediaServerMessage (message: Message) { function initialize (options: InitializeOptions) { + browser = new dnssd.Browser(dnssd.tcp("googlecast")); + browser.on("error", err => { + console.error("Discovery failed", err); + }); + if (options.shouldWatchStatus) { browser.on("serviceUp", onStatusBrowserServiceUp); browser.on("serviceDown", onStatusBrowserServiceDown);