peticiones - MutakamwoyoCloud/MCloud GitHub Wiki
PetitionHandler.js
Dependencias:
- modulo Archiver.
- fs de node
localizacion: ./MCloud/src/core
Clase de la parte backend de la aplicación que se encargará de manejar las peticiones que se van a enviar al otro extremo y comprimirlas en paquetes.
Reference
Constructor
function PH(package_size){
this._qoldidx =1;
this._qnewidx =1;
this._qstorage={};
this._i=0;
this._package_size = package_size;
this._petitions = [];
}
Usado para instanciar un objeto manejador de peticiones. El parametro package_size sirve para determinar el tamaño que va a tener en peticiones cada paquete comprimido. packa_size = 3 significa que cada paquete va a tener 3 peticiones.
qoldix y qnewidx son indices que nos sirven para saber el estado o el número de elementos de nuestra cola, qstorage será la memoria que guarde las preparadas en la cola preparadas para ser encoladas mientras que _petitions se encargaŕa de tener guardadas en memoria las peticiones hasta que se alcance el número de paquetes deseado.
Funciones relacionadas a la cola de peticiones
PH.prototype.size = function(){
return this._qnewidx - this._qoldidx;
};
PH.prototype.enqueue = function(data) {
this._qstorage[this._qnewidx] = data;
this._qnewidx++;
};
PH.prototype.dequeue = function(){
var oldIdx = this._qoldidx,
newIdx = this._qnewidx,
toDelete;
if (oldIdx !== newIdx){
toDelete = this._qstorage[oldIdx];
delete this._qstorage[oldIdx];
this._qoldidx++;
return toDelete;
}
};
Funciones standar de una cola:
- size: nos devuelve el numero de elementos
- enqueue: encola el elemento data, normalmente un identificador para respetar el orden.
- dequeue: quita un elemento de la cola y lo devuelve
add_petition
PH.prototype.add_petition= function(data){
this._petitions[this._i] = data;
this._i++;
if (this._i == this._package_size){
var id = tools.generateTimeId();
var petitions = this._petitions;
create_package(petitions, id);
this.enqueue(id);
this._i = 0;
}
Esta funcion se encarga de almacenar una petición en memoria y de crear un paquete en caso de que se haya alcanzado package_size, el paquete se encolara para respetar su orden.
create_package
function create_package(petitions, id){
// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/'+id+'.zip');
var archive = archiver('zip', {
store: true // Sets the compression method to STORE.
});
// listen for all archive data to be written
output.on('close', function() {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});
// good practice to catch this error explicitly
archive.on('error', function(err) {
throw err;
});
// pipe archive data to the file
archive.pipe(output);
for (var i = 0, len = petitions.length; i < len; i++){
archive.append(petitions[i], {name: i+'.json'});
}
// finalize the archive (ie we are done appending files but streams have to finish yet)
archive.finalize();
Función estatica de la clase que se encarga de generar un paquete con el identificador (id) de la petición pasado por parametros y la referencia a memoria (petitions) donde se encuentren nuestras peticiones almacenadas.
receive_package
function receive_package(self){
var pull_folder = './pull/';
fs.readdir(pull_folder, (err, files) => {
files.forEach(file => {
decompress(pull_folder+file, pull_folder+'dist_'+file.split("_")[0]).then(files_decompress => {
files_decompress.forEach(file_decompress => {
var type = file_decompress.path.split("_")[0];
var name_search = file_decompress.path.split("_")[1].split(".")[0];
var json = require(pull_folder+'dist_'+file.split("_")[0]+"/"+file_decompress.path);
var json_insert = {};
json_insert["name"] = json["name"];
json_insert["data"] = json;
self.data.do(_model.op.insert,{}, json_insert, self.emitter, 1);
fs.unlinkSync(pull_folder+'dist_'+file.split("_")[0]+"/"+file_decompress.path);
});
fs.unlinkSync(pull_folder+file);
});
});
});
}
Función estatica de la clase que se encarga de descomprimir todo lo que se encuentre en la ./pull/ y almacenar todos los json resultantes con los datos en la base de datos. Elimina todos los archivos descargados y descomprimidos cuando estos se han guardado en la base de datos.
EXAMPLE
En el siguiente ejemplo vamos a crear un manejador que cree paquetes cada dos peticiones y despues vamos a recorrer un bucle guardando "prueba" en cada peticion.
var n = 2;
var petition_hander = new PH(n);
for (var i = 0, len = 10; i < len; i++){
var prueba = "prueba";
petition_hander.add_petition(prueba);
}
Resultado:
nPaquetes= len/n = 5 paquetes de dos peticiones, len%n = 0 por lo tanto se han empaquetado todas las peticiones.