code: @SuppressWarnings("javadoc")
      protected void firePacketSendingListeners(final TopLevelStreamElement sendTopLevelStreamElement) {
          if (debugger != null) {
              debugger.onOutgoingStreamElement(sendTopLevelStreamElement);
          }
  
          if (!(sendTopLevelStreamElement instanceof Stanza)) {
              return;
          }
          Stanza packet = (Stanza) sendTopLevelStreamElement;
  
          final List<StanzaListener> listenersToNotify = new LinkedList<>();
          synchronized (sendListeners) {
              for (ListenerWrapper listenerWrapper : sendListeners.values()) {
                  if (listenerWrapper.filterMatches(packet)) {
                      listenersToNotify.add(listenerWrapper.getListener());
                  }
              }
          }
          if (listenersToNotify.isEmpty()) {
              return;
          }
          // Notify in a new thread, because we can
          asyncGo(new Runnable() {
              @Override
              public void run() {
                  for (StanzaListener listener : listenersToNotify) {
                      try {
                          listener.processStanza(packet);
                      }
                      catch (Exception e) {
                          LOGGER.log(Level.WARNING, "Sending listener threw exception", e);
                          continue;
                      }
                  }
              }
          });
      }
docs: TODO: Rename to fireElementSendingListeners().