From 19aaa8f27d5cd613f075c0b48e730cd8096f4317 Mon Sep 17 00:00:00 2001 From: hensm Date: Wed, 12 Aug 2020 00:41:12 +0100 Subject: [PATCH] Add friendlier app CLI --- app/package-lock.json | 11 ++++++ app/package.json | 2 + app/src/daemon/index.ts | 83 ++++++++++++++++++++--------------------- app/src/main.ts | 41 ++++++++++++++++++-- 4 files changed, 92 insertions(+), 45 deletions(-) diff --git a/app/package-lock.json b/app/package-lock.json index 446f22c..d5fe03e 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -187,6 +187,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "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": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", @@ -464,6 +470,11 @@ "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": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", diff --git a/app/package.json b/app/package.json index 7a6b056..cc60c6e 100644 --- a/app/package.json +++ b/app/package.json @@ -14,6 +14,7 @@ "bplist-creator": "0.0.8", "bplist-parser": "^0.2.0", "castv2": "^0.1.10", + "dedent": "^0.7.0", "fast-srp-hap": "^2.0.2", "mdns": "^2.5.1", "mime-types": "^2.1.27", @@ -21,6 +22,7 @@ "tweetnacl": "^1.0.3" }, "devDependencies": { + "@types/dedent": "^0.7.0", "@types/mdns": "0.0.33", "@types/mime-types": "^2.1.0", "@types/node": "^13.13.5", diff --git a/app/src/daemon/index.ts b/app/src/daemon/index.ts index 53a7479..f1233e6 100644 --- a/app/src/daemon/index.ts +++ b/app/src/daemon/index.ts @@ -10,53 +10,52 @@ import { DecodeTransform , EncodeTransform } from "../transforms"; -const argv = minimist(process.argv.slice(2), { - string: [ "port" ] - , default: { - port: "9556" - } -}); +export function init (port: number) { + process.stdout.write("Starting WebSocket server... "); -const port = parseInt(argv.port); -if (!port || port < 1025 || port > 65535) { - console.error("Invalid port specified!"); - process.exit(1); -} + const wss = new WebSocket.Server({ port }, () => { + console.log("Done!"); + }); -const wss = new WebSocket.Server({ port }); - -wss.on("connection", socket => { - // 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("error", (err) => { + console.log("Failed!"); + console.error(err); }); - /** - * 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] ]); + wss.on("connection", socket => { + // Stream for incoming WebSocket messages + const messageStream = new Readable({ objectMode: true }); + messageStream._read = () => {}; - // 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)); - } + socket.on("message", (message: string) => { + messageStream.push(JSON.parse(message)); }); - // 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()); + }); +} diff --git a/app/src/main.ts b/app/src/main.ts index a3e4484..cae5c16 100644 --- a/app/src/main.ts +++ b/app/src/main.ts @@ -1,18 +1,53 @@ "use strict"; +import meta from "../package.json"; + +import dedent from "dedent"; import minimist from "minimist"; +import * as daemon from "./daemon"; + 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: { daemon: false + , port: "9556" } }); -if (argv.daemon) { - import("./daemon"); +if (argv.version) { + 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 { import("./bridge"); }