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
- Ondersteuning voor private-encrypted channels
- Nieuwe WebSocket-events
- Nieuwe REST API-methoden
- Bijgewerkte REST API-methoden
- Bugfixes
- 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.
