Files
fx_cast/app/src/bridge/components/receiverSelector.ts
2021-04-25 04:26:53 +01:00

89 lines
2.0 KiB
TypeScript

"use strict";
import child_process from "child_process";
import path from "path";
import { sendMessage } from "../lib/messaging";
function fatal (message: string) {
console.error(message);
process.exit(1);
}
let selectorApp: child_process.ChildProcess | undefined;
let selectorAppOpen = false;
export function startReceiverSelector (data: string) {
if (process.platform !== "darwin") {
fatal("Invalid platform for native receiver selector.");
}
if (!data) {
fatal("Missing native selector data");
} else {
try {
JSON.parse(data);
} catch (err) {
fatal("Invalid native selector data.");
}
}
if (selectorApp && selectorAppOpen) {
selectorApp.kill();
selectorAppOpen = false;
}
const selectorPath = path.join(process.cwd()
, "fx_cast_selector.app/Contents/MacOS/fx_cast_selector");
selectorApp = child_process.spawn(selectorPath, [ data ]);
selectorAppOpen = true;
if (selectorApp.stdout) {
selectorApp.stdout.setEncoding("utf-8");
selectorApp.stdout.on("data", data => {
const jsonData = JSON.parse(data);
if (!jsonData.mediaType) {
sendMessage({
subject: "main:receiverSelector/stop"
, data: jsonData
});
return;
}
sendMessage({
subject: "main:receiverSelector/selected"
, data: jsonData
});
});
}
selectorApp.on("error", err => {
sendMessage({
subject: "main:receiverSelector/error"
, data: err.message
});
});
selectorApp.on("close", () => {
if (selectorAppOpen) {
selectorAppOpen = false;
sendMessage({
subject: "main:receiverSelector/close"
});
}
});
}
export function stopReceiverSelector () {
if (!selectorApp?.killed) {
selectorApp?.kill();
selectorAppOpen = false;
}
}