Тайм-аут дескриптора eventSource-polyfill - PullRequest
0 голосов
/ 07 января 2019

Я использую EventSource и SSE для отправки уведомлений пользователям. Моя аутентификация основана на токене JWT, срок действия которого истекает каждые 10 минут. После истечения срока действия мне нужно закрыть предыдущий EventSource и запустить новый. Однако я не могу определить событие тайм-аута на стороне клиента.

Код на стороне клиента:

let eventSource = new EventSourcePolyfill(AppUrl.NEW_NOTIFICATIONS, { headers: { Authorization: 'Bearer ' + this.authService.getAccessToken() } });
    eventSource.onmessage = (message) => {
      this.store.dispatch(NotificationActionFactory.addNotifications.createNew({ notifications: JSON.parse(message.data) }));
    };

    eventSource.onopen = (a) => {
      console.log('Connection Open');
    };
    eventSource.onerror = (e) => {
      if(e.target.readyState == eventSource.CLOSED){
        eventSource.close();
        console.log('Connection closed');
      }else{
        console.log('error message');
      }
    };

код на стороне сервера:

@RequestMapping(value = "/app/notifications/new", method = RequestMethod.GET)
    public ResponseEntity<SseEmitter> streamNotification() {
        Long timeoutTime = DataServiceUtil.getTokenTimeoutTime(credentialProvider.getExpiryTime());
        logger.debug("The timeout is {}", timeoutTime);
        final SseEmitter emitter = new SseEmitter(60000L);
        emitter.onTimeout(() -> {
            emitter.complete();
        });
        service.addEventToStore(credentialProvider.getUserId(), emitter);

        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.set("X-Accel-Buffering",
                "no");
        return ResponseEntity.ok()
                .headers(responseHeaders).body(emitter);
    }
...