Как стать автором
Обновить

Комментарии 12

идея любопытная, кажется тут можно еще покопать в сторону использования более шустрых реализаций (допустим uws или что-то на wasm), или grpc тот же.

В библиотеке также хотелось бы иметь возможность аборта по айдишнику (клиент передумал и ему не нужен ответ).

Честно говоря, я плохо представляю где могла бы понадобиться отмена запроса, но сделать такое легко учитывая структуру

abort(waitId) {
    const err = new Error("Request abortion");
    this._awaitMessages[waitId]?.reject(err):
    return err:
}  

Надеюсь, я правильно понял что должна делать функция..

не совсем).

Допустим есть какой-то список данных выводимый на клиенте. И есть ендпоинт который отдает эти данные на сервере.

Построение этого списка не моментальное. Серверу тоже нужно сходить в другие сервисы и/или БД внутри кластера, чтобы собрать этот список и отдать это пользователю. У списка предусмотрена фильтрация, пользователь передает параметры фильтрации - сервер фильтрует список при построении.

При отмене запроса не только клиент должен перестать ожидать ответ на свой же запрос, но и сервер должен перестать делать какие-то вычисления по нему. Если у сервера в этот момент для выполнения этого запроса есть активные запросы в другие сервисы - он тоже должен их прервать дабы не расходовать ресурсы впустую.

Получается если клиент выбрал фильтры, а через секунду выбрал другие фильтры, то первый запрос отменится, а второй будет выполнен.

Примерно такой может быть контекст у отмены запроса. Надеюсь понятно описал.

Ну можно например два подключения к серверу делать, управляющее и с данными... Если управляющее отваливается или по нему приходит запрос на отмену, сервер спокойно перестает обрабатывать запрос и дропает соединение с данными. Это так, навскидку придумалось, не могу сказать, можно ли так на вебсокете сделать.

uWS хорош, но там только серверная часть

Реально лучше, очень полезная штука

Полезный хелпер.
Ещё в клиент было бы здорово добавить что-то простое для обработки дисконнекта и колбэков по коннекту/дисконнекту, и цикличного реконнекта, с настройками пауз и количеством попыток.
В идеале, чтобы просто было в пару строк видеть состояние соединения (я обычно делаю индикатор красный/зеленый где-то в углу) и "растущую" паузу попыток реконнекта. Тогда вообще не нужно будет заморачиваться по WS, только ваша либа и все.

Цикличный реконнект правда очень хорошая идея. Пожалуй, это первое, что я сделаю когда вновь возьмусь за библиотеку.

А по поводу callback не совсем понял, вроде же есть ивенты которые работают схожим с callback способом, разве не?

waitId стоит делать через UUID - и быстро, и гарантировано не пересекается с другими, WS все же для систем где много сообщений / клиентов, а значит примитивный Date.now не лучшее решение

Ранее у меня стоял выбор между UUID и собственной реализацией на node:crypto дабы не иметь сторонних зависимостей, но сейчас я на 100% могу сказать, что следующая (наверное, релизная версия) будет иметь UUID под капотом для waitId

Стоит еще адаптировать библиотеку (и вопрос, будет ли она актуальна?) к нативной реализации Ws клиента в следующих версиях ноды

Я процентов на 90 уверен, что она будет актуальна. Всё, что использует AsyncSocket это ивенты connect и message, а так-же метод send. Если это всё в следующих версия меняться не будет (как минимум интерфейс использования), то он останется актуальным.

Да и в ином случае, я скорее всего просто запатчу AsyncSocket

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории