-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplayground.clj
75 lines (63 loc) · 2.14 KB
/
playground.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
65
66
67
68
69
70
71
72
73
74
75
(ns playground
(:require [ring.adapter.jetty :as j]
[exoscale.ex :as ex]
[s-exp.flex.limit.aimd :as limit]
[s-exp.flex :as f]
[s-exp.flex.interceptor :as ix]
[s-exp.flex.middleware]
[exoscale.interceptor]))
;; (def tf (bound-fn* println))
;; (remove-tap tf)
;; (add-tap tf)
(defn ok-response [s]
{:status 200
:body (pr-str s)})
(defn rejected-response [s]
{:status 420
:body (format "Enhance your calm - %s" (ex-message s))})
(def limit (s-exp.flex.limit.aimd/make
{:initial-limit 10
:max-limit 20
:min-limit 1}))
(def limiter (f/limiter {:limit limit}))
(def ix (ix/interceptor {:limiter limiter}))
(defn interceptor-handler [request]
(exoscale.interceptor/execute
{:request request}
[{:error (fn [_ctx err]
(if (ex/type? err :s-exp.flex/rejected)
(rejected-response @limiter)
{:status 500
:body (str "boom -" err)}))
:leave :response}
#'ix
{:enter (fn [ctx]
(Thread/sleep (rand-int 1000))
(assoc ctx
:response
(ok-response @limiter)))}]))
(defn server+interceptor
[]
(j/run-jetty #'interceptor-handler
{:port 8080
:join? false}))
(def resp-time (atom 500))
(defn server+middleware []
(let [handler (s-exp.flex.middleware/with-limiter
(fn [_]
(Thread/sleep
;; 1000 ; simulate stable
(max 1 (swap! resp-time inc)) ; simulate slowing down
;; (max 1 (swap! resp-time dec)) ; simulate faster resp times
)
(ok-response @limiter))
{:limiter limiter})]
(j/run-jetty (fn [request]
(ex/try+ (handler request)
(catch :s-exp.flex/rejected _
(rejected-response @limiter))))
{:port 8080
:join? false})))
(declare server)
(try (.stop server) (catch Exception _ :boom))
(def server (server+middleware))