#!/usr/bin/env node /* eslint-disable no-console */ const openurl = require('openurl'); const yargs = require('yargs'); const localtunnel = require('../localtunnel'); const { version } = require('../package'); const { argv } = yargs .usage('Usage: lt --port [num] ') .env(true) .option('p', { alias: 'port', describe: 'Internal HTTP server port', }) .option('h', { alias: 'host', describe: 'Upstream server providing forwarding', default: 'https://localtunnel.me', }) .option('s', { alias: 'subdomain', describe: 'Request this subdomain', }) .option('l', { alias: 'local-host', describe: 'Tunnel traffic to this host instead of localhost, override Host header to this host', }) .option('local-https', { describe: 'Tunnel traffic to a local HTTPS server', }) .option('local-cert', { describe: 'Path to certificate PEM file for local HTTPS server', }) .option('local-key', { describe: 'Path to certificate key file for local HTTPS server', }) .option('local-ca', { describe: 'Path to certificate authority file for self-signed certificates', }) .option('allow-invalid-cert', { describe: 'Disable certificate checks for your local HTTPS server (ignore cert/key/ca options)', }) .options('o', { alias: 'open', describe: 'Opens the tunnel URL in your browser', }) .option('print-requests', { describe: 'Print basic request info', }) .require('port') .boolean('local-https') .boolean('allow-invalid-cert') .boolean('print-requests') .help('help', 'Show this help and exit') .version(version); if (typeof argv.port !== 'number') { yargs.showHelp(); console.error('\nInvalid argument: `port` must be a number'); process.exit(1); } (async () => { const tunnel = await localtunnel({ port: argv.port, host: argv.host, subdomain: argv.subdomain, local_host: argv.localHost, local_https: argv.localHttps, local_cert: argv.localCert, local_key: argv.localKey, local_ca: argv.localCa, allow_invalid_cert: argv.allowInvalidCert, }).catch(err => { throw err; }); tunnel.on('error', err => { throw err; }); console.log('your url is: %s', tunnel.url); /** * `cachedUrl` is set when using a proxy server that support resource caching. * This URL generally remains available after the tunnel itself has closed. * @see https://github.com/localtunnel/localtunnel/pull/319#discussion_r319846289 */ if (tunnel.cachedUrl) { console.log('your cachedUrl is: %s', tunnel.cachedUrl); } if (argv.open) { openurl.open(tunnel.url); } if (argv['print-requests']) { tunnel.on('request', info => { console.log(new Date().toString(), info.method, info.path); }); } })();