The Tech Platform

Nov 9, 20212 min

Node.js Server-Sent Events with Total.js framework

With the Total.js framework, you can create an HTTP route for Server-Sent Events, or you can connect easily to another server with implemented Server-Sent Events.

Route for Server-Sent Events

Server-side implementation:

exports.install = function() {
 
ROUTE('GET /sse/', serversentevents, ['sse']);
 
};
 
function serversentevents() {
 
var self = this;
 
var lasteventid = self.sseID || '0';
 
var counter = U.parseInt(lasteventid);
 
var indexer = 0; var interval = setInterval(function() {
 
// Closes client after 10 seconds
 
if (indexer++ > 10) {
 
self.close();
 
clearInterval(interval);
 
} else {
 
// Sends data to the client
 
if (!self.sse({ counter: counter++, message: GUID() }, null, counter)) {
 
// Something wrong
 
// Client closed
 
clearInterval(interval);
 
}
 
} }, 1000);
 
}

Client-side (web browser) implementation:

var sse = new EventSource('/sse/');
 
sse.onmessage = function(ev)
 
{
 
// A message
 
console.log('Message:', ev.data);
 
};
 
sse.onerror = function(e) {
 
// Some error
 
console.log('Error:', e);
 
};

Capture Server-Sent Events on the server-side

With the Total.js framework is very easy to handle messages from another server with implemented Server-Sent Events functionality. For example, the code below captures messages from another HTTP server:

var opt = {};
 
opt.url = 'http://127.0.0.1:8000/sse/';
 
opt.custom = true;
 
opt.headers = { accept: 'text/event-stream' };
 
opt.timeout = 0;
 
opt.callback = function(err, response)
 
{
 
response.stream.on('data', U.streamer('\n\n', function(chunk)
 
{
 
var lines = chunk.toString('utf8').split('\n');
 
var msg = {}; // Server sent events parser
 
for (var line of lines) {
 
var index = line ? line.indexOf(':') : -1;
 
if (index !== -1) {
 
var key = line.substring(0, index);
 
var val = line.substring(index + 2);
 
switch (key) {
 
case 'data':
 
val = val.parseJSON();
 
break;
 
case 'retry':
 
val = +val;
 
break;
 
}
 
msg[key] = val;
 
}
 
}
 
// msg.id {String}
 
// msg.data {Object}
 
// msg.retry {Number}
 
// msg.event {String}
 

 
console.log(msg);
 
}));
 
};
 

 
REQUEST(opt);

Source: Medium - Peter Širka

The Tech Platform

www.thetechplatform.com

    0