hsync 0.8.0 → 0.10.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 CHANGED
@@ -5,4 +5,24 @@
5
5
  Client for the ([hsync-server](https://github.com/monteslu/hsync-server)).
6
6
  Share your local webserver as a secure public URL, and more.
7
7
 
8
+ ## basic usage
9
+
10
+ clone repo
11
+ `npm i`
12
+
13
+ set enviroment:
14
+
15
+
16
+ ### hsync server URL
17
+ `export HSYNC_SERVER="wss://myhost.myserver.com"`
18
+
19
+
20
+ ### secret for your hsync client
21
+ `export HSYNC_SECRET="*****************"`
22
+
23
+ ### local webserver port
24
+ `export PORT="8080"`
25
+
26
+ ### run
27
+ `node index`
8
28
 
package/cli.js CHANGED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { program, Option } = require('commander');
4
+ const pack = require('./package.json');
5
+ const config = require('./config');
6
+ const { createConnection } = require('./hsync');
7
+
8
+ program
9
+ .name(pack.name)
10
+ .description(pack.description)
11
+ .version(pack.version)
12
+ .addOption(new Option('-p, --port <number>', 'port for local webserver', 3000).env('PORT'))
13
+ .addOption(new Option('-d, --dynamic-host <url>', 'host to get a dynamic connection from').env('HSYNC_DYNAMIC_HOST'))
14
+ .addOption(new Option('-s, --hsync-server <url>', 'hsync-server location ex: wss://sub.mydomain.com').env('HSYNC_SERVER'))
15
+ .addOption(new Option('-p, --hsync-password <url>', 'password to connect to hsync-server').env('HSYNC_SECRET'));
16
+
17
+ program.parse();
18
+
19
+ const options = program.opts();
20
+
21
+ console.log(options);
22
+
23
+ const [defaultCon] = config.connections;
24
+ if (!defaultCon.hsyncServer && !defaultCon.dynamicHost) {
25
+ defaultCon.dynamicHost = config.defaultDynamicHost;
26
+ }
27
+
28
+ config.connections.forEach(async (conConfig) => {
29
+ const con = await createConnection(conConfig);
30
+ console.log('Listening for requests on: ', con.webUrl);
31
+ console.log('Secret: ', con.hsyncSecret);
32
+ console.log('Admin instance at: ', con.webAdmin);
33
+ });
package/config.js CHANGED
@@ -1,10 +1,12 @@
1
1
  const baseConfig = {
2
- hsyncServer: process.env.HSYNC_SERVER || 'ws://localhost:3101',
2
+ hsyncServer: process.env.HSYNC_SERVER, // something like 'wss://mydevice.mydomain.com'
3
3
  hsyncSecret: process.env.HSYNC_SECRET, // keep it secret, keep it safe!
4
4
  localHost: process.env.LOCAL_HOST || 'localhost', // host of local server
5
5
  port: process.env.PORT || 3000, // port of local server
6
6
  hsyncBase: process.env.HSYNC_BASE || '_hs',
7
- keepalive: parseInt(process.env.HSYNC_KEEP_ALIVE) || 60,
7
+ keepalive: parseInt(process.env.HSYNC_KEEP_ALIVE) || 300,
8
+ dynamicHost: process.env.HSYNC_DYNAMIC_HOST,
9
+ defaultDynamicHost: 'https://demo.hsync.tech',
8
10
  };
9
11
 
10
12
 
@@ -23,7 +25,8 @@ keys.forEach((k) => {
23
25
  port: process.env['PORT_' + name] || baseConfig.port,
24
26
  hsyncBase: process.env['HSYNC_BASE_' + name] || baseConfig.hsyncBase,
25
27
  keepalive: parseInt(process.env['HSYNC_KEEP_ALIVE_' + name]) || baseConfig.keepalive,
26
- })
28
+ dynamicHost: process.env['HSYNC_DYNAMIC_HOST_' + name],
29
+ });
27
30
  }
28
31
  }
29
32
  })
package/connection.js CHANGED
@@ -1,27 +1,61 @@
1
- const mqtt = require('mqtt');
1
+ const fetch = require('isomorphic-fetch');
2
2
  const EventEmitter = require('events').EventEmitter;
3
3
  const b64id = require('b64id');
4
4
  const debug = require('debug')('hsync:info');
5
5
  const debugVerbose = require('debug')('hsync:verbose');
6
6
  const debugError = require('debug')('hsync:error');
7
7
  const { createRPCPeer, createServerReplyPeer } = require('./lib/rpc');
8
- const createWebHandler = require('./lib/web-handler');
9
- const createSocketListenHandler = require('./lib/socket-listen-handler');
8
+ const { createWebHandler, setNet: webSetNet } = require('./lib/web-handler');
9
+ const { createSocketListenHandler, setNet: listenSetNet } = require('./lib/socket-listen-handler');
10
10
 
11
11
  debug.color = 3;
12
12
  debugVerbose.color = 2;
13
13
  debugError.color = 1;
14
14
 
15
- function createHsync(config) {
16
- const {
15
+ let mqtt;
16
+
17
+ function setNet(netImpl) {
18
+ webSetNet(netImpl);
19
+ listenSetNet(netImpl);
20
+ }
21
+
22
+ function setMqtt(mqttImpl) {
23
+ mqtt = mqttImpl;
24
+ }
25
+
26
+ async function createHsync(config) {
27
+ let {
17
28
  hsyncServer,
18
29
  hsyncSecret,
19
30
  localHost,
20
31
  port,
21
32
  hsyncBase,
22
- keepalive
33
+ keepalive,
34
+ dynamicHost,
23
35
  } = config;
24
36
 
37
+ let dynamicTimeout;
38
+
39
+ if (dynamicHost) {
40
+ const options = {
41
+ headers: {
42
+ 'Content-Type': 'application/json',
43
+ },
44
+ method: 'POST',
45
+ body: '{}',
46
+ };
47
+ const resp = await fetch(`${dynamicHost}/${hsyncBase}/dyn`, options);
48
+ const result = await resp.json();
49
+ // console.log('resutl', result);
50
+ if (dynamicHost.toLowerCase().startsWith('https')) {
51
+ hsyncServer = `wss://${result.url}`;
52
+ } else {
53
+ hsyncServer = `ws://${result.url}`;
54
+ }
55
+ hsyncSecret = result.secret;
56
+ dynamicTimeout = result.timeout;
57
+ }
58
+
25
59
  const hsyncClient = {};
26
60
  hsyncClient.config = config;
27
61
  const peers = {};
@@ -53,7 +87,11 @@ function createHsync(config) {
53
87
  });
54
88
 
55
89
  mqConn.on('error', (error) => {
56
- debugError('error on mqConn', myHostName, error);
90
+ debugError('error on mqConn', myHostName, error.code, error);
91
+ if ((error.code === 4) || (error.code === 5)) {
92
+ debug('ending');
93
+ mqConn.end();
94
+ }
57
95
  });
58
96
 
59
97
  mqConn.on('message', (topic, message) => {
@@ -180,10 +218,21 @@ function createHsync(config) {
180
218
  hsyncClient.serverReplyMethods = serverReplyMethods;
181
219
  hsyncClient.getPeer = getPeer;
182
220
  hsyncClient.peerMethods = peerMethods;
221
+ hsyncClient.hsyncSecret = hsyncSecret;
222
+ hsyncClient.hsyncServer = hsyncServer;
223
+ hsyncClient.dynamicTimeout = dynamicTimeout;
224
+ if (hsyncServer.toLowerCase().startsWith('wss://')) {
225
+ hsyncClient.webUrl = `https://${myHostName}`;
226
+ } else {
227
+ hsyncClient.webUrl = `https://${myHostName}`;
228
+ }
229
+ hsyncClient.webAdmin = `${hsyncClient.webUrl}/${hsyncBase}/admin`;
183
230
 
184
231
  return hsyncClient;
185
232
  }
186
233
 
187
234
  module.exports = {
188
235
  createHsync,
236
+ setNet,
237
+ setMqtt,
189
238
  };
package/dev_dynamic.sh ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+
3
+ export DEBUG="hsync*,errors*";
4
+
5
+ export HSYNC_DYNAMIC_HOST="https://foo.hsync.tech";
6
+
7
+
@@ -0,0 +1,8 @@
1
+ #!/bin/bash
2
+
3
+ export DEBUG="hsync*,errors*";
4
+
5
+ export HSYNC_SECRET="f7glV4m_REeimy_TdwjM4w"
6
+
7
+ export HSYNC_SERVER="wss://luis-stripe.shiv.to"
8
+ export PORT="3021"
package/hsync-web.js ADDED
@@ -0,0 +1,56 @@
1
+ const mqtt = require('precompiled-mqtt');
2
+ const buffer = require('buffer');
3
+ const net = require('net-web');
4
+ const { createHsync, setNet, setMqtt } = require('./connection');
5
+ const config = require('./config');
6
+
7
+ // TODO need to make this work with web/service workers
8
+ window.Buffer = buffer.Buffer;
9
+
10
+ setNet(net);
11
+ setMqtt(mqtt);
12
+
13
+ async function dynamicConnect(dynamicHost, useLocalStorage) {
14
+ let con;
15
+ if (useLocalStorage) {
16
+ const localConfigStr = localStorage.getItem('hsyncConfig');
17
+ if (localConfigStr) {
18
+ const localConfig = JSON.parse(localConfigStr);
19
+ if ((Date.now() - localConfig.created) < (localConfig.timeout * 0.66)) {
20
+ config.hsyncSecret = localConfig.hsyncSecret;
21
+ config.hsyncServer = localConfig.hsyncServer;
22
+ }
23
+ }
24
+
25
+ if (!config.hsyncSecret) {
26
+ config.dynamicHost = dynamicHost || config.defaultDynamicHost;
27
+ }
28
+
29
+ con = await createHsync(config);
30
+
31
+ if (config.dynamicHost) {
32
+ const storeConfig = {
33
+ hsyncSecret: con.hsyncSecret,
34
+ hsyncServer: con.hsyncServer,
35
+ timeout: con.dynamicTimeout,
36
+ created: Date.now(),
37
+ };
38
+ localStorage.setItem('hsyncConfig', JSON.stringify(storeConfig));
39
+ }
40
+
41
+ return con;
42
+ }
43
+
44
+ config.dynamicHost = dynamicHost || config.defaultDynamicHost;
45
+ con = await createHsync(config);
46
+
47
+ return con;
48
+
49
+ }
50
+
51
+ module.exports = {
52
+ createConnection: createHsync,
53
+ dynamicConnect,
54
+ net,
55
+ config,
56
+ };
package/hsync.js ADDED
@@ -0,0 +1,23 @@
1
+ const net = require('net');
2
+ const mqtt = require('mqtt');
3
+ const { createHsync, setNet, setMqtt } = require('./connection');
4
+ const config = require('./config');
5
+
6
+ setNet(net);
7
+ setMqtt(mqtt);
8
+
9
+ async function dynamicConnect(dynamicHost) {
10
+ let con;
11
+
12
+ config.dynamicHost = dynamicHost || config.defaultDynamicHost;
13
+ con = await createHsync(config);
14
+
15
+ return con;
16
+ }
17
+
18
+ module.exports = {
19
+ createConnection: createHsync,
20
+ dynamicConnect,
21
+ config,
22
+ };
23
+
package/index.js CHANGED
@@ -1,7 +1,11 @@
1
-
2
1
  const config = require('./config');
3
- const { createHsync } = require('./connection');
2
+ const { createConnection } = require('./hsync');
3
+
4
+ const [defaultCon] = config.connections;
5
+ if (!defaultCon.hsyncServer && !defaultCon.dynamicHost) {
6
+ defaultCon.dynamicHost = config.defaultDynamicHost;
7
+ }
4
8
 
5
9
  config.connections.forEach((conConfig) => {
6
- const con = createHsync(conConfig);
7
- });
10
+ const con = createConnection(conConfig);
11
+ });
@@ -1,12 +1,16 @@
1
- const net = require('net');
2
1
  const debug = require('debug')('hsync:listener');
3
2
  const debugError = require('debug')('hsync:error');
4
3
 
5
4
  const { createRPCPeer } = require('./rpc');
6
5
 
7
6
  debugError.color = 1;
7
+ let net;
8
8
 
9
- function createHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
9
+ function setNet(netImpl) {
10
+ net = netImpl;
11
+ }
12
+
13
+ function createSocketListenHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
10
14
  debug('creating handler', hostName, port, targetPort, targetHost);
11
15
 
12
16
  const sockets = {};
@@ -63,7 +67,6 @@ function createHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
63
67
  socket.end();
64
68
  }
65
69
 
66
-
67
70
  });
68
71
 
69
72
  socketServer.listen(port);
@@ -89,4 +92,7 @@ function createHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
89
92
  };
90
93
  }
91
94
 
92
- module.exports = createHandler;
95
+ module.exports = {
96
+ createSocketListenHandler,
97
+ setNet,
98
+ };
@@ -1,4 +1,3 @@
1
- const net = require('net');
2
1
  const debug = require('debug')('hsync:relay');
3
2
  const debugError = require('debug')('hsync:error');
4
3
 
@@ -6,13 +5,19 @@ const { createRPCPeer } = require('./rpc');
6
5
 
7
6
  debugError.color = 1;
8
7
 
8
+ let net;
9
+
10
+ function setNet(netImpl) {
11
+ net = netImpl;
12
+ }
13
+
9
14
  function createHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
10
15
 
11
16
  const sockets = {};
12
17
 
13
18
  const peer = createRPCPeer({hostName, hsyncClient});
14
19
 
15
- const socketServer = net.createServer((socket) => {
20
+ const socketServer = net.createServer(async (socket) => {
16
21
 
17
22
  socket.socketId = b64id.generateId();
18
23
  sockets[socket.socketId] = socket;
@@ -85,4 +90,7 @@ function createHandler({hostName, port, targetPort, targetHost, hsyncClient}) {
85
90
  };
86
91
  }
87
92
 
88
- module.exports = createHandler;
93
+ module.exports = {
94
+ createHandler,
95
+ setNet,
96
+ };
@@ -1,10 +1,15 @@
1
- const net = require('net');
2
1
  const debug = require('debug')('hsync:web');
3
2
  const debugError = require('debug')('hsync:error');
4
3
 
5
4
  debugError.color = 1;
6
5
 
7
- function createHanlder({myHostName, localHost, port, mqConn}) {
6
+ let net;
7
+
8
+ function setNet(netImpl) {
9
+ net = netImpl;
10
+ }
11
+
12
+ function createWebHandler({myHostName, localHost, port, mqConn}) {
8
13
 
9
14
  const sockets = {};
10
15
 
@@ -26,11 +31,6 @@ function createHanlder({myHostName, localHost, port, mqConn}) {
26
31
  socket = new net.Socket();
27
32
  socket.socketId = socketId;
28
33
  sockets[socketId] = socket;
29
- socket.connect(port, localHost, () => {
30
- debug(`\nCONNECTED TO ${localHost}:${port}`, socket.socketId);
31
- debug('← ' + message.slice(0, 200).toString().split('\r\n')[0], message.length);
32
- socket.write(message);
33
- });
34
34
  socket.on('data', (data) => {
35
35
  if (!socket.dataRecieved) {
36
36
  const logData = data.slice(0, 200).toString().split('\r\n')[0];
@@ -51,6 +51,11 @@ function createHanlder({myHostName, localHost, port, mqConn}) {
51
51
  delete sockets[socket.socketId];
52
52
  debugError('error connecting', localHost, port, err);
53
53
  });
54
+ socket.connect(port, localHost, () => {
55
+ debug(`\nCONNECTED TO ${localHost}:${port}`, socket.socketId);
56
+ debug('← ' + message.slice(0, 200).toString().split('\r\n')[0], message.length);
57
+ socket.write(message);
58
+ });
54
59
  return;
55
60
  }
56
61
 
@@ -80,4 +85,7 @@ function createHanlder({myHostName, localHost, port, mqConn}) {
80
85
  };
81
86
  }
82
87
 
83
- module.exports = createHanlder;
88
+ module.exports = {
89
+ createWebHandler,
90
+ setNet,
91
+ };
package/lib/web-net.js ADDED
@@ -0,0 +1,67 @@
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
+ console.log('server.listen', port);
39
+ listeners['l' + port] = server;
40
+ events.on('socket_connect_' + port, ({ clientSocket, clientCallback }) => {
41
+ console.log('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
+ };
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "hsync",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "client for hsync-server",
5
- "main": "index.js",
5
+ "main": "hsync.js",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1",
8
8
  "dev": "nodemon --inspect index.js",
@@ -19,15 +19,26 @@
19
19
  "websocket",
20
20
  "mqtt"
21
21
  ],
22
+ "browser": {
23
+ "./hsync": "./hsync-web"
24
+ },
25
+ "bin": {
26
+ "hsync": "./cli.js"
27
+ },
22
28
  "author": "Luis Montes",
23
29
  "license": "ISC",
24
30
  "dependencies": {
25
31
  "b64id": "^1.0.0",
32
+ "buffer": "^6.0.3",
33
+ "commander": "^10.0.0",
26
34
  "debug": "^4.3.1",
35
+ "isomorphic-fetch": "^3.0.0",
27
36
  "mqtt": "^4.2.6",
37
+ "net-web": "^0.2.0",
38
+ "precompiled-mqtt": "^4.3.14-beta",
28
39
  "rawr": "^0.14.0"
29
40
  },
30
41
  "devDependencies": {
31
- "nodemon": "^2.0.7"
42
+ "nodemon": "^2.0.20"
32
43
  }
33
44
  }
package/dev_keys2.sh DELETED
@@ -1,19 +0,0 @@
1
- #!/bin/bash
2
-
3
- export DEBUG="hsync*,errors*";
4
-
5
- export HSYNC_SECRET="PbqfT7DATIatgizQ5PGKvg"
6
-
7
- export HSYNC_SERVER="wss://aaron-provider.shiv.to"
8
- export PORT="3000"
9
-
10
- export HSYNC_SERVER_API="wss://aaron-api.shiv.to"
11
- export PORT_API="3001"
12
-
13
-
14
- export HSYNC_SERVER_PATIENT="wss://aaron-patient.shiv.to"
15
- export PORT_PATIENT="3010"
16
-
17
-
18
-
19
-