Last active
March 2, 2023 00:52
-
-
Save kidpollo/f3882815d0a8cc77faf16a601c37f067 to your computer and use it in GitHub Desktop.
nbb + ruuter + axios node proxy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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