@yousolution/node-red-contrib-you-tunnel-websocket 1.1.0 → 1.1.2

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/CHANGELOG.md ADDED
@@ -0,0 +1,82 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ---
9
+
10
+ ## [1.1.2] - 2026-05-04
11
+
12
+ ### Fixed
13
+ - Add proper cleanup of existing server on port before starting
14
+ - Replace console.log/warn/error with proper logger
15
+ - Improve error handling during server start/stop
16
+
17
+ ### Changed
18
+ - Update @remotelinker/reverse-ws-tunnel from ^1.0.10 to ^1.0.11
19
+ - Add log context for each tunnel node
20
+
21
+ ---
22
+
23
+ ## [1.1.1] - 2025-??-??
24
+
25
+ ### Changed
26
+ - Update @remotelinker/reverse-ws-tunnel from ^1.0.9 to ^1.0.10
27
+
28
+ ---
29
+
30
+ ## [1.1.0] - 2025-??-??
31
+
32
+ ### Fixed
33
+ - Fix server configuration issues
34
+
35
+ ### Changed
36
+ - Disable wstunnel client node temporarily
37
+ - Switch from local/beta package to published reverse-ws-tunnel package
38
+
39
+ ### Documentation
40
+ - Update README to match current codebase
41
+
42
+ ---
43
+
44
+ ## [1.0.1-dev-3] - 2025-??-??
45
+
46
+ ### Added
47
+ - Initial wstunnel client node for reverse WebSocket tunneling
48
+
49
+ ### Changed
50
+ - Update version to 1.0.1-dev-3
51
+ - Update dependencies
52
+ - Improve documentation
53
+ - Disable wstunnel client node
54
+
55
+ ---
56
+
57
+ ## [1.0.1] - 2025-??-??
58
+
59
+ ### Added
60
+ - Add configurable log level dropdown in wstunnel configuration (trace, debug, info, warning, error)
61
+
62
+ ### Fixed
63
+ - Remove old connections when redeploying flows
64
+
65
+ ### Changed
66
+ - First release with reverse tunnel functionality
67
+
68
+ ---
69
+
70
+ ## [1.0.0] - 2025-??-??
71
+
72
+ ### Added
73
+ - Initial release with WebSocket tunnel support
74
+ - MSSQL integration
75
+
76
+ ---
77
+
78
+ [1.1.2]: https://github.com/yousolution-cloud/node-red-contrib-you-tunnel-websocket/compare/v1.1.1...v1.1.2
79
+ [1.1.1]: https://github.com/yousolution-cloud/node-red-contrib-you-tunnel-websocket/compare/v1.1.0...v1.1.1
80
+ [1.1.0]: https://github.com/yousolution-cloud/node-red-contrib-you-tunnel-websocket/compare/v1.0.1...v1.1.0
81
+ [1.0.1]: https://github.com/yousolution-cloud/node-red-contrib-you-tunnel-websocket/compare/v1.0.0...v1.0.1
82
+ [1.0.0]: https://github.com/yousolution-cloud/node-red-contrib-you-tunnel-websocket/tree/v1.0.0
package/nodes/wsTunnel.js CHANGED
@@ -13,9 +13,8 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  **/
16
-
17
- const { startWebSocketServer } = require('@remotelinker/reverse-ws-tunnel/server');
18
- const { setLogLevel } = require('@remotelinker/reverse-ws-tunnel/utils');
16
+ const { startWebSocketServer, stopWebSocketServer } = require('@remotelinker/reverse-ws-tunnel/server');
17
+ const { logger, setLogContext, setLogLevel } = require('@remotelinker/reverse-ws-tunnel/utils');
19
18
 
20
19
  const instances = {};
21
20
 
@@ -45,66 +44,63 @@ module.exports = function (RED) {
45
44
 
46
45
  // Set the log level dynamically based on configuration
47
46
  const logLevel = node.tunnelConfig.options.logLevel || 'info';
47
+ setLogContext('TunnelNode-' + node.tunnelConfig.options.name);
48
48
  setLogLevel(logLevel);
49
49
 
50
50
  node.status({ fill: 'red', shape: 'ring', text: 'disconnected' });
51
-
52
51
  const port = node.tunnelConfig.options.port;
53
52
  const host = node.tunnelConfig.options.host ? '' : undefined;
54
53
  const path = node.tunnelConfig.options.path ? '' : undefined;
55
54
  const tunnelIdHeaderName = node.tunnelConfig.options.tunnelIdHeaderName;
56
-
57
- instances[id] = instances[id] || { state: {} };
58
-
59
- if (instances[id].state[port]) {
60
- console.warn(`Server already running on port ${port} for node ${id}. Skipping creation.`);
61
- node.status({
62
- fill: 'green',
63
- shape: 'dot',
64
- text: `listening on port ${port}`,
55
+ instances[id] = instances[id] || {};
56
+ // Cleanup any existing server on this port before starting
57
+ // This handles cases where previous deployment didn't cleanup properly
58
+ stopWebSocketServer(port)
59
+ .then(() => {
60
+ logger.info(`Cleaned up any existing server on port ${port} before starting`);
61
+ return startWebSocketServer({
62
+ port,
63
+ host,
64
+ path,
65
+ tunnelIdHeaderName,
66
+ });
67
+ })
68
+ .then((state) => {
69
+ instances[id].state = state;
70
+ logger.info(`Started WebSocketServer for node ${id} on port ${port}`);
71
+ if (instances[id].state[port].webSocketServer) {
72
+ onListening();
73
+ }
74
+ })
75
+ .catch((err) => {
76
+ logger.error(`Error starting WebSocketServer on port ${port}:`, err);
77
+ node.status({
78
+ fill: 'red',
79
+ shape: 'dot',
80
+ text: `error: ${err.message}`,
81
+ });
65
82
  });
66
- return;
67
- }
68
-
69
- instances[id].state = startWebSocketServer({
70
- port,
71
- host,
72
- path,
73
- tunnelIdHeaderName,
74
- });
75
-
76
- console.log(`Started WebSocketServer for node ${id} on port ${port}`);
77
-
78
- if (instances[id].state[port].webSocketServer) {
79
- onListening();
80
- }
81
-
82
83
  function onListening() {
83
84
  const server = instances[id].state[port].webSocketServer;
84
-
85
85
  server.on('listening', () => {
86
- console.log('Listening ' + id);
86
+ logger.info('Listening ' + id);
87
87
  node.status({
88
88
  fill: 'green',
89
89
  shape: 'dot',
90
90
  text: `listening on port ${port}`,
91
91
  });
92
92
  });
93
-
94
93
  server.on('connection', (ws) => {
95
94
  const clientAddress = ws._socket.remoteAddress;
96
95
  const clientPort = ws._socket.remotePort;
97
96
  const totalClients = server.clients.size;
98
-
99
97
  node.status({
100
98
  fill: 'green',
101
99
  shape: 'dot',
102
100
  text: `clients ${totalClients}`,
103
101
  });
104
-
105
- console.log(`WebSocket connection from ${clientAddress}:${clientPort}`);
106
- console.log(`Total connected clients: ${totalClients}`);
107
-
102
+ logger.info(`WebSocket connection from ${clientAddress}:${clientPort}`);
103
+ logger.info(`Total connected clients: ${totalClients}`);
108
104
  ws.on('close', () => {
109
105
  const remainingClients = server.clients.size;
110
106
  node.status({
@@ -112,45 +108,31 @@ module.exports = function (RED) {
112
108
  shape: 'dot',
113
109
  text: `clients ${remainingClients}`,
114
110
  });
115
- console.log(`Client disconnected: ${clientAddress}:${clientPort}`);
116
- console.log(`Remaining clients: ${remainingClients}`);
111
+ logger.info(`Client disconnected: ${clientAddress}:${clientPort}`);
112
+ logger.info(`Remaining clients: ${remainingClients}`);
117
113
  });
118
114
  });
119
115
  }
120
-
121
116
  this.on('close', function (removed, done) {
122
- if (instances[id] && instances[id].state && instances[id].state[port]) {
123
- const server = instances[id].state[port].webSocketServer;
124
- if (server) {
125
- try {
126
- for (const client of server.clients) {
127
- try {
128
- client.removeAllListeners();
129
- client.close();
130
- } catch (clientErr) {
131
- console.error(`Error terminating client on port ${port}:`, clientErr);
132
- }
133
- }
117
+ logger.info(`[DEBUG] Close called for node ${id}, removed=${removed}`);
134
118
 
135
- server.close(() => {
136
- console.log(`Closed WebSocketServer on port ${port} during node shutdown`);
137
- });
138
- } catch (err) {
139
- console.error(`Error closing WebSocketServer on port ${port}:`, err);
140
- }
141
- }
142
-
143
- delete instances[id].state[port];
144
-
145
- // Se non ci sono più porte attive per questo nodo, cancella del tutto
146
- if (Object.keys(instances[id].state).length === 0) {
147
- delete instances[id];
148
- }
119
+ if (instances[id] && instances[id].state && instances[id].state[port]) {
120
+ stopWebSocketServer(port)
121
+ .then(() => {
122
+ logger.info(`Cleaned up WebSocketServer on port ${port} for node ${id}`);
123
+ delete instances[id];
124
+ done();
125
+ })
126
+ .catch((err) => {
127
+ console.error(`Error stopping server on port ${port}:`, err);
128
+ delete instances[id];
129
+ done();
130
+ });
131
+ } else {
132
+ logger.info(`No server state found for node ${id} on port ${port}`);
133
+ done();
149
134
  }
150
-
151
- done();
152
135
  });
153
136
  }
154
-
155
137
  RED.nodes.registerType('wstunnel server', WSTunnelServer);
156
138
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yousolution/node-red-contrib-you-tunnel-websocket",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Module to create websockeet tunnel for NODE-RED",
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -23,7 +23,7 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@remotelinker/reverse-ws-tunnel": "^1.0.7",
26
+ "@remotelinker/reverse-ws-tunnel": "^1.0.11",
27
27
  "cookie": "^1.0.2",
28
28
  "cross-conf-env": "^1.3.0",
29
29
  "dotenv": "^17.2.1",