Skip to content

bortexz/resocket

Folders and files

NameName
Last commit message
Last commit date

Latest commit

67cfea0 · Dec 17, 2022

History

9 Commits
Aug 29, 2022
Aug 29, 2022
Dec 17, 2022
Dec 17, 2022
Aug 29, 2022
Dec 17, 2022
Aug 29, 2022
Dec 17, 2022
Dec 17, 2022
Aug 29, 2022
Sep 30, 2022

Repository files navigation

resocket

Clojars ProjectCljdoc

JDK11 Clojure WebSocket client with core.async API

Features

  • core.async API with input and output channels for receiving/sending messages, and closed promise-chan with details about the closing of the connection.
  • Automatically send ping frames to the server at given intervals, abort connections that do not pong within a certain timeout.
  • Close a connection by closing output channel, abort within a certain timeout if on-close is not received from the server.
  • Specify input and output parsers to take/put your preferred data structure on the channels (maps, vecs, ...) and use the parser for json/edn parsing, etc.
  • Minimal dependencies, just clojure and core.async.
  • reconnector process to create new connections when the previous ones have been closed, returning a core.async connections channel to take new connections from.
  • Small codebase, around ~300 LOC docstrings included.

Install

Leiningen/Boot

[io.github.bortexz/resocket "0.1.0"]

Clojure CLI/deps.edn

io.github.bortexz/resocket {:mvn/version "0.1.0"}

Usage

See the docs for more detailed information about all the options available.

Quick introduction

Connection:

(require '[bortexz.resocket :as resocket])

(let [{:keys [input output closed error]} (a/<!! (resocket/connection "ws://<service>" {}))]
    (when-not error
      (a/<!! input) ;; Take new messages
      (a/>!! output "Hi from client") ;; Send messages
      (a/close! output) ;; Close connection
      (a/<!! closed)) ;; {:close-type :on-close :status 1000 :description ""}
    )

Reconnector:

(let [{:keys [connections close closed?]} (resocket/reconnector {:get-url (constantly "ws://<service>")})]
    (a/go-loop []
      (when-let [conn (a/<! connections)] ;; get new connections until reconnector closed
        (loop []
          (when-let [v (a/<! (:input conn))]
            ;; Process messages
            (recur)))
        (recur)))
    ;; Somewhere else, when tired of receiving new connections
    (a/close! close) ; Closes current connection (if any) and the reconnector

    ;; Listen to closed? in a different place than the connections handler
    (when (a/<! closed?) "Reconnector has been closed.")
  )

Credits

  • hato as this library borrows some code from hato's websocket client.

License

Copyright © 2022 Alberto Fernandez

Distributed under the Eclipse Public License version 1.0.