123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- "use strict";
-
- // Use separate scope to prevent global scope pollution
- (function () {
- const config = {};
-
- /**
- * Helper function to get server address/hostname from either the commandline or env
- */
- function getServerAddress() {
- /**
- * Get command line parameters
- * Assumes that a cmdline parameter is defined with `--key [value]`
- *
- * @param {string} key key to look for at the command line
- * @param {string} defaultValue value if no key is given at the command line
- * @returns {string} the value of the parameter
- */
- function getCommandLineParameter(key, defaultValue = undefined) {
- const index = process.argv.indexOf(`--${key}`);
- const value = index > -1 ? process.argv[index + 1] : undefined;
- return value !== undefined ? String(value) : defaultValue;
- }
-
- // Prefer command line arguments over environment variables
- ["address", "port"].forEach((key) => {
- config[key] = getCommandLineParameter(key, process.env[key.toUpperCase()]);
- });
-
- // determine if "--use-tls"-flag was provided
- config["tls"] = process.argv.indexOf("--use-tls") > 0;
- }
-
- /**
- * Gets the config from the specified server url
- *
- * @param {string} url location where the server is running.
- * @returns {Promise} the config
- */
- function getServerConfig(url) {
- // Return new pending promise
- return new Promise((resolve, reject) => {
- // Select http or https module, depending on requested url
- const lib = url.startsWith("https") ? require("https") : require("http");
- const request = lib.get(url, (response) => {
- let configData = "";
-
- // Gather incoming data
- response.on("data", function (chunk) {
- configData += chunk;
- });
- // Resolve promise at the end of the HTTP/HTTPS stream
- response.on("end", function () {
- resolve(JSON.parse(configData));
- });
- });
-
- request.on("error", function (error) {
- reject(new Error(`Unable to read config from server (${url} (${error.message}`));
- });
- });
- }
-
- /**
- * Print a message to the console in case of errors
- *
- * @param {string} message error message to print
- * @param {number} code error code for the exit call
- */
- function fail(message, code = 1) {
- if (message !== undefined && typeof message === "string") {
- console.log(message);
- } else {
- console.log("Usage: 'node clientonly --address 192.168.1.10 --port 8080 [--use-tls]'");
- }
- process.exit(code);
- }
-
- getServerAddress();
-
- (config.address && config.port) || fail();
- const prefix = config.tls ? "https://" : "http://";
-
- // Only start the client if a non-local server was provided
- if (["localhost", "127.0.0.1", "::1", "::ffff:127.0.0.1", undefined].indexOf(config.address) === -1) {
- getServerConfig(`${prefix}${config.address}:${config.port}/config/`)
- .then(function (configReturn) {
- // Pass along the server config via an environment variable
- const env = Object.create(process.env);
- const options = { env: env };
- configReturn.address = config.address;
- configReturn.port = config.port;
- configReturn.tls = config.tls;
- env.config = JSON.stringify(configReturn);
-
- // Spawn electron application
- const electron = require("electron");
- const child = require("child_process").spawn(electron, ["js/electron.js"], options);
-
- // Pipe all child process output to current stdout
- child.stdout.on("data", function (buf) {
- process.stdout.write(`Client: ${buf}`);
- });
-
- // Pipe all child process errors to current stderr
- child.stderr.on("data", function (buf) {
- process.stderr.write(`Client: ${buf}`);
- });
-
- child.on("error", function (err) {
- process.stdout.write(`Client: ${err}`);
- });
-
- child.on("close", (code) => {
- if (code !== 0) {
- console.log(`There something wrong. The clientonly is not running code ${code}`);
- }
- });
- })
- .catch(function (reason) {
- fail(`Unable to connect to server: (${reason})`);
- });
- } else {
- fail();
- }
- })();
|