IndexedDB è un database incorporato in un browser, molto più potente di localStorage.
Memorizza quasi ogni tipo di valore per chiavi, con tipi di chiavi multipli.
Supporta transazioni per l'affidabilità.
Supporta query dell'intervallo delle chiavi, indici.
Può memorizzare volumi di dati molto più grandi rispetto a localStorage.
Non è dipendente da politiche di sicurezza legata al filesystem del sistema operativo o da eventuali azioni restrittive di un software antivirus.
Questa potenza è solitamente eccessiva per le applicazioni client-server tradizionali ma nel caso di utilizzo di WebRTC è risultato la scelta ideale per memorizzare tutti i log dell’applicativo AgentDesktop/CTToolbar7.
In AgentDesktop è stata implementata una nuova libreria javascript che consente di loggare su IndexedDB sia i log dell’applicativo toolbar, i log delle integrazioni come i Widget ed infine i log della libreria SIP.js che implementa WebRTC.
E' possibile utilizzare questa libreria per andare ad implementare nella propria applicazione le funzionalità di log. La libreria è liberamente caricabile dal seguente indirizzo:
<script type="text/javascript" src="/AD/js/AD_INDEXED_DB.js"
Creazione di una nuova istanza/Apertura di una istanza già esistente
Viene creata una nuova istanza della classe AD_INDEXED_DB.
let AD_LOGDB = new AD_INDEXED_DB();
Si inizializza correttamente la istanza andando a specificare il nome del datanase e la tabella che si vuole creare.
AD_LOGDB.Init("AD_LOG", "toolbar").then( () => { // DB successfully opened });
Se non esistente verrà creato il database denominato “AD_LOG” contenente la tabella “toolbar”.
Utilizzando il debugger del browser si potrà andare a verificare la corretta creazione e strutturazione del database.
Strutturazione dei dati
La tabella appena creata avrà il compito di contenere tutte le loggate. Ciascun record rappresenta una singola loggata che non è altro che un oggetto JSON con la seguente strutturazione:
ts: il timestamp in formato Epoch, automaticamente generato quando viene invocata la API di logging
module: il nome del modulo che ha originato la loggata
text: il testo della loggata.
Ai fini di permettere ricerche, cancellazioni ed estrazioni più rapide i campi ts e module vengono automaticamente indicizzati.
API disponibili
addData(<module_name>, <text>)
AD_LOGDB.addData("SINGLE SIGN ON", "User logged in successfully");
Viene aggiunta una loggata all’interno della tabella specificata nel metodo “Init”.
getSize()
AD_LOGDB.getSize().then( (size) => { } );
Viene restituita la dimensione stimata di tutto il database.
getCount()
AD_LOGDB.getCount().then( (count) => { } );
Viene restituito il numero di record presenti nella tabella.
clearTable()
AD_LOGDB.clearTable().then( () => { // Table successfully cleared });
Viene svuotata completamente la tabella predefinita da tutto il suo contenuto, compresi gli indici. La tabella non verrà rimossa dal database.
readAllData()
AD_LOGDB.readAllData().then( (data) => { } );
Vengono restituiti tutti i record contenuti nella tabella nel formato Array. Ogni record rappresenta una loggata.
Storicizzazione dei dati
Al fine di limitare la dimensione del database i log verranno storicizzati per un numero massimo di giorni. Il valore predefinito della libreria è 20 giorni.
E' possibile modificare il valore di storicizzazione mediante la API setRetentionDays
AD_LOGDB.setRetentionDays(5);
Al modificare del valore di retention verrà eseguito un controllo sulla tabella al fine di eliminare i vecchi record. Il controllo è eseguito andando a calcolare in primis la data tra il primo record (più vecchio) e l’ultimo record (più recente). Se la differenza in giorni supera il valore di retention verranno progressivamente cancellati i record più vecchi.
API di utilità generale
purgeOldRecords
()
AD_LOGDB.purgeOldRecords();
Forza il controllo sulla storicizzazione dei log andando eventualmente a cancellare i record come timeStamp più vecchio del numero massimo di giorni impostato.
getFirstRecord
()
AD_LOGDB.getFirstRecord().then( (first) => { } );
Restituisce il primo record (loggata più vecchia) della tabella
getLastRecord
()
AD_LOGDB.getLastRecord().then( (last) => { } );
Restituisce l’ultimo record (loggata più recente) della tabella.