TheSalarKhan / node-sse-server

SSE Microservice, Nodejs based, Non-Blocking, PubSub

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

This is a microservice meant for streaming data via SSE. It uses the PUB/SUB pattern.

For an explanation of SSE watch this video: https://www.youtube.com/watch?v=71hId_-Iwqc

One can poteltially also use this as an online presence microservice, as the server keeps a list of connected clients, we can choose to stream that as another sse endpoint, or we can have a REST api endpoint for querying the information of a certain client, or get a list of all the connected clientIds.

Example

npm install

$ npm i

Start the dev server

$ npm run dev

Subscribe

To subscribe use EventSource object.

<!DOCTYPE html> <html> <body>
	<script type="text/javascript">
		const channelsToSubscribe = ["channel1", "channel2"];
		const source = new EventSource(`http://localhost:9090/subscribe/?channels=${encodeURIComponent(channelsToSubscribe.join(","))}`);

		function _getEventData(event) {
			const data = JSON.parse(event.data);
			const { channelName, type, payload } = data;
			return channelName ? {
				channelName,
				type,
				payload
			} : {
				type,
				payload
			};
		}
		// Fires once on a successful subscription.
		source.addEventListener("registered", (event) => {
			console.log(_getEventData(event));
		});
		// Fires once for every subscribed channel, giving the last
		// published value on that channel or "{}"
		source.addEventListener("lastEvent", (event) => {
			console.log(_getEventData(event));
		});
		// Fires on receiving an event of eventType "message"
		// for a channel.
		source.addEventListener("message", (event) => {
			document.body.innerHTML += event.data + "<br>";
		});
		// Fires on receiving an event of eventType "foo"
		source.addEventListener("foo", (event) => {
			document.body.innerHTML += event.data + "<br>";
		});
		// Fires on receiving an event of eventType "bar"
		source.addEventListener("bar", (event) => {
			document.body.innerHTML += event.data + "<br>";
		});
	</script>
</body> </html>

Publish

To publish do the following post call. We can post to multiple channels with multiple events in a single request. The event listener corresponding to 'eventType' will be fired on all clients connected to the respective channels.

For example this request will fire the following events on channel "channel1": "message", "foo". And it will fire the following events on channel "channel2": "message", "bar".


method:
	POST
url:
	http://localhost:3000/publish
headers:
	'Content-Type': 'application/json'
body:
	{
		"events": [
			{
				"channelName": "channel1",
				"type": "message",
				"payload": "{ \"location\": \"123.44,34.234234\"}"
			},
			{
				"channelName": "channel1",
				"type": "foo",
				"payload": "{ \"message\": \"Hi fooo\"}"
			},
			{
				"channelName": "channel2",
				"type": "message",
				"payload": "{ \"location\": \"123.44,872938.99\"}"
			},
			{
				"channelName": "channel2",
				"type": "bar",
				"payload": "{ \"location\": \"123.44\"}"
			}
		]
	}

TODOS

* Security: Token or Secret based.

About

SSE Microservice, Nodejs based, Non-Blocking, PubSub


Languages

Language:JavaScript 83.2%Language:HTML 14.3%Language:Dockerfile 2.1%Language:Shell 0.4%