diff --git a/projects/main/src/taoensso/telemere.cljc b/projects/main/src/taoensso/telemere.cljc index d83b39d..0420289 100644 --- a/projects/main/src/taoensso/telemere.cljc +++ b/projects/main/src/taoensso/telemere.cljc @@ -362,6 +362,25 @@ (handler thread throwable))))) nil)) +;;;; + +(defn dispatch-signal! + "Dispatches given signal to registered handlers, supports `with-signal/s`. + Normally called automatically (internally) by signal creators, this util + is provided publicly since it's also handy for manually re/dispatching + custom/modified signals, etc.: + + (let [original-signal (with-signal :trap (event! ::my-id1)) + modified-signal (assoc original-signal :id ::my-id2)] + (dispatch-signal! modified-signal))" + + [signal] + (when-let [wrapped-signal (impl/wrap-signal signal)] + (impl/dispatch-signal! wrapped-signal))) + +(comment (dispatch-signal! (assoc (with-signal :trap (log! "hello")) :level :warn))) + + ;;;; Interop #?(:clj diff --git a/projects/main/src/taoensso/telemere/impl.cljc b/projects/main/src/taoensso/telemere/impl.cljc index 858249a..7621b85 100644 --- a/projects/main/src/taoensso/telemere/impl.cljc +++ b/projects/main/src/taoensso/telemere/impl.cljc @@ -271,7 +271,7 @@ sigs/IFilterableSignal (allow-signal? [_ sig-filter] (sig-filter kind ns id level)) (signal-value [_ handler-sample-rate] - (let [sig-val @signal-value_] + (let [sig-val (force signal-value_)] (or (when handler-sample-rate (when (map? sig-val) @@ -282,6 +282,13 @@ (double (or (get sig-val :sample-rate) 1.0)))))) sig-val)))) +(defn wrap-signal + "Used by `taoensso.telemere/dispatch-signal!`." + [signal] + (when (map? signal) + (let [{:keys [ns kind id level]} signal] + (WrappedSignal. ns kind id level signal)))) + ;;;; Handlers (enc/defonce ^:dynamic *sig-handlers* "?[]" nil) @@ -361,9 +368,10 @@ (if last-only? (vreset! vol_ sv) (vswap! vol_ #(conj (or % []) sv)))) - (when trap? :stop)) + (when trap? :trapped)) - (sigs/call-handlers! *sig-handlers* signal))) + (sigs/call-handlers! *sig-handlers* signal) + :dispatched)) ;;;; Signal API helpers diff --git a/projects/main/test/taoensso/telemere_tests.cljc b/projects/main/test/taoensso/telemere_tests.cljc index 1b4f479..235d2f9 100644 --- a/projects/main/test/taoensso/telemere_tests.cljc +++ b/projects/main/test/taoensso/telemere_tests.cljc @@ -671,6 +671,10 @@ (testing "Signals in go macros" [(async/go (tel/log! "hello"))])) +(deftest _dispatch-signal! + [(sm? (tel/with-signal (tel/dispatch-signal! (assoc (tel/with-signal :trap (tel/log! "hello")) :level :warn))) + {:kind :log, :level :warn, :line :submap/some})]) + #?(:clj (deftest _uncaught->handler! (let [p (promise)]