• Stars
    star
    24
  • Rank 986,245 (Top 20 %)
  • Language
    Clojure
  • Created about 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Server Sent Events (SSE) client for Clojurescript based on js/fetch

oxbow

A Server Sent Events (SSE) client for Clojurescript based on js/fetch

Clojars Project

This library uses js/fetch to expose the full functionality of HTTP and processes the SSE data for you.

It's ready for use as a standalone functional Clojurescript library and also has re-frame bindings for integration into a re-frame application.

Rationale

js/EventSource is generally moribund and does not support sending headers. Discussions generally reference js/fetch as a modern alternative but it does not natively process streams.

⚠️Chrome Devtools will not show events under the EventSource tab for requests made by js/fetch. See: Issue 1025893

Usage

Clojurescript

You can start a new connection using sse-client, which returns a map containing a no-arg abort function under the :abort key.

(require '[oxbow.core :as o])

(let [{:keys [abort]} (o/sse-client {:uri "/events"
                                     :on-event #(js/console.log "Got an event!" %)})]

  ;; events are passed to the callback
  ;; call abort to close the client

  (abort))

re-frame

The re-frame bindings behave the same way, with the addition of :id which gives you a handle to abort with.

(require '[oxbow.re-frame :as o])
(require '[re-frame.core :as rf])

(rf/reg-event-db
  ::on-event
  (fn [db [_ {:keys [data] :as event}]]
    (update db :events conj data)))


(rf/dispatch [::o/sse-client {:id ::my-events
                              :uri "/events"
                              :on-event [::on-event]}])

;; events are passed to the callback
;; call abort to close the client

(rf/dispatch [::o/abort ::my-events])

Options

{:fetch-options     {:headers {"Authorization" "xyz"}}        ;; options passed to js/fetch, see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
 :on-open           #(js/console.log "Stream connected" %)    ;; invoked when the stream opens
 :on-close          #(js/console.log "Stream ended")          ;; invoked when the stream ends
 :on-event          #(js/console.log "Message received: " %)  ;; invoked for every event
 :on-error          #(js/console.warn "Error: " %)            ;; invoked on error
 :data-parser       identity                                  ;; parses the `data` value of the event
 :auto-reconnect?   true                                      ;; whether it should automatically reconnect upon disconnection
 :reconnect-timeout 2000                                      ;; ms to wait before attempting reconnect
 }

Development

cider-jack-in-cljs and open the test page http://localhost:9500/figwheel-extra-main/auto-testing

You will need to also run (oxbow.server-stub/start-server!) for the integration tests.

Build

CircleCI

License

Copyright © 2020 oliyh

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.

More Repositories

1

martian

The HTTP abstraction library for Clojure/script, supporting OpenAPI, Swagger, Schema, re-frame and more
Clojure
470
star
2

re-graph

A graphql client for clojurescript and clojure
Clojure
447
star
3

superlifter

A DataLoader for Clojure/script
Clojure
158
star
4

re-learn

A library for integrating tutorials into your re-frame/reagent application
Clojure
138
star
5

pedestal-api

Easily build APIs in Pedestal using Schema and Swagger
Clojure
106
star
6

kamera

UI testing via image comparison and devcards
Clojure
86
star
7

lacinia-gen

Generators for GraphQL
Clojure
69
star
8

re-jump.el

emacs navigation for re-frame projects
Emacs Lisp
69
star
9

locksmith

Want to use GraphQL with Clojure/script but don't want keBab or snake_keys everywhere? Use locksmith to change all the keys!
Clojure
61
star
10

slacky

Memes as a Slack Service
Clojure
33
star
11

angel-interceptor

Express relations between Pedestal interceptors and decouple scope from execution order
Clojure
28
star
12

doo-chrome-devprotocol

A runner for doo which runs tests in Chrome, using the Chrome Dev Protocol with no need for karma or npm.
Clojure
27
star
13

carmine-streams

Utility functions for working with Redis streams in carmine
Clojure
26
star
14

fixa

Better test fixtures for clojure
Clojure
26
star
15

spa-skeleton

A skeleton project for a ClojureScript Single Page Application backed by a Swagger API
Clojure
21
star
16

re-partee

How I build Clojurescript apps
Clojure
15
star
17

carve.el

Emacs plugin for borkdude/carve
Emacs Lisp
9
star
18

alrightee

Tee for re-frame
Clojure
7
star
19

learning-clojure

Learning materials for Clojure
Clojure
5
star
20

tinybeans-archive

Create an archive of a tinybeans journal
Clojure
4
star
21

cljockwork

A REST API for cron4j, written in Clojure
Clojure
4
star
22

stardev-feedback

Capturing feedback for https://stardev.io
3
star
23

haproxy-cert-jwt

A Lua extension for HAProxy to turn an SSL client certificate into a JWT for the backend
Lua
2
star
24

one-route

A Ring webserver with one route
HTML
2
star
25

slacky-bot

All the memes for Slack
Clojure
2
star
26

cljs-webapp-from-scratch

Clojure
2
star
27

ingred

Search recipes by ingredient - a REST api written in Clojure with data scraped from the BBC
Clojure
2
star
28

sunshine

Clojure
2
star
29

fast-feedback

A presentation giving guidance on how to optimise your feedback loop and improve efficiency
HTML
1
star
30

a-taste-of-clojure

A talk to introduce (Java) developers to Clojure
JavaScript
1
star
31

sanakone

Learn Finnish
Clojure
1
star
32

masvn

Subversion integration for emacs based on dsvn and inspired by magit
Emacs Lisp
1
star