Pusher-client Delphi-update

· Functies

Het component TsgcWS_API_Pusher is bijgewerkt om aan te sluiten op de nieuwste Pusher Channels-protocolspecificatie. Deze release introduceert ondersteuning voor private-encrypted channels, vier nieuwe presence- en cache-kanaal-events, twee nieuwe REST API-endpoints, verbeterde query-parameters voor bestaande endpoints en diverse bugfixes. Alle wijzigingen zijn backward-compatible — bestaande code blijft zonder aanpassing werken.

Inhoudsopgave

  1. Ondersteuning voor private-encrypted channels
  2. Nieuwe WebSocket-events
  3. Nieuwe REST API-methoden
  4. Bijgewerkte REST API-methoden
  5. Bugfixes
  6. Samenvatting

1. Ondersteuning voor private-encrypted channels

Pusher Channels ondersteunt private-encrypted channels die end-to-end-encryptie van event-data bieden met behulp van NaCl Secretbox (XSalsa20-Poly1305). De Pusher-servers zien de plaintext nooit — alleen de communicerende clients kunnen de berichten ontsleutelen. Er zijn twee nieuwe kanaaltypen toegevoegd aan de TsgcWSPusherChannels-enumeratie:

Enum-waarde Kanaal-prefix Beschrijving
pscPrivateEncryptedChannel private-encrypted- End-to-end versleuteld privaat kanaal. Data payloads worden versleuteld met een per-kanaal gedeelde sleutel.
pscPrivateEncryptedCacheChannel private-encrypted-cache- Hetzelfde als hierboven, plus cache-kanaal-gedrag — het laatste event wordt geleverd aan nieuwe abonnees.

De klasse TsgcWSPusherResponseAuthentication bevat nu een eigenschap SharedSecret. Bij het abonneren op een private-encrypted--kanaal moet je authorization-endpoint de base64-gecodeerde per-kanaal gedeelde sleutel teruggeven. Stel deze waarde in in de OnPusherAuthentication-event-handler:

procedure TForm1.sgcPusherAuthentication(Sender: TObject;
  AuthRequest: TsgcWSPusherRequestAuthentication;
  AuthResponse: TsgcWSPusherResponseAuthentication);
begin
  // For private-encrypted channels, set the shared secret
  // returned by your authorization server
  AuthResponse.Secret := 'your-app-secret';
  AuthResponse.SharedSecret := 'base64-encoded-per-channel-key';
end;

Abonneren op een encrypted channel

// Subscribe to a private-encrypted channel
sgcPusher.Subscribe('my-secret-channel', pscPrivateEncryptedChannel);
// Subscribe to a private-encrypted cache channel
sgcPusher.Subscribe('my-secret-cache', pscPrivateEncryptedCacheChannel);

Publiceren op een encrypted channel

// Client events work on private-encrypted channels just like private channels
sgcPusher.Publish('my-event', 'my-secret-channel',
  pscPrivateEncryptedChannel, '{"message":"Hello encrypted!"}');

2. Nieuwe WebSocket-events

Er zijn vier nieuwe events toegevoegd om Pusher interne protocolberichten af te handelen die voorheen niet werden afgehandeld. Deze events worden automatisch geactiveerd wanneer de bijbehorende pusher_internal:-berichten via de WebSocket-verbinding binnenkomen.

Event-eigenschap Protocolbericht Beschrijving
OnPusherMemberAdded pusher_internal:member_added Wordt geactiveerd wanneer een nieuwe gebruiker toetreedt tot een presence-kanaal. Levert de kanaalnaam, user-ID en gebruikersinformatie.
OnPusherMemberRemoved pusher_internal:member_removed Wordt geactiveerd wanneer een gebruiker een presence-kanaal verlaat. Levert de kanaalnaam, user-ID en gebruikersinformatie.
OnPusherSubscriptionCount pusher_internal:subscription_count Wordt geactiveerd wanneer het abonnementenaantal voor een kanaal verandert. Moet worden ingeschakeld in het Pusher-dashboard.
OnPusherCacheMiss pusher_internal:cache_miss Wordt geactiveerd bij het abonneren op een cache-kanaal dat geen gecached event beschikbaar heeft.

OnPusherMemberAdded / OnPusherMemberRemoved

Deze events gebruiken het nieuwe callback-type TsgcWSPusherMemberEvent, dat de kanaalnaam, user-ID en gebruikersinformatie als afzonderlijke parameters levert:

TsgcWSPusherMemberEvent = procedure(Sender: TObject;
  Channel, UserId, UserInfo: String) of object;
procedure TForm1.sgcPusherMemberAdded(Sender: TObject;
  Channel, UserId, UserInfo: String);
begin
  Memo1.Lines.Add('User joined: ' + UserId + ' on ' + Channel);
  if UserInfo  '' then
    Memo1.Lines.Add('  Info: ' + UserInfo);
end;
procedure TForm1.sgcPusherMemberRemoved(Sender: TObject;
  Channel, UserId, UserInfo: String);
begin
  Memo1.Lines.Add('User left: ' + UserId + ' from ' + Channel);
end;

OnPusherSubscriptionCount

Gebruikt het nieuwe callback-type TsgcWSPusherSubscriptionCountEvent. Dit event vereist dat de functie Subscription Count is ingeschakeld in je Pusher-dashboardinstellingen.

TsgcWSPusherSubscriptionCountEvent = procedure(Sender: TObject;
  Channel: String; SubscriptionCount: Integer) of object;
procedure TForm1.sgcPusherSubscriptionCount(Sender: TObject;
  Channel: String; SubscriptionCount: Integer);
begin
  Memo1.Lines.Add(Channel + ' now has ' + IntToStr(SubscriptionCount) +
    ' subscribers');
end;

OnPusherCacheMiss

Gebruikt het nieuwe callback-type TsgcWSPusherCacheMissEvent. Dit event wordt geactiveerd wanneer je je abonneert op een cache-kanaal (cache-, private-cache-, private-encrypted-cache- of presence-cache-) en er geen gecached event beschikbaar is.

TsgcWSPusherCacheMissEvent = procedure(Sender: TObject;
  Channel: String) of object;
procedure TForm1.sgcPusherCacheMiss(Sender: TObject; Channel: String);
begin
  Memo1.Lines.Add('No cached event for channel: ' + Channel);
end;

3. Nieuwe REST API-methoden

Er zijn twee nieuwe server-side REST API-methoden toegevoegd aan het component TsgcWS_API_Pusher, voor het batch-events-endpoint en het beëindigen van gebruikersverbindingen.

Methode Pusher-endpoint Beschrijving
TriggerBatchEvents POST /apps/{app_id}/batch_events Activeer tot 10 events in één HTTP-verzoek. Elk event kan een ander kanaal targeten.
TerminateUserConnections POST /apps/{app_id}/users/{user_id}/terminate_connections Beëindig alle WebSocket-verbindingen voor een specifieke geauthenticeerde gebruiker.

TriggerBatchEvents

function TriggerBatchEvents(const aBatch: String): String;

De parameter aBatch is een JSON-string met een batch-array van event-objecten. Elk object moet channel, name en data bevatten. Maximaal 10 events per batch.

var
  vBatch, vResult: string;
begin
  vBatch :=
    '{"batch": [' +
    '  {"channel": "my-channel-1", "name": "my-event", "data": "{\"msg\":\"hello\"}"}' + ',' +
    '  {"channel": "my-channel-2", "name": "my-event", "data": "{\"msg\":\"world\"}"}' +
    ']}';
  vResult := sgcPusher.TriggerBatchEvents(vBatch);
  Memo1.Lines.Add(vResult);
end;

TerminateUserConnections

function TerminateUserConnections(const aUserId: String): String;

Forceert het beëindigen van alle actieve WebSocket-verbindingen voor een bepaalde gebruiker. Dit is handig om een gebruiker uit te loggen op al hun apparaten of toegang in te trekken na een wijziging in machtigingen. Vereist dat Pusher User Authentication is geconfigureerd.

var
  vResult: string;
begin
  // Disconnect user "user-123" from all sessions
  vResult := sgcPusher.TerminateUserConnections('user-123');
  Memo1.Lines.Add(vResult);
end;

4. Bijgewerkte REST API-methoden

Drie bestaande REST API-methoden zijn uitgebreid met aanvullende optionele parameters. Aangezien de nieuwe parameters allemaal standaardwaarden hebben, is bestaande code volledig backward-compatible.

TriggerEvent

Vorige signatuur

function TriggerEvent(const aEventName, aChannel, aData: String): String;

Nieuwe signatuur

function TriggerEvent(const aEventName, aChannel, aData: String;
  const aSocketId: String = '';
  const aInfo: String = ''): String;
Parameter Beschrijving
aSocketId Sluit deze socket-ID uit van het ontvangen van het event. Handig om te voorkomen dat de verzender zijn eigen broadcast ontvangt.
aInfo Door komma's gescheiden lijst van terug te geven attributen. Geldige waarden: subscription_count, user_count.
var
  vResult: string;
begin
  // Trigger event, exclude the sender, and request subscription count
  vResult := sgcPusher.TriggerEvent('my-event', 'my-channel',
    '{"msg":"hello"}', sgcPusher.FSocket_id, 'subscription_count');
  Memo1.Lines.Add(vResult);
  // Response: {"channels":{"my-channel":{"subscription_count":5}}}
end;

GetChannels

Vorige signatuur

function GetChannels: String;

Nieuwe signatuur

function GetChannels(
  const aFilterByPrefix: String = '';
  const aInfo: String = ''): String;
Parameter Beschrijving
aFilterByPrefix Filter de teruggegeven kanalen op naam-prefix. Voorbeeld: presence- geeft alleen presence-kanalen terug.
aInfo Door komma's gescheiden attributen. Geldige waarden: user_count (alleen presence), subscription_count.
var
  vResult: string;
begin
  // List all presence channels with user counts
  vResult := sgcPusher.GetChannels('presence-', 'user_count');
  Memo1.Lines.Add(vResult);
  // Response: {"channels":{"presence-room":{"user_count":3}}}
  // List all channels (no filter) - backward-compatible call
  vResult := sgcPusher.GetChannels;
  Memo1.Lines.Add(vResult);
end;

GetChannel

Vorige signatuur

function GetChannel(const aChannel: String): String;

Nieuwe signatuur

function GetChannel(const aChannel: String;
  const aInfo: String = ''): String;
Parameter Beschrijving
aInfo Door komma's gescheiden attributen. Geldige waarden: subscription_count, user_count, cache.
var
  vResult: string;
begin
  // Get channel info with subscription count and user count
  vResult := sgcPusher.GetChannel('presence-room',
    'subscription_count,user_count');
  Memo1.Lines.Add(vResult);
  // Response: {"occupied":true,"subscription_count":5,"user_count":3}
  // Get basic channel info - backward-compatible call
  vResult := sgcPusher.GetChannel('my-channel');
  Memo1.Lines.Add(vResult);
end;

5. Bugfixes

In deze release zijn diverse bugs geïdentificeerd en gecorrigeerd:

Bug Impact Oplossing
Typfout in DoReadEvent: 'puserh:ping' Kritiek Server-pings werden nooit herkend, waardoor de client heartbeat-verzoeken miste. Dit kon ertoe leiden dat de server de client wegens inactiviteit verbrak. Gecorrigeerd naar 'pusher:ping'.
DoSendPong null-toegang Hoog Toegang tot JSON.Node['data'].Value zonder null-check kon een access violation veroorzaken als het ping-bericht geen data-veld heeft. Null-check toegevoegd; standaardwaarde is {} als data ontbreekt.
GetUsers hardcoded prefix Hoog De methode plaatste altijd presence- voor de kanaalnaam, waardoor de prefix werd verdubbeld als de gebruiker al de volledige kanaalnaam doorgaf (bijv. presence-presence-room). Hardcoded prefix verwijderd. Gebruikers moeten nu de volledige kanaalnaam inclusief de presence--prefix doorgeven.
GetUsers dubbele puntkomma Laag Aan het einde van de methode stond een verdwaalde dubbele puntkomma ;;. Extra puntkomma verwijderd.

Breaking change in GetUsers: De methode GetUsers plaatst niet langer automatisch presence- voor de kanaalnaam. Als je code alleen de kanaalnaam zonder prefix doorgeeft (bijv. GetUsers('my-room')), moet je deze bijwerken zodat de volledige naam wordt gebruikt: GetUsers('presence-my-room').


6. Samenvatting

Categorie Aantal Details
Nieuwe kanaaltypen 2 pscPrivateEncryptedChannel, pscPrivateEncryptedCacheChannel
Nieuwe WebSocket-events 4 OnPusherMemberAdded, OnPusherMemberRemoved, OnPusherSubscriptionCount, OnPusherCacheMiss
Nieuwe REST-methoden 2 TriggerBatchEvents, TerminateUserConnections
Bijgewerkte REST-methoden 3 TriggerEvent (+socket_id, +info), GetChannels (+filter, +info), GetChannel (+info)
Nieuwe eigenschappen 1 SharedSecret on TsgcWSPusherResponseAuthentication
Bugfixes 4 Ping-typfout, pong null-toegang, GetUsers-prefix, dubbele puntkomma

Alle wijzigingen zijn backward-compatible. Nieuwe methodeparameters gebruiken standaardwaarden en nieuwe event-eigenschappen zijn optioneel. De enige gedragswijziging zit in GetUsers, die niet langer automatisch de presence--prefix toevoegt.