L'API SSE (Server Sent Event) a été retenue et implémentée dans Silverpeas.
Le serveur peut maintenant notifier le ou les navigateurs WEB (envois d'événements donc) et le navigateur peut de son côté écouter ces événements.
Les deux événements fonctionnels aujourd'hui envoyés sont les suivants :
- USER_SESSION : cet événement est envoyé vers les navigateurs WEB à chaque connexion ou à chaque déconnexion (manuelle ou forcée) d'un utilisateur.
Les données suivantes sont transmises via l'événement :
{
nbConnectedUsers : /* le nombre total d'utilisateurs connectés, au regard de l'isolement des domaines et du domaine de l'utilisateur qui reçoit l'événement */,
isOpening : /* booléen qui indique si l'événement est envoyé suite à une connexion (true) (false ou undefined n'ont ici pas de réalité informationnelle). */,
isClosing : /* booléen qui indique si l'événement est envoyé suite à une déconnexion (true) (false ou undefined n'ont ici pas de réalité informationnelle). */
}
Ces deux événements sont écoutables depuis l'URL /[URL de l'application, silverpeas autrement dit]/sse/common.
Exemple d'une implémentation de l'écoute de l'événement USER_SESSION dans Silverpeas :
spServerEventSource.addEventListener(
'USER_SESSION',
function(serverEvent) {
var data = JSON.parse(serverEvent.data);
alert('Il y a ' + data.nbConnectedUsers + ' utilisateur(s) connecté(s)');
},
'expiredUserSessionListener'
);
spServerEventSource est mis à disposition par SilverpeasLayout (créé dans le cadre du REDMINE
#7909). Cette instance permet d'ajouter ou de supprimer facilement des écoutes d'événements communs de Silverpeas (les deux listés ci-dessus), via les méthodes :
- addEventListener : ajout de l'écoute d'un événement, avec les paramètres :
- serverEventName : le nom de l'événement écouté
- listener : la fonction javascript a exécuter lors de la réception d'un événement, l'instance de l'événement est passé en premier paramètre
- listenerId : un identifiant optionnel. Cet identifiant, s'il est transmis, permet de supprimer l'écoute précédemment mise en place avec le même identifiant
- removeEventListener : suppression de l'écoute d'un événement, avec les paramètres :
- serverEventName : le nom de l'événement écouté
- listenerOrListenerId : function javascript à supprimer des écoutes ou identifiant de la fonction javascript à supprimer
Si le service ci-dessus (spServerEventSource) n'existait pas, il aurait fallu écrire :
var serverEventSource = new EventSource('/silverpeas/sse/common');
serverEventSource.addEventListener(
'USER_SESSION',
function(serverEvent) {
var data = JSON.parse(serverEvent.data);
alert('Il y a ' + data.nbConnectedUsers + ' utilisateur(s) connecté(s)');
}
);
Quelques explications sur les Server Sent Event : https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events
Pour les navigateurs qui ne sont nativement pas compatibles avec cette API, il existe un polyfill que Silverpeas utilise naturellement : https://github.com/Yaffle/EventSource