git.iko.soy/rowtype-yoga/purescript-yoga-sse
on main help sign in
Initial: SSE EventSource client and server bindings
commit8fd8b6d6de3d26bdd1991e80046542db5ab7b55a authorMark <mark.eibes@gmail.com> dateTue 3 Mar 2026, 13:21 (7 months ago)
6 files changed+97
.gitignore+5 spago.yaml+14 src/Yoga/SSE/EventSource.js+13 src/Yoga/SSE/EventSource.purs+26 src/Yoga/SSE/Server.js+15 src/Yoga/SSE/Server.purs+24
.gitignorenew file+5
@@ -0,0 +1,5 @@
1+output
2+.spago
3+node_modules
4+spago.lock
5+bun.lock
spago.yamlnew file+14
@@ -0,0 +1,14 @@
1+workspace: {}
2+
3+package:
4+ name: yoga-sse
5+ publish:
6+ version: 0.1.0
7+ license: MIT
8+ location:
9+ githubOwner: rowtype-yoga
10+ githubRepo: purescript-yoga-sse
11+ dependencies:
12+ - effect: ">=4.0.0 <5.0.0"
13+ - foreign: ">=7.0.0 <8.0.0"
14+ - prelude: ">=6.0.2 <7.0.0"
src/Yoga/SSE/EventSource.jsnew file+13
@@ -0,0 +1,13 @@
1+export function newEventSourceImpl(url) {
2+ return new EventSource(url);
3+}
4+
5+export function onMessageImpl(es, cb) {
6+ es.onmessage = function (event) {
7+ cb(event.data)();
8+ };
9+}
10+
11+export function closeImpl(es) {
12+ es.close();
13+}
src/Yoga/SSE/EventSource.pursnew file+26
@@ -0,0 +1,26 @@
1+module Yoga.SSE.EventSource
2+ ( EventSource
3+ , newEventSource
4+ , onMessage
5+ , close
6+ ) where
7+
8+import Prelude
9+
10+import Effect (Effect)
11+import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, runEffectFn1, runEffectFn2)
12+
13+foreign import data EventSource :: Type
14+
15+foreign import newEventSourceImpl :: EffectFn1 String EventSource
16+foreign import onMessageImpl :: EffectFn2 EventSource (EffectFn1 String Unit) Unit
17+foreign import closeImpl :: EffectFn1 EventSource Unit
18+
19+newEventSource :: String -> Effect EventSource
20+newEventSource = runEffectFn1 newEventSourceImpl
21+
22+onMessage :: EventSource -> (String -> Effect Unit) -> Effect Unit
23+onMessage es cb = runEffectFn2 onMessageImpl es (mkEffectFn1 cb)
24+
25+close :: EventSource -> Effect Unit
26+close = runEffectFn1 closeImpl
src/Yoga/SSE/Server.jsnew file+15
@@ -0,0 +1,15 @@
1+export function setHeadersImpl(res) {
2+ res.writeHead(200, {
3+ "Content-Type": "text/event-stream",
4+ "Cache-Control": "no-cache",
5+ Connection: "keep-alive",
6+ });
7+}
8+
9+export function writeImpl(res, data) {
10+ res.write("data: " + data + "\n\n");
11+}
12+
13+export function onCloseImpl(res, cb) {
14+ res.on("close", cb);
15+}
src/Yoga/SSE/Server.pursnew file+24
@@ -0,0 +1,24 @@
1+module Yoga.SSE.Server
2+ ( setHeaders
3+ , write
4+ , onClose
5+ ) where
6+
7+import Prelude
8+
9+import Effect (Effect)
10+import Effect.Uncurried (EffectFn1, EffectFn2, runEffectFn1, runEffectFn2)
11+import Foreign (Foreign)
12+
13+foreign import setHeadersImpl :: EffectFn1 Foreign Unit
14+foreign import writeImpl :: EffectFn2 Foreign String Unit
15+foreign import onCloseImpl :: EffectFn2 Foreign (Effect Unit) Unit
16+
17+setHeaders :: Foreign -> Effect Unit
18+setHeaders = runEffectFn1 setHeadersImpl
19+
20+write :: Foreign -> String -> Effect Unit
21+write = runEffectFn2 writeImpl
22+
23+onClose :: Foreign -> Effect Unit -> Effect Unit
24+onClose = runEffectFn2 onCloseImpl