Skip to content

Commit 1e72e5c

Browse files
committed
Added some test, maybe all effect types should be changed to Aff..
1 parent 7ba62a7 commit 1e72e5c

File tree

7 files changed

+127
-17
lines changed

7 files changed

+127
-17
lines changed

package-lock.json

+19
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "purescript-sse-stream",
3+
"version": "1.0.0",
4+
"description": "Stream for writing Server-Sent Events",
5+
"main": "index.js",
6+
"directories": {
7+
"test": "test"
8+
},
9+
"scripts": {
10+
"test": "echo \"Error: no test specified\" && exit 1"
11+
},
12+
"repository": {
13+
"type": "git",
14+
"url": "git+https://github.com/purescript-node-contrib/purescript-sse-stream.git"
15+
},
16+
"keywords": [],
17+
"author": "",
18+
"license": "ISC",
19+
"bugs": {
20+
"url": "https://github.com/purescript-node-contrib/purescript-sse-stream/issues"
21+
},
22+
"homepage": "https://github.com/purescript-node-contrib/purescript-sse-stream#readme",
23+
"dependencies": {
24+
"ssestream": "^1.1.0"
25+
},
26+
"devDependencies": {
27+
"stream-buffers": "^3.0.2"
28+
}
29+
}

spago.dhall

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
Welcome to a Spago project!
33
You can edit this file as you like.
44
-}
5-
{ name = "my-project"
5+
{ name = "sse-stream"
66
, dependencies =
77
[ "console"
88
, "effect"
99
, "http-types"
1010
, "node-http"
1111
, "node-streams"
1212
, "psci-support"
13+
, "spec"
1314
]
1415
, packages = ./packages.dhall
1516
, sources = [ "src/**/*.purs", "test/**/*.purs" ]

src/SSE.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
"use strict";
2-
const SseStream = require('ssestream')
2+
const SseStream = require('ssestream').default
33

4-
exports.createSseStream = req => () => { new SseStream(req) }
4+
exports.createSseStream = req => () => { return new SseStream(req) }
5+
6+
exports.createSseStream_ = () => { return new SseStream() }
57

68
exports.pipe = sse => stream => () => { sse.pipe(stream) }
79

810
exports._write = sse => message => () => { sse.write(message) }
9-
11+
// exports._writeMessage = sse => message => cb => () => { sse.write(message,) }
1012
exports._writeHead = sse => statusCode => headers => () => {
1113
sse.writeHead(statusCode, headers)
12-
}
14+
}
15+
16+
exports.end = sse => () => { sse.end() }

src/SSE.purs

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module SSE
22
( createSseStream
3+
, createSseStream_
4+
, end
35
, pipe
46
, write
57
, writeHead
@@ -22,18 +24,20 @@ writeHead sse {code, message} hdrs = _writeHead sse code headers
2224
where
2325
headers = Object.fromFoldable hdrs
2426

25-
write :: SseStream -> ServerEvent -> Effect Unit
26-
write sse (Comment comment) = _write sse { comment }
27-
write sse (RetryEvent retry) = _write sse { retry }
27+
write :: SseStream -> ServerEvent -> Effect Boolean
28+
write sse (Comment comment) = _write sse { comment }
29+
write sse (RetryEvent retry) = _write sse { retry }
2830
write sse (ServerEvent {data: d, event: e, id: i}) = case d,e,i of
29-
_data,Nothing,Nothing -> _write sse { data: _data }
30-
_data,Just event,Just id -> _write sse { data: _data, event, id }
31-
_data,Just event,Nothing -> _write sse { data: _data, event }
31+
_data,Nothing,Nothing -> _write sse { data: _data }
32+
_data,Just event,Just id -> _write sse { data: _data, event, id }
33+
_data,Just event,Nothing -> _write sse { data: _data, event }
3234
_data,Nothing,Just id -> _write sse { data: _data, id }
3335

3436
-- TO CONSIDER: since the SseStream object extends Transform class
3537
-- and Transform is simply a duplex, should we return a Duplex type instead?
3638
foreign import createSseStream :: HTTP.Request -> Effect SseStream
39+
foreign import createSseStream_ :: Effect SseStream
3740
foreign import pipe :: forall r. SseStream -> Writable r -> Effect (Writable r)
38-
foreign import _write :: forall message. SseStream -> { | message } -> Effect Unit
39-
foreign import _writeHead :: SseStream -> Int -> Object String -> Effect Unit
41+
foreign import _write :: forall message. SseStream -> { | message } -> Effect Boolean
42+
foreign import _writeHead :: SseStream -> Int -> Object String -> Effect Unit
43+
foreign import end :: SseStream -> Effect Unit

test/Main.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"use strict";
2+
3+
exports.writableStreamBuffer = () => {
4+
var W = require('stream-buffers').WritableStreamBuffer
5+
return new W
6+
}
7+
8+
exports.contentStr = w => () => {
9+
return w.getContentsAsString('utf8')
10+
}

test/Main.purs

+47-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,53 @@ module Test.Main where
22

33
import Prelude
44

5+
import Control.Plus (empty)
6+
import Data.Either (Either(..))
57
import Effect (Effect)
6-
import Effect.Class.Console (log)
8+
import Effect.Aff (launchAff_, makeAff, nonCanceler)
9+
import Effect.Class (liftEffect)
10+
import Node.Stream (Writable)
11+
import Node.Stream as Stream
12+
import SSE as SSE
13+
import SSE.Types (ServerEvent(..))
14+
import Test.Spec (describe, it)
15+
import Test.Spec.Assertions (shouldEqual)
16+
import Test.Spec.Reporter.Console (consoleReporter)
17+
import Test.Spec.Runner (runSpec)
18+
19+
foreign import writableStreamBuffer :: Effect (Writable ())
20+
21+
foreign import contentStr :: Writable () -> Effect String
722

823
main :: Effect Unit
9-
main = do
10-
log "🍝"
11-
log "You should add some tests."
24+
main = launchAff_ $ runSpec [consoleReporter] do
25+
describe "SseStream" do
26+
it "writes multiple multiline messages" do
27+
let msg1 = ServerEvent { data: "hello\nworld", id: empty, event: empty }
28+
msg2 = ServerEvent { data: "こんにちは\n世界", id: empty, event: empty }
29+
30+
sse <- liftEffect $ SSE.createSseStream_
31+
sink <- liftEffect $ writableStreamBuffer
32+
33+
_ <- liftEffect $ SSE.pipe sse sink
34+
35+
_ <- liftEffect $ SSE.write sse msg1
36+
_ <- liftEffect $ SSE.write sse msg2
37+
_ <- liftEffect $ SSE.end sse
38+
39+
result <- makeAff \done -> do
40+
Stream.onFinish sink do
41+
content <- contentStr sink
42+
done $ Right content
43+
pure nonCanceler
44+
45+
let expected = """:ok
46+
47+
data: hello
48+
data: world
49+
50+
data: こんにちは
51+
data: 世界
52+
53+
"""
54+
result `shouldEqual` expected

0 commit comments

Comments
 (0)