SSE fonctionne en local mais sur ovh ni sur IBM!!

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, je déploie mon site ce jour sur un hébergement ovh.
j’ai tout testé en local tout est ok, sur ovh tout est KO.

en clair, j’ai une page planning qui doit afficher se mettre à jour au fur et a mesure que les clients prennent rendez-vous. concrètement, j’ai une entity rendez-vous et une entity SSE. l’entity SSE s’incrémente lorsque la prise du rendez-vous est aujourd’hui avec l’id du planning, l’id du rendez-vous et un état (null par défaut)

voici le code sur la page planning qui intérroge la méthode SSEAction

<script>
$(document).ready(function(){
    //server sent 
    if(typeof(EventSource) !== "undefined") {
        var source = new EventSource("{{ path('SSE', {'id': planning.id, 'date': date|date("d-m-Y") }) }}");
        source.addEventListener('message', function(e) {
            {# if (e.origin =="http://{{ app.request.server.get('SERVER_NAME') }}") { #}
                source.onmessage = function(event) {
                    if(event.data != "null"){
                        console.log(event.data);                        
                        
                        var audio = new Audio('{{ asset("son/msg.mp3") }}');
                        var promise = audio.play();
                        if (promise !== undefined) {
                            promise.then(_ => {
                                // Autoplay started!
                            }).catch(error => {
                                // Autoplay was prevented.
                                // Show a "Play" button so that user can start playback.
                            });
                        }
                        idrdv = event.data;
                        msg = "Nouveau rendez-vous positionné dans votre planning";

                        if (!("Notification" in window)) {
                            alert("Ce navigateur ne supporte pas les notifications desktop");
                        } else if (Notification.permission === "granted") {                           
                            var notification = new Notification(msg);
                        } else if (Notification.permission !== 'denied') {
                            Notification.requestPermission(function (permission) {
                            if(!('permission' in Notification)) {
                                Notification.permission = permission;
                                document.getElementById("snackbar-container").innerHTML = ' <div class="snackbar error fadeOut">Vous avez desactiver les notifications windows</div>';
                            }
                            if (permission === "granted") {
                                var notification = new Notification(msg);
                            }
                            });
                        }
                        {# document.getElementById("snackbar-container").innerHTML = ' <div class="snackbar notice fadeInUp"></div>'; #}
                        majRdv(idrdv);
                    }
                };
            {#  } #}
        });
    } else {
        document.getElementById("snackbar-container").innerHTML = ' <div class="snackbar error fadeOut">Désolé, votre browser n\'est pas supporté</div>';
    }
});

la méthode SSEAction

/**
     * server sent
     * @param integer [$id] identifiant du planning
     * @param date $date la date en francais 05-11-2018
     * @return 
     */
    public function SSEAction(Request $request, $id, $date){ 
        $session = $request->getSession();
        $em = $this->getDoctrine()->getManager();

        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
                
        $planning = $em->getRepository('AppBundle:Planning')->find($id);
        $rdvs = $em->getRepository('AppBundle:SSE')->findBy(array('planning'=>$planning, 'etat'=>null));

        if($rdvs){
            foreach($rdvs as $rdv){
                echo "data: {$rdv->getRendezvous()->getId()} \n\n";
                $rdv->setEtat(1);
            }
        }  else {
            echo "data:null\n\n";
        }
        flush();

        $em->flush();
        return new Response();
    }

dans la console j’ai bien mon retour comme quoi il n’y a pas de nouveaux rendez-vous mais lorsqu’un rendez-vous se positionne, la base de donnée ce met à jour (on met 1 à la place de null dans l’etat de la table SSE) mais la connexion SSE ne me renvoi pas le data.

Édité par Leeroy Jenkins

+0 -0

Prend une capture de l’onglet "network" de la console de ton navigateur stp.

On devrait mieux comprendre si la connexion est rejetée, si elle est établie mais que rien ne se passe dedans, etc.

Happiness is a warm puppy

+1 -0
Auteur du sujet

Bonjour,

dsl du retard de réponse

oui c’est le même nom de domaine.

voici en image ce que renvoi la console, entouré en bleu la connexion envoyé quelques secondes après la prise du rdv et donc qui aurait du renvoyer un data :id du rdv

Image utilisateur
Image utilisateur

Édité par Leeroy Jenkins

+0 -0
Auteur du sujet

Bon, j’ai changé d’hébergeur, pour passer sur ibm bluemix.

et la non plus, cela ne fonctionne pas, j’ai par contre un message un peu plus clair

EventSource’s response has a MIME type ("text/html") that is not "text/event-stream". Aborting the connection.

une idée?

j’ai trouvé!!

J’ai cru trouver :'( |

j’ai trouvé mais sans comprendre :'(

Je déclaré mal les headers

        $response = new Response();
        $response->headers->set('Content-Type', 'text/event-stream');
        $response->headers->set('Cache-Control', 'no-cache');

        return $response;

les headers bien déclaré, ca ne me renvoi plus rien…

bon je crois que je vais essayer de trouver autre chose et abandonner SSE…

Bon ben, le temps d’aller manger, sans rien toucher, ca fonctionne impec… j’hésite du coup a trouver une solution de remplacement, je me vois mal planter un service pour une techno capricieuse…

Édité par Leeroy Jenkins

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte