Skip to content

Commit

Permalink
Adds basic interceptor functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
dehli committed Feb 7, 2020
1 parent a1e75cf commit b2d4ba7
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 1 deletion.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

<groupId>dehli</groupId>
<artifactId>serverless</artifactId>
<version>0.1.24</version>
<version>0.1.25</version>
<name>serverless</name>

<dependencies>
Expand Down
7 changes: 7 additions & 0 deletions src/serverless/aws/api_gateway.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,10 @@
(def sub (comp :principalId authorizer))
(def body #(-> % :body (json->clj :keywordize-keys true)))
(def endpoint (comp #(str (:domainName %) "/" (:stage %)) request-context))

;; Websocket event helpers
(defn ws-event->deps [ws-event]
(let [api (management-api (endpoint ws-event))]
{:delete-connection (partial delete-connection api)
:get-connection (partial get-connection api)
:post-to-connection (partial post-to-connection api)}))
31 changes: 31 additions & 0 deletions src/serverless/interceptors/core.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
(ns serverless.interceptors.core
(:require [serverless.core.async :refer [go-try channel? <!]]))

(defn- doseq-interceptors!
[fn-key context interceptors]
(go-try
(doseq [interceptor interceptors]
(let [next-fn (or (get interceptor fn-key) identity)
chan-or-val (next-fn @context)
new-context (if (channel? chan-or-val)
(<! chan-or-val)
chan-or-val)]
(reset! context new-context)))))

(defn add-interceptors
[interceptors handler]
(fn [event]
(go-try
(let [context (atom event)]
;; Go through interceptors (on enter)
(<! (doseq-interceptors!
:enter context
(concat interceptors [{:name :handler :enter handler}])))

;; Go through interceptors (on leave)
(<! (doseq-interceptors!
:leave context
(reverse interceptors)))

;; Return context
@context))))
15 changes: 15 additions & 0 deletions src/serverless/interceptors/defaults.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
(ns serverless.interceptors.defaults
(:require [serverless.aws.api-gateway :as api]))

(def assoc-event
{:name :move-event
:enter (fn [event] {:event event})})

(def merge-web-socket-deps
{:name :merge-web-socket-deps
:enter (fn [{:keys [event] :as context}]
(update context :deps merge (api/ws-event->deps event)))})

(def web-socket-default-interceptors
[assoc-event
merge-web-socket-deps])
41 changes: 41 additions & 0 deletions test/serverless/interceptors/core_test.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
(ns serverless.interceptors.core-test
(:require [cljs.test :refer [async deftest is]]
[serverless.core.async :refer [go-try <!]]
[serverless.interceptors.core :as sut]))

(deftest add-interceptors
(async done
(go-try
(let [interceptors [{:name :a
:enter (fn [{:keys [test] :as ctx}]
(-> ctx
(assoc :a-enter test)
(update :test inc)))
:leave (fn [{:keys [test] :as ctx}]
(-> ctx
(assoc :a-leave test)
(update :test inc)))}
{:name :b
:enter (fn [{:keys [test] :as ctx}]
(go-try
(-> ctx
(assoc :b-enter test)
(update :test inc))))
:leave (fn [{:keys [test] :as ctx}]
(-> ctx
(assoc :b-leave test)
(update :test inc)))}]

handler (sut/add-interceptors interceptors
#(assoc % :handler (:test %)))]

(is (= (<! (handler {:event "test"}))
{:event "test"
:a-enter nil
:b-enter 1
:handler 2
:b-leave 2
:a-leave 3
:test 4}))

(done)))))

0 comments on commit b2d4ba7

Please sign in to comment.