[TypeScript, C++] Zdielanie a validácia typov medzi klientom a serverom rubrika: Programování: JavaScript

7 xxar3s
položil/-a 15.5.2021
 
upravil/-a 15.5.2021

Robím vo voľnom čase na aplikácii pre ESP32, zariadenie určené na pestovanie rastlín, obsahujúce automatický zavlažovací systém, osvetlenie, kameru atď... Celé sa to bude ovládať na dialku, z webového browseru, z PC, či Mobilu. beží tam server AsyncWebServer, ktorý má podobné vlastnosti ako Node.JS, akurát je celý napísaný v C++ a príde mi ešte lepší, keďže je to all-in-one riešenie. Podporuje to okrem http aj WebSockety (server aj klient), čo je fajn, nakoľko potom ovládcia web aplikácia, môže byť dostatočne interaktívna (skoro ako desktopovka), bez toho, aby som ju mal na strane frontendu zamorenú rôznymi setInterval-mi a setTimeout-ami.

Aj keď je ESP32 len malý čip, s malou pamäťou (520KB ram) dvojadrovým SoC, rýchlosť responsu je prekvapivo celkom rýchla... Ale už keď posielam na klienta vačšie súbory, napríklad obrázky, ktoré sa načítajú z SPIFFS, tak sa trochu zapotí. Preto som sa rozhodol, že objem prenesených dát minimalizujem cachovaním a tiež tým, že urobím ajaxový frontend a vačšie súbory sa prenesú len raz a potom sa už budú posielať len malé dáta cez REST

Ajaxový frontend píšem v TypeScripte, React-e a UI toolkite React Prime,. Zatiaľ používam JSON, ale keď bude aplikácia (a s ňou aj objem prenesených dát) rásť, možno by bolo fajn prejsť na nejaký binárny formát. BSON?

Všetko ide ako po masle, akurát to má jednu nevýhodu. Typy prenosových objektov mojho REST API, ktoré raz napíšem v C++, musím znovu písať aj v Typescripte. Čo je otrava a porušuje to trošku DRY. Nedalo by sa to nejako automatizovať? Buď tak, že by sa nejakým toolom / mapperom vygenerovali z C++ typov, typové definície pre Typescript, alebo kludne aj dynamicky za behu že by sa tie typy zdielali. Nechcem používať ani RPCčka, CORBA, SOAP a podobné srandy. Chcem nejaké rýchle minimalistické riešenie. Možno by bolo fajn, keby sa tie typy dát aj validovali. Keď sa zmení entita na strane servera, aby som dostal chybové hlásenie.

V bývalej práci sme používali na validácie serverových typov io-ts, definície síce bolo treba písať ručne, ale aspoň to validovalo typy. Žiaľ syntax zápisu typov bola veľmi neintuitívna, nebola moc human readable a vôbec to nevyzeralo ako typescript. Poprosil vby som teda dačo iné. Čo by to tie entity nie len validovalo, ale aj generovalo. Vopred ďakujem.

odkaz
7 harrison314
odpověděl/-a 16.5.2021
 
upravil/-a 16.5.2021

Nieco podobne som si robil aj ja (ale malo to trochu iny ucel a bezalo to na ESP8266). No bolo to v cistom TypeScripte (UI Framework mi naozaj nebolo treba), Bootstrap sa tahal s CDN-ky. Grafy som kreslil priamo na cipe tym, ze som stremoval SVG-cko,...
Mal som generator, co skompiloval a minifikoval TS a asserty, gzipol ich a vygeneroval C/C++ kod na ich servirovanie s cipu.

atiaľ používam JSON, ale keď bude aplikácia (a s ňou aj objem prenesených dát) rásť, možno by bolo fajn prejsť na nejaký binárny formát. BSON?
BSON je tiez pomerne velky format. Skor odporucam MessagePack, je mensi a ma velmi dobru podporu aj v C/C++ a JS.

Co sa tyka generovania modelov, nic hotove nepoznam. Ale v takomto pripde by som siel cetou, ze definicie modelov by som mal osobytne v nejakom XML/JSON-e, a napisal si jednoduchy generator, co ich zvaliduje a vygeneruje aj TypeScriptove definicie aj kod pre C++. Tym sa ti nikdy nerozidu.

Komentáře

  • xxar3s : Díky za tipy. Ten MessagePack som vôbec nepoznal pozriem sa na to. 17.5.2021

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.