Browse Source

fix up exmaples

pull/48/head
Jeff Becker 7 years ago
parent
commit
028a5590ae
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05
  1. 17
      websocks-demo/Makefile
  2. 12
      websocks-demo/bittorrent-client.html
  3. 23
      websocks-demo/bittorrent.js
  4. 12
      websocks-demo/index.html
  5. 14
      websocks-demo/irc-client.html
  6. 292
      websocks-demo/irc-client.js
  7. 15
      websocks-demo/readme.md
  8. 7478
      websocks-demo/websocks-bt.js
  9. 5828
      websocks-demo/websocks-irc.js
  10. 358
      websocks-demo/websocks.js

17
websocks-demo/Makefile

@ -0,0 +1,17 @@
WEBSOCKS_SRC = websocks.js
BT_OUT = websocks-bt.js
BT_SRC = bittorrent.js
IRC_OUT = websocks-irc.js
IRC_SRC = irc-client.js
all: $(BT_OUT) $(IRC_OUT)
$(IRC_OUT):
browserify $(WEBSOCKS_SRC) $(IRC_SRC) -o $(IRC_OUT)
$(BT_OUT):
browserify $(WEBSOCKS_SRC) $(BT_SRC) -o $(BT_OUT)
clean:
rm -f $(BT_OUT) $(IRC_OUT)

12
websocks-demo/bittorrent-client.html

@ -0,0 +1,12 @@
<!doctype html>
<html>
<head>
<title> bittorrent over i2p with WebSOCKS </title>
<script src="websocks-bt.js" type="text/javascript"></script>
<link rel="stylesheet" href="style.css"></link>
</head>
<body>
<label for="ws-server">WebSOCKS server:</label><input id="ws-server" value="ws://127.0.0.1:7766/"></input>
<label for="torrent-file">Torrent File:</label><input type="file" id="torrent-file" />
<button onclick="start_downloading()">start</button>
</html>

23
websocks-demo/bittorrent.js

@ -0,0 +1,23 @@
var Protocol = require('bittorrent-protocol');
var stream = require('stream');
var WebSocks = require("./websocks.js").WebSocks;
function start_torrent(torrent_file_blob)
{
var torrent = new WebsocksTorrent();
var elem = document.getElementById("ws-server");
torrent.start(elem.value);
torrent.addTorrent(torrent_file_blob);
}
function start_downloading()
{
var elem = document.getElementById("torrent-file");
var files = elem.files;
for (var f of files) {
if(f.slice) {
start_torrent(f.slice());
}
}
}

12
websocks-demo/index.html

@ -1,14 +1,10 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<title> irc client with WebSOCKS </title> <title> websocks demos </title>
<script src="websocks.js" type="text/javascript"></script>
<link rel="stylesheet" href="style.css"></link>
</head> </head>
<body> <body>
<label for="ws-server">WebSOCKS server:</label><input id="ws-server" value="ws://127.0.0.1:7766/"></input> <a href="irc-client.html">irc client demo</a>
<input id="irc-server" value="irc.dg.i2p"></input> <a href="bittorrent-client.html">bittorrent client demo</a>
<button onclick="ws_try_connect()">connect</button> </body>
<div id="irc-window">
</div>
</html> </html>

14
websocks-demo/irc-client.html

@ -0,0 +1,14 @@
<!doctype html>
<html>
<head>
<title> irc client with WebSOCKS </title>
<link rel="stylesheet" href="style.css"></link>
</head>
<body>
<label for="ws-server">WebSOCKS server:</label><input id="ws-server" value="ws://127.0.0.1:7766/"></input>
<input id="irc-server" value="irc.dg.i2p"></input>
<button id="connect">connect</button>
<div id="irc-window">
</div>
<script src="websocks-irc.js" type="text/javascript"></script>
</html>

292
websocks-demo/irc-client.js

@ -0,0 +1,292 @@
var WebSocks = require("./websocks.js").WebSocks;
function ws_try_connect()
{
var elem = document.getElementById("irc-window");
elem.remove();
elem = document.createElement("div");
elem.id ="irc-window";
document.body.appendChild(elem);
var input = document.createElement("input");
input.setAttribute("class", "text-input");
elem.appendChild(input);
var irc = {
connected: 0,
line_in: "",
target: "",
nick: "ebin",
panes: {}
};
function irc_ui_show_pane(pane)
{
irc_ui_ensure_pane(pane);
// hide all other panes
for (var k in irc.panes) {
if(k == pane) {
irc.panes[k].elem.style = "display: inline-block";
irc.target = k;
} else {
irc.panes[k].elem.style = "display: none";
}
}
}
function irc_ui_ensure_pane(pane)
{
if(irc.panes[pane]) return;
var e = document.createElement("pre");
e.setAttribute("class", "text-window");
e.style = "display: none";
e.setAttribute("panename", pane);
irc.panes[pane] = {
elem: e,
name: pane
};
var root = document.getElementById("irc-window");
root.appendChild(e);
}
function irc_ui_println(line, pane)
{
if(line == "") return;
var node = document.createTextNode(line);
var e = document.createElement("div");
e.appendChild(node);
if(!pane) {
pane = " ";
}
irc_ui_ensure_pane(pane);
var p = irc.panes[pane];
if(p) {
p.elem.appendChild(e);
if (pane == irc.target) {
window.scroll(0, p.elem.offsetTop + p.elem.offsetHeight);
}
} else {
console.log("No pane called "+pane);
}
}
function irc_on_privmsg(src, target, msg)
{
var parts = src.split("!");
src = parts[0].slice(1);
irc_ui_println("<"+src+ "> "+msg, target);
}
function irc_on_greeted(conn)
{
irc_ui_println("successfully joined irc");
}
function irc_on_join(src, target)
{
irc_ui_println("--> "+src, target);
}
function irc_on_part(src, target)
{
irc_ui_println("<-- "+src, target);
}
function irc_on_other(src, cmd, target, msg)
{
irc_ui_println("<"+src+"> "+msg, src);
}
function irc_process_in(conn)
{
var line = irc.line_in.trim();
console.log("--> "+line);
if(line.startsWith("PING ")) {
// handle ping
irc_sendline(conn, "PONG "+line.slice(5));
return;
}
var parts = line.split(" ");
if (parts.length > 2) {
var src = parts[0];
var cmd = parts[1];
var target = parts[2];
var idx = line.indexOf(target);
var msg = line.slice(idx+target.length+2);
if (cmd == "PRIVMSG") {
irc_on_privmsg(src, target, msg);
return;
}
if (cmd == "JOIN" ) {
irc_on_join(src, target);
return;
}
if (cmd == "PART") {
irc_on_part(src, target);
return;
}
if(cmd == "PONG") return;
if(cmd == "376") {
// we have been greeted fully
irc_on_greeted(conn);
return;
}
if (cmd == "433") {
irc.nick = irc.nick + "_";
irc_sendline(conn, "NICK "+irc.nick);
irc_sendline(conn, "USER "+irc.nick+" "+irc.nick+" "+irc.nick+" :"+irc.nick);
}
irc_on_other(src.slice(1), cmd, target, msg);
}
irc_ui_println(line);
}
function irc_data(conn, data)
{
data = irc.line_in + data;
var lines = data.split("\n");
for(var idx = 0; idx < lines.length; idx++) {
irc.line_in = lines [idx] + "\n";
irc_process_in(conn);
}
}
function irc_sendline(conn, line)
{
console.log("<-- "+ line);
conn.write(line + "\n");
}
function irc_privmsg(conn, target, msg)
{
irc_ui_println("<"+irc.nick+"> "+msg, target);
irc_sendline(conn, "PRIVMSG "+target+" :"+msg);
}
function irc_join_channel(conn, chnl)
{
irc_sendline(conn, "JOIN "+chnl);
irc_ui_ensure_pane(chnl);
}
function handle_input_command(conn, arg, params)
{
arg = arg.toLowerCase();
if (arg == "j" || arg == "join") {
for (var idx = 0 ; idx < params.length; idx ++) {
irc_join_channel(conn, params[idx]);
}
return;
}
if(arg == "lp" || arg == "listpanes") {
irc_ui_println("--- begin list of panes", irc.target);
for (var k in irc.panes) {
if(k == irc.target) {
irc_ui_println("(active) : "+k, irc.target);
} else {
irc_ui_println(" : "+k, irc.target);
}
}
irc_ui_println("--- end list of panes", irc.target);
return;
}
if(arg == "m" || arg == "msg") {
irc_privmsg(conn, params[0], params.slice(1).join(" "));
return;
}
if(arg == "n" || arg == "nick") {
irc_sendline(conn, "NICK "+params[0]);
irc.nick = params[0];
return;
}
if(arg == "r" || arg == "raw") {
irc_sendline(conn, params.join(" "));
return;
}
if(arg == "q" || arg == "quit") {
irc_sendline(conn, "QUIT");
return;
}
if(arg == "w" || arg == "window") {
irc.target = params[0];
irc_ui_show_pane(irc.target);
return;
}
}
function handle_input_line(conn, line)
{
if(line[0] == "/") {
var parts = line.split(" ");
handle_input_command(conn, parts[0].slice(1), parts.slice(1));
} else {
irc_privmsg(conn, irc.target, line);
}
};
function irc_connected(conn, url)
{
irc.connected = 1;
console.log("connected to irc");
irc_ui_println("connecting to "+url+"...");
// send user command
irc_sendline(conn, "NICK "+irc.nick);
irc_sendline(conn, "USER "+irc.nick+" "+irc.nick+" "+irc.nick+" :"+irc.nick);
irc.pinger = setInterval(function(){
if(irc.connected) {
irc_sendline(conn, "PING :i-hate-tcp-lol-"+new Date().getTime());
}
}, 10000);
input.addEventListener("keypress", function(ev){
// handle enter key
switch(ev.key) {
case "Enter":
handle_input_line(conn, input.value);
ev.preventDefault();
input.value = "";
}
return;
});
}
var e = document.getElementById("ws-server");
var wsurl = e.value;
e = document.getElementById("irc-server");
var irc_url = e.value;
var parts = irc_url.split(":");
var host = parts[0];
var port = 6667;
if(parts.length != 1) {
port = parts[1];
}
irc_ui_show_pane(" ");
var sock = new WebSocks(wsurl);
sock.connect(host, port, function(err, writer, reader) {
if(err) {
console.log(err);
} else {
irc_connected(writer);
reader.on("data", function(data) {
irc_data(writer, data);
});
}
});
};
document.getElementById("connect").onclick = function() {
console.log("try connect");
ws_try_connect();
};

15
websocks-demo/readme.md

@ -0,0 +1,15 @@
# demos
## dependencies
* browserify
* GNU Make
* i2pd with websockets enabled
* websocks tunnel
## usage:
make
python3 -m http.server 3000
then go [here](http://127.0.0.1:3000/)

7478
websocks-demo/websocks-bt.js

File diff suppressed because it is too large Load Diff

5828
websocks-demo/websocks-irc.js

File diff suppressed because it is too large Load Diff

358
websocks-demo/websocks.js

@ -1,293 +1,137 @@
var stream = require('stream');
function ws_try_connect()
{
var elem = document.getElementById("irc-window");
elem.remove();
elem = document.createElement("div");
elem.id ="irc-window";
document.body.appendChild(elem);
var input = document.createElement("input");
input.setAttribute("class", "text-input");
elem.appendChild(input);
function WebSocks(wsurl)
{
this._wsurl = wsurl;
this._ws = null;
this._ouraddr = null;
this._remoteAddr = null;
this._recvbuffer = stream.PassThrough();
this._sendbuffer = stream.PassThrough();
}
var irc = { WebSocks.prototype.createListener = function(callback) {
connected: 0, var self = this;
line_in: "", self._doAccept(function(err) {
target: "", if(err) callback(err, null);
nick: "ebin", else {
panes: {}, callback(null, self._sendbuffer, self._recvbuffer);
};
function irc_ui_show_pane(pane)
{
irc_ui_ensure_pane(pane);
// hide all other panes
for (var k in irc.panes) {
if(k == pane) {
irc.panes[k].elem.style = "display: inline-block";
irc.target = k;
} else {
irc.panes[k].elem.style = "display: none";
}
}
} }
}, function(data) {
self._recvbuffer.write(data);
});
};
function irc_ui_ensure_pane(pane) WebSocks.prototype._doAccept = function(accept_cb, recv_cb) {
var self = this;
self._socket(function (err, data) {
if(!self._remoteAddr)
{ {
if(irc.panes[pane]) return; if(!data)
var e = document.createElement("pre");
e.setAttribute("class", "text-window");
e.style = "display: none";
e.setAttribute("panename", pane);
irc.panes[pane] = {
elem: e,
name: pane,
};
var root = document.getElementById("irc-window");
root.appendChild(e);
}
function irc_ui_println(line, pane)
{ {
if(line == "") return; // send handshake
var node = document.createTextNode(line); self._ws.send("accept");
var e = document.createElement("div");
e.appendChild(node);
if(!pane) {
pane = " ";
}
irc_ui_ensure_pane(pane);
var p = irc.panes[pane];
if(p) {
p.elem.appendChild(e);
if (pane == irc.target) {
window.scroll(0, p.elem.offsetTop + p.elem.offsetHeight);
} }
} else { else
console.log("No pane called "+pane); {
// this means handshake read
var j = JSON.parse(data);
if(j.error) {
connect_cb(j.error);
} else if(j.success){
self._remoteAddr = host;
connect_cb(null);
} }
// repeat
setTimeout(function() {
self._doAccept(connect_cb);
}, 10);
} }
function irc_on_privmsg(src, target, msg)
{
var parts = src.split("!");
src = parts[0].slice(1);
irc_ui_println("<"+src+ "> "+msg, target);
} }
else
function irc_on_greeted(conn)
{ {
irc_ui_println("successfully joined irc"); recv_cb(err, data);
} }
});
};
function irc_on_join(src, target) WebSocks.prototype._closed = function()
{ {
irc_ui_println("--> "+src, target); var self = this;
} self._recvbuffer.close();
self._sendbuffer.close();
self._ws.close();
};
function irc_on_part(src, target) WebSocks.prototype.connect = function(host, port, connect_cb) {
var self = this;
self._socket(function (err, data) {
if(!self._remoteAddr)
{ {
irc_ui_println("<-- "+src, target); if(!data)
}
function irc_on_other(src, cmd, target, msg)
{ {
irc_ui_println("<"+src+"> "+msg, src); // send handshake
self._ws.send("connect "+host+":"+port);
} }
else
function irc_process_in(conn)
{ {
var line = irc.line_in.trim(); // this means handshake read
console.log("--> "+line); var j = JSON.parse(data);
if(line.startsWith("PING ")) { if(j.error) {
// handle ping connect_cb(j.error, null, null);
irc_sendline(conn, "PONG "+line.slice(5)); } else if(j.success){
return; self._remoteAddr = host;
} connect_cb(null, self._sendbuffer, self._recvbuffer);
var parts = line.split(" "); } else {
if (parts.length > 2) { connect_cb("failed to connect", null, null);
var src = parts[0];
var cmd = parts[1];
var target = parts[2];
var idx = line.indexOf(target);
var msg = line.slice(idx+target.length+2);
if (cmd == "PRIVMSG") {
irc_on_privmsg(src, target, msg);
return;
}
if (cmd == "JOIN" ) {
irc_on_join(src, target);
return;
}
if (cmd == "PART") {
irc_on_part(src, target);
return;
}
if(cmd == "PONG") return;
if(cmd == "376") {
// we have been greeted fully
irc_on_greeted(conn);
return;
}
irc_on_other(src.slice(1), cmd, target, msg);
}
irc_ui_println(line);
} }
function irc_data(conn, data)
{
data = irc.line_in + data;
var lines = data.split("\n");
for(var idx = 0; idx < lines.length; idx++) {
irc.line_in = lines [idx] + "\n";
irc_process_in(conn);
} }
} }
else
function irc_sendline(conn, line)
{ {
console.log("<-- "+ line); self._recvbuffer.write(data);
conn.send(line + "\n");
} }
});
};
function irc_privmsg(conn, target, msg) WebSocks.prototype._socket = function(cb) {
{ var self = this;
irc_ui_println("<"+irc.nick+"> "+msg, target); self._ws = new WebSocket(self._wsurl);
irc_sendline(conn, "PRIVMSG "+target+" :"+msg); self._ws.onclose = function(ev) {
} self._closed();
};
function irc_join_channel(conn, chnl) self._ws.onopen = function(ev) {
{ console.log("connected to websocks");
irc_sendline(conn, "JOIN "+chnl); self._ws.send("getaddr");
irc_ui_ensure_pane(chnl); };
}
function handle_input_command(conn, arg, params) self._ws.onmessage = function(ev) {
if(!self._ouraddr)
{ {
arg = arg.toLowerCase(); var j = JSON.parse(ev.data);
if (arg == "j" || arg == "join") { if(j.error) {
for (var idx = 0 ; idx < params.length; idx ++) { console.log("connect error: "+j.error);
irc_join_channel(conn, params[idx]); cb(j.error, null);
}
return; return;
} }
if(j.success && j.destination) {
if(arg == "lp" || arg == "listpanes") { self._ouraddr = j.destination;
irc_ui_println("--- begin list of panes", irc.target);
for (var k in irc.panes) {
if(k == irc.target) {
irc_ui_println("(active) : "+k, irc.target);
} else { } else {
irc_ui_println(" : "+k, irc.target); cb("failed to connect", null);
}
}
irc_ui_println("--- end list of panes", irc.target);
return;
}
if(arg == "m" || arg == "msg") {
irc_privmsg(conn, params[0], params.slice(1).join(" "));
return;
}
if(arg == "n" || arg == "nick") {
irc_sendline(conn, "NICK "+params[0]);
irc.nick = params[0];
return;
}
if(arg == "r" || arg == "raw") {
irc_sendline(conn, params.join(" "));
return; return;
} }
if(arg == "q" || arg == "quit") { self._sendbuffer.on("data", function(data) {
irc_sendline(conn, "QUIT"); self._ws.send(data);
return;
}
if(arg == "w" || arg == "window") {
irc.target = params[0];
irc_ui_show_pane(irc.target);
return;
}
}
function handle_input_line(conn, line)
{
if(line[0] == "/") {
var parts = line.split(" ");
handle_input_command(conn, parts[0].slice(1), parts.slice(1));
} else {
irc_privmsg(conn, irc.target, line);
}
}
function irc_connected(conn, url)
{
console.log("connected to irc");
irc_ui_show_pane(" ");
irc_ui_println("connecting to "+url+"...");
// send user command
irc_sendline(conn, "NICK "+irc.nick);
irc_sendline(conn, "USER "+irc.nick+" "+irc.nick+" "+irc.nick+" :"+irc.nick);
irc.pinger = setInterval(function(){
if(irc.connected) {
irc_sendline(conn, "PING :i-hate-tcp-lol-"+new Date().getTime());
}
}, 10000);
input.addEventListener("keypress", function(ev){
// handle enter key
switch(ev.key) {
case "Enter":
handle_input_line(conn, input.value);
ev.preventDefault();
input.value = "";
}
return;
}); });
cb(null, null);
} }
else
cb(null, ev.data);
};
};
var e = document.getElementById("ws-server"); module.exports = {
var ws = new WebSocket(e.value); "WebSocks": WebSocks,
e = document.getElementById("irc-server"); };
var irc_url = e.value;
ws.onclose = function(err) {
console.log("connection closed "+err);
irc.connected = 0;
clearInterval(irc.pinger);
irc_ui_println("connection closed");
}
ws.onopen = function(ev) {
console.log("connect to "+irc_url);
irc_ui_println("resolving "+irc_url+" ...");
ws.send(irc_url);
}
ws.onmessage = function(ev) {
var data = ev.data;
if(irc.connected) {
irc_data(ws, data);
} else {
var j = JSON.parse(data);
if(j.error) {
console.log("WebSOCKS error: "+j.error);
console.log("try again");
setTimeout(function() {
ws.send(irc_url);
}, 1000);
}
irc.connected = j.success == "1";
if(irc.connected) {
irc_connected(ws, irc_url);
}
}
}
}

Loading…
Cancel
Save