Kompilace a spuštění domorodé složky serveru
NEWCOMPONENT(html, [callback]) zkompiluje serverovou komponentu, odlišnou od jComponent v prohlížeči. Přijímá zdrojový text obsahující script total nebo script node; bez callbacku vrací promise. Název načte components/name.html; URL stáhne zdroj. Tento recept používá pouze inline důvěryhodný kód, bez vzdáleného zdroje a deklarací npm.
Exportovaná komponenta poskytuje metadata, výchozí hodnoty config a make(instance,config). component.create(overrides) vytvoří instanci s klonovanými výchozími hodnotami. Pro transformaci vstupu deklarujte inputs:[{id,schema}]. instance.input(inputId,data,callback) doručí zprávu, jejíž .data a .error odrážejí validaci schématu. Handler se spustí i při neplatném vstupu, proto před zpracováním zkontrolujte message.error. message.send(outputId,data) vyšle výstup; message.destroy() jej ukončí.
instance.reconfigure(values) aktualizuje svou konfiguraci a volá její konfigurace/spasování. instance.remove() volá životní cyklus a odstraňuje příklad; component.remove() odstraňuje všechny případy a vyzývá k odinstalování.
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); }
}