mirror of
https://github.com/penpot/penpot.git
synced 2026-05-03 23:29:03 +00:00
Mainly the followin changes: - Pass majority of code to the old and plain synchronous style and start using virtual threads for the RPC (and partially some HTTP server middlewares). - Make some improvements on how CLIMIT is handled, simplifying code - Improve considerably performance reducing the reflection and unnecesary funcion calls on the whole stack-trace of an RPC call. - Improve efficiency reducing considerably the total threads number.
65 lines
1.8 KiB
Clojure
65 lines
1.8 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC
|
|
|
|
(ns app.http.client
|
|
"Http client abstraction layer."
|
|
(:require
|
|
[app.common.spec :as us]
|
|
[app.worker :as wrk]
|
|
[clojure.spec.alpha :as s]
|
|
[integrant.core :as ig]
|
|
[java-http-clj.core :as http]
|
|
[promesa.core :as p])
|
|
(:import
|
|
java.net.http.HttpClient))
|
|
|
|
(s/def ::client #(instance? HttpClient %))
|
|
(s/def ::client-holder
|
|
(s/keys :req [::client]))
|
|
|
|
(defmethod ig/pre-init-spec ::client [_]
|
|
(s/keys :req [::wrk/executor]))
|
|
|
|
(defmethod ig/init-key ::client
|
|
[_ {:keys [::wrk/executor] :as cfg}]
|
|
(http/build-client {:executor executor
|
|
:connect-timeout 30000 ;; 10s
|
|
:follow-redirects :always}))
|
|
|
|
(defn send!
|
|
([client req] (send! client req {}))
|
|
([client req {:keys [response-type sync?] :or {response-type :string sync? false}}]
|
|
(us/assert! ::client client)
|
|
(if sync?
|
|
(http/send req {:client client :as response-type})
|
|
(try
|
|
(http/send-async req {:client client :as response-type})
|
|
(catch Throwable cause
|
|
(p/rejected cause))))))
|
|
|
|
(defn- resolve-client
|
|
[params]
|
|
(cond
|
|
(instance? HttpClient params)
|
|
params
|
|
|
|
(map? params)
|
|
(resolve-client (::client params))
|
|
|
|
:else
|
|
(throw (UnsupportedOperationException. "invalid arguments"))))
|
|
|
|
(defn req!
|
|
"A convencience toplevel function for gradual migration to a new API
|
|
convention."
|
|
([cfg-or-client request]
|
|
(let [client (resolve-client cfg-or-client)]
|
|
(send! client request {})))
|
|
([cfg-or-client request options]
|
|
(let [client (resolve-client cfg-or-client)]
|
|
(send! client request options))))
|
|
|