packages feed

servant-event-stream 0.3.2.0 → 0.3.2.1

raw patch · 4 files changed

+69/−4 lines, 4 filesdep +hspecdep +servantdep +servant-event-streamPVP ok

version bump matches the API change (PVP)

Dependencies added: hspec, servant, servant-event-stream

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,5 +1,12 @@ # Revision history for servant-event-stream +## 0.3.2.1 -- 2026-02-27++* Add guard space after colon in SSE field encoding. Without it, field values+  starting with a space lost their leading space because the SSE spec strips+  exactly one leading space from field values. (Issue #16)+* Add unit tests for `encodeServerEvent`.+ ## 0.3.2.0 -- 2026-02-23  * Support GHC 8.6 through 9.12 (base 4.12 to 4.21).
servant-event-stream.cabal view
@@ -1,6 +1,6 @@ cabal-version: >=1.10 name: servant-event-stream-version: 0.3.2.0+version: 0.3.2.1 stability: alpha synopsis: Servant support for Server-Sent events category: Servant, Web@@ -51,4 +51,9 @@   main-is: Spec.hs   hs-source-dirs: tests   default-language: Haskell2010-  build-depends: base >=4.12 && <4.22+  build-depends:+    base >=4.12 && <4.22,+    bytestring >=0.11.1.0 && <0.13,+    hspec >=2.7 && <2.12,+    servant >=0.15 && <0.21,+    servant-event-stream
src/Servant/API/EventStream.hs view
@@ -115,7 +115,7 @@     <> mconcat (map (field "data:") (safelines (eventData e)))  where   optional name = maybe mempty (field name)-  field name val = name <> val <> "\n"+  field name val = name <> " " <> val <> "\n"    -- discard CR and split LFs into multiple data values   safelines = C8.lines . C8.filter (/= '\r')
tests/Spec.hs view
@@ -1,2 +1,55 @@+{-# LANGUAGE OverloadedStrings #-}++module Main (main) where++import qualified Data.ByteString.Lazy as LBS+import Data.Proxy (Proxy (..))+import Servant.API.ContentTypes (mimeRender)+import Servant.API.EventStream+import Test.Hspec++render :: ServerEvent -> LBS.ByteString+render = mimeRender (Proxy :: Proxy EventStream)+ main :: IO ()-main = putStrLn "Test suite not yet implemented"+main = hspec $ do+  describe "MimeRender EventStream ServerEvent" $ do+    it "encodes data-only event" $+      render (ServerEvent Nothing Nothing "hello")+        `shouldBe` "data: hello\n"++    it "encodes event with all fields" $+      render (ServerEvent (Just "update") (Just "1") "payload")+        `shouldBe` "event: update\nid: 1\ndata: payload\n"++    it "encodes multi-line data as multiple data fields" $+      render (ServerEvent Nothing Nothing "line1\nline2\nline3")+        `shouldBe` "data: line1\ndata: line2\ndata: line3\n"++    it "preserves leading space in data value" $+      render (ServerEvent Nothing Nothing " How")+        `shouldBe` "data:  How\n"++    it "preserves leading space in event type" $+      render (ServerEvent (Just " custom") Nothing "x")+        `shouldBe` "event:  custom\ndata: x\n"++    it "preserves leading space in event id" $+      render (ServerEvent Nothing (Just " 42") "x")+        `shouldBe` "id:  42\ndata: x\n"++    it "encodes empty data as empty output" $+      render (ServerEvent Nothing Nothing "")+        `shouldBe` ""++    it "strips CR characters from data" $+      render (ServerEvent Nothing Nothing "hello\r\nworld")+        `shouldBe` "data: hello\ndata: world\n"++    it "omits event field when Nothing" $+      render (ServerEvent Nothing (Just "1") "x")+        `shouldBe` "id: 1\ndata: x\n"++    it "omits id field when Nothing" $+      render (ServerEvent (Just "ping") Nothing "x")+        `shouldBe` "event: ping\ndata: x\n"