Skip to content

Instantly share code, notes, and snippets.

@birowo
Last active November 17, 2016 07:31
Show Gist options
  • Save birowo/afd2bf47556afd2a05baaccd9ca5b9ac to your computer and use it in GitHub Desktop.
Save birowo/afd2bf47556afd2a05baaccd9ca5b9ac to your computer and use it in GitHub Desktop.
server sent event dengan NODE.JS . contoh untuk broadcast message. jalankan >node nodesse di terminal dari path dimana file-file berikut disimpan. coba akses browser: http://localhost di 2/lebih instance browser/client . SSE adalah https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
<html>
<head>
<title></title>
</head>
<body>
<textarea id="daftar" readonly></textarea><br>
<input id="pesan"><br>
<button onclick="kirim()">kirim</button>
<script>
pesan.focus();
function sse(url, callback){
if(window.EventSource){
var sse = new EventSource(url);
sse.onmessage = callback;
}else{
document.body.innerHTML = '';
return alert('tidak support server sent event');
}
}
sse('/sse', function(evt){
daftar.value = evt.data+'\n'+daftar.value;
});
function ajax(method, url, kueri, callback){
try{ var xhr=new XMLHttpRequest();}catch(err){
document.body.innerHTML = '';
return alert('tidak support ajax');
}
xhr.onreadystatechange = function(){
if(4 == xhr.readyState && 200 == xhr.status){
callback&&callback(xhr.responseText);
}
}
if(-1 != 'GET,DELETE'.indexOf(method)){
if(kueri) url += "?"+kueri;
kueri = null;
}
xhr.open(method, url);
kueri&&xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(kueri);
}
function kirim(){
ajax('POST', '/xhr?pesan='+pesan.value);
pesan.value = '';
pesan.focus();
}
</script>
</body>
</html>
'use strict';
const sseres = [];
const fsReadStream = require('fs').createReadStream;
const rute = {
notfound: function(rekues, respon){
respon.writeHead(404, {'Content-Type': 'text/html; charset=UTF-8'});
respon.end('tidak ketemu');
},
'/': function(rekues, respon){
respon.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'});
fsReadStream('nodesse.html').pipe(respon);
},
'/sse': function(rekues, respon){
respon.writeHead(200, {"Content-Type":"text/event-stream", "Cache-Control":"no-cache", "Connection":"keep-alive"});
//respon.write("retry:9999\n\n");
sseres.push(respon);
},
'/xhr': function(rekues, respon){
respon.end();
let len = sseres.length;
while(len){
len--;
if(sseres[len].write){ if(rekues.kueri.pesan) sseres[len].write('data:'+rekues.kueri.pesan+'\n\n');}
else sseres.splice(len, 1);
}
}
}
const urlparse = require('url').parse;
const PORT = 80;
const server = require('http').createServer(function(rekues, respon){
const url = urlparse(rekues.url, true);
rekues.kueri = url.query;
rute[rute.hasOwnProperty(url.pathname)? url.pathname: 'notfound'](rekues, respon);
});
server.timeout = 0; // no timeout
server.listen(PORT);
@birowo
Copy link
Author

birowo commented Nov 16, 2016

nodesse
serpertinya baru chrome browser yang tab network inspect element nya bisa memantau EventStream data. jadi saya cobanya buka 2 instance chrome browser.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment