module Network.Eventsourced.Lib (application, serverEvent, createCorsHeaders) where import Control.Concurrent (MVar, putMVar) import System.IO.Error (tryIOError) import Network.Wai (Middleware, Application) import Network.Wai.EventSource (ServerEvent(..), eventSourceAppIO) import Network.Wai.Middleware.AddHeaders (addHeaders) import Blaze.ByteString.Builder.Char8 (fromString) import Data.ByteString.Char8 (pack) import Data.ByteString (ByteString) serverEvent :: Either IOError String -> ServerEvent serverEvent (Left _) = CloseEvent serverEvent (Right s) = ServerEvent Nothing Nothing [ fromString s ] eventFromLine :: MVar () -> IO ServerEvent eventFromLine shutdownMVar = do input <- tryIOError getLine let event = serverEvent input case event of CloseEvent -> do putMVar shutdownMVar () return event _ -> return event createCorsHeaders :: String -> [(ByteString, ByteString)] createCorsHeaders s = [(pack "Access-Control-Allow-Origin", pack s)] addCorsHeaders :: String -> Middleware addCorsHeaders s = addHeaders $ createCorsHeaders s application :: MVar () -> String -> Application application shutdown allowOrigin = do let app = eventSourceAppIO $ eventFromLine shutdown addCorsHeaders allowOrigin app