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/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 'rtcSignal ok';
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
- debug('dcOpen!');
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('node handleRtcAnswer', answer.sdp.length);
107
+ debug('web handle RtcAnswer', answer.sdp.length);
98
108
  con.setRemoteDescription(answer);
99
- return 'web handleRtcAnswer ok';
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);
@@ -31,9 +31,23 @@ function initListeners(hsyncClient) {
31
31
 
32
32
  function addSocketListener(options = {}) {
33
33
  const { port, targetPort, targetHost } = options;
34
- debug('creating handler', port, targetHost);
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: targetHost });
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
 
@@ -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(remotePeer, { port, socketId }) {
33
+ function connectSocket(peer, { port, socketId, hostName }) {
34
+ debug('connectSocket', port, socketId, hostName);
33
35
 
34
- remotePeer.notifications.oncloseRelaySocket((remotePeer, { socketId }) => {
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, remotePeer.hostName);
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 remotePeer
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 remotePeer is not ready
65
- if (remotePeer.packAndSend) {
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
- remotePeer.packAndSend(`socketData/${socket.socketId}`, Buffer.from(data));
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 remotePeer.notifiers.closeListenerSocket({socketId});
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 = 'localhost'}) {
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.21.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"