Вы можете использовать подписки graphql (подробности см. В документации apollo).
В начале запроса для текущего состояния. Обе стороны (сервер и клиент) будут иметь одинаковые данные. Оба могут использовать одну и ту же библиотеку, например immutable.js
Клиент вызывает подписку, начинает прослушивать сообщения onListChange.
На сервере insertElement
, removeElement
, updateElement
распознаватели делают то же самое:
- обрабатывает мутацию в состоянии бэкэнда;
- кодирует
insert
(или remove
или * 1024) *) как actionType
и необходимые данные (аргументы мутации, вновь созданный идентификатор, номер версии) как payload
; - отправляет это ('onListChange') сообщение подписчикам, используя publi sh.
Клиент :
- получает сообщение;
- декодирует сообщение и обновляет / изменяет собственное состояние (обрабатывает ту же мутацию, что и на сервере) ;
- обновляет номер локальной версии.
В результате клиент должен иметь то же состояние.
Клиент может обнаружить пропущенные сообщения (номера версий, переданные в полезной нагрузке по сравнению с локальным индикатором версии), и принудительно [повторно] запросить текущее (полное) состояние.
Обновить
Если на стороне сервера изменения:
- не обусловлены мутациями (например, другие приложения работают на той же базе данных);
- не являются поток изменений, но просто новые состояния (новое состояние только что пришло / читается из внешнего источника);
... - у вас нет шансов ввести свои логики c в процесс применение изменений - у вас должен быть запущен процесс мониторинга , чтобы:
- обнаруживать изменения состояния;
- преобразовывать различия состояния в набор «патчей» (например, используя jiff );
- publi sh исправляет как сообщение для подписчиков.
Клиент декодирует (сообщения поток) исправляет мутации локального состояния (чтобы быть в синхронизации c с состоянием сервера), как ранее. Как и выше - применять изменения, если версии соответствуют или запрашивать все состояние.
Graphql является только каналом связи (запросы, сообщения) - он не имеет ничего для процессов (и данных, с обеих сторон) необходимо для этой задачи.