How to test

How to use

{-# LANGUAGE OverloadedStrings #-} -- That library uses `Text` pervasively. This pragma permits to use
-- String literal when a Text is needed.
module Main where
import Control.Concurrent.Async (wait)
import Data.Aeson
-- It requires to have `aeson` package installed. Note that EventStore doesn't constraint you to JSON
-- format but putting common use aside, by doing so you'll be able to use some interesting EventStore
-- features like its Complex Event Processing (CEP) capabality.
import Database.EventStore
-- Note that imports 'NonEmpty' data constructor and 'nonEmpty' function from
-- 'Data.List.NonEmpty'.
main :: IO ()
main = do
-- A common pattern with an EventStore connection is to create a single instance only and pass it
-- wherever you need it (it's threadsafe). It's very important to not consider an EventStore connection like
-- its regular SQL counterpart. An EventStore connection will try its best to reconnect
-- automatically to the server if the connection dropped. Of course that behavior can be tuned
-- through some settings.
conn <- connect defaultSettings (Static "127.0.0.1" 1113)
let js = object ["isHaskellTheBest" .= True] -- (.=) comes from Data.Aeson module.
evt = createEvent "programming" Nothing (withJson js)
-- Appends an event to a stream named `languages`.
as <- sendEvent conn (StreamName "languages") anyVersion evt Nothing
-- EventStore interactions are fundamentally asynchronous. Nothing requires you to wait
-- for the completion of an operation, but it's good to know if something went wrong.
_ <- wait as
-- Again, if you decide to `shutdown` an EventStore connection, it means your application is
-- about to terminate.
shutdown conn
-- Make sure the EventStore connection completes every ongoing operation. For instance, if
-- at the moment we call `shutdown` and some operations (or subscriptions) were still pending,
-- the connection aborted all of them.
waitTillClosed conn

Notes

That library was tested on Linux and OSX.

Contributions and bug reports are welcome!

BSD3 License

-Yorick Laupa

Changes

1.2.2

Fix ACL JSON (de)serialization.

Fix rare situation where the user send a command before the connection with the
server is available, causing that operation to be sent only after s_operationTimeout milliseconds.

Fix “thread blocked indefinitely in an STM transaction” error when failed to create a
connection with the server and exceeded the maximun attempt count.

Fix: Cluster connection, in the discovery process using gossip seed, we try for the next seed if the current one is unreachable.

1.2.1

Bump http-client version.

1.2.0

Introduce a type-safe EventNumber setting.

Introduce a type-safe ResolveLink setting.

Support GHC 8.6 but drop GHC < 8.

Refactor Slice api.

Implement a stream-processing interface.

typeful stream id representation.

Uniform batch-read and subscription interface.

1.1.6

Update package metadata information.

1.1.5

Bump aeson version.

1.1.4

Fix compilation on GHC 8.4

1.1.3

Remove text-format dependency.

1.1.2

Aeson bump version.

1.1.1

Fix connection-manager connection reference. The issue was the client was starting
to send requests to server even if the confirmation hasn’t been confirmed yet.

1.1.0

Supports GetEventStore >= 4.0.0 protocol changes.

No longer support GetEventStore < 4.0.0.

Stream versions are Int64.

1.0.0

Support SemVer versioning.

0.15.0.2

Support GHC 8.2.1.

Support Stackage LTS 9.

0.15.0.1

Discard version restriction on hashable library.

0.15.0.0

Overall internal components refactoring.

Decrease memory pressure by 10 folds.

Improve general performance.

Provide proper logging support using fast-logger library.

Support operation timeout detection.

Detects if the server is overwhelmed and act accordingly.

Improve connection management code.

Expose EKG monitoring metrics.

0.14.0.1

Fix subscription deadlock on connection drop.

Fix subscription catchup state tracking on connection drop.

Fix internal connection dispose lock implementation.

Bump aeson version.

0.14.0.0

Fix deadlock issues in subscription code.

Improve cluster connection fiability.

Internal refactoring.

Typeful EventType

0.13.1.7

Report stream name when facing a ‘Stream not found’ error from the server on catchup subscription.

Prevent the driver from deadlocking when asking for catchup subscription on a stream that doesn’t exist.

0.13.1.6

Fix a deadlock on user side when asking a catchup subscription on a stream that doesn’t exist.