# Kompilace a spuštění domorodé složky serveru

> Sbírejte důvěryhodnou složku Total.js HTML, vytvořte příklad, validujte zprávy, upravte je a uvolněte zdroje.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: cs
Content-SHA256: 6446080daf7b01ba3252971ddcdd18af86741162de94de526f4fcbe790fea074
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`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í.

```js 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); }
}
```
