L'époque est pressée, nous voulons de plus en plus tout savoir en temps réel. Acharnée, l'avant garde des défricheurs du Web use sa touche F5 pour rafraîchir ses Twitters, Friendfeeds et consorts. Accrocs, nous harcelons de plus en plus frénétiquement les serveurs pour voir s'ils n'auraient pas reçu une nouvelle livraison de came informationelle. Les mômes de la banquette arrière et leurs à quelle heure on arrive ??? passeraient presque pour des anges à côté de nous. Ce modèle qui nécessite d'user nos touches F5 n'est vraiment plus satisfaisant, il est grand temps de changer de paradigme, de s'assurer que l'information vienne à nous aussitôt pondue[1][2].

Parmi les idées qui font le plus gazouiller ces derniers mois, j'ai tout particulièrement remarqué une longue présentation de Jeff Lindsay sur les Web Hooks (Web Hooks and the Programmable World of Tomorrow) et un projet développé par des travailleurs de Google, PubSubHubbub, visant à créer un canal de diffusion d'informations basé sur le modèle "publish and subscribe", PubSub pour faire hype.

Je vous laisse aller y jeter un œil si vous n'en avez pas encore entendu parler, et on se retrouve juste après.

...

Je suis fan depuis de très nombreuses années de XMPP, le protocole eXtensible de messagerie instantanée utilisé par Jabber. Or une des extensions d'XMPP (on dit une XEP) s'intitule tout simplement "Publish-Subscribe". Depuis le temps qu'elle traînait dans ma liste de trucs à lire absolument, j'ai fini par me décider. Et depuis un mois, c'est mon livre de chevet.

Cette spécification propose d'étendre le protocole XMPP en lui rajoutant des fonctionnalité d'abonnement à des publications. Plus précisément il définit un certain nombre de mécanismes permettant:

  • de créer sur un serveur Jabber une arborescence de dossiers (des nœuds);
  • de s'abonner à ces dossiers;
  • de publier des informations dans les dossiers. Le format de publication est libre, cela peut-être n'importe quoi;
  • de recevoir un message instantané de notification dès qu'une nouvelle publication a été effectuée dans un dossier auquel on est abonné. La notification peut inclure le contenu publié. Outre les notifications, PubSub peut donc également servir à distribuer des contenus;

Simple, efficace, et permettant d'innombrables applications. Pour aller plus loin, je vous conseille par exemple la lecture de Tout sur PubSub, traduction par Nÿco de All About PubSub, de Gaston Dombiak et Matt Tucker.

J'ai voulu jouer un peu avec PubSub mais je me suis aperçu que si côté serveur, plusieurs projets libres implémentaient la norme[3];, côté client ce n'était pas la joie. Du moins n'ai-je pas trouvé de bibliothèque PHP l'implémentant. Les autres langages sont mieux servis, mais malheureusement PHP reste le langage de référence du développement web, et celui avec lequel je suis le plus à l'aise. Joie, j'avais enfin découvert une utilité à ma carcasse: j'allais étendre l'excellente bibliothèque XMPPHP de Nathan Fritz pour implémenter la partie cliente de la XEP-0060. Et c'est ainsi qu'est née Sixties, une petite bibliothèque permettant de communiquer avec un serveur Jabber supportant PubSub. L'implémentation de la norme n'est pas tout à fait complète, mais vous devriez y trouver de quoi commencer à vous amuser. Accessoirement, l'architecture proposée devrait offrir quelques bases pour jouer avec d'autres XEP, j'ai par exemple également commencé à implémenter les XEP-0055 ("Jabber Search") et XEP-0050 ("Ad-Hoc Commands"[4];)

La meilleure façon de tester une implémentation étant de l'utiliser, j'ai peu à peu rajouté quelques composants autour de la bibliothèque:

  • une interface sous la forme d'un web service en mode REST;
  • une application AJAX rudimentaire qui dialogue avec ce service et permet d'administrer le serveur : essentiellement gérer les nœuds et les abonnements;
  • un petit robot (toujours en PHP) qui se connecte au serveur Jabber, attend patiemment de recevoir des notifications et déclenche à leur arrivée des actions. Ces actions peuvent être l'appel d'un Web Hook, l'envoi d'un mail...
  • une vague interface pour gérer ses abonnements et les actions à déclencher;
  • une bookmarklet pour publier des contenus dans une arborescence PubSub sous forme d'entrées ATOM[5];
  • et c'est tout pour l'instant;

Un petit dessin pour essayer d'expliquer l'imbrication de ces différents composants :

Sixties - architecture

(le cercle vert représente l'ensemble des composants de Sixties; les couteaux multi-fonction correspondent à l'API de communication avec le serveur)

  1. un administrateur crée des nœuds
  2. les utilisateurs s'abonnent pour recevoir les notifications des nœuds et enregistrent auprès du robot des actions à déclencher;
  3. des utilisateurs ou des services publient des contenus sur le serveur:
    • soit directement en communiquant avec le serveur Jabber;
    • soit via un service web;
  4. le serveur notifie les utilisateurs abonnés. Le robot étant à l'écoute il reçoit les notifications;
  5. le robot exécute les opérations enregistrées:

Pour mes tests, j'ai utilisé deux serveurs Jabber libres implémentant PubSub:

  • ejabberd. C'est mon chouchou, pour sa légèreté, sa robustesse, et l'"exotisme" de son langage, Erlang. Sa version de PubSub souffre encore de lacunes, mais la version 2.1.0, en cours de finalisation, apporte de nombreuses améliorations par rapport à la 2.0.5. Un de ses avantages est sa modularité : on peut assez simplement créer un nouveau module pour représenter sur le serveur un nœud avec des caractéristiques adaptées à ses besoins[6];
  • Openfire, serveur en Java. Très complet;
  • j'ai également validé les communications avec Tigase, un autre serveur libre en Java, mais n'ai pas poussé les tests très loin avec celui-ci;

Tout retour sur d'autres serveurs sera le bienvenu.

Je n'ai pas mis en place de serveur de démonstration public car:

  • je n'ai pas vraiment le temps de gérer au quotidien le fonctionnement et la sécurité d'un serveur Jabber public et d'un bot;
  • le bot, dans sa version basique actuelle, pourrait facilement être détourner pour par exemple envoyer des pourriels;

Si vous voulez tester l'engin, il vous faudra donc trouver un serveur Web proposant PubSub ou en déployer un (mais c'est l'affaire de quelques minutes, que vous choisissiez ejabberd, Openfire ou Tigase)

Tout cela est à l'état de prototype et manque clairement de finition, mais fonctionne, donc je le release early et attend à présent vos retours. Un début de documentation est disponible sur le site du projet, je vais tâcher de l'enrichir rapidement. La documentation ultime, le code, est pour sa part relativement bien commenté, vous ne devriez donc pas avoir de mal à commencer à utiliser la bibliothèque. A titre d'exemple, voici les deux lignes permettant de publier un contenu à l'intérieur d'un nœud:

$conn = XMPP2::quickConnect('toto@toto.org/batch', $password);
$conn->xep('pubsub')->itemPublish('pubsub.toto.net', '/home/toto/misc', $content);

Voilà qui devrait, je l'espère, faciliter l'intégration de PubSub aux projets développés en PHP et, partant, donner un peu plus de visibilité à ces excellentes technologies que sont XMPP et PubSub.

Enfin, s'il fallait un argument supplémentaire pour vous convaincre de jeter un œil à Pubsub (voire à Sixties), allez donc voir du côté des spécifications du Google Wave Federation Protocol. C'est le protocole décrivant les communications entre deux serveurs hébergeant des Waves[7]. On savait dès l'annonce de Wave que ce protocole serait basé sur XMPP. En y regardant de plus près, on découvre qu'il étend en fait PubSub : chaque vaque est un nœud, et les wavelets des items publiés dans ce nœud. La XEP-0060 est utilisée comme transport des vagues et des vaguelettes.

PS: j'oubliais le plus important : le dépôt de code est accessible en lecture à cette adresse : https://svn.clochix.net/sixties/ et la licence du projet est bien évidemment la GPL

Notes

[1] à la prochaine étape nous suivront en direct l'accouchement, avec les notifications de frappe touche par touche — comme c'est déjà le cas dans certains clients de messagerie ou avec Google Wave. Pour remonter plus avant, détecter la fécondation de l'idée, il faudra attendre encore un peu;

[2] oui je sais on est en train de ré-inventer les mailing-lists;

[3] relativement, car elle est assez touffue et pas tout à fait finalisée

[4] celle-ci permet d'exécuter sur les serveurs des commandes spécifiques. Elle peut par exemple être utilisée avec ejabberd pour gérer les utilisateurs, administrer le serveur, etc

[5] et je suis finalement assez constant puisque je proposais déjà ici il y a presque 3 ans une bookmarklet pour envoyer des messages Jabber;

[6] une autre XEP est en cours de rédaction pour définir différents types de nœuds dans l'arborescence. Cette XEP-0248 a commencé à être implémentée dans ejabberd;

[7] mais si vous savez bien le joujou de Google qui va révolutionner les communications sur le Net. Au passage j'ai été complètement conquis lorsque j'ai découvert le premier client distribué par Google : je me suis cru revenu au bon vieux temps de talk;