aboutsummaryrefslogtreecommitdiff
path: root/src/js_bridge.js
blob: f6a158b432bc96251be5e2a57b7aac6c7c2d1bfa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
var s = document.createElement('script');
s.setAttribute('src','https://unpkg.com/peerjs@1.5.5/dist/peerjs.min.js');
document.body.appendChild(s);
function genRanHex(size) {
	return Array.apply(null,Array(size)).map(function(){
		return Math.floor(Math.random() * 16).toString(16);
	}).join('');
	
}
window.PEER = {
	event_queue: [],
	peers: {},
	peer_message_queue: [],
	connection_message_queue: [],
	creation_queue: [],
	connections: {},
	to_connect: [], // Sometimes we have to wait a tick before the connection is ready.
	create: function(_) {
		var peer = new Peer({
			//"host": "cogarr.net",
			//"path": "/stun/",
			//"secure": true,
			//"debug": 3
		});
		peer.on("open", function(){
			console.log("[JS] Open called on peer");
			PEER.peers[peer.id] = peer;
			PEER.creation_queue.push(peer.id);
		});
		peer.on("error", function(msg){
			//console.log("[JS ERROR] " + msg);
			PEER.connection_message_queue.push({"message":msg, "data": {
				"call": "create",
				"e": "error",
				"message": msg
			}});
		});
	},
	delete_peer: function(tbl) {
		var name = tbl.name;
		//console.log("[JS] Deleting peer " + name);
		delete PEER.peers[name];
	},
	on: function(tbl) {
		var name = tbl.name;
		var e = tbl.e;
		var message = tbl.message;
		//console.log("[JS] Setting hook for " + name + "," + e + "," + message);
		PEER.peers[name].on(e, function(data) {
			//console.log("[JS] Peer " + name + " received " + e);
			if(e == "connection"){
				// Store the server-side DataConnection under directional key [server, client]
				PEER.connections[[name,data.peer]] = data;
				//console.log("[JS] Peer.connections is now");
				//console.log(PEER.connections);
				// Rewrite for Lua so net.rewrite_events can build a Hub-side Connection
				data = [name,data.peer]; // [server, client]
			}else{
				//console.log("[JS] Not connection:" + e + ":" + data);
			}
			PEER.peer_message_queue.push({"message":message, "data":{
				"call": "on",
				"peer": name,
				"e": e,
				"data": data
			}});
			//console.log("[JS] Message queue is now");
			//console.log(PEER.peer_message_queue);
		});
	},
	connect: function(tbl) {
		var source = tbl.source;
		var dest = tbl.dest;
		//console.log("[JS] connecting " + source + " to " + dest);
		var conn = PEER.peers[source].connect(dest);
		// Store client-side DataConnection under directional key [client, hub]
		PEER.connections[[source,dest]] = conn;
		// Send a hello to always establish a connection
		//console.log("[JS] sending hello");// doesn't seem to show up in the output, but its needed so we don't drop the first message.
		conn.send("Hello");
		//console.log("[JS] Connect called, PEER.connections is");
		//console.log(PEER.connections);
		return [source,dest];
	},
	disconnect: function(tbl) {
		PEER.peers[tbl.name].disconnect();
	},
	reconnect: function(tbl){
		PEER.peers[tbl.name].reconnect();
	},
	destroy: function(tbl){
		PEER.peers[tbl.name].destroy();
	},
	send: function(tbl){
		var source = tbl.source;
		var dest = tbl.dest;
		var data = tbl.data;
		var key = [source,dest];
		//console.log("[JS] sending " + data + " over " + key);
		//console.log(PEER.connections[key]);
		//console.log(data);
		PEER.connections[key].send(data);
	},
	close: function(tbl){
		var name = tbl.name;
		var id = tbl.id;
		PEER.connections[[name,id]].close();
	},
	conn_on: function(tbl){
		var source = tbl.source;
		var dest = tbl.dest;
		var e = tbl.e;
		var message = tbl.message;
		//console.log("[JS] Setting hook for [" + source + "," + dest + "] " + e + "," + message);
		//console.log(PEER.connections[[source,dest]]);
		//console.log(PEER.connections);
		PEER.connections[[source,dest]].on(e, function(c) {
			//console.log("[JS] connection between " + dest + " and " + source + " received " + e);
			PEER.connection_message_queue.push({"message":message, "data":{
				"call": "on",
				"peer": source,
				"dest": dest,
				"e": e,
				"data": c
			}});
		});
	},
	conn_field: function(tbl){
		var name = tbl.name;
		var id = tbl.id;
		var field = tbl.field;
		return PEER.connections[[name,id]][field];
	}
};