Skip to content

Commit a7f2a85

Browse files
cemerickswannodette
authored andcommitted
CLJS-1176: redirect node REPL output through *out* and *err*, not System/out, System/err
1 parent 9cddd75 commit a7f2a85

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

src/clj/cljs/repl/node.clj

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
[clojure.data.json :as json])
1818
(:import java.net.Socket
1919
java.lang.StringBuilder
20-
[java.io File BufferedReader BufferedWriter]
21-
[java.lang ProcessBuilder ProcessBuilder$Redirect]))
20+
[java.io File BufferedReader BufferedWriter InputStream
21+
Writer InputStreamReader IOException]
22+
[java.lang ProcessBuilder Process]))
2223

2324
(defn socket [host port]
2425
(let [socket (Socket. host port)
@@ -77,6 +78,20 @@
7778
(defn platform-path [v]
7879
(str "path.join.apply(null, " (seq->js-array v) ")"))
7980

81+
(defn- pipe [^Process proc in ^Writer out]
82+
;; we really do want system-default encoding here
83+
(with-open [^java.io.Reader in (-> in InputStreamReader. BufferedReader.)]
84+
(loop [buf (char-array 1024)]
85+
(when (.isAlive proc)
86+
(try
87+
(let [len (.read in buf)]
88+
(when-not (neg? len)
89+
(.write out buf 0 len)))
90+
(catch IOException e
91+
(when (and (.isAlive proc) (not (.contains (.getMessage e) "Stream closed")))
92+
(.printStackTrace e *err*))))
93+
(recur buf)))))
94+
8095
(defn setup
8196
([repl-env] (setup repl-env nil))
8297
([repl-env opts]
@@ -87,12 +102,11 @@
87102
(string/replace (slurp (io/resource "cljs/repl/node_repl.js"))
88103
"var PORT = 5001;"
89104
(str "var PORT = " (:port repl-env) ";")))
90-
bldr (ProcessBuilder. (into-array [(get opts :node-command "node")]))
91-
_ (-> bldr
105+
proc (-> (ProcessBuilder. (into-array [(get opts :node-command "node")]))
92106
(.redirectInput of)
93-
(.redirectOutput ProcessBuilder$Redirect/INHERIT)
94-
(.redirectError ProcessBuilder$Redirect/INHERIT))
95-
proc (.start bldr)
107+
.start)
108+
_ (do (future (pipe proc (.getInputStream proc) *out*))
109+
(future (pipe proc (.getErrorStream proc) *err*)))
96110
env (ana/empty-env)
97111
core (io/resource "cljs/core.cljs")
98112
;; represent paths as vectors so we can emit JS arrays, this is to

0 commit comments

Comments
 (0)