Я использую 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);
}