X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=js%2Fcomet.js;h=3cd1b17dea9f98c97f7581012cf3db4899bc78bc;hp=f26a3250f63a08182825ab39be5ecc29aee67dae;hb=972919ab7f5651cd721eb6eec75f7150fdeaf347;hpb=75e69b9fa74954d55acaa5f342579524c3397cb4 diff --git a/js/comet.js b/js/comet.js index f26a325..3cd1b17 100644 --- a/js/comet.js +++ b/js/comet.js @@ -19,31 +19,33 @@ /*jslint laxbreak:true */ /** - * Permet de gérer les événements (push serveur). - * Principe de fonctionnement : - * - La page courante créer un objet euphorik.PageEvent en indiquant le nom de la page - * - La page courante attend un événement en appelant 'waitEvent' et en donnant deux fonctions : - * - 'funSend' une fonction qui renvoie les données à envoyer avant l'attente, par exemple {"dernierMess" : 23} - * "header" et "page" seront ajoutés aux données - * - 'funsReceive' un ensemble de fonctions à appeler en fonction du "reply" sur serveur - * - * l'information envoyé est sous la forme : - * { - * "header" : {"action" : "wait_event", "version" : }, - * "page" : - * [..] - * } - * l'information reçu est sous la forme : - * { - * "reply" : - * [..] - * } - * @page la page courante pour laquelle on écoute des événements (un string) - * @util le helper 'util' - */ -euphorik.PageEvent = function(page, util) { + * Permet de gérer les événements (push serveur). + * Principe de fonctionnement : + * - La page courante créer un objet euphorik.Comet en indiquant le nom de la page et la version du protocole. + * - La page courante attend un événement en appelant 'waitEvent' (non-bloquant) et en donnant deux fonctions : + * - 'funSend' une fonction qui renvoie l'objet à envoyer avant l'attente, par exemple {"dernierMess" : 23} + * ("header" et "page" sont automatiquement ajoutés à l'objet) + * - 'funsReceive' un ensemble de fonctions à appeler en fonction du "reply" du serveur, par exemple {"set_nom" : function(data) { print("ok : " + data.nom); } } + * + * l'information envoyée est sous la forme : + * { + * "header" : {"action" : "wait_event", "version" : }, + * "page" : + * [..] + * } + * l'information reçue est sous la forme : + * { + * "reply" : + * [..] + * } + * et sont de type chaine + * + * @page [string] la page courante pour laquelle on écoute des événements (un string) + * @util [int] la version + */ +Comet = function(page, version) { this.page = page; - this.util = util; + this.version = version; // l'objet JSONHttpRequest représentant la connexion d'attente this.attenteCourante = undefined; @@ -55,7 +57,7 @@ euphorik.PageEvent = function(page, util) { /** * Arrête l'attente courante s'il y en a une. */ -euphorik.PageEvent.prototype.stopAttenteCourante = function() { +Comet.prototype.stopAttenteCourante = function() { this.stop = true; if (this.attenteCourante) { @@ -64,23 +66,23 @@ euphorik.PageEvent.prototype.stopAttenteCourante = function() { }; /** - * Attend un événement lié à la page. + * Attend un événement lié à la page. Non-bloquant. * @funSend une fonction renvoyant les données json à envoyer * @funsReceive est un objet comprenant les fonctions à appeler en fonction du "reply" * les fonctions acceptent un paramètre correspondant au données reçues. * exemple : {"new_message" : function(data){ ... }} */ -euphorik.PageEvent.prototype.waitEvent = function(funSend, funsReceive) { +Comet.prototype.waitEvent = function(funSend, funsReceive) { this.stopAttenteCourante(); this.stop = false; - var thisPageEvent = this; + var thisComet = this; // on doit conserver l'ordre des valeurs de l'objet JSON (le serveur les veut dans l'ordre définit dans le protocole) // TODO : ya pas mieux ? var dataToSend = { - "header" : { "action" : "wait_event", "version" : euphorik.conf.versionProtocole }, + "header" : { "action" : "wait_event", "version" : this.version }, "page" : this.page }; var poulpe = funSend(); @@ -94,18 +96,18 @@ euphorik.PageEvent.prototype.waitEvent = function(funSend, funsReceive) { dataType: "json", // TODO : doit disparaitre timeout: 180000, // timeout de 3min. Gros HACK pas beau. FIXME problème décrit ici : http://groups.google.com/group/jquery-en/browse_thread/thread/8724e64af3333a76 - data: this.util.jsonVersAction(dataToSend), + data: { action : JSON.stringify(dataToSend) }, success: - function(data) { + function(data) { funsReceive[data.reply](data); - + // rappel de la fonction dans 100 ms - setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funsReceive); }, 100); + setTimeout(function(){ thisComet.waitEvent2(funSend, funsReceive); }, 100); }, error: function(XMLHttpRequest, textStatus, errorThrown) { ;; console.log("Connexion perdue dans PageEvent.prototype.waitEvent()"); - setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funsReceive); }, 1000); + setTimeout(function(){ thisComet.waitEvent2(funSend, funsReceive); }, 1000); } }); }; @@ -113,7 +115,7 @@ euphorik.PageEvent.prototype.waitEvent = function(funSend, funsReceive) { /** * Si un stopAttenteCourante survient un peu n'importe quand il faut imédiatement arreter de boucler. */ -euphorik.PageEvent.prototype.waitEvent2 = function(funSend, funsReceive) { +Comet.prototype.waitEvent2 = function(funSend, funsReceive) { if (this.stop) { return; }