shoreleave/shoreleave-worker0.3,0A smarter client-side with ClojureScript : Shoreleave's embedded web worker utilities dependencies
dev dependencies
| (this space intentionally left almost blank) | ||||||||||||
(ns shoreleave.worker
(:require [shoreleave.browser.blob :as blob]
[cljs.reader :as reader])) | |||||||||||||
(deftype WorkerFn [F eworker res-atom-vector]
IWithMeta
(-with-meta [WFn meta]
(WorkerFn. (with-meta (.-F WFn) meta) (.-eworker WFn) (.-res-atom-vector WFn)))
IMeta
(-meta [WFn] (meta (.-F WFn)))
IFn
(-invoke [WFn arg]
(let [w (.-eworker WFn)]
(.postMessage w arg)))
IDeref
(-deref [WFn]
(-deref (.-res-atom-vector WFn)))
IWatchable
(-add-watch [WFn key f]
(-add-watch (.-res-atom-vector WFn) key f))
(-remove-watch [WFn key]
(-remove-watch (.-res-atom-vector WFn) key))
;#_(-notify-watches [WFn oldval newval]
; (-notify-watches (.-res-atom-vector WFn) oldval newval))
IHash
(-hash [WFn] (goog.getUid (.-f (.-F WFn))))) | |||||||||||||
DO NO USE THIS!!!! I still need to find a way to inject/import in the JS behind namespaces | |||||||||||||
(defn worker [f]
(let [f-str (str f)
fn-str (str "var swfn = " f-str ";"
"self.onmessage = function(c){self.postMessage(swfn(c.data));return c};")
blobb (blob/blob fn-str)
agg (atom [])
w (js/Worker. (blob/object-url! blobb))
*w (set! (.-onmessage w) #(swap! agg conj (.-data %)))
wfn (WorkerFn. f w agg)]
wfn)) | |||||||||||||