Стратегия обнаружения активности пользователя для поддержания сеанса в рабочем состоянии (RxJS)

#angular #typescript #rxjs #polling

#angular #typescript #rxjs #опрос

Вопрос:

Я хочу поддерживать сеанс пользователя в рабочем состоянии с помощью активности пользователя, определенной как таковая.

Информационная система должна инициировать блокировку интерактивного сеанса после 15-минутного периода бездействия пользователя (бездействие определяется как отсутствие активности клавиатуры или мыши).

Это то, что я придумал .. как обычно, есть много способов выполнить что-то в RxJS, и мне было интересно, есть ли лучший способ или стандартная стратегия

Приведенный ниже пример будет пинговать сервер, если есть активность пользователя каждые 60 секунд

 const userActivityEvents = [
      fromEvent(document, 'click'),
      fromEvent(document, 'wheel'),
      fromEvent(document, 'scroll'),
      fromEvent(document, 'keypress'),
      fromEvent(document, 'mousemove'),
      fromEvent(document, 'touchmove'),
    ];

    merge(...userActivityEvents).pipe(
      throttleTime(60 * 1000),
      switchMap(() => this.apiService.get('/api/auth/ping', new HttpParams(), new HttpHeaders({ignoreLoadingBar: ''})),
      ),
    ).subscribe({error: () => undefined});

  

Комментарии:

1. что такое {leading: true, trailing: false} ?

2. это были значения по умолчанию rxjs-dev.firebaseapp.com/api/operators/throttleTime я обновил вопрос и удалил их, так как они ничего не добавляли

Ответ №1:

Поскольку в этом вопросе не было никакой поддержки, я мог бы также оставить свой окончательный ответ.

       this.ngZone.runOutsideAngular(() => {
        merge(
          fromEvent(document, 'click'),
          fromEvent(document, 'wheel'),
          fromEvent(document, 'scroll'),
          fromEvent(document, 'keypress'),
          fromEvent(document, 'mousemove'),
          fromEvent(document, 'touchmove'),
        ).pipe(
          throttleTime(USER_ACTIVITY_POLL_TIME),
          skip(1),
          filter(() => !this.sessionModal),
          filter(() => this.authService.authenticated),
          switchMap(() => this.authService.ping(new HttpHeaders({ignoreLoadingBar: ''}))),
        ).subscribe({error: () => undefined});
      });