Хранилище состояний
Рутовое приложение начиная с версии 6.0.40
поддерживает хранилище состояний.
Хранилище состояний - это по сути хранилище чего угодно между вкладками рутового приложений например, web-socket соединение. Хранилище состояний не нужно отдельно включать, оно работает всегда по умолчанию
Web-socket соединение - это технология, которая позволяет устанавливать двустороннюю связь между браузером и сервером через единый сокет. Она обеспечивает постоянное соединение между клиентом и сервером, позволяя передавать данные в режиме реального времени без необходимости постоянного обновления страницы. Web-socket соединение может использоваться для создания чата, онлайн-игр, приложений для видеоконференций и других приложений, которые требуют мгновенной передачи данных.
Процесс такой:
- Пользователь открывает вкладку A;
- Вкладка A проверяет, что в хранилище ничего нет и регистрирует там web-socket - соединение;
- Вкладка A подписывается на соединение;
- Пользователь открывает вкладку B;
- Вкладка B проверяет, что в хранилище уже есть web-socket - соединение и тоже подписывается на него;
- Пользователь открывает вкладку C;
- Вкладка C так же видит, что в хранилище уже есть соединнение и вместо того, чтобы открывать свое - пользуется уже открытым соединением, доступным в хранилище
Таким образом все открытые вкладки в рутовом приложении могут общаться через одно и то же соединение через единый канал веб-сокета открытом в хранилище состояний рутового приложения
Хранилище состояний входит в состав библиотеки @diasoft/qpalette-core
начиная с версии 6.0.40
Пример кода
/**
* Позволяет делиться данными между вкладками.
* Можно хранить как простые объекты, так и Subject, и даже WebSocket.
*
* Пример хранения веб-сокет соединения:
*/
class MyWebSocketService {
data$ = new Subject<any>();
//Открываем WebSocket
get connection(): WebSocket {
let connection = this.storage.getState('qbpm-websocket-connection') as WebSocket;
if (!connection) {
connection = new WebSocket('/api/websocket');
this.storage.saveState(connection, 'qbpm-websocket-connection');
connection.onmessage = (msg) => {
this.data$.next(JSON.parse(msg.data));
};
}
return connection;
}
constructor(private readonly storage: QWindowStorageService) {
}
send(data: any){
this.connection.send(JSON.stringify({}));
}
}
export class QWindowStorageService