Listar sesiones web activas con uniGUI

Hoy veremos cómo podemos obtener información sobre las sesiones activas de las aplicaciones web desarrolladas con el framework uniGUI.
Para los que no conozcan uniGUI, diríamos que quizás es la plataforma más avanzada del mercado para el desarrollo de aplicaciones web.
Utiliza la librería javascript Sencha Ext JS junto a toda la potencia de Delphi y permite crear, depurar y diseñar desde el IDE del Delphi  módulos ISAPI (dll) para Internet Information Server, Servicios Windows, o Servidores independientes (Standalone) y se puede utilizar desde Delphi 2006 hasta Delphi 10.2 Tokyo.
El que el código javascript se encapsule en componentes Delphi, no implica que no podamos inyectar nuestro propio código, ya que uniGUI dispone de funciones que nos permiten hacerlo, también dispone de módulos para hacer pruebas de stress para probar el funcionamiento de nuestra aplicación web en entornos de máxima concurrencia.
Soporta los principales navegadores del mercado desde IE9+, MIcrosoft Edge, Firefox, Chrome, Safari y Opera.
Tienen más información desde su página web.
Antes de iniciar la explicación supongo que han instalado uniGUI en su entorno Delphi favorito (les recomiendo el siguiente post de Emilio Pérez)
Volviendo al asunto de este artículo, vamos a ver cómo mostrar las sesiones activas cuando se ejecuta una aplicación web realizada con uniGUI.

- Abrimos Delphi y vamos a File-New-Other

-
Seleccionamos UniGUI for Delphi - Application Wizard y pulsamos OK
y en la siguiente pantalla

marcamos la opción "Standalone Server" y pulsamos OK
Si todo ha ido bien, habremos creado en la vista del proyecto tres units:
Main.pas, MainModule.pas, ServerController.pas

- Ahora tenemos que añadir componentes e insertar código.

Desde la unit Main.pas:

Añadimos dos componentes tuniButton y tuniListBox, y cambiamos las siguientes propiedades:
uniButton1.caption = 'Listar sesiones'
uniButton.Align = alTop
UniListBox1.Align = alClient
Nos quedará de la siguiente forma:


Ahora pasamos a insertar el código para el evento onclic del uniButton, que nos permita obtener información de las sesiones activas (id de sesión, ip, hora de último acceso y variable) que los guardaremos en una estructura tipo record llamada TInfoSesionesRec.

Para acceder a estos datos tenemos que hacerlo mediante el método SessionManager del ServerModule.

VAR
 S : TUniGUISessions;
...
  S := UniServerModule.SessionManager.Sessions;

Lo siguiente es fácil, hacemos un bucle y en cada vuelta leemos los datos de la sesión. Hay que tener en cuenta que estos datos se están actualizando constantemente por lo que tendremos que bloquear el acceso utilizando los métodos Lock / unLock y además este bloqueo tendrá que ser lo más corto posible:

...
type
  TInfoSesionesRec = record
    SesionID : string;
    IP : string;
    Variable : string;
    LastTime: TDateTime;
  end;
...
public
    ListaDeSesiones : array of TInfoSesionesRec;
end;
...

procedure TMainForm.UniButton1Click(Sender: TObject);
var
  S : TUniGUISessions;
  U : TUniGUISession;
  I : Integer;
begin
  S := UniServerModule.SessionManager.Sessions;
  S.Lock; //la utilización de Lock debe ser lo más corta posible
  try
    SetLength(ListaDeSesiones, S.SessionList.Count);
    UniListBox1.Clear;
    //Recorremos las sesiones activas
    for I := 0 to S.SessionList.Count - 1  do
    begin
      U := S.SessionList[I];
      ListaDeSesiones[I].SesionID := U.SessionId;
      ListaDeSesiones[I].IP := U.RemoteIP;
      ListaDeSesiones[I].LastTime := U.LastTimeStamp;
      if U.UniMainModule <> nil then // Comprobamos si el MainModule está activo
        ListaDeSesiones[I].Variable := (U.UniMainModule as TUniMainModule).MiString;
        WITH ListaDeSesiones[I] DO
          BEGIN
            UniListBox1.items.add(U.SessionID + ' # ' + U.RemoteIP + ' # ' + DateTimeToSTr(U.LastTimeStamp));
          END;
    end;
  finally
    S.Unlock; // liberamos el lock
  end;
end;

Recordar que hay que añadir en el USES la unit uniGUISessionManager y en el MainModule en el apartado PUBLIC la variable  MiString
Ahora sólo queda ir al menú RUN para compilar e iniciar nuestra aplicación web y si todo es correcto veremos en la esquina inferior derecha el siguiente icono
Lo pulsamos con el botón derecho del ratón y accedemos al menú RESTORE
A continuación abrimos nuestro navegador y y tecleamos en la url
localhost:8077
Para hacer pruebas he generado 3 pestañas y en todas ellas he puesto en la URL localhost:8077
con lo que al pulsar el botón "listar sesiones" de la aplicación nos aparecerán 3 líneas. 
vemos la siguiente imagen:

Cada línea corresponde a una de las 3 sesiones abiertas y para cada una de ellas nos muestra la cookie de sesión, la ip, y la hora en la que ha accedido.

Recordar que tendremos que ir al menú Shutdown del icono que está en la esquina inferior derecha de la pantalla para cerrar y en su caso volver a compilar una nueva versión de la aplicación.

Si no lo hacemos así tendremos un error (bind socket already use)

Espero que os haya sido útil, en próximos artículos veremos más utilidades de este framework.