hsync 0.18.3 → 0.20.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 +16 -4
- package/cli.js +12 -1
- package/connection.js +40 -53
- package/dist/hsync.js +15 -15
- package/dist/hsync.min.js +1 -1
- package/hsync-web.js +4 -15
- package/hsync.js +10 -2
- package/lib/fetch.js +11 -16
- package/lib/peers.js +210 -188
- package/lib/rtc-node.js +94 -84
- package/lib/rtc-web.js +72 -65
- package/lib/socket-listeners.js +182 -0
- package/lib/socket-relays.js +123 -0
- package/package.json +7 -6
- package/shell.js +33 -0
- package/lib/socket-listen-handler.js +0 -135
- package/lib/socket-relay-handler.js +0 -105
- package/tn.js +0 -34
package/shell.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const net = require('net');
|
|
2
|
+
|
|
3
|
+
function run(port = 2323) {
|
|
4
|
+
process.stdin.setRawMode( true );
|
|
5
|
+
console.log('connecting to localhost:', port, ' ...');
|
|
6
|
+
|
|
7
|
+
const client = net.createConnection({ port }, () => {
|
|
8
|
+
client.on('data', (data) => {
|
|
9
|
+
process.stdout.write(data);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
process.stdin.on('data', (data) => {
|
|
13
|
+
client.write(data);
|
|
14
|
+
// ctrl-c ( end of text )
|
|
15
|
+
if ( String(data) === '\u0003' ) {
|
|
16
|
+
process.exit();
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
client.on('end', () => {
|
|
21
|
+
console.log('disconnected from server');
|
|
22
|
+
process.exit();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
client.on('error', (err) => {
|
|
26
|
+
console.error(err);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = run;
|
|
33
|
+
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
const b64id = require('b64id');
|
|
2
|
-
const debug = require('debug')('hsync:listener');
|
|
3
|
-
const debugError = require('debug')('hsync:error');
|
|
4
|
-
|
|
5
|
-
const { getRPCPeer } = require('./peers');
|
|
6
|
-
const { sockets } = require('./socket-map');
|
|
7
|
-
|
|
8
|
-
let net;
|
|
9
|
-
|
|
10
|
-
function setNet(netImpl) {
|
|
11
|
-
net = netImpl;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
debugError.color = 1;
|
|
15
|
-
|
|
16
|
-
function receiveRelayData(remotePeer, { socketId, data }) {
|
|
17
|
-
debug('receiveRelayData', socketId, data, 'sockets', Object.keys(sockets));
|
|
18
|
-
if (!sockets[socketId]) {
|
|
19
|
-
throw new Error('listener has no matching socket for relay: ' + socketId);
|
|
20
|
-
}
|
|
21
|
-
let dataBuffer = data;
|
|
22
|
-
if (typeof dataBuffer === 'string') {
|
|
23
|
-
dataBuffer = Buffer.from(dataBuffer, 'base64');
|
|
24
|
-
}
|
|
25
|
-
sockets[socketId].write(dataBuffer);
|
|
26
|
-
return 'receiveRelayData ok';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function createSocketListenHandler(options = {}) {
|
|
30
|
-
const { hostName, port, targetPort, targetHost, hsyncClient } = options;
|
|
31
|
-
debug('creating handler', port, targetHost);
|
|
32
|
-
|
|
33
|
-
const rpcPeer = getRPCPeer({hostName: targetHost, hsyncClient});
|
|
34
|
-
|
|
35
|
-
const socketServer = net.createServer(async (socket) => {
|
|
36
|
-
|
|
37
|
-
if (!rpcPeer.rtcCon) {
|
|
38
|
-
await rpcPeer.connectRTC();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
socket.socketId = b64id.generateId();
|
|
42
|
-
sockets[socket.socketId] = socket;
|
|
43
|
-
rpcPeer.sockets[socket.socketId] = socket;
|
|
44
|
-
socket.listenerSocket = true;
|
|
45
|
-
debug('connected to local listener', port, socket.socketId);
|
|
46
|
-
socket.peerConnected = false;
|
|
47
|
-
const pubTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketData/${socket.socketId}`;
|
|
48
|
-
const closeTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketClose/${socket.socketId}`;
|
|
49
|
-
const dataQueue = [];
|
|
50
|
-
|
|
51
|
-
async function sendData(data) {
|
|
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);
|
|
58
|
-
// hsyncClient.mqConn.publish(pubTopic, data);
|
|
59
|
-
const result = await rpcPeer.methods.receiveListenerData({
|
|
60
|
-
socketId: socket.socketId,
|
|
61
|
-
data: Buffer.from(data).toString('base64'),
|
|
62
|
-
});
|
|
63
|
-
debug('sendData from Listener', result);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
socket.on('data', async (data) => {
|
|
67
|
-
debug('socket data', data ? data.length : '');
|
|
68
|
-
// if (!socket.peerConnected) {
|
|
69
|
-
// dataQueue.push(data);
|
|
70
|
-
// return;
|
|
71
|
-
// }
|
|
72
|
-
sendData(data);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
socket.on('close', () => {
|
|
76
|
-
debug('listener socket closed', port, socket.socketId);
|
|
77
|
-
if (sockets[socket.socketId]) {
|
|
78
|
-
delete sockets[socket.socketId];
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
socket.on('error', (error) => {
|
|
83
|
-
debug('socket error', hostName, socket.socketId, error);
|
|
84
|
-
if (sockets[socket.socketId]) {
|
|
85
|
-
delete sockets[socket.socketId];
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
try {
|
|
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
|
-
});
|
|
97
|
-
debug('connect result', result);
|
|
98
|
-
socket.peerConnected = true;
|
|
99
|
-
dataQueue.forEach(sendData);
|
|
100
|
-
} catch (e) {
|
|
101
|
-
debugError('cant connect remotely', hostName, targetPort, e);
|
|
102
|
-
if (sockets[socket.socketId]) {
|
|
103
|
-
delete sockets[socket.socketId];
|
|
104
|
-
}
|
|
105
|
-
socket.end();
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
socketServer.listen(port);
|
|
110
|
-
|
|
111
|
-
function end() {
|
|
112
|
-
const sockKeys = Object.keys(sockets);
|
|
113
|
-
sockKeys.forEach((sk) => {
|
|
114
|
-
try {
|
|
115
|
-
sockets[sk].end();
|
|
116
|
-
delete sockets[sk];
|
|
117
|
-
}
|
|
118
|
-
catch(e) {
|
|
119
|
-
debug('error closing socket', e);
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return {
|
|
125
|
-
socketServer,
|
|
126
|
-
sockets,
|
|
127
|
-
end,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
module.exports = {
|
|
132
|
-
createSocketListenHandler,
|
|
133
|
-
receiveRelayData,
|
|
134
|
-
setNet,
|
|
135
|
-
};
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
const debug = require('debug')('hsync:relay');
|
|
2
|
-
const debugError = require('debug')('hsync:error');
|
|
3
|
-
const { getRPCPeer } = require('./peers');
|
|
4
|
-
const { sockets } = require('./socket-map');
|
|
5
|
-
|
|
6
|
-
debugError.color = 1;
|
|
7
|
-
|
|
8
|
-
let net;
|
|
9
|
-
|
|
10
|
-
function setNet(netImpl) {
|
|
11
|
-
net = netImpl;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const relays = {};
|
|
15
|
-
|
|
16
|
-
function receiveListenerData(remotePeer, { socketId, data }) {
|
|
17
|
-
debug('receiveListenerData', socketId, data, 'sockets', Object.keys(sockets));
|
|
18
|
-
if (!sockets[socketId]) {
|
|
19
|
-
throw new Error('relay has no matching socket for listener : ' + socketId);
|
|
20
|
-
}
|
|
21
|
-
let dataBuffer = data;
|
|
22
|
-
if (typeof dataBuffer === 'string') {
|
|
23
|
-
dataBuffer = Buffer.from(dataBuffer, 'base64');
|
|
24
|
-
}
|
|
25
|
-
sockets[socketId].write(dataBuffer);
|
|
26
|
-
return 'receiveListenerData ok';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function connectSocket(remotePeer, { hsyncClient, fromHost, port, socketId}) {
|
|
30
|
-
const relay = relays['p' + port];
|
|
31
|
-
debug('connect relay', port, socketId);
|
|
32
|
-
if (!relay) {
|
|
33
|
-
throw new Error('no relay found for port: ' + port);
|
|
34
|
-
}
|
|
35
|
-
// const rpcPeer = getRPCPeer({hostName: fromHost, hsyncClient});
|
|
36
|
-
// const relayDataTopic = `msg/${hostName}/${hsyncClient.myHostName}/relayData/${socketId}`;
|
|
37
|
-
return new Promise((resolve, reject) => {
|
|
38
|
-
const socket = new net.Socket();
|
|
39
|
-
socket.socketId = socketId;
|
|
40
|
-
sockets[socketId] = socket;
|
|
41
|
-
socket.connect(relay.targetPort, relay.targetHost, () => {
|
|
42
|
-
debug(`CONNECTED TO LOCAL SERVER`, socket.socketId, socket.hostName);
|
|
43
|
-
resolve({socketId, targetHost: relay.targetHost, targetPort: relay.targetPort});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
socket.on('data', async (data) => {
|
|
47
|
-
debug(`data in ${socket.socketId}`, relay.targetPort, relay.targetHost, data.length);
|
|
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({
|
|
54
|
-
socketId,
|
|
55
|
-
data: Buffer.from(data).toString('base64'),
|
|
56
|
-
});
|
|
57
|
-
// const p = getRTCPeer(hostName, hsyncClient);
|
|
58
|
-
// if (p.connected) {
|
|
59
|
-
// p.send(`relayData/${socketId}`, data);
|
|
60
|
-
// return;
|
|
61
|
-
// }
|
|
62
|
-
// hsyncClient.mqConn.publish(relayDataTopic, data);
|
|
63
|
-
});
|
|
64
|
-
socket.on('close', () => {
|
|
65
|
-
debug(`LOCAL CONNECTION CLOSED`, socket.socketId, targetHost, targetPort);
|
|
66
|
-
delete sockets[socket.socketId];
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
socket.on('error', (e) => {
|
|
70
|
-
debugError(`LOCAL CONNECTION ERROR`, socket.socketId, targetHost, targetPort, e);
|
|
71
|
-
delete sockets[socket.socketId];
|
|
72
|
-
reject(e);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// function receiveSocketData(socketId, data) {
|
|
80
|
-
// if (sockets[socketId]) {
|
|
81
|
-
// debug('receiveSocketData', socketId, data.length);
|
|
82
|
-
// sockets[socketId].write(data);
|
|
83
|
-
// return 'ok';
|
|
84
|
-
// }
|
|
85
|
-
|
|
86
|
-
// throw new Error('socket not found: ' + socketId);
|
|
87
|
-
// }
|
|
88
|
-
|
|
89
|
-
function createSocketRelayHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
|
|
90
|
-
debug('creating relay', hostName, port, targetPort, targetHost);
|
|
91
|
-
relays['p' + port] = {
|
|
92
|
-
hostName,
|
|
93
|
-
port,
|
|
94
|
-
targetPort,
|
|
95
|
-
targetHost,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
module.exports = {
|
|
100
|
-
createSocketRelayHandler,
|
|
101
|
-
connectSocket,
|
|
102
|
-
// receiveSocketData,
|
|
103
|
-
setNet,
|
|
104
|
-
receiveListenerData,
|
|
105
|
-
};
|
package/tn.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
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
|
-
});
|