Частичная синхронизация состояния клиента с помощью ngrx - PullRequest
1 голос
/ 04 августа 2020

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

const server = new WebSocket.Server({port: this.port});
server.on("connection", ws => {
  ws.on("message", data => {
    server.clients.forEach((client: WebSocket) => {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(data);
      } }); }); });

На стороне клиента / Angular я использую ngrx для хранения / обновления состояния. В настоящее время я подписываюсь на любые изменения в состоянии, и всякий раз, когда это происходит, я отправляю весь объект состояния через веб-сокет. Когда я получаю сообщение, я загружаю состояние, убедившись, что на этот раз сообщение не отправлено:

this.store.pipe(select("test")).subscribe(state => {
  if (!state.forcefullyChanged) this.ws.sendState(state);
});

this.ws.messages$.subscribe(state => {
  this._loadState(state);
  this.store.dispatch(forceChangeState(state));
});

Проблема в том, что состояние состоит из нескольких (длинных) массивов:

export interface State {
  a: Array<SomeOtherObject>;
  b: Array<SomeObject[]>;
}

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

Я знаю о более сложные решения, такие как использование Meteor или создание надлежащей базы данных. Я мог бы настроить наблюдателя для каждого элемента массива, но это может быть утомительно, так как я часто добавляю / удаляю элементы из середины этих элементов. В идеале я бы получил селектор ngrx, чтобы он возвращал, какая ячейка массива изменилась, и я бы отправил на сервер только новую ячейку и ее индекс. Это возможно? Есть ли более канонический способ получения частичных обновлений состояния (на уровне элементов массива, а не полей)?

...