ctt-gob-es / clienteafirma

Cliente @firma
http://administracionelectronica.gob.es/ctt/clienteafirma
256 stars 121 forks source link

Sugerencia de mejora: comprobación recursiva disponibilidad del cliente de firma en intervalos crecientes #370

Open fernandouribe opened 11 months ago

fernandouribe commented 11 months ago

Hola, tenemos un producto que hace uso del cliente de firma a través del javascript autoscript.js (versión 1.8.2), y nos hemos encontrado con problemas a la hora de comprobar la disponibilidad de la aplicación en un entorno del Ministerio de Economía en el cual los usuarios acceden a la aplicación a través de un escritorio virtual (o VDI).

Tras estudiar la problemática y realizar las pertinentes pruebas hemos tomado la decisión de modificar el script paral que el tiempo entre los distintos reintentos no sea siempre el mismo, sino que vaya aumentando exponencialmente con cada reintento. De este modo se favorezca a los dispositivos con mejor respuesta inicialmente (ya que los intervalos en las primeras repeticiones son similares al configurado en la propiedad AUTOFIRMA_LAUNCHING_TIME), y este tiempo se aumente en las últimas repeticiones para dar soporte a dispositivos con una respuesta más lenta (tal y como muestra la siguiente figura)

Los cambios en código realizados son:

  1. Definir la función con la lógica de obtención del tiempo de espera
    // Tiempo de espera entre los intentos de conexion con autofirma por WebSocket
    var AUTOFIRMA_LAUNCHING_TIME = 2000;
    // Nuevo PLYCA
    function getVariableAutofirmaLaunchingTime(numOfAttempt) {
    return 1000 * (AUTOFIRMA_LAUNCHING_TIME / 1000 - 1 + 10 ** (1 - ((numOfAttempt | 0) / AUTOFIRMA_CONNECTION_RETRIES)))
    }
    // Fin nuevo PLYCA
  2. Aplicar la función

    /** Comprobacion recursiva de la disponibilidad de la aplicacion en los distintos
     * puertos hasta un maximo del numero de intentos indicados. */
    function waitAppAndProcessRequest(ports, retries) {
    
      if (!connected) {
    
        if (retries > 0) {
          // Tratamos de conectar al websocket a traves de cualquiera de los posibles puertos
          for (var i = 0; !connected && i < ports.length; i++) {
            createWebSocket(ports[i]);
          }
          // Nuevo PLYCA
          const waitFor = getVariableAutofirmaLaunchingTime(retries);
          console.log('Intento ' + (AUTOFIRMA_CONNECTION_RETRIES - retries + 1) + ' repitiendo operadcion en ' + waitFor + 'ms');
          setTimeout(waitAppAndProcessRequest, waitFor, ports, retries - 1);
          // Fin Nuevo PLYCA
          // setTimeout(waitAppAndProcessRequest, AutoScript.AUTOFIRMA_LAUNCHING_TIME, ports, retries - 1);
        }
        else {
          processErrorResponse("es.gob.afirma.standalone.ApplicationNotFoundException", "No se ha podido conectar con AutoFirma.");
        }
      }
      else {
    
        // Enviamos la peticion
        console.log("Enviamos el mensaje al socket");
        processRequest(AutoScript.AUTOFIRMA_CONNECTION_RETRIES);
      }
    }

¿Sería posible evaluar incorporar nativamente en autoscript.js este funcionamiento?