void stream_manager::deliver_handshake(response_promise& rp, stream_slot slot, message handshake) { CAF_LOG_TRACE(CAF_ARG(rp) << CAF_ARG(slot) << CAF_ARG(handshake)); CAF_ASSERT(rp.pending()); CAF_ASSERT(slot != invalid_stream_slot); ++pending_handshakes_; auto next = rp.next(); rp.deliver(open_stream_msg{slot, std::move(handshake), self_->ctrl(), next, priority_}); }
stream_slot stream_manager::add_unchecked_outbound_path_impl(response_promise& rp, message handshake) { CAF_LOG_TRACE(CAF_ARG(rp) << CAF_ARG(handshake)); CAF_ASSERT(out().terminal() == false); if (!rp.pending()) { CAF_LOG_WARNING("add_outbound_path called with next == nullptr"); rp.deliver(sec::no_downstream_stages_defined); return invalid_stream_slot; } auto slot = self_->assign_next_pending_slot_to(this); auto path = out().add_path(slot, rp.next()); CAF_IGNORE_UNUSED(path); CAF_ASSERT(path != nullptr); // Build pipeline by forwarding handshake along the path. deliver_handshake(rp, slot, std::move(handshake)); generate_messages(); return slot; }