Resultados progresivos en RPC

· Características

WAMP 1.0 es un subprotocolo WebSocket abierto que proporciona dos patrones de mensajería asíncrona: RPC y PubSub.

Desde sgcWebSockets 4.3.8 se soporta un nuevo método, no incluido en la especificación WAMP 1.0, pero que puede ser muy útil para nuestros usuarios. WAMP permite llamadas RPC, pero la respuesta del servidor solo puede ser exitosa o no. A veces, un RPC requiere más de un resultado (streaming de noticias, cotizaciones, mostrar progreso...) y aquí la especificación no permite hacerlo (WAMP 2.0 sí lo permite, pero es mucho más complejo).

Por tanto, desde sgcWebSockets 4.3.8 está disponible el RPC con múltiples resultados.

Básicamente funciona igual que el RPC anterior, pero hay un nuevo evento en el lado del cliente llamado OnCallProgressResult que se dispara si el servidor envía un resultado parcial y aún quedan más resultados por recibir. Al mismo tiempo, el servidor tiene un nuevo método llamado CallProgressResult, que se llama para enviar un resultado parcial al cliente. 

El cliente puede cancelar una llamada RPC activa usando el nuevo método CancelCall y pasando CallId como parámetro.

Ejemplo de servidor 

procedure OnServerCall(Connection: TsgcWSConnection; const CallId, ProcUri, Arguments: string);
var
  vNum: Integer;
begin
  if ProcUri = 'GetProgressiveTime' then
  begin
    vNum := StrToInt(Arguments);
    for i := 1 to vNum do
	begin
	  if i = 20 then
        oServerWAMP.CallResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now))
	  else
	    oServerWAMP.CallProgressiveResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now));
	end
  end
  else
    oServer.WAMP.CallError(CallId, 'Unknown method');
end;
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
oServerWAMP := TsgcWSPServer_WAMP.Create(nil);
oServerWAMP.OnCall := OnServerCallEvent;
oServerWAMP.Server := oServer;
oServer.Active := True; 

Ejemplo de cliente 

procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  // This is the last result
  ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  // Partial result, there are still more results to receive
  ShowMessage(Result);
end;
procedure OnCallErrorClient(Connection: TsgcWSConnection; const Error: string);
begin
  ShowMessage(Error);
end;
oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 80;
oClientWAMP := TsgcWSPClient_WAMP.Create(nil);
oClientWAMP.OnCallResult := OnCallResultClient;
oClientWAMP.OnCallProgressResult := OnCallProgressResultClient;
oClientWAMP.OnCallError := OnCallErrorClient;
oClientWAMP.Client := oClient;
oClient.Active := True;
// After client has connected, request GetTime from server
oClientWAMP.Call('GetProgressiveTime');