From 3a43bc96fbe2263d855c9a79fddee4f4838ddb5c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Oct 2024 21:16:21 +0100 Subject: [PATCH] wip --- examples/browser-repl/package.json | 2 +- src/squint/nrepl.js | 23 ++++++++-- src/squint/repl/nrepl_server.cljs | 70 ++++++++++++++++++------------ 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/examples/browser-repl/package.json b/examples/browser-repl/package.json index 17037b44..ebdbb515 100644 --- a/examples/browser-repl/package.json +++ b/examples/browser-repl/package.json @@ -7,6 +7,6 @@ "vite": "^5.4.8" }, "scripts": { - "dev": "concurrently 'squint watch --repl' 'vite dev' 'squint nrepl-server --target browser'" + "dev": "concurrently 'squint watch --repl' 'vite dev' 'squint nrepl-server --target browser --port 13333'" } } diff --git a/src/squint/nrepl.js b/src/squint/nrepl.js index cde5e2c1..46b85bad 100644 --- a/src/squint/nrepl.js +++ b/src/squint/nrepl.js @@ -9,19 +9,34 @@ function nreplWebSocket () { async function evalMe(code) { const updatedCode = code.replace(/import\('(.+?)'\)/g, 'import(\'/@resolve-deps/$1\')'); console.log(updatedCode); - const res = await eval(updatedCode); + var res; + try { + res = await eval(updatedCode); + } catch (e) { + console.log('ex', e); + res = e; + } console.log(res); + return res; } -function handleNreplMessage(event) { +async function handleNreplMessage(event) { let data = event.data; data = JSON.parse(data); + const id = data.id; + console.log('data', data); const op = data.op; + var code, ws, res, msg; switch (op) { case 'eval': - const code = data.code; + code = data.code; console.log(code); - evalMe(code); + res = await evalMe(code); + console.log(res); + msg = JSON.stringify({op: 'eval', value: res, id: id}); + console.log(msg); + ws = nreplWebSocket(); + ws.send(msg); break; default: break; } diff --git a/src/squint/repl/nrepl_server.cljs b/src/squint/repl/nrepl_server.cljs index 0a867160..06a71b85 100644 --- a/src/squint/repl/nrepl_server.cljs +++ b/src/squint/repl/nrepl_server.cljs @@ -111,34 +111,42 @@ (def !ws-conn (atom nil)) (def !target (atom nil)) +(def !response-handler (atom nil)) (defn do-handle-eval [{:keys [ns code file _load-file? _line] :as request} send-fn] - (-> - (js/Promise.resolve code) - (.then compile) - (.then (fn [v] - (println "About to eval:") - (println v) - (if (= :browser @!target) - (if-let [conn @!ws-conn] - (.send conn (js/JSON.stringify - #js {:op "eval" - :code v})) - ;; TODO: here comes the websocket code - ) - (js/eval v)))) - (.then (fn [val] - (send-fn request {"ns" (str @last-ns) - "value" (format-value (:nrepl.middleware.print/print request) - (:nrepl.middleware.print/options request) - val)}))) - (.catch (fn [e] - (js/console.error e) - (handle-error send-fn request e))) - (.finally (fn [] - (send-fn request {"ns" (str @last-ns) - "status" ["done"]}))))) + (let [browser? (= :browser @!target) + error? (atom nil)] + (-> + (js/Promise.resolve code) + (.then compile) + (.then (fn [v] + (println "About to eval:") + (println v) + (if browser? + (if-let [conn @!ws-conn] + (.send conn (js/JSON.stringify + #js {:op "eval" + :code v + :id (:id request)})) + (println "No websocket connection to send result to") + ;; TODO: here comes the websocket code + ) + (js/eval v)))) + (.then (fn [val] + (when-not browser? + (send-fn request {"ns" (str @last-ns) + "value" (format-value (:nrepl.middleware.print/print request) + (:nrepl.middleware.print/options request) + val)})))) + (.catch (fn [e] + (js/console.error e) + (reset! error? e) + (handle-error send-fn request e))) + (.finally (fn [] + (when (or (not browser?) @error?) + (send-fn request {"ns" (str @last-ns) + "status" ["done"]}))))))) (defn handle-eval [{:keys [ns] :as request} send-fn] (prn :ns ns) @@ -265,6 +273,7 @@ (.setNoDelay ^node-net/Socket socket true) (let [handler (make-request-handler opts) response-handler (make-reponse-handler socket) + _ (reset! !response-handler response-handler) pending (atom nil)] (.on ^node-net/Socket socket "data" (fn [data] @@ -286,6 +295,13 @@ (def !server (atom nil)) +(defn ws-message-handler [data] + (let [data (js/JSON.parse data) + data (js->clj data)] + (when-let [id (get data "id")] + (prn :sending-reply data) + (@!response-handler {:id id} data)))) + (defn start-server "Start nRepl server. Accepts options either as JS object or Clojure map." [opts] @@ -313,9 +329,9 @@ (println "Websocket server running on port 1340") (.on wss "connection" (fn [conn] (reset! !ws-conn conn) - #_(.on conn "message" + (.on conn "message" (fn [data] - (js/console.log "data" data))) + (ws-message-handler data))) #_(.send conn "something"))) #_(reset! !ws-server wss))) (.listen server