Skip to content

Commit 68fe320

Browse files
committed
pushing new changes with examples
1 parent 2e7514c commit 68fe320

File tree

7 files changed

+114
-29
lines changed

7 files changed

+114
-29
lines changed

examples/Client.purs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module Examples.Client where
2+
3+
import Prelude
4+
5+
import Effect (Effect)
6+
import Effect.Class.Console as Console
7+
import EventSource as ES
8+
9+
main :: Effect Unit
10+
main = do
11+
es <- ES.createEventSource "http://localhost:3000" mempty
12+
13+
ES.onMessage es \me -> do
14+
Console.log me.data

examples/Server.purs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
module Examples.Server where
2+
3+
import Prelude
4+
5+
import Control.Plus (empty)
6+
import Data.Maybe (Maybe(..))
7+
import Effect (Effect)
8+
import Effect.Class.Console as Console
9+
import Effect.Now as Effect
10+
import Effect.Timer (clearInterval, setInterval)
11+
import Node.HTTP as HTTP
12+
import Node.Stream as Stream
13+
import SSE as SSE
14+
import SSE.Types (EventName(..), ServerEvent(..))
15+
16+
main :: Effect Unit
17+
main = do
18+
server <- HTTP.createServer \req res -> app req res
19+
HTTP.listen server { backlog: Nothing, hostname: "localhost",port: 3000 } do
20+
Console.log "listen on port 3000"
21+
where
22+
app req res = do
23+
Console.log "New connection"
24+
let resStream = HTTP.responseAsStream res
25+
sseStream <- SSE.createSseStream req
26+
_ <- SSE.pipe sseStream resStream
27+
28+
intervalId <- setInterval 1000 do
29+
let event = Just $ EventName "message"
30+
date <- Effect.nowDateTime
31+
void $ SSE.write sseStream $ ServerEvent { data: show date, event, id: empty }
32+
33+
Stream.onClose resStream do
34+
Console.log "lost connection"
35+
clearInterval intervalId

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
},
2222
"homepage": "https://github.com/purescript-node-contrib/purescript-eventsource#readme",
2323
"dependencies": {
24-
"eventsource": "^1.0.7"
24+
"eventsource": "^1.0.7",
25+
"ssestream": "^1.1.0"
2526
}
2627
}

packages.dhall

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,18 @@ let additions =
135135
, version =
136136
"master"
137137
}
138+
, sse-stream =
139+
{ dependencies =
140+
[ "http-types"
141+
, "node-http"
142+
, "node-streams"
143+
, "spec"
144+
]
145+
, repo =
146+
"https://github.com/purescript-node-contrib/purescript-sse-stream.git"
147+
, version =
148+
"master"
149+
}
138150
}
139151

140-
in upstream // overrides // additions
152+
in upstream // overrides // additions

spago.dhall

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@ Welcome to a Spago project!
33
You can edit this file as you like.
44
-}
55
{ name = "my-project"
6-
, dependencies = [ "console", "effect", "http-types", "psci-support" ]
6+
, dependencies =
7+
[ "console"
8+
, "effect"
9+
, "http-types"
10+
, "js-timers"
11+
, "options"
12+
, "psci-support"
13+
, "sse-stream"
14+
]
715
, packages = ./packages.dhall
816
, sources = [ "src/**/*.purs", "test/**/*.purs" ]
917
}

src/EventSource.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"use strict";
22

3+
const EventSource = require('eventsource')
4+
35
exports._createEventSource = url => options => () => {
46
options.https = { rejectUnauthorized: options.httpsRejectUnauthorized }
57
delete options.httpsRejectUnauthorized
@@ -26,7 +28,7 @@ exports._onOpen = evs => cb => () => {
2628
}
2729

2830
exports._onMessage = evs => cb => () => {
29-
evs.onmessage = cb
31+
evs.onmessage = (e) => cb(e)()
3032
}
3133

3234
exports._onError = evs => closeError => evsError => cb => () => {

src/EventSource.purs

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,35 @@ import Prelude
44

55
import Data.Generic.Rep (class Generic)
66
import Data.Generic.Rep.Show (genericShow)
7-
import Data.Maybe (Maybe(..))
7+
import Data.Options (Option, Options, opt, options)
88
import Effect (Effect)
9+
import Foreign (Foreign)
910
import Network.HTTP.Types as H
10-
import Prim.Row (class Union)
1111

1212
foreign import data EventSource :: Type
1313

14+
data ExtentionOptions
15+
16+
httpsRejectUnauthorized :: Option ExtentionOptions Boolean
17+
httpsRejectUnauthorized = opt "httpsRejectUnauthorized"
18+
19+
withCredentials :: Option ExtentionOptions Boolean
20+
withCredentials = opt "withCredentials"
21+
22+
headers :: Option ExtentionOptions (Array H.Header)
23+
headers = opt "headers"
24+
25+
proxy :: Option ExtentionOptions String
26+
proxy = opt "proxy"
27+
1428
newtype EventName = EventName String
1529

16-
type Extensions =
17-
( httpsRejectUnauthorized :: Boolean
18-
, withCredentials :: Boolean
19-
, headers :: Array H.Header
20-
, proxy :: String
21-
)
30+
type MessageEvent =
31+
{ type :: String
32+
, data :: String
33+
, lastEventId :: String
34+
, origin :: String
35+
}
2236

2337
data EventSourceError
2438
= EventSourceErr H.Status
@@ -35,13 +49,11 @@ derive instance eqReadyState :: Eq ReadyState
3549
instance showReadyState :: Show ReadyState where
3650
show = genericShow
3751

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
52+
eventName :: String -> EventName
53+
eventName = EventName
54+
55+
createEventSource :: String -> Options ExtentionOptions -> Effect EventSource
56+
createEventSource url opts = _createEventSource url $ options opts
4557

4658
readyState :: EventSource -> Effect ReadyState
4759
readyState evs = do
@@ -51,28 +63,29 @@ readyState evs = do
5163
1 -> OPEN
5264
_ -> CLOSED
5365

54-
addEventListener :: forall event. EventSource -> EventName -> (event -> Effect Unit) -> Effect Unit
66+
addEventListener :: EventSource -> EventName -> (MessageEvent -> Effect Unit) -> Effect Unit
5567
addEventListener evs (EventName en) = _addEventListener evs en
5668

57-
removeEventListener :: forall event. EventSource -> EventName -> (event -> Effect Unit) -> Effect Unit
69+
removeEventListener :: EventSource -> EventName -> Effect Unit -> Effect Unit
5870
removeEventListener evs (EventName en) = _removeEventListener evs en
5971

60-
onOpen :: forall event. EventSource -> (event -> Effect Unit) -> Effect Unit
72+
onOpen :: EventSource -> Effect Unit -> Effect Unit
6173
onOpen = _onOpen
6274

63-
onMessage :: forall event. EventSource -> (event -> Effect Unit) -> Effect Unit
75+
-- | This will only fire if your event name is 'message', do not use it unless so.
76+
onMessage :: EventSource -> (MessageEvent -> Effect Unit) -> Effect Unit
6477
onMessage = _onMessage
6578

6679
onError :: EventSource -> (EventSourceError -> Effect Unit) -> Effect Unit
6780
onError evs = _onError evs ConnectionClosedErr EventSourceErr
6881

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
82+
foreign import _createEventSource :: String -> Foreign -> Effect EventSource
83+
foreign import _readyState :: EventSource -> Effect Int
84+
foreign import _addEventListener :: EventSource -> String -> (MessageEvent -> Effect Unit) -> Effect Unit
85+
foreign import _removeEventListener :: EventSource -> String -> Effect Unit -> Effect Unit
7386
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
87+
foreign import _onOpen :: EventSource -> Effect Unit -> Effect Unit
88+
foreign import _onMessage :: EventSource -> (MessageEvent -> Effect Unit) -> Effect Unit
7689
foreign import _onError ::
7790
EventSource
7891
-> (String -> EventSourceError)

0 commit comments

Comments
 (0)