From 3407774a1a39ca4859d363a2a6a0b78354b309c0 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Fri, 24 Jun 2022 23:11:49 -0500 Subject: [PATCH] readme --- readme.md | 20 ++++++++++++++++++++ tcplexer.ts | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 readme.md mode change 100644 => 100755 tcplexer.ts diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..51a1497 --- /dev/null +++ b/readme.md @@ -0,0 +1,20 @@ +# tcplexer + +`tcplexer` is a tiny Deno app that receives TCP packets from one socket and +copies those packets' contents to them all connected clients on another socket. + +# Example Usage + +```bash +SOURCE_PORT=7517 CLIENT_PORT=7518 deno run --allow-net --allow-env tcplexer.ts & + +ffmpeg -i 'rtsp://admin:pass@10.0.0.104' -vn \ + -i 'rtsp://admin:pass@10.0.0.222' -vn \ + -ac 1 -filter_complex amerge=inputs=2 \ + -hide_banner -loglevel error -f mp3 - \ + | netcat localhost 7517 + +vlc 'tcp://localhost:7518' +``` + +> TODO: show client with mpv or cvlc or something diff --git a/tcplexer.ts b/tcplexer.ts old mode 100644 new mode 100755 index 2899db5..6d2fb7d --- a/tcplexer.ts +++ b/tcplexer.ts @@ -1,10 +1,21 @@ +#!/usr/bin/env -S deno run --allow-net --allow-env + import { iterateReader } from "https://deno.land/std@0.145.0/streams/conversion.ts"; const clients: Set = new Set(); (async () => { try { - const sourceListener = Deno.listen({ port: 8080 }); + const sourcePort = parseInt(Deno.env.get("SOURCE_PORT") || "") || 0; + const sourceSockOpts = { + port: sourcePort, + }; + + const sourceListener = Deno.listen(sourceSockOpts); + console.info( + "Listening for source connections on port", + (sourceListener.addr as Deno.NetAddr).port, + ); for await (const source of sourceListener) { console.info("Source connected from", source.remoteAddr); for await (const packet of iterateReader(source)) { @@ -18,13 +29,23 @@ const clients: Set = new Set(); console.info(`Source disconnected from`, source.remoteAddr); } } catch (err) { - console.error("Error listening for TCP connections on port 8080:", err); + console.error("Error listening for source TCP connections:", err); + Deno.exit(1); } })(); (async () => { try { - const clientsListener = Deno.listen({ port: 8081 }); + const clientPort = parseInt(Deno.env.get("CLIENT_PORT") || "") || 0; + const clientSockOpts = { + port: clientPort, + }; + + const clientsListener = Deno.listen(clientSockOpts); + console.info( + "Listening for client connections on port", + (clientsListener.addr as Deno.NetAddr).port, + ); while (true) { try { const conn = await clientsListener.accept(); @@ -38,3 +59,16 @@ const clients: Set = new Set(); console.error("Error listening for TCP connections on port 8081:", err); } })(); + +/* stdin +(async () => { + for await (const packet of iterateReader(Deno.stdin)) { + clients.forEach((client, _v2, _set) => + client.write(packet).catch(() => { + console.log(`Client disconnected from`, client.remoteAddr); + clients.delete(client); + }) + ); + } +})(); +*/