hsync 0.21.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +1 -1
- package/connection.js +34 -15
- package/dist/hsync.js +5 -5
- package/dist/hsync.min.js +1 -1
- package/lib/peers.js +29 -5
- package/lib/rtc-node.js +17 -14
- package/lib/rtc-web.js +15 -4
- package/lib/socket-listeners.js +19 -5
- package/lib/socket-relays.js +13 -9
- package/package.json +6 -2
package/lib/peers.js
CHANGED
|
@@ -18,7 +18,6 @@ function createPacket(topic, payload) {
|
|
|
18
18
|
topic,
|
|
19
19
|
payload: payloadStr,
|
|
20
20
|
});
|
|
21
|
-
// console.log('packet', packet);
|
|
22
21
|
return packet;
|
|
23
22
|
}
|
|
24
23
|
|
|
@@ -66,6 +65,8 @@ function initPeers(hsyncClient) {
|
|
|
66
65
|
const myAuth = b64id.generateId();
|
|
67
66
|
const transport = new EventEmitter();
|
|
68
67
|
const peer = rawr({transport, methods: Object.assign({}, hsyncClient.peerMethods), timeout, idGenerator: b64id.generateId});
|
|
68
|
+
debug('createRPCPeer rawr', peer);
|
|
69
|
+
|
|
69
70
|
peer.hostName = hostName;
|
|
70
71
|
peer.rtcEvents = new EventEmitter();
|
|
71
72
|
peer.localMethods = Object.assign({}, hsyncClient.peerMethods);
|
|
@@ -73,12 +74,13 @@ function initPeers(hsyncClient) {
|
|
|
73
74
|
|
|
74
75
|
peer.localMethods.rtcSignal = (peerInfo, signal) => {
|
|
75
76
|
debug('rtcSignal', signal.type);
|
|
76
|
-
if (signal.type === 'offer' && !peer.rtcCon && !signal.alreadySent) {
|
|
77
|
+
if (signal.type === 'offer') { // && !peer.rtcCon && !signal.alreadySent) {
|
|
78
|
+
peer.rtcStatus = 'connecting';
|
|
77
79
|
rtc.answerPeer(peer, signal);
|
|
78
80
|
} else if (signal.type === 'answer') {
|
|
79
81
|
peer.handleRtcAnswer(signal);
|
|
80
82
|
}
|
|
81
|
-
return
|
|
83
|
+
return `rtcSignal ${signal.type} handled ok`;
|
|
82
84
|
}
|
|
83
85
|
|
|
84
86
|
peer.rtcEvents.on('packet', async (packet) => {
|
|
@@ -97,6 +99,13 @@ function initPeers(hsyncClient) {
|
|
|
97
99
|
transport.receiveData(rpcMsg);
|
|
98
100
|
// return;
|
|
99
101
|
// }
|
|
102
|
+
} else if (p1 === 'jsonMsg') {
|
|
103
|
+
try {
|
|
104
|
+
const jsonMsg = JSON.parse(msg.payload.toString());
|
|
105
|
+
peer.rtcEvents.emit('jsonMsg', jsonMsg);
|
|
106
|
+
} catch (e) {
|
|
107
|
+
debug('error parsing jsonMsg', e);
|
|
108
|
+
}
|
|
100
109
|
} else if (p1 === 'socketData') {
|
|
101
110
|
handleSocketPacket(msg);
|
|
102
111
|
} else if (p1 === 'test') {
|
|
@@ -110,7 +119,7 @@ function initPeers(hsyncClient) {
|
|
|
110
119
|
});
|
|
111
120
|
|
|
112
121
|
peer.rtcEvents.on('dcOpen', () => {
|
|
113
|
-
debug('dcOpen');
|
|
122
|
+
debug(peer.answerer ? 'answerer' : 'offerer', 'dcOpen');
|
|
114
123
|
peer.packAndSend = (topic, payload) => {
|
|
115
124
|
const packet = createPacket(topic, payload);
|
|
116
125
|
if (topic === 'test') {
|
|
@@ -154,20 +163,35 @@ function initPeers(hsyncClient) {
|
|
|
154
163
|
|
|
155
164
|
peer.connectRTC = async () => {
|
|
156
165
|
debug('connectRTC');
|
|
166
|
+
peer.rtcStatus = 'connecting';
|
|
167
|
+
peer.rtcEvents.emit('connecting');
|
|
157
168
|
return new Promise(async (resolve, reject) => {
|
|
158
169
|
try {
|
|
159
170
|
const offer = await rtc.offerPeer(peer);
|
|
160
171
|
debug('offer', offer);
|
|
161
172
|
peer.rtcEvents.once('dcOpen', () => {
|
|
162
|
-
|
|
173
|
+
peer.rtcStatus = 'connected';
|
|
174
|
+
debug('offerer dcOpen!');
|
|
163
175
|
resolve(offer);
|
|
164
176
|
});
|
|
165
177
|
} catch (e) {
|
|
166
178
|
debug('error connecting to rtc', e);
|
|
179
|
+
peer.rtcStatus = 'error';
|
|
167
180
|
reject(e);
|
|
168
181
|
}
|
|
169
182
|
});
|
|
170
183
|
};
|
|
184
|
+
|
|
185
|
+
peer.sendJSONMsg = (msg) => {
|
|
186
|
+
if (typeof msg !== 'object') {
|
|
187
|
+
throw new Error('sendJSONMsg requires an object');
|
|
188
|
+
}
|
|
189
|
+
if (!peer.packAndSend) {
|
|
190
|
+
throw new Error('peer not connected');
|
|
191
|
+
}
|
|
192
|
+
const payload = JSON.stringify(msg);
|
|
193
|
+
peer.packAndSend('jsonMsg', payload);
|
|
194
|
+
};
|
|
171
195
|
|
|
172
196
|
transport.send = async (msg) => {
|
|
173
197
|
const fullMsg = {
|
package/lib/rtc-node.js
CHANGED
|
@@ -32,6 +32,12 @@ function offerPeer(peer) {
|
|
|
32
32
|
let gatheringComplete = false;
|
|
33
33
|
let offerSent = false;
|
|
34
34
|
const start = Date.now();
|
|
35
|
+
|
|
36
|
+
peer.handleRtcAnswer = (answer) => {
|
|
37
|
+
debug('node handle RtcAnswer', answer.sdp.length);
|
|
38
|
+
peer.rtcCon.setRemoteDescription(answer.sdp, answer.type);
|
|
39
|
+
return 'node handle RtcAnswer ok';
|
|
40
|
+
}
|
|
35
41
|
|
|
36
42
|
async function sendOffer() {
|
|
37
43
|
const desc = con.localDescription();
|
|
@@ -86,10 +92,6 @@ function offerPeer(peer) {
|
|
|
86
92
|
dc.sendMessageBinary(packet);
|
|
87
93
|
};
|
|
88
94
|
peer.rtcEvents.emit('dcOpen', dc);
|
|
89
|
-
// dc.sendMessage("Hello from node from offerer");
|
|
90
|
-
// peer.dc.onStateChange((state) => {
|
|
91
|
-
// debug('dc state change', state);
|
|
92
|
-
// });
|
|
93
95
|
debug('keys', Object.keys(dc));
|
|
94
96
|
});
|
|
95
97
|
|
|
@@ -107,12 +109,6 @@ function offerPeer(peer) {
|
|
|
107
109
|
offerSent = true;
|
|
108
110
|
}
|
|
109
111
|
}, GATHERING_TIMEOUT);
|
|
110
|
-
|
|
111
|
-
peer.handleRtcAnswer = (answer) => {
|
|
112
|
-
debug('node handleRtcAnswer', answer.sdp.length);
|
|
113
|
-
con.setRemoteDescription(answer.sdp, answer.type);
|
|
114
|
-
return 'node handleRtcAnswer ok';
|
|
115
|
-
}
|
|
116
112
|
|
|
117
113
|
});
|
|
118
114
|
}
|
|
@@ -124,6 +120,7 @@ async function answerPeer(peer, offer) {
|
|
|
124
120
|
|
|
125
121
|
const con = new rtc.PeerConnection('pc', defaultOptions);
|
|
126
122
|
peer.rtcCon = con;
|
|
123
|
+
peer.answerer = true;
|
|
127
124
|
|
|
128
125
|
function sendAnswer() {
|
|
129
126
|
const desc = con.localDescription();
|
|
@@ -135,6 +132,16 @@ async function answerPeer(peer, offer) {
|
|
|
135
132
|
if (state === 'connected') {
|
|
136
133
|
peer.connected = true;
|
|
137
134
|
peer.rtcEvents.emit('connected', con);
|
|
135
|
+
} else if (state === 'disconnected') {
|
|
136
|
+
peer.connected = false;
|
|
137
|
+
peer.rtcEvents.emit('disconnected', con);
|
|
138
|
+
peer.rtcCon = null;
|
|
139
|
+
peer.dc = null;
|
|
140
|
+
} else if (state === 'closed') {
|
|
141
|
+
peer.connected = false;
|
|
142
|
+
peer.rtcEvents.emit('closed', con);
|
|
143
|
+
peer.rtcCon = null;
|
|
144
|
+
peer.dc = null;
|
|
138
145
|
}
|
|
139
146
|
});
|
|
140
147
|
|
|
@@ -163,10 +170,6 @@ async function answerPeer(peer, offer) {
|
|
|
163
170
|
dc.sendMessageBinary(packet);
|
|
164
171
|
};
|
|
165
172
|
peer.rtcEvents.emit('dcOpen', dc);
|
|
166
|
-
|
|
167
|
-
// peer.dc.onStateChange((state) => {
|
|
168
|
-
// debug('dc state change', state);
|
|
169
|
-
// });
|
|
170
173
|
});
|
|
171
174
|
|
|
172
175
|
}
|
package/lib/rtc-web.js
CHANGED
|
@@ -53,10 +53,20 @@ async function offerPeer(peer) {
|
|
|
53
53
|
};
|
|
54
54
|
|
|
55
55
|
con.onconnectionstatechange = (event) => {
|
|
56
|
-
debug('connection state', con.connectionState, event);
|
|
56
|
+
debug('offerer connection state', con.connectionState, event);
|
|
57
57
|
if(con.connectionState === 'connected') {
|
|
58
58
|
peer.connected = true;
|
|
59
59
|
peer.rtcEvents.emit('connected', con);
|
|
60
|
+
} else if (con.connectionState === 'disconnected') {
|
|
61
|
+
peer.connected = false;
|
|
62
|
+
peer.rtcEvents.emit('disconnected', con);
|
|
63
|
+
peer.rtcCon = null;
|
|
64
|
+
peer.dc = null;
|
|
65
|
+
} else if (con.connectionState === 'closed') {
|
|
66
|
+
peer.connected = false;
|
|
67
|
+
peer.rtcEvents.emit('closed', con);
|
|
68
|
+
peer.rtcCon = null;
|
|
69
|
+
peer.dc = null;
|
|
60
70
|
}
|
|
61
71
|
};
|
|
62
72
|
|
|
@@ -94,9 +104,9 @@ async function offerPeer(peer) {
|
|
|
94
104
|
}, GATHERING_TIMEOUT);
|
|
95
105
|
|
|
96
106
|
peer.handleRtcAnswer = (answer) => {
|
|
97
|
-
debug('
|
|
107
|
+
debug('web handle RtcAnswer', answer.sdp.length);
|
|
98
108
|
con.setRemoteDescription(answer);
|
|
99
|
-
return 'web
|
|
109
|
+
return 'web handle RtcAnswer ok';
|
|
100
110
|
}
|
|
101
111
|
});
|
|
102
112
|
}
|
|
@@ -107,6 +117,7 @@ async function answerPeer(peer, offer) {
|
|
|
107
117
|
// window.rtc = rtc;
|
|
108
118
|
|
|
109
119
|
peer.rtcCon = con;
|
|
120
|
+
peer.answerer = true;
|
|
110
121
|
|
|
111
122
|
let gatheringComplete = false;
|
|
112
123
|
const start = Date.now();
|
|
@@ -133,7 +144,7 @@ async function answerPeer(peer, offer) {
|
|
|
133
144
|
};
|
|
134
145
|
|
|
135
146
|
con.onconnectionstatechange = (event) => {
|
|
136
|
-
debug('connection state', con.connectionState, event);
|
|
147
|
+
debug('answerer connection state', con.connectionState, event);
|
|
137
148
|
if(con.connectionState === 'connected') {
|
|
138
149
|
peer.connected = true;
|
|
139
150
|
peer.rtcEvents.emit('connected', con);
|
package/lib/socket-listeners.js
CHANGED
|
@@ -31,9 +31,23 @@ function initListeners(hsyncClient) {
|
|
|
31
31
|
|
|
32
32
|
function addSocketListener(options = {}) {
|
|
33
33
|
const { port, targetPort, targetHost } = options;
|
|
34
|
-
|
|
34
|
+
if (!targetHost) {
|
|
35
|
+
throw new Error('no targetHost');
|
|
36
|
+
}
|
|
37
|
+
let cleanHost = targetHost.trim();
|
|
38
|
+
if (cleanHost.endsWith('/')) {
|
|
39
|
+
cleanHost = cleanHost.substring(0, cleanHost.length - 1);
|
|
40
|
+
}
|
|
41
|
+
const url = new URL(cleanHost);
|
|
42
|
+
if (url.hostname.toLowerCase() === hsyncClient.myHostName.toLowerCase()) {
|
|
43
|
+
throw new Error('targetHost must be a different host');
|
|
44
|
+
}
|
|
45
|
+
debug('creating handler', port, cleanHost);
|
|
46
|
+
if (cleanHost !== targetHost) {
|
|
47
|
+
debug('targetHost cleaned UP', targetHost, cleanHost);
|
|
48
|
+
}
|
|
35
49
|
|
|
36
|
-
const rpcPeer = hsyncClient.getRPCPeer({ hostName:
|
|
50
|
+
const rpcPeer = hsyncClient.getRPCPeer({ hostName: cleanHost });
|
|
37
51
|
|
|
38
52
|
const socketServer = net.createServer(async (socket) => {
|
|
39
53
|
|
|
@@ -118,7 +132,7 @@ function initListeners(hsyncClient) {
|
|
|
118
132
|
debug('connecting remotely', socket.socketId, targetPort, rpcPeer.hostName, targetHost);
|
|
119
133
|
const result = await rpcPeer.methods.connectSocket({
|
|
120
134
|
socketId: socket.socketId,
|
|
121
|
-
port: targetPort,
|
|
135
|
+
port: targetPort || port,
|
|
122
136
|
hostName: rpcPeer.hostName,
|
|
123
137
|
});
|
|
124
138
|
debug('connect result', result);
|
|
@@ -154,8 +168,8 @@ function initListeners(hsyncClient) {
|
|
|
154
168
|
socketServer,
|
|
155
169
|
sockets,
|
|
156
170
|
end,
|
|
157
|
-
targetHost,
|
|
158
|
-
targetPort,
|
|
171
|
+
targetHost: cleanHost,
|
|
172
|
+
targetPort: targetPort || port,
|
|
159
173
|
port,
|
|
160
174
|
};
|
|
161
175
|
|
package/lib/socket-relays.js
CHANGED
|
@@ -24,14 +24,16 @@ function initRelays(hsyncClient) {
|
|
|
24
24
|
targetPort: l.targetPort,
|
|
25
25
|
whitelist: l.whitelist || '',
|
|
26
26
|
blacklist: l.blacklist || '',
|
|
27
|
+
hostName: l.targetHost,
|
|
27
28
|
};
|
|
28
29
|
});
|
|
29
30
|
return retVal;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
function connectSocket(
|
|
33
|
+
function connectSocket(peer, { port, socketId, hostName }) {
|
|
34
|
+
debug('connectSocket', port, socketId, hostName);
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
peer.notifications.oncloseRelaySocket((peer, { socketId }) => {
|
|
35
37
|
debug('closeRelaySocket', socketId);
|
|
36
38
|
if (sockets[socketId]) {
|
|
37
39
|
sockets[socketId].end();
|
|
@@ -42,12 +44,12 @@ function initRelays(hsyncClient) {
|
|
|
42
44
|
});
|
|
43
45
|
|
|
44
46
|
const relay = cachedRelays['p' + port];
|
|
45
|
-
debug('connect relay', port, socketId,
|
|
47
|
+
debug('connect relay', port, socketId, peer.hostName);
|
|
46
48
|
if (!relay) {
|
|
47
49
|
throw new Error('no relay found for port: ' + port);
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
// TODO: check white and black lists on
|
|
52
|
+
// TODO: check white and black lists on peer
|
|
51
53
|
|
|
52
54
|
// const relayDataTopic = `msg/${hostName}/${hsyncClient.myHostName}/relayData/${socketId}`;
|
|
53
55
|
return new Promise((resolve, reject) => {
|
|
@@ -61,10 +63,10 @@ function initRelays(hsyncClient) {
|
|
|
61
63
|
|
|
62
64
|
socket.on('data', async (data) => {
|
|
63
65
|
debug(`data in ${socket.socketId}`, relay.targetPort, relay.targetHost, data.length);
|
|
64
|
-
// TODO: queue data if
|
|
65
|
-
if (
|
|
66
|
+
// TODO: queue data if peer is not ready
|
|
67
|
+
if (peer.packAndSend) {
|
|
66
68
|
debug('sending relay data via rtc', socket.socketId, data.length);
|
|
67
|
-
|
|
69
|
+
peer.packAndSend(`socketData/${socket.socketId}`, Buffer.from(data));
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
70
72
|
});
|
|
@@ -72,7 +74,7 @@ function initRelays(hsyncClient) {
|
|
|
72
74
|
debug(`LOCAL CONNECTION CLOSED`, socket.socketId);
|
|
73
75
|
if (sockets[socket.socketId]) {
|
|
74
76
|
try {
|
|
75
|
-
await
|
|
77
|
+
await peer.notifiers.closeListenerSocket({socketId});
|
|
76
78
|
} catch (e) {
|
|
77
79
|
debug('error closing socket', e);
|
|
78
80
|
}
|
|
@@ -90,8 +92,9 @@ function initRelays(hsyncClient) {
|
|
|
90
92
|
|
|
91
93
|
}
|
|
92
94
|
|
|
93
|
-
function addSocketRelay({whitelist, blacklist, port, targetPort, targetHost
|
|
95
|
+
function addSocketRelay({whitelist, blacklist, port, targetPort, targetHost}) {
|
|
94
96
|
targetPort = targetPort || port;
|
|
97
|
+
targetHost = targetHost || 'localhost';
|
|
95
98
|
debug('creating relay', whitelist, blacklist, port, targetPort, targetHost);
|
|
96
99
|
const newRelay = {
|
|
97
100
|
whitelist,
|
|
@@ -99,6 +102,7 @@ function initRelays(hsyncClient) {
|
|
|
99
102
|
port,
|
|
100
103
|
targetPort,
|
|
101
104
|
targetHost,
|
|
105
|
+
hostName: targetHost,
|
|
102
106
|
};
|
|
103
107
|
cachedRelays['p' + port] = newRelay;
|
|
104
108
|
return newRelay;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hsync",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"description": "client for hsync-server",
|
|
5
5
|
"main": "hsync.js",
|
|
6
6
|
"scripts": {
|
|
@@ -18,7 +18,11 @@
|
|
|
18
18
|
"json-rpc",
|
|
19
19
|
"ngrok",
|
|
20
20
|
"websocket",
|
|
21
|
-
"mqtt"
|
|
21
|
+
"mqtt",
|
|
22
|
+
"proxy",
|
|
23
|
+
"reverse-proxy",
|
|
24
|
+
"vpn",
|
|
25
|
+
"tunnel"
|
|
22
26
|
],
|
|
23
27
|
"browser": {
|
|
24
28
|
"./hsync": "./hsync-web"
|