@sterile frost - SSE is actually simpler and less resource intensive than websockets. Your server should however be serving HTTP/2.
Have a look at this SO answer.
What you'd need to do to continue with this is create a proper service for your streams (notice the private stream array of stream objects created in the controller example. This service is what you'd need to call anywhere in your application to "inject" data into the stream (as the OP of that reply notes) and of course, if you want the reply to be user specific, you'd need to relate the stream id to the user somehow (using the user Id as the stream id maybe? I'll leave that challenge up to you 🙂 ). In other words, you shouldn't need to "swap over" to eventEmitter and back. You pass the streams around and inject data as you need to.
Unlike this scenario where the data would specific to the client, when it's public then should I use a static observable instead of creating a new one on request?
If the SSE connection is for all public pushes of data i.e. all users get the same event at the same time, then of course you don't need to identify a particular stream, but you'd still need the stream object to pass around. You could just change the id to something generic like 'public' and I think you'd need a different controller path. Or, you could just use the same controller path, but you'd need to inject the same data into all streams (so looping through the streams in the stream array, which I'm not certain is the most effective way to do it). I'm new to SSE and even working with events on the backend, so I'm guessing a bit too as I go here. 🙂
Still, I hope I could help.