Skip to content

Instantly share code, notes, and snippets.

@kidpollo
Last active March 2, 2023 00:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kidpollo/f3882815d0a8cc77faf16a601c37f067 to your computer and use it in GitHub Desktop.
Save kidpollo/f3882815d0a8cc77faf16a601c37f067 to your computer and use it in GitHub Desktop.
nbb + ruuter + axios node proxy
(ns local
{:clj-kondo/config '{:lint-as {promesa.core/let clojure.core/let
applied-science.js-interop/fn clojure.core/fn
applied-science.js-interop/defn clojure.core/defn}}}
(:require [cljs-bean.core :refer [->clj ->js]]
[promesa.core :as p]
["http" :as http]
["url"]
[applied-science.js-interop :as j]
[clojure.string :as string]
[ruuter.core :as ruuter]
[lambda.foo.core :as bp]))
(defn axios->res [prom]
(-> prom
(p/then
(j/fn [^js {:keys [status data]}]
{:status status
:body (js/JSON.stringify data)}))
(p/catch
(fn [error]
{:status "500"
:body (js/JSON.stringify error)}))))
(defn ruuter-response->res [maybe-promise]
(if (p/promise? maybe-promise)
(axios->res maybe-promise)
;; This is a ruuter response which isnt a promise
(p/resolved maybe-promise)))
(j/defn node-req->ruuter-req [^js {:keys [url method] :as req}]
(p/let [url (js/URL. url "http://localhost")
uri (j/get url :pathname)
query-string (j/get url :search)
body (p/create
(fn [resolve reject]
(try
(let [strs []]
(.on req "data" #(conj strs (.toString %)))
(.on req "end" #(resolve (string/join strs))))
(catch :default e
(reject e)))))]
{:uri uri
;;:request-method method
:method method
:query-string query-string
:body body}))
(def server
(.createServer
http
(fn [req res]
(p/let [ruuter-req (node-req->ruuter-req req)
resp (-> (ruuter/route bp/routes ruuter-req)
ruuter-response->res)]
(.writeHead res (get resp :status) #js {"Content-Type" "application/json"})
(.write res (get resp :body))
(.end res)))))
(.listen server 3000 (fn [] (prn "server started")))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment