@mikkel-ol/tunnelmole
Version:
Tunnelmole, an open source ngrok alternative. Instant public URLs for any http/https based application. Available as a command line application or as an NPM dependency for your code. Stable and maintained. Good test coverage. Works behind firewalls
64 lines (54 loc) • 2.24 kB
text/typescript
import HostnameAssignedMessage from "../messages/hostname-assigned-message.js";
import HostipWebSocket from "../websocket/host-ip-websocket.js";
import { Options } from "../options.js";
import { eventHandler, URL_ASSIGNED } from "../events/event-handler.js";
import chalk from "chalk";
import { getConnectionInfo } from "../websocket/connection-info-service.js";
export default async function hostnameAssigned(
message: HostnameAssignedMessage,
websocket: HostipWebSocket,
options: Options
) {
const port = options.port;
if (typeof port === "undefined") {
console.error('Please specify a port e.g. run "tmole 80"');
}
const httpsUrl = `https://${message.hostname}`;
const httpUrl = `http://${message.hostname}`;
const destinationUrl = `http://localhost:${port}`;
const encodedHttpsUrl = Buffer.from(httpsUrl).toString("base64");
const isCli = getConnectionInfo().isCli;
if (isCli) {
eventHandler.emit(URL_ASSIGNED, httpsUrl);
return;
}
if (process.env.TUNNELMOLE_QUIET_MODE !== "1") {
console.info("=".repeat(process.stdout.columns));
console.info(
"Your Tunnelmole Public URLs are below and are accessible internet wide. Always use HTTPs for the best security"
);
console.info("");
console.info(
`${chalk.greenBright.bold(httpsUrl)} ⟶ ${chalk.bold(destinationUrl)}`
);
console.info(
`${chalk.greenBright.bold(httpUrl)} ⟶ ${chalk.bold(destinationUrl)}`
);
console.info("=".repeat(process.stdout.columns));
}
console.info(chalk.bold("\nShare your creation with the world!"));
printSharingNetwork("Reddit", "reddit", encodedHttpsUrl);
printSharingNetwork("Hacker News", "hackernews", encodedHttpsUrl);
printSharingNetwork("BlueSky", "bluesky", encodedHttpsUrl);
printSharingNetwork("X (Twitter)", "twitter", encodedHttpsUrl);
printSharingNetwork("LinkedIn", "linkedin", encodedHttpsUrl);
eventHandler.emit(URL_ASSIGNED, httpsUrl);
}
const printSharingNetwork = (
displayNetworkName: string,
network: string,
encodedHttpsUrl: string
) => {
const shareUrl = `https://dashboard.tunnelmole.com/share/${network}/${encodedHttpsUrl}`;
console.info(`${displayNetworkName}: ${chalk.greenBright.bold(shareUrl)}`);
};