@thgh/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
76 lines • 3.12 kB
JavaScript
import hostnameAssigned from "./src/message-handlers/hostname-assigned.js";
import forwardedRequest from "./src/message-handlers/forwarded-request.js";
import hostnameAlreadyTaken from "./src/message-handlers/hostname-already-taken.js";
import invalidSubscription from "./src/message-handlers/invalid-subscription.js";
import HostipWebSocket from "./src/websocket/host-ip-websocket.js";
/**
* Websocket message handlers for different message types
* Like app.ts for express, but with handlers for different message types instead of URLs
*/
const messageHandlers = {
hostnameAssigned,
forwardedRequest,
hostnameAlreadyTaken,
invalidSubscription,
WebSocketCloseMessage,
WebSocketOpenMessage,
WebSocketHostMessage,
WebSocketClientMessage,
};
export { messageHandlers };
function WebSocketCloseMessage(message, websocket, options) {
if (!websocket.sockets)
return console.log('WebSocketCloseMessage impossible');
const { socketId, code, data } = message;
const found = websocket.sockets.get(socketId);
if (found.readyState === 1)
found === null || found === void 0 ? void 0 : found.close(code === 1006 ? 1001 : code, data);
}
function WebSocketOpenMessage(forwardedRequestMessage, websocket, options) {
const port = options.port;
const { socketId, url, headers } = forwardedRequestMessage;
delete headers['sec-websocket-key'];
delete headers['sec-websocket-extensions'];
// Create end to end tunnel
if (!websocket.sockets)
websocket.sockets = new Map();
const datatunnel = new HostipWebSocket('ws://127.0.0.1:' + port + url, {
// headers: { cookie: headers.cookie },
});
websocket.sockets.set(socketId, datatunnel);
// Forward messages from client to server
// console.log('WebSocketOpenMessage.ready', datatunnel.readyState)
datatunnel.on('open', () => {
// console.log('WebSocketOpenMessage.open', datatunnel.readyState)
});
datatunnel.on('message', (data) => {
const message = { type: 'WebSocketClientMessage', socketId, data };
websocket.sendMessage(message);
});
datatunnel.on('close', () => {
const close = { type: 'WebSocketCloseMessage', socketId };
websocket.sendMessage(close);
});
datatunnel.on('error', (e) => {
console.log('datatunnel.error', socketId, e);
});
}
async function WebSocketHostMessage(forwardedRequestMessage, websocket, options) {
// console.log('WebSocketHostMessage')
if (!websocket.sockets) {
// console.log('no sockets, wait')
await new Promise((resolve) => setTimeout(resolve, 1000));
}
if (!websocket.sockets)
return; // console.log('bummer')
const { socketId, data } = forwardedRequestMessage;
const datatunnel = websocket.sockets.get(socketId);
// console.log('datatunnel', datatunnel.readyState)
if (!datatunnel)
return; // console.log('no datatunnel')
datatunnel.send(data);
}
function WebSocketClientMessage() {
console.log('WebSocketClientMessage impossible?');
}
//# sourceMappingURL=message-handlers.js.map