Bonjour.

Pour une appli multi-utilisateur j'ai besoin de mettre à jour les page sur les navigateurs des personnes connectées.
En cherchant, je suis facilement tombé sur la notion de server-side event (SSE) et l'implémentation en javascript EventSource.

Ça c'était la partie facile…

J'ai donc mis en place les exemples très simples et courts des pages :
https://www.developerdrive.com/pushi...r-sent-events/ dont l'exemple provoque manifestement une erreur (pas d'écriture du résultat)
https://www.w3schools.com/html/html5...sentevents.asp dont l'exemple fonctionne parfaitement bien

Côté réseau, les deux reçoivent bien la requête du serveur, avec un code 200, mais le second génère vraisemblablement une erreur (c'est ce qui arrive quand je teste chez moi). La seule différence que j'ai notée est la version de http : 1,1 quand ça ne marcvhe pas, 2 quand ça marche. Or pour autant que j'ai compris (EventSource apparu en 2012, http/2 en 2015 : back to the future !?) EventSource est compatible http/1.1

Testée chez moi, en local et sur mon domaine, la solution de developerdrive qui ne diffère pas fondamentalement de celle de w3school génère une erreur, EventSource retournant un objet error là ou j'attends un objet message.

Or… sans doute pour faire écho à l'absence (quasi) totale de documentation digne de ce nom sur le net, cet objet erreur… n'apporte aucune information por comprendre l'erreur : numéro ou message !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
bubbles: false
cancelBubble: false
cancelable: false
composed: false
currentTarget: null
defaultPrevented: false
eventPhase: 0
explicitOriginalTarget: EventSource { url: "http://localhost/sse/send_sse.php", withCredentials: false, readyState: 0, … }
isTrusted: true
originalTarget: EventSource { url: "http://localhost/sse/send_sse.php", withCredentials: false, readyState: 0, … }
returnValue: true
srcElement: EventSource { url: "http://localhost/sse/send_sse.php", withCredentials: false, readyState: 0, … }
target: EventSource { url: "http://localhost/sse/send_sse.php", withCredentials: false, readyState: 0, … }
timeStamp: 43196
type: "error"
<get isTrusted()>: function isTrusted()
<prototype>: EventPrototype { composedPath: composedPath(), stopPropagation: stopPropagation(), stopImmediatePropagation: stopImmediatePropagation(), … }
cartes.js:517:11
La seule information utile que j'ai trouvée après des heures de recherches est la suivante (stackoverflow) et si je suis la spécification j'en déduis sur l'erreur
− CORS : non, pas de message en ce sens du navigateur
− erreur réseau : non, requête avec statut 200
− reconnexion : non puisque le statut est 200 et non 500 et que le traitement n'a pas été effectué
− pas de redirection.

Quelqu'un peut-il m'aider à comprendre d'où provient l'erreur et comment la détecter ?


Par ailleurs la très abondante documentation (3 pages à tout casser) n'explique pas comment fonctionne le service. Je remarque que systématiquement une requête est envoyée toutes les 5 s sans que côté serveur un événement n'ai réellement eu lieu (la page php ne fait qu'écrire un nombre aléatoire ou la date, mais n'est pas déclencher par la requête d'une autre personne). Y a-t-il moyen de configurer ça ? Le service vraiment utile serait de distribuer seulement quand il y a une mise à jour sur le serveur. Là ça fait potentiellement beaucoup de traffic pour peut-être rien. Côté client on peut mieux gérer la fréquence de mise à jour selon l'activité sur la page.

Merci.