@SuppressWarnings({"rawtypes", "unchecked"})
  public void onEvent(
      NamespaceClient client, String eventName, List<Object> args, AckRequest ackRequest) {
    EventEntry entry = eventListeners.get(eventName);
    if (entry == null) {
      return;
    }

    try {
      Queue<DataListener> listeners = entry.getListeners();
      for (DataListener dataListener : listeners) {
        Object data = getEventData(args, dataListener);
        dataListener.onData(client, data, ackRequest);
      }
    } catch (Exception e) {
      exceptionListener.onEventException(e, args, client);
      if (ackMode == AckMode.AUTO_SUCCESS_ONLY) {
        return;
      }
    }

    sendAck(ackRequest);
  }