hsync 0.17.0 → 0.18.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.
@@ -1,9 +1,9 @@
1
1
  const b64id = require('b64id');
2
2
  const debug = require('debug')('hsync:listener');
3
3
  const debugError = require('debug')('hsync:error');
4
- // const { getRTCPeer } = require('./data-channel');
5
4
 
6
- const { getRPCPeer } = require('./rpc');
5
+ const { getRPCPeer } = require('./peers');
6
+ const { sockets } = require('./socket-map');
7
7
 
8
8
  let net;
9
9
 
@@ -11,19 +11,9 @@ function setNet(netImpl) {
11
11
  net = netImpl;
12
12
  }
13
13
 
14
-
15
14
  debugError.color = 1;
16
15
 
17
- const sockets = {};
18
-
19
- // function receiveRelayData(socketId, data) {
20
- // if (sockets[socketId]) {
21
- // debug('receiveRelayData', socketId, data.length);
22
- // sockets[socketId].write(data);
23
- // }
24
- // }
25
-
26
- function receiveRelayData(requestInfo, { socketId, data }) {
16
+ function receiveRelayData(remotePeer, { socketId, data }) {
27
17
  debug('receiveRelayData', socketId, data, 'sockets', Object.keys(sockets));
28
18
  if (!sockets[socketId]) {
29
19
  throw new Error('listener has no matching socket for relay: ' + socketId);
@@ -33,21 +23,25 @@ function receiveRelayData(requestInfo, { socketId, data }) {
33
23
  dataBuffer = Buffer.from(dataBuffer, 'base64');
34
24
  }
35
25
  sockets[socketId].write(dataBuffer);
36
- return 'ok';
26
+ return 'receiveRelayData ok';
37
27
  }
38
28
 
39
- function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
40
- debug('creating handler', { hostName, port, targetPort, targetHost });
29
+ function createSocketListenHandler(options = {}) {
30
+ const { hostName, port, targetPort, targetHost, hsyncClient } = options;
31
+ debug('creating handler', port, targetHost);
41
32
 
42
- // const rpcPeer = getRPCPeer({hostName, hsyncClient});
43
33
  const rpcPeer = getRPCPeer({hostName: targetHost, hsyncClient});
44
34
 
45
- debug('peer crated');
46
-
47
35
  const socketServer = net.createServer(async (socket) => {
48
36
 
37
+ if (!rpcPeer.rtcCon) {
38
+ await rpcPeer.connectRTC();
39
+ }
40
+
49
41
  socket.socketId = b64id.generateId();
50
42
  sockets[socket.socketId] = socket;
43
+ rpcPeer.sockets[socket.socketId] = socket;
44
+ socket.listenerSocket = true;
51
45
  debug('connected to local listener', port, socket.socketId);
52
46
  socket.peerConnected = false;
53
47
  const pubTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketData/${socket.socketId}`;
@@ -55,12 +49,12 @@ function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyn
55
49
  const dataQueue = [];
56
50
 
57
51
  async function sendData(data) {
58
- debug('sending data', hostName, data.length);
59
- // const p = getRTCPeer(hostName, hsyncClient);
60
- // if (p.connected) {
61
- // p.send(`socketData/${socket.socketId}`, data);
62
- // return;
63
- // }
52
+ if (rpcPeer.packAndSend) {
53
+ debug('sending data via rtc', hostName, socket.socketId, data.length);
54
+ rpcPeer.packAndSend(`socketData/${socket.socketId}`, data);
55
+ return;
56
+ }
57
+ debug('sending data via rpc', hostName, data.length);
64
58
  // hsyncClient.mqConn.publish(pubTopic, data);
65
59
  const result = await rpcPeer.methods.receiveListenerData({
66
60
  socketId: socket.socketId,
@@ -70,7 +64,7 @@ function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyn
70
64
  }
71
65
 
72
66
  socket.on('data', async (data) => {
73
- debug('socket data', data?.length);
67
+ debug('socket data', data ? data.length : '');
74
68
  // if (!socket.peerConnected) {
75
69
  // dataQueue.push(data);
76
70
  // return;
@@ -83,7 +77,6 @@ function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyn
83
77
  if (sockets[socket.socketId]) {
84
78
  delete sockets[socket.socketId];
85
79
  }
86
- // hsyncClient.mqConn.publish(closeTopic, '');
87
80
  });
88
81
 
89
82
  socket.on('error', (error) => {
@@ -91,20 +84,19 @@ function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyn
91
84
  if (sockets[socket.socketId]) {
92
85
  delete sockets[socket.socketId];
93
86
  }
94
- // hsyncClient.mqConn.publish(closeTopic, '');
95
87
  });
96
88
 
97
89
  try {
98
- debug('connecting remotely', socket.socketId, targetPort);
99
- const result = await rpcPeer.methods.connectSocket({socketId: socket.socketId, port: targetPort});
90
+ debug('connecting remotely', socket.socketId, targetPort, rpcPeer.hostName, targetHost);
91
+ const result = await rpcPeer.methods.connectSocket({
92
+ socketId: socket.socketId,
93
+ port: targetPort,
94
+ hostName: rpcPeer.hostName,
95
+ wut: 'huh',
96
+ });
100
97
  debug('connect result', result);
101
98
  socket.peerConnected = true;
102
- dataQueue.forEach(sendData);
103
- // const p = getRTCPeer(hostName, hsyncClient);
104
- // if (p.pc) {
105
- // p.createDC();
106
- // }
107
-
99
+ dataQueue.forEach(sendData);
108
100
  } catch (e) {
109
101
  debugError('cant connect remotely', hostName, targetPort, e);
110
102
  if (sockets[socket.socketId]) {
@@ -112,13 +104,10 @@ function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyn
112
104
  }
113
105
  socket.end();
114
106
  }
115
-
116
-
117
107
  });
118
108
 
119
109
  socketServer.listen(port);
120
110
 
121
-
122
111
  function end() {
123
112
  const sockKeys = Object.keys(sockets);
124
113
  sockKeys.forEach((sk) => {
@@ -0,0 +1,19 @@
1
+ const debug = require('debug')('hsync:socket-map');
2
+ const sockets = {};
3
+
4
+ function handleSocketPacket(packet) {
5
+ const [topic, socketId] = packet.topic.split('/');
6
+ const socket = sockets[socketId];
7
+ if (!socket) {
8
+ return;
9
+ }
10
+ if (topic === 'socketData') {
11
+ debug('socketData', typeof packet.payload, !!socket.listenerSocket, packet.payload.length);
12
+ socket.write(packet.payload);
13
+ }
14
+ }
15
+
16
+ module.exports = {
17
+ sockets,
18
+ handleSocketPacket,
19
+ };
@@ -1,8 +1,7 @@
1
- const b64id = require('b64id');
2
1
  const debug = require('debug')('hsync:relay');
3
2
  const debugError = require('debug')('hsync:error');
4
- // const { getRTCPeer } = require('./data-channel');
5
- const { getRPCPeer } = require('./rpc');
3
+ const { getRPCPeer } = require('./peers');
4
+ const { sockets } = require('./socket-map');
6
5
 
7
6
  debugError.color = 1;
8
7
 
@@ -12,11 +11,9 @@ function setNet(netImpl) {
12
11
  net = netImpl;
13
12
  }
14
13
 
15
-
16
14
  const relays = {};
17
- const sockets = {};
18
15
 
19
- function receiveListenerData(requestInfo, { socketId, data }) {
16
+ function receiveListenerData(remotePeer, { socketId, data }) {
20
17
  debug('receiveListenerData', socketId, data, 'sockets', Object.keys(sockets));
21
18
  if (!sockets[socketId]) {
22
19
  throw new Error('relay has no matching socket for listener : ' + socketId);
@@ -26,16 +23,16 @@ function receiveListenerData(requestInfo, { socketId, data }) {
26
23
  dataBuffer = Buffer.from(dataBuffer, 'base64');
27
24
  }
28
25
  sockets[socketId].write(dataBuffer);
29
- return 'ok';
26
+ return 'receiveListenerData ok';
30
27
  }
31
28
 
32
- function connectSocket({ hsyncClient, fromHost }, {port, socketId}) {
29
+ function connectSocket(remotePeer, { hsyncClient, fromHost, port, socketId}) {
33
30
  const relay = relays['p' + port];
34
31
  debug('connect relay', port, socketId);
35
32
  if (!relay) {
36
33
  throw new Error('no relay found for port: ' + port);
37
34
  }
38
- const rpcPeer = getRPCPeer({hostName: fromHost, hsyncClient});
35
+ // const rpcPeer = getRPCPeer({hostName: fromHost, hsyncClient});
39
36
  // const relayDataTopic = `msg/${hostName}/${hsyncClient.myHostName}/relayData/${socketId}`;
40
37
  return new Promise((resolve, reject) => {
41
38
  const socket = new net.Socket();
@@ -48,7 +45,12 @@ function connectSocket({ hsyncClient, fromHost }, {port, socketId}) {
48
45
 
49
46
  socket.on('data', async (data) => {
50
47
  debug(`data in ${socket.socketId}`, relay.targetPort, relay.targetHost, data.length);
51
- const result = await rpcPeer.methods.receiveRelayData({
48
+ if (remotePeer.packAndSend) {
49
+ debug('sending relay data via rtc', socket.socketId, data.length);
50
+ remotePeer.packAndSend(`socketData/${socket.socketId}`, Buffer.from(data));
51
+ return;
52
+ }
53
+ const result = await remotePeer.methods.receiveRelayData({
52
54
  socketId,
53
55
  data: Buffer.from(data).toString('base64'),
54
56
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hsync",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "client for hsync-server",
5
5
  "main": "hsync.js",
6
6
  "scripts": {
@@ -35,13 +35,17 @@
35
35
  "debug": "^4.3.1",
36
36
  "isomorphic-fetch": "^3.0.0",
37
37
  "mqtt": "^4.2.6",
38
+ "mqtt-packet-web": "^8.2.0",
38
39
  "net-web": "^0.2.0",
39
40
  "precompiled-mqtt": "^4.3.14-beta",
40
- "rawr": "^0.14.0"
41
+ "rawr": "^0.15.1",
42
+ "webpack": "^5.88.2",
43
+ "webpack-cli": "^4.10.0"
44
+ },
45
+ "optionalDependencies": {
46
+ "node-datachannel": "^0.4.3"
41
47
  },
42
48
  "devDependencies": {
43
- "nodemon": "^2.0.20",
44
- "webpack": "^5.75.0",
45
- "webpack-cli": "^5.0.1"
49
+ "nodemon": "^3.0.1"
46
50
  }
47
51
  }
package/tn.js ADDED
@@ -0,0 +1,34 @@
1
+ const net = require('net');
2
+
3
+ process.stdin.setRawMode( true );
4
+
5
+ const client = net.createConnection({ port: 2323 }, () => {
6
+ // 'connect' listener.
7
+ // console.log('connected to server!');
8
+ // client.write('world!\r\n');
9
+ client.on('data', (data) => {
10
+ process.stdout.write(data);
11
+ });
12
+
13
+ process.stdin.on('data', (data) => {
14
+ client.write(data);
15
+ // ctrl-c ( end of text )
16
+ if ( String(data) === '\u0003' ) {
17
+ process.exit();
18
+ }
19
+ });
20
+
21
+ // on any data into stdin
22
+ //
23
+
24
+
25
+ client.on('end', () => {
26
+ console.log('disconnected from server');
27
+ process.exit();
28
+ });
29
+
30
+ client.on('error', (err) => {
31
+ console.error(err);
32
+ });
33
+
34
+ });
package/lib/rpc.js DELETED
@@ -1,95 +0,0 @@
1
- const rawr = require('rawr');
2
- const b64id = require('b64id');
3
- const debug = require('debug')('hsync:rpc');
4
- const EventEmitter = require('events').EventEmitter;
5
- // const { peerMethods } = require('./peer-methods');
6
- const fetch = require('./fetch');
7
-
8
- const peers = {};
9
-
10
- function getRPCPeer({hostName, temporary, timeout = 10000, hsyncClient}) {
11
- let peer = peers[hostName];
12
- if (!peer) {
13
- debug('creating peer', hostName);
14
- peer = createRPCPeer({hostName, hsyncClient, timeout, methods: hsyncClient.peerMethods});
15
- if (temporary) {
16
- peer.rpcTemporary = true;
17
- }
18
- peers[hostName] = peer;
19
- }
20
- return peer;
21
- }
22
-
23
-
24
- function createRPCPeer({ hostName, hsyncClient, timeout = 10000, methods = {} }) {
25
- if (!hostName) {
26
- throw new Error('No hostname specified');
27
- }
28
- if (hostName === hsyncClient.myHostName) {
29
- throw new Error('Peer must be a different host');
30
- }
31
- const myAuth = b64id.generateId();
32
- const transport = new EventEmitter();
33
- transport.send = async (msg) => {
34
- const fullMsg = {
35
- msg,
36
- myAuth,
37
- toHost: hostName,
38
- fromHost: hsyncClient.webUrl,
39
- };
40
- // const toSend = JSON.stringify(fullMsg);
41
- const topic = `rpc/${hsyncClient.myHostName}`;
42
- debug('↑ peer rpc', `${hostName}/_hs/rpc`, msg);
43
- // hsyncClient.mqConn.publish(topic, Buffer.from(toSend));
44
- try {
45
- const result = await fetch.post(`${hostName}/_hs/rpc`, fullMsg);
46
- transport.receiveData({id: msg.id, result, jsonrpc: msg.jsonrpc});
47
- } catch(e) {
48
- debug(e);
49
- transport.receiveData({id: msg.id, error: e, method: msg.method, jsonrpc: msg.jsonrpc});
50
- }
51
-
52
- };
53
- transport.receiveData = (msg) => {
54
- debug('↓ peer rpc', msg);
55
- if(typeof msg === 'string') {
56
- msg = JSON.parse(msg);
57
- }
58
- if (Array.isArray(msg.params)) {
59
- msg.params.unshift(hostName);
60
- }
61
- transport.emit('rpc', msg);
62
- };
63
-
64
- const peer = rawr({transport, methods: Object.assign({}, methods), timeout, idGenerator: b64id.generateId});
65
- peer.myAuth = myAuth;
66
- return peer;
67
-
68
- }
69
-
70
- function createServerPeer(hsyncClient, methods) {
71
- const transport = new EventEmitter();
72
- transport.send = (msg) => {
73
- if(typeof msg === 'object') {
74
- msg = JSON.stringify(msg);
75
- }
76
- const topic = `srpc/${hsyncClient.myHostName}`;
77
- debug('↑ server rpc request', msg);
78
- hsyncClient.mqConn.publish(topic, Buffer.from(msg));
79
- };
80
- transport.receiveData = (msg) => {
81
- debug('↓ server rpc reply', msg);
82
- if(msg) {
83
- msg = JSON.parse(msg);
84
- }
85
- transport.emit('rpc', msg);
86
- };
87
- const peer = rawr({transport, methods, timeout: 5000});
88
- return peer;
89
- }
90
-
91
- module.exports = {
92
- createRPCPeer,
93
- createServerPeer,
94
- getRPCPeer,
95
- };
package/lib/web-net.js DELETED
@@ -1,67 +0,0 @@
1
- const EventEmitter = require('events').EventEmitter;
2
-
3
- const events = new EventEmitter();
4
-
5
- const listeners = {};
6
-
7
- function Socket() {
8
- const socket = new EventEmitter();
9
-
10
- socket.connect = function(port, host, clientCallback) {
11
- events.emit(('socket_connect_' + port), {
12
- port,
13
- host,
14
- clientSocket: socket,
15
- clientCallback,
16
- });
17
- }
18
-
19
- socket.write = function(message) {
20
- if (socket.serverSocket) {
21
- socket.serverSocket.emit('data', message);
22
- }
23
- };
24
-
25
- socket.end = function() {
26
- if (socket.serverSocket) {
27
- socket.serverSocket.emit('close');
28
- }
29
-
30
- }
31
-
32
- return socket;
33
- }
34
-
35
- function createServer(cb) {
36
- const server = new EventEmitter();
37
- server.listen = (port) => {
38
- debug('server.listen', port);
39
- listeners['l' + port] = server;
40
- events.on('socket_connect_' + port, ({ clientSocket, clientCallback }) => {
41
- debug('socket_connect_' + port, clientSocket);
42
- const serverSocket = new EventEmitter();
43
- clientSocket.serverSocket = serverSocket;
44
- if (server.cb) {
45
- server.cb(serverSocket);
46
- }
47
- serverSocket.write = (data) => {
48
- clientSocket.emit('data', data);
49
- }
50
- serverSocket.end = () => {
51
- clientSocket.emit('close');
52
- }
53
-
54
- if (clientCallback) {
55
- clientCallback();
56
- }
57
- });
58
- };
59
- server.cb = cb;
60
- return server;
61
- }
62
-
63
- module.exports = {
64
- Socket,
65
- createServer,
66
- events,
67
- };