Skip to content

Commit 2e7514c

Browse files
committed
Added simple bidings, need to import purescript-sse-stream package
1 parent aa97087 commit 2e7514c

File tree

5 files changed

+137
-13
lines changed

5 files changed

+137
-13
lines changed

packages.dhall

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ let upstream =
123123

124124
let overrides = {=}
125125

126-
let additions = {=}
127-
126+
let additions =
127+
{ http-types =
128+
{ dependencies =
129+
[ "tuples"
130+
, "unicode"
131+
, "uri"
132+
]
133+
, repo =
134+
"https://github.com/Woody88/purescript-http-types.git"
135+
, version =
136+
"master"
137+
}
138+
}
139+
128140
in upstream // overrides // additions

spago.dhall

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Welcome to a Spago project!
33
You can edit this file as you like.
44
-}
55
{ name = "my-project"
6-
, dependencies = [ "console", "effect", "psci-support" ]
6+
, dependencies = [ "console", "effect", "http-types", "psci-support" ]
77
, packages = ./packages.dhall
88
, sources = [ "src/**/*.purs", "test/**/*.purs" ]
99
}

src/EventSource.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"use strict";
2+
3+
exports._createEventSource = url => options => () => {
4+
options.https = { rejectUnauthorized: options.httpsRejectUnauthorized }
5+
delete options.httpsRejectUnauthorized
6+
return new EventSource(url, options);
7+
}
8+
9+
exports._readyState = evs => () => {
10+
evs.readyState
11+
}
12+
exports._addEventListener = evs => e => cb => () => {
13+
evs.addEventListener(e, cb)
14+
}
15+
16+
exports._removeEventListener = evs => e => cb => () => {
17+
evs.removeEventListener(e, cb)
18+
}
19+
20+
exports.close = evs => () => {
21+
evs.close()
22+
}
23+
24+
exports._onOpen = evs => cb => () => {
25+
evs.onopen = cb
26+
}
27+
28+
exports._onMessage = evs => cb => () => {
29+
evs.onmessage = cb
30+
}
31+
32+
exports._onError = evs => closeError => evsError => cb => () => {
33+
evs.onerror = (err) => {
34+
if (err.status){
35+
const evsErr = evsError({ code: err.status, message: status.message })
36+
return cb(evsErr)()
37+
}
38+
39+
return cb(closeError(err.message))()
40+
}
41+
}

src/EventSource.purs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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

src/Main.purs

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)