From 2fef3dc881c689283b8ce375ad686c7fea0184e1 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 18 Jan 2023 17:12:33 +0100 Subject: [PATCH] :tada: Add prepl support And rename the current repl to urepl (user-repl). --- backend/scripts/repl | 16 +++++++++- backend/src/app/config.clj | 14 +++++---- backend/src/app/main.clj | 11 +++++-- backend/src/app/srepl.clj | 61 ++++++++++++++++++++++++++------------ 4 files changed, 73 insertions(+), 29 deletions(-) diff --git a/backend/scripts/repl b/backend/scripts/repl index 3fe39461b..9be6c1490 100755 --- a/backend/scripts/repl +++ b/backend/scripts/repl @@ -2,7 +2,21 @@ export PENPOT_HOST=devenv export PENPOT_TENANT=dev -export PENPOT_FLAGS="$PENPOT_FLAGS enable-backend-asserts enable-audit-log enable-transit-readable-response enable-demo-users disable-secure-session-cookies enable-smtp enable-webhooks" +export PENPOT_FLAGS="\ + $PENPOT_FLAGS \ + enable-backend-asserts \ + enable-audit-log \ + enable-transit-readable-response \ + enable-demo-users \ + disable-secure-session-cookies \ + enable-smtp \ + enable-prepl-server \ + enable-urepl-server \ + enable-rpc-climit \ + enable-rpc-rlimit \ + enable-soft-rpc-rlimit \ + enable-webhooks \ + enable-access-tokens"; # export PENPOT_DATABASE_URI="postgresql://172.17.0.1:5432/penpot" # export PENPOT_DATABASE_USERNAME="penpot" diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj index 870ff58d5..ff0a187ad 100644 --- a/backend/src/app/config.clj +++ b/backend/src/app/config.clj @@ -64,8 +64,6 @@ :tenant "default" :redis-uri "redis://redis/0" - :srepl-host "127.0.0.1" - :srepl-port 6062 :assets-storage-backend :assets-fs :storage-assets-fs-directory "assets" @@ -196,8 +194,10 @@ (s/def ::smtp-ssl ::us/boolean) (s/def ::smtp-tls ::us/boolean) (s/def ::smtp-username (s/nilable ::us/string)) -(s/def ::srepl-host ::us/string) -(s/def ::srepl-port ::us/integer) +(s/def ::urepl-host ::us/string) +(s/def ::urepl-port ::us/integer) +(s/def ::prepl-host ::us/string) +(s/def ::prepl-port ::us/integer) (s/def ::assets-storage-backend ::us/keyword) (s/def ::storage-assets-fs-directory ::us/string) (s/def ::storage-assets-s3-bucket ::us/string) @@ -308,8 +308,10 @@ ::smtp-tls ::smtp-username - ::srepl-host - ::srepl-port + ::urepl-host + ::urepl-port + ::prepl-host + ::prepl-port ::assets-storage-backend ::storage-assets-fs-directory diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 6b5141a84..02d33f479 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -21,6 +21,7 @@ [app.metrics :as-alias mtx] [app.metrics.definition :as-alias mdef] [app.redis :as-alias rds] + [app.srepl :as-alias srepl] [app.storage :as-alias sto] [app.util.time :as dt] [app.worker :as-alias wrk] @@ -404,9 +405,13 @@ ::http.client/client (ig/ref ::http.client/client) ::props (ig/ref :app.setup/props)} - :app.srepl/server - {:port (cf/get :srepl-port) - :host (cf/get :srepl-host)} + [::srepl/urepl ::srepl/server] + {:port (cf/get :urepl-port 6062) + :host (cf/get :urepl-host "localhost")} + + [::srepl/prepl ::srepl/server] + {:port (cf/get :prepl-port 6063) + :host (cf/get :prepl-host "localhost")} :app.setup/builtin-templates {::http.client/client (ig/ref ::http.client/client)} diff --git a/backend/src/app/srepl.clj b/backend/src/app/srepl.clj index ed4b44467..cd5838a76 100644 --- a/backend/src/app/srepl.clj +++ b/backend/src/app/srepl.clj @@ -9,7 +9,10 @@ (:require [app.common.logging :as l] [app.common.spec :as us] + [app.config :as cf] [app.srepl.main] + [app.util.json :as json] + [app.util.locks :as locks] [clojure.core.server :as ccs] [clojure.main :as cm] [clojure.spec.alpha :as s] @@ -20,39 +23,59 @@ (ccs/repl-init) (in-ns 'app.srepl.main)) -(defn repl +(defn user-repl [] (cm/repl :init repl-init :read ccs/repl-read)) +(defn json-prepl + [] + (let [out *out* + lock (locks/create)] + (ccs/prepl *in* + (fn [m] + (binding [*out* out, *flush-on-newline* true, *print-readably* true] + (locks/locking lock + (println (json/encode-str m)))))))) + ;; --- State initialization -(s/def ::name ::us/not-empty-string) -(s/def ::port int?) +(s/def ::port ::us/integer) (s/def ::host ::us/not-empty-string) +(s/def ::flag #{:urepl-server :prepl-server}) +(s/def ::type #{::prepl ::urepl}) +(s/def ::key (s/tuple ::type ::us/keyword)) (defmethod ig/pre-init-spec ::server [_] - (s/keys :opt-un [::port ::host ::name])) + (s/keys :req [::flag] + :req-un [::port ::host])) (defmethod ig/prep-key ::server - [_ cfg] - (merge {:name "main"} cfg)) + [[type _] cfg] + (assoc cfg ::flag (keyword (str (name type) "-server")))) (defmethod ig/init-key ::server - [_ {:keys [port host name] :as cfg}] - (when (and port host name) - (l/info :msg "initializing server repl" :port port :host host :name name) - (ccs/start-server {:address host - :port port - :name name - :accept 'app.srepl/repl}) - cfg)) + [[type _] {:keys [::flag port host] :as cfg}] + (when (contains? cf/flags flag) + (let [accept (case type + ::prepl 'app.srepl/json-prepl + ::urepl 'app.srepl/user-repl) + params {:address host + :port port + :name (name type) + :accept accept}] + + (l/info :msg "initializing repl server" + :name (name type) + :port port + :host host) + + (ccs/start-server params) + + params))) (defmethod ig/halt-key! ::server - [_ cfg] - (when cfg - (ccs/stop-server (:name cfg)))) - - + [_ params] + (some-> params :name ccs/stop-server))