|
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