RPC progressive results

· Functies

WAMP 1.0 is een open WebSocket-subprotocol dat twee asynchrone messaging-patronen biedt: RPC en PubSub.

Vanaf sgcWebSockets 4.3.8 wordt een nieuwe methode ondersteund die niet in de WAMP 1.0-specificatie is opgenomen, maar deze kan zeer nuttig zijn voor onze gebruikers. WAMP staat RPC-aanroepen toe, maar het server-antwoord kan alleen succesvol zijn of niet. Soms vereist een RPC meer dan één resultaat (streaming-nieuws, koersen, voortgang tonen...) en hier staat de specificatie dat niet toe (WAMP 2.0 staat het wel toe, maar is veel complexer).

Dus vanaf sgcWebSockets 4.3.8 is RPC met meerdere resultaten beschikbaar.

Het werkt in principe hetzelfde als de eerdere RPC, maar er is een nieuw event aan de clientzijde genaamd OnCallProgressResult dat wordt geactiveerd als de server een partieel resultaat verstuurt en er nog meer resultaten te ontvangen zijn. Tegelijkertijd heeft de server een nieuwe methode genaamd CallProgressResult, die wordt aangeroepen om een partieel resultaat naar de client te sturen. 

De client kan een actieve RPC-aanroep annuleren met de nieuwe methode CancelCall en de CallId als parameter mee te geven.

Server-voorbeeld 

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; 

Client-voorbeeld 

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');