TSM - Vă prezentăm ironwingjs

Andrei Cacio - Web developer

Pe scurt, ironwingjs este o librărie JavaScript lightweight şi framework-agnostic. Prin framework-agnostic înţelegem o librărie care nu depinde de un framework anume și se poate folosi fără nicio dependinţă în plus. Ironwing oferă manipulare de tip CRUD peste o interfaţă REST API pentru datele care vin de pe aceasta.

Totul a început de la simpla necesitate de a lucra cu datele care vin de pe un API. Aveam nevoie de o metodă destul de simplă și rapidă de a asimila acel API şi de a manipula datele într-o aplicaţie privată. În acel moment, nu intenționam să folosim un framework JavaScript anume deoarece doream să utilizăm strict partea de manipulare de date. Au fost câteva variante open-source, dar majoritatea aveau alte dependinţe şi era destul de complicat să le foloseşti stand-alone. Astfel, am început să scriem propria noastra variantă care să funcționeze exact așa cum ne doream. După ce s-a scris o primă versiune mai complexă, şi am observat că funcţionează exact cum ne-am aşteptat, ne-am gândit că poate ar ajuta şi alţi programatori. Aşa că ne-am hotărât să publicăm o versiune mai finisată sub forma unei librării open-source. Aşa a luat naştere ironwingjs.

Ironwing este scrisă conform noilor standarde EcmaScript şi se foloseşte de unele implementări populare precum promises. Totodată, această librarie este construită pe baza a câteva concepte precum: adapters, storage, proxy objects. Aceste concepte abstracte au fost gândite astfel ca ironwing să fie uşor extensibil şi practic. Mai mult decât atât, această librarie a fost concepută să fie uşor de folosit în orice aplicaţie şi ușor de adaptat în orice framework. Ideea de bază este simplitatea.

Instalare

Ironwing poate fi instalat folosind una din următoarele metode afişate mai jos:

$ npm install ironwing
# sau
$ bower install ironwing

În caz că se utilizează sistemul de operare Windows, aceste comenzi pot fi rulate în cadrul consolei git-bash.

Cum funţionează

Adapters

Un adapter este un obiect scris dupa o interfaţă prestabilită pentru putea fi integrat cu ironwing. Out of the box, ironwing este livrat cu un adaptor pentru comunicarea cu serverul prin AJAX. Practic acest adaptor este o interfaţă intermediară pentru comunicarea cu API-ul oferit de browser, numit . Acest API oferă o metodă asincronă de comunicare cu serverul prin request-uri HTTP de tip JSON. Programatorul nu interacţionează cu adaptorii în mod direct. Aceştia sunt folosiţi under the hood de core-ul ironwing. Scopul adaptorilor sunt de a abstractiza comunicarea cu serverul astfel încât procesul să devină uşor de modificat. Oricine poate să scrie propriul său adaptor. Încărcarea unui adapter se face folosind metoda  astfel:

import ironwing from 'ironwing';
ironwing.useAdapter('JSON', ['/api']);  

Această bucată de cod setează librăria ironwing să foloseasca requesturi de tip JSON pentru toate operaţiile cu serverul. Acest tip de adaptor are nevoie de un singur parametru, şi anume calea către API.

Storage

Prin default, ironwing foloseşte un storage local (heap). După ce libraria aduce de la server una sau mai multe resurse, aceasta le stochează folosind interfaţa storage-ului pentru a putea fi folosite in viitor. Se poate spune că ironwing cache-uieşte resursele. Spre exemplu, dacă ar fi să aducem o resursă folosind următoarea cale de la API: /users/100 vom proceda astfel:

ironwing('users', 100).then((user) => { 
    console.log(user.attr.name); 
});  

iar dacă dorim să ne folosim de această resursă în altă parte a aplicaţiei, putem avea acces la ea folosind următoarea metodă:

var userModel =  ironwing.storage.find('users', 100);  

sau dacă dorim să avem acces la intreaga colecţie de tip users:

ironwing('users',).then((users) => { 
    console.log(users.length); 
});
var usersCollection =  ironwing.storage.findAll('users');

În următoarea vearsiune se doreşte implementarea unui sistem de folosire a mai multor implementări de tip storage. Un exemplu bun ar fi o implementare de storage ce se foloseşte de local storage din browser.

Proxy objects

Metoda  este de fapt un factory method care returnează instanţe de tip Model. Fiecare instanţă expune metode CRUD pentru manipularea resursei mapped pe API. Mai mult, ironwing nu modifică în mod direct obiectul deserializat din JSON. Librăria expune un obiect numit proxy care este de fapt intermediarul. Acest obiect poate fi accesat prin cheia . Mai mult decât atât, acest obiect este de fapt o transformare camel cased a denumirilor atributelor originale. Acest format este de preferat să fie folosit în aplicaţiile JavaScript de accea ironwing transformă automat orice combinaţie (pascal case, uppercase etc.) în formatul camel case. Orice modificare pe obiectul proxy este automat sincronizată cu obiectul original înainte să fie transmis serverului sub forma serializată. Această tehnică ne permite să avem un control mult mai mare asupra cum este modificat obiectul original.

Exemplu de folosinţă

import ironwing from 'ironwing';
var userData = {
    first_name: 'Jon',
    last_name: 'Doe';
};
ironwing.useAdapter('JSON', ['/api']);
ironwing.create('users', userData).then((userModel) => {
    /**
    * a POST request is sent to the server
    * /api/users
    */
    userModel.attr.firstName = 'Jon';
    userModel.attr.lastName = 'Doe';
    userModel.update().then(() => {
        /**
        * a PUT request is sent to the server
        * /api/users/:id
        */
    });
});  

Concluzie

Ironwing este o librărie care poate fi uşor "conectată" la un RESTful API iar programatorul are direct acces la o manipulare CRUD asupra resurselor sale. Noi am decis să publicăm această librarie publicului larg cu speranţa că poate va ajuta pe altcineva la momentul oportun. Deoarece este open source, oricine poate contribui, să raporteze probleme sau pur şi simplu să vina cu idei noi legate de cum ar dori să funcţioneze ironwing. Ironwing este o viziune diferită de a rezolva o necesitate de care depindem cu toţii. Scopul şi esenţa librăriei este de a fi cât mai uşor de folosit și cât mai uşor extensibilă.

Disclaimer

Ironwing a fost dezvoltat inițial pentru proiectul Trubzi în cadrul Evozon Systems din Cluj-Napoca. Evozon este o companie de software fondată în 2005 de catre Gabriel Cretu si Robert Masic, cu clienți de pe toate continentele. Evozon dezvoltă atât aplicații la cerere cât și produse proprii precum Trubzi, Calendis, Hoteliqo și framework-uri folosite de către dezvoltatori din lumea întreagă, precum Essence și Crux.