lib/jsdom/living/events/EventTarget-impl.js
function invokeEventListeners(tuple, eventImpl) {
  const tupleIndex = eventImpl._path.indexOf(tuple);
  for (let i = tupleIndex; i >= 0; i--) {
    const t = eventImpl._path[i];
    if (t.target) {
      eventImpl.target = t.target;
      break;
    }
  }

  eventImpl.relatedTarget = idlUtils.wrapperForImpl(tuple.relatedTarget);

  if (eventImpl._stopPropagationFlag) {
    return;
  }

  eventImpl.currentTarget = idlUtils.wrapperForImpl(tuple.item);

  const listeners = tuple.item._eventListeners;
  innerInvokeEventListeners(eventImpl, listeners);
}
function invokeEventListeners(tuple, eventImpl) {
  const tupleIndex = eventImpl._path.indexOf(tuple);
  for (let i = tupleIndex; i >= 0; i--) {
    const t = eventImpl._path[i];
    if (t.target) {
      eventImpl.target = t.target;
      break;
    }
  }

  eventImpl.relatedTarget = idlUtils.wrapperForImpl(tuple.relatedTarget);

  if (eventImpl._stopPropagationFlag) {
    return;
  }

  eventImpl.currentTarget = idlUtils.wrapperForImpl(tuple.item);

  const listeners = tuple.item._eventListeners;
  innerInvokeEventListeners(eventImpl, listeners);
}
https://dom.spec.whatwg.org/#concept-event-listener-invoke