Я как делал, у запроса есть айди, есть метод, у ответа же только айди, без метода, оба участника канала вебсокет ждут сообщений... Каждый накидывает обработчиков на методы, когда приходит сообщение с методом то выполняется соответствующий обработчик над полученным данными и он должен отправить ответ, а может несколько... Когда угодно.. главное чтобы айди был как у запроса. а запросы же отправляться с уникальным айди для соединения (по сути просто счётчик на номер запроса) и тут же возвращается фьючер с ответом, который подписывается на ответ с подходящим айди, либо стрим, который будет прокидывал дальше данные пакетов с этим айди, пока не придет закрывающий пакет...