Рутовое приложение
Хранилище состояний

Хранилище состояний

Рутовое приложение начиная с версии 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