From ad3644491840707907c3006edac3a27898b6f6a5 Mon Sep 17 00:00:00 2001 From: MCHost Date: Fri, 29 Mar 2024 02:02:21 -0400 Subject: [PATCH] first commit --- README.txt | 24 ++++++++++++++++++++++++ client.js | 12 ++++++++++++ package.json | 40 ++++++++++++++++++++++++++++++++++++++++ relay.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ server.js | 7 +++++++ 5 files changed, 128 insertions(+) create mode 100644 README.txt create mode 100644 client.js create mode 100644 package.json create mode 100644 relay.js create mode 100644 server.js diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..9ed37e6 --- /dev/null +++ b/README.txt @@ -0,0 +1,24 @@ +Origin Master Repo: https://github.com/lanmower/hyper-relay + +HyperMC utilizes this server within its infrastructure to serve HTTP based traffic to our Hyper Proxy Service. + +This package relays tcp listeners over hyperswarm, using the createServer/connect noise encrypted channel. + +The cli tools are symetric topics, but one can +easily spawn a client programatically that uses +a public key instead of a topic, to make your +relayed process publicly available. + +# Installation +npm install --save hyper-relay -g + +## TCP Relay + +### remotely +### relay from a hyper-relay client to a local server +hyper-tcp-relay-server + +### locally +### relay from a local server to a hyper-relay server +hyper-tcp-relay-client + diff --git a/client.js b/client.js new file mode 100644 index 0000000..c3dfe02 --- /dev/null +++ b/client.js @@ -0,0 +1,12 @@ +#!/usr/bin/env node + +const crypto = require('hypercore-crypto') +if(process.argv.length == 4) { + const key = process.argv[process.argv.length-1]; + const port = parseInt(process.argv[process.argv.length-2]); + const tunnel = require('./relay.js')() + const keyPair = crypto.keyPair(crypto.data(Buffer.from(key))); + const pubKey = keyPair.publicKey; + tunnel.client(pubKey,port); +} else console.log("usage: hyper-relay-client "); + diff --git a/package.json b/package.json new file mode 100644 index 0000000..3194784 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "name": "hyper-relay", + "version": "0.2.40", + "description": "TCP relay for hyperswarm (tunnel)", + "main": "main.js", + "scripts": { + "start": "node socks.js 1080 glitch" + }, + "dependencies": { + "@hyperswarm/dht": "latest", + "hi-base32": "^0.5.1", + "hypercore-crypto": "^3.4.0", + "pump": "^3.0.0", + "ssh2": "^1.5.0" + }, + "bin": { + "hyper-tcp-relay-server": "server.js", + "hyper-tcp-relay-client": "client.js" + }, + "bugs": { + "url": "https://github.com/lanmower/hyper-relay/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "engines": { + "node": "12.x" + }, + "homepage": "https://github.com/lanmower/hyper-relay#readme", + "keywords": [ + "node", + "hyperswarm", + "tunnel", + "tcp", + "relay" + ], + "license": "MIT", + "repository": { + "url": "git+https://github.com/lanmower/hyper-relay.git" + } +} diff --git a/relay.js b/relay.js new file mode 100644 index 0000000..39ce9c5 --- /dev/null +++ b/relay.js @@ -0,0 +1,45 @@ +const DHT = require("@hyperswarm/dht"); +const net = require("net"); +const pump = require("pump"); +const node = new DHT({}); +module.exports = () => { + return { + serve: (keyPair, host, port) => { + const server = node.createServer(); + server.on("connection", function (servsock) { + const socket = net.connect(port, host); + socket.on('serve error', console.error); + let open = { servsock: true, remote: true }; + servsock.on('data', (d) => { socket.write(d) }); + socket.on('data', (d) => { servsock.write(d) }); + + const remoteend = () => { + if (open.remote) socket.end(); + open.remote = false; + } + const servsockend = () => { + if (open.servsock) servsock.end(); + open.servsock = false; + } + servsock.on('error', remoteend) + servsock.on('finish', remoteend) + servsock.on('end', remoteend) + socket.on('finish', servsockend) + socket.on('error', servsockend) + socket.on('end', servsockend) + }); + server.listen(keyPair); + return keyPair.publicKey; + }, + client: (hexPublicKey, port) => { + const publicKey = Buffer.from(hexPublicKey, 'hex'); + const server = net.createServer(function (local) { + const socket = node.connect(publicKey); + socket.on('client error', console.error); + pump(local, socket, local); + }); + server.listen(port, "127.0.0.1"); + return publicKey; + } + }; +}; diff --git a/server.js b/server.js new file mode 100644 index 0000000..2e33cf4 --- /dev/null +++ b/server.js @@ -0,0 +1,7 @@ +const crypto = require("hypercore-crypto"); +const node = require('./relay.js')(); +const b32 = require("hi-base32"); +const key = crypto.keyPair(crypto.data(Buffer.from(process.argv[3]))); +const port = process.argv[2] || 80; +console.log(b32.encode(key.publicKey).replace('====', '').toLowerCase()) +node.serve(key, "localhost", port)