Transformation JavaScript
Source: 05_javascript_transform
Un serveur HTTP qui applique une fonction JavaScript à chaque payload JSON entrant et renvoie le résultat transformé. Le moteur JS est déclaré comme modèle afin que la fonction soit compilée une seule fois au démarrage et réutilisée pour toutes les requêtes concurrentes.
Exécution
melodium run 05_javascript_transform/Compo.toml$ curl -X POST http://127.0.0.1:8080/transform \
-H "Content-Type: application/json" \
-d '{"name":"Alice","score":82}'
{"name":"Alice","score":82,"grade":"B","note":"processed by Mélodium JS engine"}Fonctionnement
Le modèle Transformer embarque la fonction JavaScript directement dans le source :
model Transformer() : JavaScriptEngine {
code = "
function transform(input) {
var grade = 'F';
if (input.score >= 90) grade = 'A';
…
return { name: input.name, score: input.score, grade: grade, … };
}
"
}Le moteur JS compile cette fonction une fois à l’instanciation du modèle. Chaque requête appelle ensuite process[engine=engine](code="transform(value)"), qui invoque la fonction compilée avec la valeur JSON parsée.
Le sous-traitement jsTransform
Self.data -> decode.data,text -> toJson.text,json -> unwrap.option,value
-> process.value,result -> unwrapOr.option,value
-> toString.value,into -> encode.text,data -> Self.dataDeux stratégies de dépaquetage différentes sont utilisées délibérément :
unwrap<Json>()avantprocess— un JSON malformé est une erreur fatale ; il n’y a rien d’utile à passer à la fonction JSunwrapOr<Json>(default=|null())aprèsprocess— une erreur d’exécution JS produit une réponsenullgracieuse plutôt que d’interrompre la requête
Le sous-traitement jsTransform déclare son propre model engine: Transformer(), qui partage l’instance avec l’engine de main via la propagation de modèles de Mélodium — la fonction n’est pas recompilée par requête.
Dépendances
[dependencies]
std = "0.10.1" # flux de base, journalisation, structures de données
http = "0.10.1" # serveur et client HTTP
net = "0.10.1" # utilitaires d'adresses IP
json = "0.10.1" # parsing et sérialisation JSON
encoding = "0.10.1" # encodage / décodage UTF-8
javascript = "0.10.1" # moteur JavaScript embarqué