SARAH: Persistance des données
Cet article décrit la manière dont sont persistées les données et leurs portées dans les différentes parties de SARAH.
Configuration: sur le disque
Le ConfigurationManager manipule un objet JSON pour organiser toute la configuration de SARAH. Cette configuration est toujours sauvegardée dans le fichier custom.prop
. Au démarrage du serveur cet objet est construit à partir de:
script/wsrnode.prop
plugins/{plugin}/{plugin}.prop
custom.prop
Attention ! si vous branchez de l’information dans cet objet, elle sera persisté lors de la prochaine sauvegarde.
Modules: en mémoire
Les modules ne sont chargés qu’une seule fois lors de l’appel de require('module')
. Ils n’exposent que la fonction exports.action = function(data, callback, config, SARAH){ ... }
ce qui veut dire:
- Les autres fonctions sont privées
- Le serveur doit redémarrer si le plugin est modifié.
- Le plugin est rechargé si il est édité depuis le web (v2.8).
- Il est possible de mémoriser des variables tant que le serveur est actif
[crayon]
// Fonction publique
exports.action = function(data, callback, config, SARAH){
ajoute(5);
callback({ tts : compteur });
}
// Fonction privée
var ajoute = function(indice){
compteur += indice;
}
// Variable privée
var compteur = 0;
[/crayon]
Les plugins sont donc cloisonnés.
Règles: dans le flux
Un plugin est appelé avec un objet JSON data
et se termine via un objet JSON callback({})
.
[crayon]
data => Plugin A => callback() => règle => data => Plugin B => callback() => …
[/crayon]
L’objet JSON data
passé au Plugin B contient l’information des data
et callback()
précédents. Dans le « do » d’une règle il s’appel options
.
Ainsi les plugins peuvent véhiculer de l’information dans le contexte d’un enchaînement de règle. Un peu comme les attributs d’une requête HTTP d’un serveur J2EE.
Contexte: partagé en mémoire
L’objet SARAH
est un singleton transverse à toute l’API. Son usage est décrit dans un précédent article.
Par convention, les plugins peuvent enregistrer de l’information dans SARAH.context
.
[crayon]
// Plugin A
exports.action = function(data, callback, config, SARAH){
SARAH.context.speaker = ‘Jean-Philippe’;
callback({});
}
// Plugin B
exports.action = function(data, callback, config, SARAH){
callback({‘tts’ : ‘Bonjour ‘ + SARAH.context.speaker});
}
[/crayon]
C’est une bonne pratique pour partager de l’information entre plugins.
Conclusion
Dans un plugin:
- Les propriétés se persistent sur disque
- Les variables se persistent en mémoire
- Le
SARAH.context
se partage entre plugins - Le
data/callback()
se partage entre règles