Skip to content

Latest commit

 

History

History
111 lines (100 loc) · 2.96 KB

README.md

File metadata and controls

111 lines (100 loc) · 2.96 KB

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.