Compileren en uitvoeren van een native server component
NEWCOMPONENT(html, [callback]) compileert een servercomponent, los van een jComponent in de browser. Het accepteert brontekst met script total of script node; zonder callback geeft het een promise terug. Een naam laadt components/name.html; een URL downloadt de bron. Dit recept gebruikt alleen vertrouwde inline code, zonder externe bron of npm-declaraties.
De geëxporteerde component levert metadata, standaardwaarden voor config en make(instance,config). component.create(overrides) maakt een instantie met gekloonde standaardwaarden. Declareer inputs:[{id,schema}] voor de transformatie van invoer. instance.input(inputId,data,callback) levert een bericht waarvan .data en .error de schemavalidatie weerspiegelen. De handler draait toch bij ongeldige invoer, controleer dus message.error voordat je verwerkt. message.send(outputId,data) zendt een uitvoer uit; message.destroy() beëindigt hem.
instance.reconfigure(values) bijgewerkt de configuratie en roept zijn configuratie/save hooks. instance.remove() roept levenscyclus hooks en verwijdert het voorbeeld; component.remove() verwijdert alle instanties en oproept om te ontgrendelen.
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); }
}