Skip to content

luminus-framework/luminus-jetty

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 

Repository files navigation

luminus-jetty

Clojars Project

Jetty HTTP adapter for Luminus

HTTP handler

(ns myapp.core
  (:require
   [luminus.ws :as ws]
   [luminus.http-server :as http]))

(defn http-handler [request]
  {:status 200
   :headers {"Content-Type" "text/plain"}
   :body (:remote-addr request)})

(http/start
 {:handler http-handler
  :port 3000})

WS handler

(ns myapp.core
  (:require
   [luminus.ws :as ws]
   [luminus.http-server :as http]
   [clojure.tools.logging :as log]))

;; a handler can be specified using a map
(def ws-handler-a
  {:on-connect           (fn [ws]
                           (log/info "WS connect" ws))
   :on-error             (fn [ws e]
                           (log/info "WS error" e))
   :on-text              (fn [ws text]
                           (log/info "text:" text)
                           (ws/send! ws text))
   :on-close             (fn [ws status-code reason]
                           (log/info "WS close" reason))
   :on-bytes             (fn [ws bytes offset len]
                           (log/info "WS bytes" bytes))})

;; alternatively you can provide a function that accepts a
;; Ring request map to initialize the websocket connection
;;
;; websocket upgrade headers like subprotocol and extensions
;; are available from the `req` via `(:websocket-subprotocols req)`
;; and `(:websocket-extensions req)`.

(def ws-handler-b
  (fn [req]
    {:on-connect (fn [& args]
                   (log/info "WS connect" args))
     :on-error   (fn [& args]
                   (log/info "WS error" args))
     :on-text    (fn [ws text]
                   (log/info "text:" text)
                   (ws/send! ws text))
     :on-close   (fn [& args]
                   (log/info "WS close" args))
     :on-bytes   (fn [& args]
                   (log/info "WS bytes" args))})})

(defn web-handler [request]
  (if (ws/ws-upgrade-request? request)
    ;; websocket upgrade request
    (ws/ws-upgrade-response ws-handler-a)
    ;; normal http request
    {:status 200
     :headers {"Content-Type" "text/plain"}
     :body (:remote-addr request)}))

;;create a single WS handler
(http/start
 {:handler web-handler
  :port 3000})

WebSocketProtocol allows you to read and write data on the ws value:

  • (send! ws msg)
  • (send! ws msg callback)
  • (close! ws)
  • (remote-addr ws)
  • (idle-timeout! ws timeout)

Notice that we support different type of msg:

  • byte[] and ByteBuffer: send binary websocket message
  • String and other Object: send text websocket message
  • (fn [ws]) (clojure function): Custom function you can operate on Jetty's RemoteEndpoint

A callback can also be specified for send!:

(send! ws msg {:write-failed (fn [throwable]) :write-success (fn [])})

A callback is a map where keys :write-failed and :write-success are optional.

Js client example

var websocket = new WebSocket("ws://localhost:3000/ws/");

websocket.onopen = function (evt) { console.log("socket open"); };
websocket.onclose = function (evt) { console.log("socket close"); };
websocket.onmessage = function (evt) { console.log("socket message: " + evt.data); };
websocket.onerror = function (evt) { websocket.send("message"); };

attribution

This library is based on ring-jetty9-adapter which provides a Jetty ring adapter based on Jetty 10, with additional websocket support.

License

Copyright © 2016 Dmitri Sotnikov

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

About

Jetty adapter for Luminus

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •