17
17
[cljs.closure :as cljsc]
18
18
[cljs.repl :as repl]
19
19
[cljs.repl.server :as server])
20
- (:import [java.util.regex Pattern]))
20
+ (:import [java.util.regex Pattern]
21
+ [java.util.concurrent Executors]))
21
22
22
- (defonce browser-state
23
- ( atom { :return-value-fn nil
24
- :client-js nil }) )
23
+ (def ^:dynamic browser-state nil )
24
+ ( def ^:dynamic ordering nil )
25
+ ( def ^:dynamic es nil )
25
26
26
27
(defn- set-return-value-fn
27
28
" Save the return value function which will be called when the next
116
117
117
118
(server/dispatch-on :post (constantly true ) handle-post)
118
119
119
- (def ordering (agent {:expecting nil :fns {}}))
120
-
121
120
(defmethod handle-post :ready [_ conn _]
122
- (send ordering (fn [_] {:expecting nil :fns {}}))
121
+ (send-via es ordering (fn [_] {:expecting nil :fns {}}))
123
122
(send-for-eval conn
124
123
(cljsc/-compile
125
124
'[(set! *print-fn* clojure.browser.repl/repl-print)
142
141
" Elements to be printed in the REPL will arrive out of order. Ensure
143
142
that they are printed in the correct order."
144
143
[order f]
145
- (send-off ordering add-in-order order f)
146
- (send-off ordering run-in-order))
144
+ (send-via es ordering add-in-order order f)
145
+ (send-via es ordering run-in-order))
147
146
148
147
(defmethod handle-post :print [{:keys [content order]} conn _ ]
149
148
(constrain-order order
@@ -483,15 +482,19 @@ goog.events.getProxy/f<@http://localhost:9000/out/goog/events/events.js:276:16"
483
482
file))
484
483
485
484
(defn setup [{:keys [working-dir] :as repl-env} opts]
486
- (println " Compiling client js ..." )
487
- (swap! browser-state
488
- (fn [old]
489
- (assoc old :client-js
490
- (create-client-js-file
491
- repl-env (io/file working-dir " client.js" )))))
492
- (println " Waiting for browser to connect ..." )
493
- opts
494
- (server/start repl-env))
485
+ (binding [browser-state (:browser-state repl-env)
486
+ ordering (:ordering repl-env)
487
+ es (:es repl-env)
488
+ server/state (:server-state repl-env)]
489
+ (repl/err-out ((:print opts) " Compiling client js ..." ))
490
+ (swap! browser-state
491
+ (fn [old]
492
+ (assoc old :client-js
493
+ (create-client-js-file
494
+ repl-env (io/file working-dir " client.js" )))))
495
+ (repl/err-out ((:print opts) " Waiting for browser to connect ..." ))
496
+ opts
497
+ (server/start repl-env)))
495
498
496
499
(defrecord BrowserEnv []
497
500
repl /IJavaScriptEnv
@@ -513,13 +516,18 @@ goog.events.getProxy/f<@http://localhost:9000/out/goog/events/events.js:276:16"
513
516
{:ua-product (clojure.browser.repl/get-ua-product )
514
517
:value (str ~e)
515
518
:stacktrace (.-stack ~e)})))))
516
- (-evaluate [_ _ _ js] (browser-eval js))
519
+ (-evaluate [this _ _ js]
520
+ (binding [browser-state (:browser-state this)
521
+ ordering (:ordering this)
522
+ es (:es this)
523
+ server/state (:server-state this)]
524
+ (browser-eval js)))
517
525
(-load [this provides url]
518
526
(load-javascript this provides url))
519
- (-tear-down [_ ]
520
- (server/stop )
521
- ( reset! server/state {} )
522
- (reset! browser-state {} )))
527
+ (-tear-down [this ]
528
+ (binding [ server/state ( :server-state this)]
529
+ ( server/stop ) )
530
+ (.shutdown ( :es this) )))
523
531
524
532
(defn repl-env*
525
533
[{:keys [output-dir] :as opts}]
@@ -531,7 +539,16 @@ goog.events.getProxy/f<@http://localhost:9000/out/goog/events/events.js:276:16"
531
539
:static-dir (cond-> [" ." " out/" ] output-dir (conj output-dir))
532
540
:preloaded-libs []
533
541
:optimizations :simple
534
- :src " src/" }
542
+ :src " src/"
543
+ :browser-state (atom {:return-value-fn nil
544
+ :client-js nil })
545
+ :ordering (agent {:expecting nil :fns {}})
546
+ :es (Executors/newFixedThreadPool 16 )
547
+ :server-state
548
+ (atom
549
+ {:socket nil
550
+ :connection nil
551
+ :promised-conn nil })}
535
552
opts))
536
553
537
554
(defn repl-env
0 commit comments