As an update from my last post about using WebSockets to stream updates to the front-end, instead of just using REST-based polling, I talk a bit about some observations made through this.
In general, this seems to lend itself to thinking about the system in terms of "here are all the variables in scope, when they enter/exit scope, and when their values change", which is simple (especially where their types are all the same, as is the case here) and means that a single back-end projection of this system can created and trivially solve all cases of early or late connection as well as an arbitrary number of connected clients. Not as versatile as something like a full operational transform-based system, but conceptually very simple and small in terms of code written.
While probably not generally-applicable to most client-server applications, it seems to fit well for Cacophony's use-case of essentially being a degenerate desktop app just using the browser to create a portable UI.
Thanks,
Jeff.