|
17 | 17 | [clojure.data.json :as json])
|
18 | 18 | (:import java.net.Socket
|
19 | 19 | 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])) |
22 | 23 |
|
23 | 24 | (defn socket [host port]
|
24 | 25 | (let [socket (Socket. host port)
|
|
77 | 78 | (defn platform-path [v]
|
78 | 79 | (str "path.join.apply(null, " (seq->js-array v) ")"))
|
79 | 80 |
|
| 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 | + |
80 | 95 | (defn setup
|
81 | 96 | ([repl-env] (setup repl-env nil))
|
82 | 97 | ([repl-env opts]
|
|
87 | 102 | (string/replace (slurp (io/resource "cljs/repl/node_repl.js"))
|
88 | 103 | "var PORT = 5001;"
|
89 | 104 | (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")])) |
92 | 106 | (.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*))) |
96 | 110 | env (ana/empty-env)
|
97 | 111 | core (io/resource "cljs/core.cljs")
|
98 | 112 | ;; represent paths as vectors so we can emit JS arrays, this is to
|
|
0 commit comments