Construir um pipeline de processamento com transforms
Um transform é uma cadeia de passos com nome. NEWTRANSFORM(name, fn, [id]) acrescenta um passo à cadeia name; os passos correm pela ordem em que foram registados, e cada um recebe o objeto de opções $ e o valor atual. Altere o valor com $.value = ... e chame $.next() para continuar com o passo seguinte. $.invalid(message) acrescenta um erro. TRANSFORM(name, value) inicia a cadeia e devolve uma promessa com o valor final; a promessa é rejeitada quando um passo reportou um erro. Com um callback em vez disso, TRANSFORM(name, value, function(err, value) {}). Um nome sem qualquer passo devolve o valor tal como está.
Use-o para trabalho que tem de poder ser estendido a partir de vários sítios, como limpar um comentário antes de o guardar: um filtro de spam, um removedor de espaços e um verificador de ligações podem viver cada um no seu ficheiro e ser acrescentados ou retirados sem mexer no código que chama TRANSFORM(). O id opcional permite remover um passo mais tarde com 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();
}