[new] Add dispatch-signal! util

This commit is contained in:
Peter Taoussanis 2024-10-10 10:02:02 +02:00
parent 9965450f5b
commit 5ac872566a
3 changed files with 34 additions and 3 deletions

View file

@ -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

View file

@ -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* "?[<wrapped-handler-fn>]" 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

View file

@ -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)]