# clj-browserchannel Cross-browser compatible, real-time, bi-directional communication between ClojureScript and Clojure using Google Closure BrowserChannel. From the [Google Closure API][1]: > A BrowserChannel simulates a bidirectional socket over HTTP. > It is the basis of the Gmail Chat IM connections to the server. The JavaScript API of BrowserChannel is open-source and part of the Google Closure library. The server component is not, as is noted in the Google Closure book ("Closure: The Definitive Guide by Michael Bolin"). [1]: https://google.github.io/closure-library/api/source/closure/goog/net/browserchannel.js.src.html ## Usage This project is comprised of multiple libraries. You'll need to include two of them in your projects. [clj-browserchannel][2] is the main library containing both the server- and client-side functionality you'll use in your web apps. In order to use the server implementation of BrowserChannel you'll need to use one of the async adapters. Currently the provided options are: * [clj-browserchannel-jetty-adapter][3] * [clj-browserchannel-immutant-adapter][4] [2]: https://github.com/gered/clj-browserchannel/tree/master/clj-browserchannel [3]: https://github.com/gered/clj-browserchannel/tree/master/clj-browserchannel-jetty-adapter [4]: https://github.com/gered/clj-browserchannel/tree/master/clj-browserchannel-immutant-adapter You can find more information on usage of all of these components by following any of the above links to them. ## Demo The [chat-demo][5] application is an example chat application using a client-side and server-side implementation for BrowserChannel written in Clojure/ClojureScript. The server component is for BrowserChannel version 8. The client component serves as a wrapper over `goog.net.BrowserChannel` which also currently implements version 8 of the protocol. [5]: https://github.com/gered/clj-browserchannel/tree/master/chat-demo The chat-demo web app runs in at least: * Chrome * Firefox * Internet Explorer 5.5+ (!!) * Android browser * Others ## Related and alternative frameworks * Websockets - Websockets solve the same problems as BrowserChannel, however BrowserChannel works on almost all existing clients. Websockets ultimately replaces BrowserChannel. * socket.io - [socket.io][6] provides a similar api as BrowserChannel on top of many transport protocols, including websockets. BrowserChannel only has two transport protocols: XHR and forever frames (for IE) in streaming and non-streaming mode. [6]: http://socket.io ## Other BrowserChannel implementations Many thanks to these authors, their work is the only open-source documentation on the BrowserChannel protocol. * [libevent-browserchannel-server][libevent] in C++ by Andy Hochhaus - Has the most extensive documentation on the BrowserChannel protocol (dead project?). See the protocol documentation on [archive.org][libevent-doc]. * [browserchannel][ruby] in Ruby by David Turnbull (dead project?) * [node-browserchannel][node] in Node.js/Javascript by Joseph Gentle [libevent]: http://code.google.com/p/libevent-browserchannel-server [libevent-doc]: http://web.archive.org/web/20121226064550/http://code.google.com/p/libevent-browserchannel-server/wiki/BrowserChannelProtocol [ruby]: https://github.com/dturnbull/browserchannel [node]: https://github.com/josephg/node-browserchannel ## About Written by: Gijs Stuurman / [@thegeez](http://twitter.com/thegeez) / [Blog](http://thegeez.github.com) / [GitHub](https://github.com/thegeez) Many updates in this fork by: Gered King / [@geredking](http://twitter.com/geredking) / [GitHub](https://github.com/gered) ### License Copyright (c) 2012 Gijs Stuurman and released under an MIT license.