Add additional error/lifetime handling to bridge

This commit is contained in:
hensm
2019-09-03 16:22:46 +01:00
parent abc0638e9b
commit c1f34ffeda

View File

@@ -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<string, Session> = new Map();
const existingMedia: Map<string, Media> = 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);