This repository has been archived by the owner on Jan 17, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
core.clj
64 lines (60 loc) · 2.49 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
(ns hiposfer.kamal.services.webserver.core
(:require [com.stuartsierra.component :as component]
[hiposfer.kamal.services.webserver.handlers :as handler]
[ring.adapter.jetty :as jetty]
[taoensso.timbre :as timbre]
[ring.middleware.keyword-params :refer [wrap-keyword-params]]
[ring.middleware.nested-params :refer [wrap-nested-params]]
[ring.middleware.params :refer [wrap-params]]
[ring.middleware.json :as json]
[ring.util.http-response :as code]
[ring.middleware.accept :as accept]
[hiposfer.kamal.libs.tool :as tool]
[clojure.walk :as walk])
(:import (org.eclipse.jetty.server Server)))
(defn- inject-networks
"inject the networks (agent current value) into the request"
[handler conn]
(fn inject-networks*
[request]
(let [networks @conn]
(if (empty? networks)
(code/service-unavailable "routers have not started yet")
(handler (assoc request :kamal/networks networks))))))
(defn- shape-response
[handler]
(fn shape-response*
[request]
(let [response (handler request)]
(if (string? (response :body))
response
(case (:mime (:accept request))
"application/json" (update response :body #(walk/postwalk tool/jsonista %))
"application/edn" (update response :body pr-str))))))
;; --------
;; A Jetty WebServer + compojure api
(defrecord WebServer [config router server]
component/Lifecycle
(start [this]
(if (:server this) this
(let [handler (-> (handler/create)
(inject-networks (:networks router))
(shape-response)
(accept/wrap-accept {:mime ["application/json" "application/edn"]})
(json/wrap-json-response) ;; note efficient but works
(json/wrap-json-params)
(wrap-keyword-params)
(wrap-nested-params)
(wrap-params))
server (jetty/run-jetty handler {:join? (:JOIN_THREAD config)
:port (:PORT config)})]
(timbre/info "-- Starting App server")
(assoc this :server server))))
(stop [this]
(if-let [server (:server this)]
(do (timbre/info "-- Stopping App server")
(.stop ^Server server)
(.join ^Server server)
(assoc this :server nil router nil)))
this))
(defn service [] (map->WebServer {}))