Browse Source

working server (empty)

Brandon Wong 1 year ago
commit
d56bf78f23
8 changed files with 140 additions and 0 deletions
  1. 5 0
      .clj-kondo/config.edn
  2. 6 0
      .gitignore
  3. 13 0
      deps.edn
  4. 18 0
      dev/user.clj
  5. 25 0
      src/attendant/handler.clj
  6. 26 0
      src/attendant/main.clj
  7. 24 0
      src/attendant/nrepl_component.clj
  8. 23 0
      src/attendant/server.clj

+ 5 - 0
.clj-kondo/config.edn

@@ -0,0 +1,5 @@
+{:skip-comments true
+ :linters {:unresolved-namespace {:exclude [clojure.pprint]}}
+ :config-in-ns {user {:linters {:refer-all {:exclude [clojure.repl]}
+                                :unused-namespace {:exclude [clojure.pprint]}
+                                :unused-referred-var {:exclude {clojure.pprint [pprint]}}}}}}

+ 6 - 0
.gitignore

@@ -0,0 +1,6 @@
+.lsp
+**/.clj-kondo/.cache
+*.swp
+.cpcache
+.nrepl-port
+.rebel_readline_history

+ 13 - 0
deps.edn

@@ -0,0 +1,13 @@
+{:deps
+ {cider/cider-nrepl {:mvn/version "0.28.3"}
+  com.bhauman/rebel-readline {:mvn/version "0.1.4"}
+  com.stuartsierra/component {:mvn/version "1.0.0"}
+  compojure/compojure {:mvn/version "1.7.0"}
+  nrepl/nrepl {:mvn/version "0.8.3"}
+  ring/ring {:mvn/version "1.9.5"}
+  ring/ring-jetty-adapter {:mvn/version "1.9.5"}}
+ :paths ["src"]
+ :aliases {:dev {:extra-deps {ring/ring-devel {:mvn/version "1.9.5"}
+                              ring/ring-mock {:mvn/version "0.4.0"}}
+                 :extra-paths ["dev"]
+                 :main-opts ["-m" "user"]}}}

+ 18 - 0
dev/user.clj

@@ -0,0 +1,18 @@
+(ns user
+  (:require
+   [clojure.repl :refer :all]
+   [clojure.pprint :refer [pprint]]
+   [com.stuartsierra.component :as component]
+   [attendant.main :as main]
+   [rebel-readline.core :as rebel-core]
+   [rebel-readline.clojure.main :as rebel-clj-main]))
+
+(defn -main []
+  (println "==> starting main system")
+  (reset!
+   main/system
+   (component/start
+    (main/main-system :dev true)))
+  (println "==> starting rebel-readline")
+  (rebel-core/ensure-terminal
+   (rebel-clj-main/repl* {})))

+ 25 - 0
src/attendant/handler.clj

@@ -0,0 +1,25 @@
+(ns attendant.handler
+  (:require
+   [compojure.core :refer [defroutes ANY OPTIONS]]
+   [compojure.route :refer [not-found]]
+   [ring.util.response :refer [header]]))
+
+(defroutes app
+  (OPTIONS "*" [] "")
+  (ANY "/" [] "attendant server")
+  (not-found "nothing here (yet)"))
+
+(defn make-handler []
+  (fn [req]
+    (let [body (some-> req
+                       :body
+                       (slurp)
+                       (not-empty)
+                       (read-string))
+          new-req (cond-> req
+                    body (update :params merge body))]
+      (-> (#'app new-req)
+          (header "Access-Control-Allow-Methods" "GET, DELETE, POST, PUT, OPTIONS")
+          (header "Access-Control-Allow-Origin" (get-in req [:headers "origin"]))
+          (header "Access-Control-Allow-Credentials" "true")
+          (header "Access-Control-Allow-Headers" "Content-Type")))))

+ 26 - 0
src/attendant/main.clj

@@ -0,0 +1,26 @@
+(ns attendant.main
+  (:require
+   [com.stuartsierra.component :as component]
+   [attendant.server :as server]
+   [attendant.nrepl-component :as nrepl]))
+
+(def port 2424)
+
+(def nrepl-port 7288)
+
+(defonce system
+  (atom nil))
+
+(defn main-system [& {:keys [dev]}]
+  (component/system-map
+   :server (server/map->Server {:port port
+                                :dev dev})
+   :nrepl (nrepl/map->NreplServer {:port nrepl-port})))
+
+(defn -main []
+  (println "starting main system")
+  (reset!
+   system
+   (component/start
+    (main-system))))
+

+ 24 - 0
src/attendant/nrepl_component.clj

@@ -0,0 +1,24 @@
+(ns attendant.nrepl-component
+  (:require
+   [cider.nrepl :refer [cider-nrepl-handler]]
+   [clojure.java.io :as io]
+   [com.stuartsierra.component :as component]
+   [nrepl.server :refer [start-server stop-server]]))
+
+(defrecord NreplServer [port]
+  component/Lifecycle
+  (start [this]
+    (println "starting nrepl server" port this)
+    (spit ".nrepl-port" port)
+    (->> (start-server
+          :bind "0.0.0.0"
+          :port port
+          :handler cider-nrepl-handler)
+         (assoc this :nrepl-server)))
+
+  (stop [this]
+    (println "stopping nrepl server" (:nrepl-server this))
+    (io/delete-file ".nrepl-port" true)
+    (stop-server (:nrepl-server this))
+    this))
+

+ 23 - 0
src/attendant/server.clj

@@ -0,0 +1,23 @@
+(ns attendant.server
+  (:require
+   [com.stuartsierra.component :as component]
+   [attendant.handler :refer [make-handler]]
+   [ring.adapter.jetty :refer [run-jetty]]
+   [ring.middleware.reload :refer [wrap-reload]]))
+
+(defrecord Server [port dev]
+  component/Lifecycle
+  (start [this]
+    (println "starting web server" (when dev "(in dev mode)"))
+    (let [handler (make-handler)
+          hand (if dev
+                 (wrap-reload handler)
+                 handler)]
+      (assoc this :server
+             (run-jetty hand {:port port
+                              :join? false}))))
+  (stop [this]
+    (println "stopping web server")
+    (.stop (:server this))
+    (.destroy (:server this))
+    this))