I like delivering ZeroMQ content to the browser (I have even written my own little WebSockets server to deliver ZeroMQ-pubsub meessages to my webapp), but I'm not sure I understand what the use for STOMP or NullMQ is, here. Is STOMP just used for to translate some bits to ZeroMQ frame terms and NullMQ used as the WebSockets-to-ZeroMQ broker? Why is this better than https://github.com/tailhook/zerogw?
NullMQ multiplexing protocol is built on top of STOMP. The main advantage of NullMQ is same socket primitives as ZeroMQ, so same patterns and solutions can be built in the browser.
I feel the example I built for our demo is a good one. Here I implemented presence and chat servers to build online chatroom. Servers and clients were initially built in Ruby, to be used in a private network behind firewall. I was then able to re-use client code with minimal changes and port it into JavaScript. This client code gave presence and chat to the browser. So effectively we solved an interesting networking problem once and were able to re-use the solution in two vastly different environments - private networks and the browser, where different authentication, authorization, performance and guarantees requirements apply.
Not that it matters much, but ZeroMQ is written in C++, while exposing "C" only interface, and then additionally there is a C++ binding to this "C" interface, which IMHO is very robust design (C for API is much easier to access from other langs).
You are right, however C bindings in other languages usually look quite ugly and non-idiomatic, but ZeroMQ did great job in that sense and their higher level language bindings are written with language specifics in mind
Jeff and Bulat - this is fascinating and timely. Just this week I've been experimenting with bridging (Apollo) STOMP with https://github.com/wandenberg/nginx-push-stream-module and getting what appears to be similar results. Neat stuff, and I'm half tempted to write an nginx-STOMP bridge to save a few layers of indirection.
Obviously, the LICENSE file wasn't there when I posted my snarky comment. Props to the author for adding one, though, since now I know that I can use this code.