more flexible signal dispatching to allow substituting SignalJs