GUIs - ruby on rails, rico

Richard Cameron camster@REDACTED
Wed Sep 21 14:17:00 CEST 2005


On 19 Sep 2005, at 21:00, bryan rasmussen wrote:

> xmlhttp is an object included with most modern browsers which allows a
> scripting engine implemented in the browser to make asynchronous http
> gets, posts etc. it has the name xmlhttp because microsoft who came up
> with it evidently envisioned it for sending around xml.

One thing I'd love to do would be to build a message passing library  
for javascript built on top the XMLHttpRequest which can communicate  
with a server written in Erlang. The idea would be a sort of analogue  
of what Distel does for Emacs - it fakes up messages and send/receive  
primitives in such a way that you can see them in elisp.

So, typical applications for this library would be web pages which  
dynamically update when information is "pushed" to them. The simplest  
toy example might be a stock ticker which updates when the price of  
the stock actually changes, not just every 60 seconds when the  
javascript on the web page re-polls. A more ambitious example would  
be to implement something like SubEthaEdit <http:// 
www.codingmonkeys.de/subethaedit/> as a pure-web application.  
SubEthaEdit is quite a clever little Mac OS X application which  
allows two users on different machines to simultaneously edit the  
same text file and see the changes appear in real time.

Unfortunately the only way I can think of to get this to work over  
HTTP turns out to be a bit of a hack. Luckily though, Erlang is  
probably ideally placed to cope with the hackiness. Perhaps something  
like this would do the trick:

1) The browser makes an XMLHttpRequest to, say, http://hostname/ 
encrypted_erlang_process_id/receive
2) That request is handled by Yaws which simply sits and waits for  
any erlang message destined for the browser. If nothing arrives  
within a suitably conservative http timeout interval (say 30  
seconds), it returns content back over HTTP to indicate that there  
are no messages. If any messages are pending, it sends them all down  
the socket over HTTP under some suitable encoding.
3) The browser interprets what it gets back from the XMLHttpRequest  
and dispatches javascript events corresponding to the underlying  
Erlang messages. These can handled by the client side javascript. The  
client then re-polls as in step one, but perhaps acknowledging that  
it's received the messages so we can have some sort of reliable  
message delivery system.

Additionally, the client-side "send" operation could work making  
XMLHttpRequest to a separate URL, say http://hostname/ 
encrypted_erlang_process_id/send

So, of course, the hacky bit is trying to turn the HTTP "pull"  
protocol into a "push" protocol by having the browser spending all  
its time sitting with an open socket on port 80 waiting for the  
server to return the next message. Having several thousand open  
sockets (one for each connected client) at once is the sort of thing  
which would utterly kill any apache based server infrastructure, but  
the Yaws propaganda <http://www.sics.se/~joe/apachevsyaws.html>,  
support for /dev/poll and kqueue in Erlang on certain architectures,  
and the whole design of Erlang/OTP indicates that it's probably the  
right tool for this hack.

It just strikes me that message passing is probably the right way of  
thinking when you're trying to build these "AJAX" applications for  
the web, and if you can get over the particularly grim way of trying  
to fit it into existing browsers, it might be quite a nice way of  
working.

Does anyone know if anyone's already implement anything like this?  
Would it even work?

Richard.



More information about the erlang-questions mailing list