Как отправить постоянную структуру данных и ее изменения во времени с помощью GraphQL? - PullRequest
0 голосов
/ 21 апреля 2020

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

[]
[1]
[1 2]
[-1 1 2]
[-1 2]
[2]
[]

I ' Я ищу библиотеку, которая позволяет мне описать эту структуру данных и ее изменения и автоматически найти правильное представление graphql только для публикации sh различий?

Например, она разбила бы вышеупомянутую структуру на:

start empty
add 1
add 2
insert -1 in the beginning
etc.

в терминах GraphQL.

Кто-нибудь занимался этим раньше?

В идеале ReasonML (front-end) и Python (back-end), но ищет какой-либо примеры.

1 Ответ

1 голос
/ 21 апреля 2020

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

В начале запроса для текущего состояния. Обе стороны (сервер и клиент) будут иметь одинаковые данные. Оба могут использовать одну и ту же библиотеку, например immutable.js

Клиент вызывает подписку, начинает прослушивать сообщения onListChange.

На сервере insertElement, removeElement, updateElement распознаватели делают то же самое:

  • обрабатывает мутацию в состоянии бэкэнда;
  • кодирует insert (или remove или * 1024) *) как actionType и необходимые данные (аргументы мутации, вновь созданный идентификатор, номер версии) как payload;
  • отправляет это ('onListChange') сообщение подписчикам, используя publi sh.

Клиент :

  • получает сообщение;
  • декодирует сообщение и обновляет / изменяет собственное состояние (обрабатывает ту же мутацию, что и на сервере) ;
  • обновляет номер локальной версии.

В результате клиент должен иметь то же состояние.

Клиент может обнаружить пропущенные сообщения (номера версий, переданные в полезной нагрузке по сравнению с локальным индикатором версии), и принудительно [повторно] запросить текущее (полное) состояние.

Обновить

Если на стороне сервера изменения:

  • не обусловлены мутациями (например, другие приложения работают на той же базе данных);
  • не являются поток изменений, но просто новые состояния (новое состояние только что пришло / читается из внешнего источника);

... - у вас нет шансов ввести свои логики c в процесс применение изменений - у вас должен быть запущен процесс мониторинга , чтобы:

  • обнаруживать изменения состояния;
  • преобразовывать различия состояния в набор «патчей» (например, используя jiff );
  • publi sh исправляет как сообщение для подписчиков.

Клиент декодирует (сообщения поток) исправляет мутации локального состояния (чтобы быть в синхронизации c с состоянием сервера), как ранее. Как и выше - применять изменения, если версии соответствуют или запрашивать все состояние.

Graphql является только каналом связи (запросы, сообщения) - он не имеет ничего для процессов (и данных, с обеих сторон) необходимо для этой задачи.

...