Résultats progressifs RPC

· Fonctionnalités

WAMP 1.0 est un sous-protocole WebSocket ouvert qui propose deux modèles de messagerie asynchrone : RPC et PubSub.

À partir de sgcWebSockets 4.3.8, une nouvelle méthode est prise en charge ; elle n'est pas incluse dans la spécification WAMP 1.0, mais peut être très utile pour nos utilisateurs. WAMP autorise les appels RPC, mais la réponse du serveur ne peut être que réussie ou échouée. Parfois, un RPC nécessite plus d'un résultat (streaming de news, cotations, affichage de progression...) et la spécification ne le permet pas (WAMP 2.0 le permet, mais c'est beaucoup plus complexe).

Donc, à partir de sgcWebSockets 4.3.8, le RPC avec plusieurs résultats est disponible.

Le fonctionnement est identique à un RPC classique, mais il existe désormais un nouvel événement côté client appelé OnCallProgressResult qui est déclenché lorsque le serveur envoie un résultat partiel et qu'il reste encore d'autres résultats à recevoir. Côté serveur, une nouvelle méthode appelée CallProgressResult est appelée pour envoyer un résultat partiel au client. 

Le client peut annuler un appel RPC actif via la nouvelle méthode CancelCall en passant CallId en paramètre.

Exemple côté serveur 

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; 

Exemple côté client 

procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  // C'est le dernier résultat
  ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  // Résultat partiel, il reste encore des résultats à recevoir
  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;
// Après la connexion du client, demande GetTime au serveur
oClientWAMP.Call('GetProgressiveTime');