Я хотел бы синхронизировать состояние приложения 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, чтобы он возвращал, какая ячейка массива изменилась, и я бы отправил на сервер только новую ячейку и ее индекс. Это возможно? Есть ли более канонический способ получения частичных обновлений состояния (на уровне элементов массива, а не полей)?