Sente is a small client+server library that makes it easy to build realtime web applications with Clojure + ClojureScript.
Loosely inspired by Socket.IO, it uses core.async, WebSockets, and Ajax under the hood to provide a simple high-level API that enables reliable, high-performance, bidirectional communications.
Sen-te (先手) is a Japanese Go term used to describe a play with such an overwhelming follow-up that it demands an immediate response, leaving its player with the initiative.
See here for earlier releases.
- Bidirectional a/sync comms over WebSockets with auto Ajax fallback
- It just works: auto keep-alive, buffering, protocol selection, reconnects
- Efficient design with auto event batching for low-bandwidth use, even over Ajax
- Send arbitrary Clojure vals over edn or Transit (JSON, MessagePack, etc.)
- Tiny, easy-to-use API
- Support for users simultaneously connected with multiple clients and/or devices
- Realtime info on which users are connected, and over which protocols
- Standard Ring security model: auth as you like, HTTPS when available, CSRF support, etc.
- Support for several popular web servers, easily extended to other servers.
|Protocol||client>server||client>server + ack/reply||server>user push|
|WebSockets||✓ (native)||✓ (emulated)||✓ (native)|
|Ajax||✓ (emulated)||✓ (native)||✓ (emulated)|
So you can ignore the underlying protocol and deal directly with Sente's unified API that exposes the best of both WebSockets (bidirectionality + performance) and Ajax (optional ack/reply).
You can help support continued work on this project, thank you!! 🙏