Construire un pipeline de traitement avec des transforms
Un transform est une chaîne d'étapes nommée. NEWTRANSFORM(name, fn, [id]) ajoute une étape à la chaîne name ; les étapes s'exécutent dans l'ordre de leur enregistrement, et chacune reçoit l'objet d'options $ et la valeur courante. Changez la valeur avec $.value = ... et appelez $.next() pour passer à l'étape suivante. $.invalid(message) ajoute une erreur. TRANSFORM(name, value) démarre la chaîne et renvoie une promesse avec la valeur finale ; la promesse est rejetée quand une étape a signalé une erreur. Avec un callback à la place, TRANSFORM(name, value, function(err, value) {}). Un nom sans aucune étape renvoie la valeur telle quelle.
Utilisez-le pour un travail qui doit pouvoir être étendu depuis plusieurs endroits, comme le nettoyage d'un commentaire avant son enregistrement : un filtre anti-spam, un nettoyeur d'espaces et un vérificateur de liens peuvent chacun vivre dans leur propre fichier et être ajoutés ou retirés sans toucher au code qui appelle TRANSFORM(). L'id facultatif permet de retirer une étape plus tard avec NEWTRANSFORM(name, null, id).
NEWTRANSFORM('comment', function($, value) {
$.value = value.trim();
$.next();
}, 'trim');
NEWTRANSFORM('comment', function($, value) {
if (/spam/i.test(value))
$.invalid('Spam is not allowed');
$.next();
}, 'spam');
NEWTRANSFORM('comment', function($, value) {
$.value = value.replace(/\s+/g, ' ');
$.next();
}, 'spaces');exports.install = function() {
ROUTE('POST /comment/ @json', comment);
ROUTE('DELETE /comment/spaces/', remove_step);
};
async function comment($) {
try {
var text = await TRANSFORM('comment', $.body.text);
$.json({ text: text });
} catch (err) {
$.json({ error: true });
}
}
function remove_step($) {
NEWTRANSFORM('comment', null, 'spaces');
$.success();
}