технически канал один для всех юзеров и твой вебсокет сервер разруливает кому что отправлять в конечном счете исходя из айдишника сокета, пользователь сам по себе не может решить на какой "канал" подписаться, он подписывается просто на события которые твой вебсокет сервак рассылает, а называются эти события для всех юзеров одинаково (по крайней мере пока ты не сделаешь специальную реализацию которая позволяет это делать иначе, из коробки - нет). но потребуется ассоциировать конкретного юзера с его сокет айди, поскольку передача сообщений происходит, олбычно с посредничеством твоего пхп приложения. например, когда юзер отправляет сообщение, запрос идет в твое пхп приложение, которое пишет сообщение в бд, а уже потом броадкастит в вебсокет-сервер это сообщение. то есть пользователь использует вс-сервер чисто для того чтобы слушать события, для приемки сообщений короче. для того чтобы ассоциировать айдишник юзера с сокет айди на стороне вебсокет сервера, можно юзать какой-то access_token уникальный для каждого пользователя. вот старый драфт как это плюс-минус того как это использовалось в одном из моих приложений:
https://gitlab.com/moofik12/masterhome/-/blob/master/frontend/common/mixins/websocket.js - запрашивает с бека аксесс токен, подписывается на вс сервер, к событию цепляем этот самый аксесс токен
https://gitlab.com/moofik12/masterhome/-/blob/master/socket-server/src/SocketServer.ts - 36 строчка -регистрация юзера в пуле активных пользователей, 59я - отправака пользователю сообщения (сообщение берется из очереди рэббита), апдейт дергается вот этим классом
https://gitlab.com/moofik12/masterhome/-/blob/master/socket-server/src/Service/Message/MessageListener.ts