Real time group editor without operational transform.
Without operation transform - WOOT.
woot
Core library for creating real time collaborative documents without Operational transformation (WOOT). This package provides the core logic and data types for building a server capable and handling real time editing with WOOT.
Real time group editors without Operational transformation
Install
$ stack install woot
Test
stack test
Notes:
Haskell server is a passive peer in the process
only needs a remote integration function
https://github.com/kroky/woot/blob/master/src/woot.coffee
https://bitbucket.org/d6y/woot
Example:
Here is a small example of how one would use this library to create a server that keeps an internal WootClient
and updates the client upon request.
Each time the server receives a POST
request with an Operation
in the JSON body, it will apply that operation to a cached WootClient
instance, and then update the cache. This server could easily receive many updates from many other clients, and reliably process the operations.
import Control.Concurrent.STM
import Data.Aeson
import Data.IORef
import Data.Woot
import Network.HTTP.Types.Status
import Network.Wai
import Network.Wai.Handler.Warp
-- ...
-- FromJSON instances for Operation and other necessary types
makeEmptyClient :: IO (IORef WootClient)
makeEmptyClient = newIORef $ makeWootClientEmpty 1
wootApp :: IORef WootClient -> Application
wootApp clientRef req respond = do
body <- requestBody req
let mOperation = decodeStrict body
case mOperation of
Nothing -> return ()
Just operation -> do
client <- readIORef clientRef
let newClient = sendOperation client operation
_ <- writeIORef clientRef newClient
putStrLn $ "Updated Client: " ++ show (wootClientString newClient)
respond $ responseLBS status200 [] "WOOOOT!"
runWootApp :: IO ()
runWootApp = makeEmptyClient >>= run 8000 . wootApp
TODO:
- ci
- docs
- examples.