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.