Skip to content

Instantly share code, notes, and snippets.

@mkg20001
Created August 6, 2018 18:54
Show Gist options
  • Save mkg20001/2dbd4e61eec1f1ce2ee2a2b41db9206c to your computer and use it in GitHub Desktop.
Save mkg20001/2dbd4e61eec1f1ce2ee2a2b41db9206c to your computer and use it in GitHub Desktop.
An example of how to use teletunnel to create a protocol matching tunnel server
'use strict'
// load modules
const TCP = require('libp2p-tcp')
const Protocols = require('teletunnel-protocols')
const {sortingHat} = require('teletunnel-core')
const fwAddr = require('forward-addr')
const pull = require('pull-stream')
const multiaddr = require('multiaddr')
// create instances
const tcp = new TCP()
const protocols = Protocols()
// config
const config = {
// WIP: '/tcp/http': '/ip4/127.0.0.1/tcp/80',
'/tcp/ssl/.hostname/*.example.com': '/ip4/127.0.0.1/tcp/443',
'/tcp/ssh': '/ip4/127.0.0.1/tcp/22',
'/tcp/ssl/.hostname/*telebit.cloud/': '/ip4/46.101.97.218/tcp/443',
'/tcp/ssl/.hostname/*.no-ssl.org/stream': '/ip4/127.0.0.1/tcp/80'
}
// helpers
const dial = (addr) => new Promise((resolve, reject) => {
const conn = tcp.dial(addr, err => {
if (err) reject(err)
else resolve(conn)
})
})
// parse
const handlers = Object.keys(config).map(addr => {
let remoteAddr = multiaddr(config[addr])
return {
address: fwAddr.validate(fwAddr.parse(addr), protocols),
handle: async (conn) => {
try {
const remote = await dial(remoteAddr)
pull(conn, remote, conn)
} catch (e) {
console.error(e.stack)
}
}
}
})
// Listen
const server = tcp.createListener(conn => sortingHat(conn, {handlers, protocols}))
server.listen(multiaddr('/ip4/127.0.0.1/tcp/6345'), (err) => {
if (err) throw err
console.log('Ready @ localhost:6345')
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment