function streamFeatures({ middleware }) {
  function use(name, xmlns, handler) {
    return middleware.use((ctx, next) => {
      const { stanza } = ctx;
      if (!stanza.is("features", "http://etherx.jabber.org/streams"))
        return next();
      const feature = stanza.getChild(name, xmlns);
      if (!feature) return next();
      return handler(ctx, next, feature);
    });
  }

  return {
    use,
  };
}
References
https://xmpp.org/rfcs/rfc6120.html#streams-negotiation Stream Negotiation
https://xmpp.org/extensions/xep-0170.html XEP-0170: Recommended Order of Stream Feature Negotiation
https://xmpp.org/registrar/stream-features.html XML Stream Features