Open Tarosweet opened 1 year ago
When I use this function, I try to send a heartbeat to the client, but the following usage does not work:
const http = require('http'); const StompServer = require('stomp-broker-js'); // const node_static = require('node-static'); // const static_directory = new node_static.Server(__dirname); const server = http.createServer((request, response) => { console.log(request.url); response.writeHead(200, { 'Access-Control-Allow-Origin': 'http://localhost:8080', 'Access-Control-Allow-Credentials': 'true', // 'Content-Type': 'text/event-stream' }); response.end('end') // static_directory.serve(request, response); }); const stompServer = new StompServer({ server: server, debug: console.log, path: '/stomp', protocol: 'sockjs', heartbeat: [20000, 20000] }); console.log(' [*] Listening on 0.0.0.0:9999'); server.listen(9999, 'localhost'); stompServer.heartbeatOn(stompServer, 20000, true) stompServer.subscribe("/subscribe", (msg, headers) => { var topic = headers.destination; console.log(`topic:${topic} messageType: ${typeof msg}`, msg, headers); stompServer.send('/subscribe', headers, `Hello from server! ${msg}`); });
Modify the source code, print the parameters of the heartbeaton function and find that it is called elsewhere,which set serverside paramter to 'false'
this.heartbeatOn = function (socket, interval, serverSide) { var self = this; console.log('###', socket, interval, serverSide) if (serverSide) { // Server takes responsibility for sending pings // Client should close connection on timeout socket.heartbeatClock = setInterval(function() { if(socket.readyState === 1) { self.conf.debug('PING'); socket.send(BYTES.LF); } }, interval); } else { // Client takes responsibility for sending pings // Server should close connection on timeout socket.heartbeatTime = Date.now() + interval; socket.heartbeatClock = setInterval(function() { var diff = Date.now() - socket.heartbeatTime; if (diff > interval + self.conf.heartbeatErrorMargin) { self.conf.debug('HEALTH CHECK failed! Closing', diff, interval); socket.close(); } else { self.conf.debug('HEALTH CHECK ok!', diff, interval); socket.heartbeatTime -= diff; } }, interval); } };
What the console prints is
### { on: [Function: on], send: [Function: send], close: [Function: close], sessionId: 'idxx' } 20000 false
But I found the call in other places, which is:
function FrameHandler(stompServer) { this.CONNECT = function (socket, frame) { // setup heart-beat feature var rawHeartbeat = frame.headers['heart-beat']; var clientHeartbeat = [0, 0]; if (rawHeartbeat) { clientHeartbeat = rawHeartbeat.split(',').map(function(x) { return parseInt(x); }); } // default server heart-beat answer var serverHeartbeat = [0, 0]; // check preferred heart-beat direction: client → server if (clientHeartbeat[0] > 0 && stompServer.conf.heartbeat[1] > 0) { serverHeartbeat[1] = Math.max(clientHeartbeat[0], stompServer.conf.heartbeat[1]); stompServer.heartbeatOn(socket, serverHeartbeat[1], true); } // check non-preferred heart-beat direction: server → client else if (clientHeartbeat[1] > 0 && stompServer.conf.heartbeat[0] > 0) { serverHeartbeat[0] = Math.max(clientHeartbeat[1], stompServer.conf.heartbeat[0]); stompServer.heartbeatOn(socket, serverHeartbeat[0], true); } if (stompServer.onClientConnected(socket, { heartbeat: clientHeartbeat, headers: frame.headers })) { ServerFrame.CONNECTED(socket, serverHeartbeat.join(','), stompServer.conf.serverName); } else { ServerFrame.ERROR(socket, 'CONNECTION ERROR', 'CONNECTION ERROR'); } };
Besides modifying the source code, is there any other way to send a heartbeat to the client?
When I use this function, I try to send a heartbeat to the client, but the following usage does not work:
Modify the source code, print the parameters of the heartbeaton function and find that it is called elsewhere,which set serverside paramter to 'false'
What the console prints is
But I found the call in other places, which is:
Besides modifying the source code, is there any other way to send a heartbeat to the client?