1
+ module EventSource where
2
+
3
+ import Prelude
4
+
5
+ import Data.Generic.Rep (class Generic )
6
+ import Data.Generic.Rep.Show (genericShow )
7
+ import Data.Maybe (Maybe (..))
8
+ import Effect (Effect )
9
+ import Network.HTTP.Types as H
10
+ import Prim.Row (class Union )
11
+
12
+ foreign import data EventSource :: Type
13
+
14
+ newtype EventName = EventName String
15
+
16
+ type Extensions =
17
+ ( httpsRejectUnauthorized :: Boolean
18
+ , withCredentials :: Boolean
19
+ , headers :: Array H.Header
20
+ , proxy :: String
21
+ )
22
+
23
+ data EventSourceError
24
+ = EventSourceErr H.Status
25
+ | ConnectionClosedErr String
26
+
27
+ -- | Connections states
28
+ data ReadyState = CONNECTING
29
+ | OPEN
30
+ | CLOSED
31
+
32
+ derive instance genericReadyState :: Generic ReadyState _
33
+ derive instance eqReadyState :: Eq ReadyState
34
+
35
+ instance showReadyState :: Show ReadyState where
36
+ show = genericShow
37
+
38
+ createEventSource :: forall exts t .
39
+ Union exts t Extensions
40
+ => String
41
+ -> Maybe { | exts }
42
+ -> EventSource
43
+ createEventSource url Nothing = _createEventSource url {}
44
+ createEventSource url (Just exts) = _createEventSource url exts
45
+
46
+ readyState :: EventSource -> Effect ReadyState
47
+ readyState evs = do
48
+ state <- _readyState evs
49
+ pure case state of
50
+ 0 -> CONNECTING
51
+ 1 -> OPEN
52
+ _ -> CLOSED
53
+
54
+ addEventListener :: forall event . EventSource -> EventName -> (event -> Effect Unit ) -> Effect Unit
55
+ addEventListener evs (EventName en) = _addEventListener evs en
56
+
57
+ removeEventListener :: forall event . EventSource -> EventName -> (event -> Effect Unit ) -> Effect Unit
58
+ removeEventListener evs (EventName en) = _removeEventListener evs en
59
+
60
+ onOpen :: forall event . EventSource -> (event -> Effect Unit ) -> Effect Unit
61
+ onOpen = _onOpen
62
+
63
+ onMessage :: forall event . EventSource -> (event -> Effect Unit ) -> Effect Unit
64
+ onMessage = _onMessage
65
+
66
+ onError :: EventSource -> (EventSourceError -> Effect Unit ) -> Effect Unit
67
+ onError evs = _onError evs ConnectionClosedErr EventSourceErr
68
+
69
+ foreign import _createEventSource :: forall opts . String -> opts -> EventSource
70
+ foreign import _readyState :: EventSource -> Effect Int
71
+ foreign import _addEventListener :: forall event . EventSource -> String -> (event -> Effect Unit ) -> Effect Unit
72
+ foreign import _removeEventListener :: forall event . EventSource -> String -> (event -> Effect Unit ) -> Effect Unit
73
+ foreign import close :: EventSource -> Effect Unit
74
+ foreign import _onOpen :: forall event . EventSource -> (event -> Effect Unit ) -> Effect Unit
75
+ foreign import _onMessage :: forall event . EventSource -> (event -> Effect Unit ) -> Effect Unit
76
+ foreign import _onError ::
77
+ EventSource
78
+ -> (String -> EventSourceError )
79
+ -> (H.Status -> EventSourceError )
80
+ -> (EventSourceError -> Effect Unit )
81
+ -> Effect Unit
0 commit comments