mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-11 10:09:59 +00:00
Add friendlier app CLI
This commit is contained in:
11
app/package-lock.json
generated
11
app/package-lock.json
generated
@@ -187,6 +187,12 @@
|
|||||||
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
|
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/dedent": {
|
||||||
|
"version": "0.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/dedent/-/dedent-0.7.0.tgz",
|
||||||
|
"integrity": "sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/long": {
|
"@types/long": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
|
||||||
@@ -464,6 +470,11 @@
|
|||||||
"assert-plus": "^1.0.0"
|
"assert-plus": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dedent": {
|
||||||
|
"version": "0.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
|
||||||
|
"integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
|
||||||
|
},
|
||||||
"deep-is": {
|
"deep-is": {
|
||||||
"version": "0.1.3",
|
"version": "0.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
"bplist-creator": "0.0.8",
|
"bplist-creator": "0.0.8",
|
||||||
"bplist-parser": "^0.2.0",
|
"bplist-parser": "^0.2.0",
|
||||||
"castv2": "^0.1.10",
|
"castv2": "^0.1.10",
|
||||||
|
"dedent": "^0.7.0",
|
||||||
"fast-srp-hap": "^2.0.2",
|
"fast-srp-hap": "^2.0.2",
|
||||||
"mdns": "^2.5.1",
|
"mdns": "^2.5.1",
|
||||||
"mime-types": "^2.1.27",
|
"mime-types": "^2.1.27",
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
"tweetnacl": "^1.0.3"
|
"tweetnacl": "^1.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/dedent": "^0.7.0",
|
||||||
"@types/mdns": "0.0.33",
|
"@types/mdns": "0.0.33",
|
||||||
"@types/mime-types": "^2.1.0",
|
"@types/mime-types": "^2.1.0",
|
||||||
"@types/node": "^13.13.5",
|
"@types/node": "^13.13.5",
|
||||||
|
|||||||
@@ -10,53 +10,52 @@ import { DecodeTransform
|
|||||||
, EncodeTransform } from "../transforms";
|
, EncodeTransform } from "../transforms";
|
||||||
|
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2), {
|
export function init (port: number) {
|
||||||
string: [ "port" ]
|
process.stdout.write("Starting WebSocket server... ");
|
||||||
, default: {
|
|
||||||
port: "9556"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const port = parseInt(argv.port);
|
const wss = new WebSocket.Server({ port }, () => {
|
||||||
if (!port || port < 1025 || port > 65535) {
|
console.log("Done!");
|
||||||
console.error("Invalid port specified!");
|
});
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const wss = new WebSocket.Server({ port });
|
wss.on("error", (err) => {
|
||||||
|
console.log("Failed!");
|
||||||
wss.on("connection", socket => {
|
console.error(err);
|
||||||
// Stream for incoming WebSocket messages
|
|
||||||
const messageStream = new Readable({ objectMode: true });
|
|
||||||
messageStream._read = () => {};
|
|
||||||
|
|
||||||
socket.on("message", (message: string) => {
|
|
||||||
messageStream.push(JSON.parse(message));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
wss.on("connection", socket => {
|
||||||
* Daemon and bridge are the same binary, so spawn a new
|
// Stream for incoming WebSocket messages
|
||||||
* version of self in bridge mode.
|
const messageStream = new Readable({ objectMode: true });
|
||||||
*/
|
messageStream._read = () => {};
|
||||||
const bridge = spawn(process.execPath, [ process.argv[1] ]);
|
|
||||||
|
|
||||||
// socket -> bridge.stdin
|
socket.on("message", (message: string) => {
|
||||||
messageStream
|
messageStream.push(JSON.parse(message));
|
||||||
.pipe(new EncodeTransform())
|
|
||||||
.pipe(bridge.stdin);
|
|
||||||
|
|
||||||
// bridge.stdout -> socket
|
|
||||||
bridge.stdout
|
|
||||||
.pipe(new DecodeTransform())
|
|
||||||
.on("data", data => {
|
|
||||||
// Socket can be CLOSING here
|
|
||||||
if (socket.readyState === WebSocket.OPEN) {
|
|
||||||
socket.send(JSON.stringify(data));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Handle termination
|
|
||||||
socket.on("close", () => bridge.kill());
|
/**
|
||||||
bridge.on("exit", () => socket.close());
|
* Daemon and bridge are the same binary, so spawn a new
|
||||||
});
|
* version of self in bridge mode.
|
||||||
|
*/
|
||||||
|
const bridge = spawn(process.execPath, [ process.argv[1] ]);
|
||||||
|
|
||||||
|
// socket -> bridge.stdin
|
||||||
|
messageStream
|
||||||
|
.pipe(new EncodeTransform())
|
||||||
|
.pipe(bridge.stdin);
|
||||||
|
|
||||||
|
// bridge.stdout -> socket
|
||||||
|
bridge.stdout
|
||||||
|
.pipe(new DecodeTransform())
|
||||||
|
.on("data", data => {
|
||||||
|
// Socket can be CLOSING here
|
||||||
|
if (socket.readyState === WebSocket.OPEN) {
|
||||||
|
socket.send(JSON.stringify(data));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle termination
|
||||||
|
socket.on("close", () => bridge.kill());
|
||||||
|
bridge.on("exit", () => socket.close());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,18 +1,53 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
import meta from "../package.json";
|
||||||
|
|
||||||
|
import dedent from "dedent";
|
||||||
import minimist from "minimist";
|
import minimist from "minimist";
|
||||||
|
|
||||||
|
import * as daemon from "./daemon";
|
||||||
|
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2), {
|
const argv = minimist(process.argv.slice(2), {
|
||||||
boolean: [ "daemon" ]
|
boolean: [ "daemon", "help", "version" ]
|
||||||
|
, string: [ "port" ]
|
||||||
|
, alias: {
|
||||||
|
d: "daemon"
|
||||||
|
, h: "help"
|
||||||
|
, v: "version"
|
||||||
|
, p: "port"
|
||||||
|
}
|
||||||
, default: {
|
, default: {
|
||||||
daemon: false
|
daemon: false
|
||||||
|
, port: "9556"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
if (argv.daemon) {
|
if (argv.version) {
|
||||||
import("./daemon");
|
console.log(meta.__applicationVersion);
|
||||||
|
} else if (argv.help) {
|
||||||
|
console.log(dedent`
|
||||||
|
Usage: ${meta.__applicationExecutableName} [options]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Print usage info
|
||||||
|
-v, --version Print version info
|
||||||
|
-d, --daemon Launch in daemon mode. This starts a WebSocket server that
|
||||||
|
the extension can be configured to connect to under bridge
|
||||||
|
options.
|
||||||
|
-p, --port Set port number for WebSocket server. This must match the
|
||||||
|
port set in the extension options.
|
||||||
|
|
||||||
|
`);
|
||||||
|
} else if (argv.daemon) {
|
||||||
|
const port = parseInt(argv.port);
|
||||||
|
if (!port || port < 1025 || port > 65535) {
|
||||||
|
console.error("Invalid port specified!");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
daemon.init(port);
|
||||||
} else {
|
} else {
|
||||||
import("./bridge");
|
import("./bridge");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user