ForgeTotal.js 5
fr

Total.js 5

Composer et exécuter un composant de serveur

Total.js 5 · total5@0.0.19 total5reference Exécutée avec Total.js 5

NEWCOMPONENT(html, [callback]) compile un composant serveur, distinct d'un jComponent de navigateur. Il accepte un texte source contenant script total ou script node ; sans callback il renvoie une promesse. Un nom charge components/name.html ; une URL télécharge le source. Cette recette n'utilise que du code en ligne de confiance, sans source distante ni déclarations npm.

Le composant exporté fournit des métadonnées, les valeurs par défaut de config et make(instance,config). component.create(overrides) crée une instance avec des valeurs par défaut clonées. Déclarez inputs:[{id,schema}] pour la transformation de l'entrée. instance.input(inputId,data,callback) livre un message dont .data et .error reflètent la validation du schéma. Le gestionnaire s'exécute quand même sur une entrée invalide, vérifiez donc message.error avant de traiter. message.send(outputId,data) émet une sortie ; message.destroy() la termine.

instance.reconfigure(values) met à jour sa configuration et appelle ses boucles de configuration/sauvegarde. instance.remove() appelle les boucles du cycle de vie et supprime l'exemple; component.remove() supprime toutes les instances et invite à désinstaller.

controllers/components.js
exports.install = function() {
	ROUTE('GET /native-component/', exercise);
};
async function exercise($) {
	try {
		var source = '<script total>exports.id="native-echo";exports.name="Native echo";exports.config={prefix:"one:"};exports.inputs=[{id:"input",schema:"*name:String"}];exports.make=function(instance,config){instance.message=function($){if($.error){$.send("invalid",{invalid:true});$.destroy();return;}$.send("output",{text:config.prefix+$.data.name});$.destroy();};instance.destroy=function(){MAIN.componentClosed=true;};};</script>';
		var component = await NEWCOMPONENT(source);
		component.debugger = false;
		var instance = component.create();
		var first = await new Promise(resolve => instance.input('input',{name:'Ann'},message => resolve(message.data)));
		var invalid = await new Promise(resolve => instance.input('input',{},message => resolve(message.data)));
		instance.reconfigure({prefix:'two:'});
		var second = await new Promise(resolve => instance.input('input',{name:'Bob'},message => resolve(message.data)));
		instance.remove();
		var rejected = false;
		try { await NEWCOMPONENT('<body>no backend script</body>'); } catch (e) { rejected = true; }
		$.json({first:first,invalid:invalid,second:second,remaining:component.instances.length,closed:MAIN.componentClosed,rejected:rejected});
	} catch (e) { $.invalid(e); }
}