@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 +82 -0
- package/nodes/wsTunnel.js +51 -69
- package/package.json +2 -2
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 {
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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.
|
|
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.
|
|
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",
|