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.
- package/cli.js +1 -0
- package/connection.js +35 -68
- package/dist/hsync.js +366 -10
- package/dist/hsync.min.js +1 -1
- package/dist/hsync.min.js.LICENSE.txt +2 -0
- package/hsync-web.js +4 -0
- package/hsync.js +3 -0
- package/lib/peers.js +237 -0
- package/lib/rtc-node.js +168 -0
- package/lib/rtc-web.js +172 -0
- package/lib/socket-listen-handler.js +28 -39
- package/lib/socket-map.js +19 -0
- package/lib/socket-relay-handler.js +12 -10
- package/package.json +9 -5
- package/tn.js +34 -0
- package/lib/rpc.js +0 -95
- package/lib/web-net.js +0 -67
|
@@ -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('./
|
|
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
|
-
|
|
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(
|
|
40
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
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({
|
|
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
|
-
|
|
5
|
-
const {
|
|
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(
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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": "^
|
|
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
|
-
};
|