Pusher ist eine einfache und zuverlässige Plattform mit netten Funktionen, die auf dem WebSocket-Protokoll basieren: flexibles Pub/Sub-Messaging, Live-Benutzerlisten (Präsenz), Authentifizierung ...
Die Pusher-WebSocket-API ist 7.
Daten werden bidirektional über einen WebSocket als Textdaten gesendet, die UTF8-kodiertes JSON enthalten (binäre WebSocket-Frames werden nicht unterstützt).
Sie können die Methode Ping aufrufen, um die Verbindung zum Server zu testen. Im Wesentlichen werden alle von der Gegenseite empfangenen Nachrichten als Hinweis darauf gewertet, dass die Verbindung aktiv ist. Bei Abwesenheit jeglicher Nachrichten kann jede Seite prüfen, ob die andere Seite antwortet, indem sie eine Ping-Nachricht sendet, auf die die andere Seite mit einem Pong antworten sollte.
Bevor Sie eine Verbindung herstellen, müssen Sie die folgenden Felder ausfüllen:
Pusher.Cluster := 'eu'; // cluster where your pusher account is located
Pusher.Key := '9c3b7ef25qe97a00116c'; // your pusher api key
Pusher.Name := 'js'; // optional, name of your application
Pusher.Version := '4.1'; // optional, version of your application
Pusher.TLS := True; // if encrypted, set to True
Pusher.Secret := '2dc792e1916ac49e6b3f'; // pusher secret string (needed for private and presence channels)
Wichtig
Pusher erfordert, dass der WebSocket-Client sich mit einer URL verbindet, die die vorherigen Felder (key, cluster...) verwendet; diese Felder werden zum Erstellen der URL verwendet, und dies geschieht, wenn Sie den Client in der Pusher-Komponente zuweisen. Um sicherzustellen, dass die URL korrekt erstellt wird, setzen Sie den Client also, nachdem Sie die Pusher-Konfigurationsfelder ausgefüllt haben. Unten finden Sie Pseudo-Code:
// Pusher-Felder konfigurieren
pusher.cluster = ...
pusher.key = ...
// Client festlegen
pusher.client = websocket client
// Verbindung starten
websocket client.Active = true;
Nach einer erfolgreichen Verbindung wird das Ereignis OnPusherConnect ausgelöst, und Sie erhalten die folgenden Felder:
Socket ID: Ein eindeutiger Bezeichner für den verbundenen Client.
Timeout: Die Anzahl der Sekunden Server-Inaktivität, nach denen der Client eine Ping-Nachricht initiieren sollte (dies wird automatisch von der Komponente behandelt).
Im Fehlerfall wird OnPusherError ausgelöst und Informationen über den Fehler bereitgestellt. Ein Fehler kann von Pusher als Antwort auf eine ungültige Authentifizierung, einen ungültigen Befehl usw. gesendet werden.
4000-4099
Zeigt einen Fehler an, der dazu führt, dass die Verbindung von Pusher geschlossen wird, und dass ein erneuter Verbindungsversuch mit denselben Parametern nicht erfolgreich sein wird.
4000: Die Anwendung akzeptiert nur SSL-Verbindungen, stellen Sie die Verbindung über wss:// wieder her
4001: Anwendung existiert nicht
4003: Application disabled
4004: Application is over connection quota
4005: Pfad nicht gefunden
4006: Invalid version string format
4007: Nicht unterstützte Protokollversion
4008: Keine Protokollversion angegeben
4100-4199
Gibt einen Fehler an, der dazu führt, dass die Verbindung von Pusher geschlossen wird, und dass der Client sich nach 1 s oder mehr erneut verbinden kann.
4100: Over capacity
4200-4299
Zeigt einen Fehler an, der dazu führt, dass die Verbindung von Pusher geschlossen wird, und dass der Client sofort erneut verbinden darf.
4200: Generisch sofort erneut verbinden
4201: Pong-Antwort nicht empfangen: Ein Ping wurde an den Client gesendet, aber es wurde keine Antwort empfangen - siehe Ping- und Pong-Nachrichten
4202: Nach Inaktivität geschlossen: Der Client war lange Zeit inaktiv (derzeit 24 Stunden) und der Client unterstützt kein Ping. Bitte aktualisieren Sie auf einen neueren WebSocket-Draft oder implementieren Sie Version 5 oder höher dieses Protokolls.
4300-4399
Jede andere Art von Fehler.
4301: Client-Ereignis aufgrund von Ratenbegrenzung abgelehnt
Channels sind ein grundlegendes Konzept in Pusher. Jede Anwendung hat eine Reihe von Kanälen, und jeder Client kann auswählen, welche Kanäle er abonniert.
Channels bieten:
Eine Möglichkeit, Daten zu filtern. Zum Beispiel kann es in einer Chat-Anwendung einen Channel für Personen geben, die über 'Hunde' diskutieren möchten
Eine Möglichkeit, den Zugriff auf verschiedene Informationsströme zu steuern. Beispielsweise möchte eine Projektmanagementanwendung Personen autorisieren, Updates über 'projectX' zu erhalten
Es wird dringend empfohlen, dass Channels verwendet werden, um Ihre Daten zu filtern, und dass dies nicht über Events erreicht wird. Das liegt daran, dass alle auf einem Channel veröffentlichten Events an alle Subscriber gesendet werden, unabhängig von ihrer Event-Bindung.
Channels müssen nicht explizit erstellt werden und werden bei Bedarf des Clients instanziiert. Das bedeutet, dass das Erstellen eines Channels einfach ist. Weisen Sie einen Client einfach an, ihn zu abonnieren.
Die folgenden Arten von Kanälen werden unterstützt:
Öffentliche Kanäle können von jedem abonniert werden, der ihren Namen kennt
Private Kanäle führen einen Mechanismus ein, mit dem Ihr Server den Zugriff auf die von Ihnen übertragenen Daten steuern kann
Presence-Kanäle sind eine Erweiterung privater Kanäle. Sie ermöglichen es Ihnen, beim Abonnieren Benutzerinformationen zu registrieren, und lassen andere Mitglieder des Kanals wissen, wer online ist
Cache-Kanäle merken sich das zuletzt ausgelöste Ereignis und senden es als erstes Ereignis an neue Abonnenten (öffentliche, private und Presence-Varianten)
Private-Encrypted-Kanäle bieten Ende-zu-Ende-Verschlüsselung mit NaCl secretbox und stellen sicher, dass selbst Pusher die Nachrichtendaten nicht lesen kann
Öffentliche Kanäle sollten für öffentlich zugängliche Daten verwendet werden, da sie keinerlei Autorisierung erfordern, um abonniert werden zu können.
Sie können Kanäle jederzeit abonnieren und abbestellen. Es ist nicht erforderlich, zuerst zu warten, bis Pusher die Verbindung hergestellt hat.
Beispiel: Abonnieren des Kanals "my-channel".
Delphi
APIPusher.Subscribe('my-channel');
Wenn Sie erfolgreich abonniert sind, wird das Ereignis OnPusherSubscribe ausgelöst; wenn ein Fehler auftritt, erhalten Sie eine Nachricht im Ereignis OnPusherError.
Alle Nachrichten vom abonnierten Kanal werden im Ereignis OnPusherEvent empfangen.
Wenn die Methode Publish aufgerufen wird und der Kanal öffentlich ist, verwendet die Komponente anstelle des WebSocket-Protokolls das HTTP-Protokoll und ruft die Methode TriggerEvent auf (Publish ist über das WebSocket-Protokoll nicht erlaubt).
Erfordert Indy 10.5.7 oder neuer
Private Kanäle sollten verwendet werden, wenn der Zugriff auf den Kanal in irgendeiner Weise eingeschränkt werden muss. Damit ein Benutzer einen privaten Kanal abonnieren kann, muss die Berechtigung autorisiert werden.
Beispiel: Abonnieren des Kanals "my-private-channel".
Delphi
APIPusher.Subscribe('my-private-channel', pscPrivateChannel);
Wenn Sie erfolgreich abonniert sind, wird das Ereignis OnPusherSubscribe ausgelöst; wenn ein Fehler auftritt, erhalten Sie eine Nachricht im Ereignis OnPusherError.
Alle Nachrichten vom abonnierten Kanal werden im Ereignis OnPusherEvent empfangen.
Erfordert Indy 10.5.7 oder neuer
Presence-Kanäle bauen auf der Sicherheit von privaten Kanälen auf und stellen die zusätzliche Funktion einer Kenntnis darüber bereit, wer diesen Kanal abonniert hat. Dies macht es extrem einfach, Chatroom- und "Wer ist online"-Funktionalität für Ihre Anwendung zu erstellen. Denken Sie an Chatrooms, Mitarbeiter an einem Dokument, Personen, die dieselbe Webseite betrachten, Konkurrenten in einem Spiel, solche Dinge.
Presence-Kanäle werden von der Client-API auf dieselbe Weise abonniert wie private Kanäle, aber dem Kanalnamen muss presence- vorangestellt werden. Wie bei privaten Kanälen wird eine HTTP-Anfrage an eine konfigurierbare Authentifizierungs-URL gestellt, um zu bestimmen, ob der aktuelle Benutzer die Berechtigung hat, auf den Kanal zuzugreifen.
Informationen über Benutzer, die einen Kanal abonnieren und sich von ihm abmelden, können dann durch Binden an Ereignisse auf dem Presence-Kanal abgerufen werden, und der aktuelle Zustand der für den Kanal abonnierten Benutzer ist über die Eigenschaft channel.members verfügbar.
Beispiel: Abonnieren Sie den Kanal "my-presence-channel".
APIPusher.Subscribe('my-presence-channel', pscPresenceChannel,
'{"user_id":"John_Smith","user_info":{"name":"John Smith"}}')
Wenn Sie erfolgreich abonniert sind, wird das Ereignis OnPusherSubscribe ausgelöst; wenn ein Fehler auftritt, erhalten Sie eine Nachricht im Ereignis OnPusherError.
Alle Nachrichten vom abonnierten Kanal werden im Ereignis OnPusherEvent empfangen.
Ein Cache-Kanal merkt sich das zuletzt ausgelöste Ereignis und sendet dies als erstes Ereignis an neue Abonnenten.
Wenn ein Ereignis auf einem Cache-Kanal ausgelöst wird, speichert Pusher Channels dieses Ereignis zwischen, und wenn ein Client einen Cache-Kanal abonniert und ein zwischengespeicherter Wert existiert, wird dieser als erstes Ereignis auf diesem Kanal an den Client gesendet. Dieses Verhalten hilft Entwicklern, den Anfangszustand bereitzustellen, ohne zusätzliche Logik hinzuzufügen, um ihn von woanders abzurufen.
Die folgenden Cache-Kanäle werden unterstützt:
Beispiel: Abonnieren des öffentlichen Cache-Kanals "my-cache-channel".
APIPusher.Subscribe('my-cache-channel', pscCacheChannel);
Wenn Sie erfolgreich abonniert sind, wird das Ereignis OnPusherSubscribe ausgelöst; wenn ein Fehler auftritt, erhalten Sie eine Nachricht im Ereignis OnPusherError.
Alle Nachrichten vom abonnierten Kanal werden im Ereignis OnPusherEvent empfangen.
Wenn beim Abonnieren eines Cache-Channels kein zwischengespeichertes Ereignis vorhanden ist, wird das Ereignis OnPusherCacheMiss ausgelöst und der Channel-Name bereitgestellt. Dies ermöglicht Ihrer Anwendung, den Fall zu behandeln, in dem keine zwischengespeicherten Daten verfügbar sind.
Private-Encrypted-Kanäle bieten Ende-zu-Ende-Verschlüsselung für Nachrichten. Wie private Kanäle erfordern sie eine Authentifizierung, aber zusätzlich werden alle Daten-Nutzlasten mit NaCl secretbox verschlüsselt, sodass nur autorisierte Abonnenten den Inhalt lesen können. Selbst Pusher selbst kann die Nachrichten nicht entschlüsseln.
Um private verschlüsselte Channels zu verwenden, müssen Sie bei der Authentifizierung ein SharedSecret angeben. Das Shared Secret wird zum Ver- und Entschlüsseln von Nachrichtendaten verwendet.
Beispiel: Abonnieren eines private-encrypted-Kanals "my-encrypted-channel".
APIPusher.Subscribe('my-encrypted-channel', pscPrivateEncryptedChannel);
Eine Variante mit privatem verschlüsseltem Cache ist ebenfalls verfügbar, die Verschlüsselung mit Cache-Channel-Verhalten kombiniert:
APIPusher.Subscribe('my-encrypted-cache-channel', pscPrivateEncryptedCacheChannel);
Wenn Sie das Ereignis OnPusherAuthentication mit verschlüsselten privaten Kanälen verwenden, können Sie die Eigenschaft SharedSecret auf dem Antwortobjekt setzen, um den Verschlüsselungsschlüssel bereitzustellen:
procedure OnPusherAuthenticationEvent(Sender: TObject;
AuthRequest: TsgcWSPusherRequestAuthentication;
AuthResponse: TsgcWSPusherResponseAuthentication);
begin
AuthResponse.SharedSecret := 'your-shared-secret-key';
end;
Presence-Channels bieten zusätzliche Ereignisse, die Ihre Anwendung benachrichtigen, wenn Benutzer einem Channel beitreten oder ihn verlassen, und ermöglichen es Ihnen, Abonnementzahlen zu verfolgen.
Wird ausgelöst, wenn ein neues Mitglied einen Presence-Kanal abonniert. Stellt den Kanalnamen, die Benutzer-ID und die Benutzerinformationen des beigetretenen Mitglieds bereit.
procedure PUSHERPusherMemberAdded(Sender: TObject;
Channel, UserId, UserInfo: string);
begin
Log('Member joined: ' + UserId + ' on ' + Channel);
end;
Wird ausgelöst, wenn sich ein Mitglied von einem Presence-Kanal abmeldet. Stellt den Kanalnamen, die Benutzer-ID und die Benutzerinformationen des Mitglieds bereit, das ihn verlassen hat.
procedure PUSHERPusherMemberRemoved(Sender: TObject;
Channel, UserId, UserInfo: string);
begin
Log('Member left: ' + UserId + ' on ' + Channel);
end;
Wird ausgelöst, wenn sich die Abonnentenanzahl auf einem Kanal ändert. Stellt den Kanalnamen und die aktuelle Anzahl der Abonnenten bereit. Dieses Ereignis muss in Ihrem Pusher-Dashboard aktiviert werden.
procedure PUSHERPusherSubscriptionCount(Sender: TObject;
Channel: string; SubscriptionCount: Integer);
begin
Log(Channel + ' has ' + IntToStr(SubscriptionCount) + ' subscribers');
end;
Wird ausgelöst, wenn ein Cache-Kanal abonniert wird, der kein zwischengespeichertes Ereignis hat. Stellt den Kanalnamen bereit. Dies ermöglicht es Ihrer Anwendung, den Fall zu behandeln, in dem keine zwischengespeicherten Daten verfügbar sind, zum Beispiel indem die Daten aus einer anderen Quelle abgerufen werden.
procedure PUSHERPusherCacheMiss(Sender: TObject; Channel: string);
begin
Log('Cache miss on: ' + Channel);
end;
Sie können nicht nur Nachrichten von abonnierten Kanälen empfangen, sondern auch Nachrichten an andere abonnierte Benutzer senden.
Rufen Sie die Methode Publish auf, um eine Nachricht an alle abonnierten Benutzer des Kanals zu senden.
Beispiel: ein Ereignis an alle abonnierten Benutzer von "my-channel" senden
APIPusher.Publish('my-event', 'my-channel');
Veröffentlichen Sie nicht mehr als 10 Nachrichten pro Sekunde pro Client (Verbindung). Alle Ereignisse, die über dieser Ratenbegrenzung ausgelöst werden, werden von der Pusher-API abgelehnt. Dies ist kein Systemproblem, es ist ein Client-Problem. 100 Clients in einem Kanal, die mit dieser Rate Nachrichten senden, müssten jeweils auch 1.000 Nachrichten pro Sekunde verarbeiten! Während einige moderne Browser dies bewältigen könnten, ist es höchstwahrscheinlich keine gute Idee.
Die API wird unter http://api-CLUSTER.pusher.com gehostet, wobei CLUSTER durch den Cluster Ihrer eigenen Apps ersetzt wird (zum Beispiel eu).
HTTP-Statuscodes werden verwendet, um den Erfolg oder Misserfolg von Anforderungen anzuzeigen. Die folgenden Status sind häufig:
200 Erfolgreiche Anfrage. Der Body enthält einen JSON-Hash von Antwortdaten
400 Fehler: Details im Antworttext
401 Authentifizierungsfehler: Der Antwort-Body enthält eine Erklärung
403 Forbidden: App deaktiviert oder Nachrichtenkontingent überschritten
Die folgenden REST-API-Funktionen wurden implementiert.
| Function | Beschreibung |
| TriggerEvent | Löst ein neues Event auf dem angegebenen Channel aus. Unterstützt optionale SocketId- (um einen Client auszuschließen) und Info-Parameter. |
| TriggerBatchEvents | Löst mehrere Ereignisse in einer einzigen HTTP-Anfrage aus. Akzeptiert ein JSON-Array von Ereignisobjekten. |
| GetChannels | Stellt eine Liste aller aktiven Kanäle bereit. Unterstützt optionale FilterByPrefix- und Info-Parameter. |
| GetChannel | Stellt Informationen über einen bestimmten Kanal bereit. Unterstützt einen optionalen Info-Parameter. |
| GetUsers | Stellt eine Liste aller mit einem Kanal verbundenen Benutzer bereit. |
| TerminateUserConnections | Beendet alle Verbindungen eines bestimmten Benutzers anhand seiner Benutzer-ID. |
Löst ein Ereignis auf einem oder mehreren Kanälen aus. Erfordert den Ereignisnamen, den Kanalnamen und die Datennutzlast.
| Parameter | Beschreibung |
| aEventName | Der Name des auszulösenden Ereignisses. |
| aChannel | Der Name des Kanals, auf dem das Ereignis ausgelöst werden soll. |
| aData | Die Ereignisdaten (JSON-Zeichenkette). |
| aSocketId (optional) | Eine Socket-ID, die vom Empfang des Events ausgeschlossen werden soll. Nützlich, um zu verhindern, dass der Sender seine eigene Nachricht empfängt. |
| aInfo (optional) | Eine durch Kommas getrennte Liste von Attributen, die in die Antwort aufgenommen werden sollen (z. B. "subscription_count"). |
// trigger event on a channel
APIPusher.TriggerEvent('my-event', 'my-channel', 'Hello World');
// trigger event excluding the sender
APIPusher.TriggerEvent('my-event', 'my-channel', 'Hello World', '123.456');
// trigger event requesting subscription_count in the response
APIPusher.TriggerEvent('my-event', 'my-channel', 'Hello World', '', 'subscription_count');
Löst mehrere Ereignisse in einem einzigen API-Aufruf aus, was effizienter ist, als für jedes Ereignis separate Anfragen zu stellen. Der Parameter batch muss eine JSON-Zeichenfolge sein, die ein Array von Ereignisobjekten enthält, wobei jedes Objekt die Felder "channel", "name" und "data" hat.
APIPusher.TriggerBatchEvents(
'[{"channel":"my-channel","name":"my-event","data":"hello"},' +
'{"channel":"my-channel-2","name":"my-event","data":"world"}]');
Gibt eine Liste der aktiven Kanäle zurück. Unterstützt optionale Parameter, um die Ergebnisse zu filtern und zusätzliche Informationen anzufordern.
| Parameter | Beschreibung |
| aFilterByPrefix (optional) | Filtert Kanäle nach einem Namenspräfix (z. B. "presence-", um nur Presence-Kanäle aufzulisten). |
| aInfo (optional) | Eine durch Kommata getrennte Liste von Attributen, die in die Antwort aufgenommen werden sollen (z. B. "user_count"). |
// get all channels
APIPusher.GetChannels;
// get only presence channels with user count
APIPusher.GetChannels('presence-', 'user_count');
Gibt Informationen über einen bestimmten Channel zurück.
| Parameter | Beschreibung |
| aChannel | Der Kanalname, über den Informationen abgerufen werden sollen. |
| aInfo (optional) | Eine durch Kommas getrennte Liste von Attributen, die einbezogen werden sollen (z. B. "user_count,subscription_count"). |
// get channel info
APIPusher.GetChannel('presence-my-channel');
// get channel info with user count
APIPusher.GetChannel('presence-my-channel', 'user_count,subscription_count');
Gibt eine Liste der mit einem Presence-Kanal verbundenen Benutzer zurück. Der Kanalname muss das vollständige Präfix enthalten (z. B. "presence-my-channel").
APIPusher.GetUsers('presence-my-channel');
Beendet alle von einem bestimmten Benutzer hergestellten Verbindungen. Dies kann verwendet werden, um einen bestimmten Benutzer zur Trennung von allen Kanälen zu zwingen. Die Benutzer-ID muss mit der beim Abonnieren eines Presence-Kanals verwendeten "user_id" übereinstimmen.
APIPusher.TerminateUserConnections('1234');
Pusher erlaubt nur das Abonnieren von privaten oder Presence-Kanälen; wenn die Verbindung ein Authentifizierungstoken bereitstellt, ermöglicht Ihnen dies, den Zugriff einzuschränken.
Sie können Ihren eigenen Authentifizierungs-Ablauf mit dem Ereignis OnPusherAuthentication erstellen. Dieses Ereignis wird aufgerufen, bevor die Subscription-Nachricht mit dem von Pusher bereitgestellten geheimen Schlüssel signiert wird. Dieses Ereignis hat 2 Parameter: eine Request-Authentifizierung mit Feldern wie SocketId, Channel-Name usw., die von Ihrem eigenen Authentifizierungsserver verwendet werden können, um die Anfrage zu authentifizieren oder nicht. Nachfolgend finden Sie einen Screenshot, der den Pusher-Authentifizierungsablauf zeigt

Wenn sich ein Client mit dem Pusher-Server verbindet, sendet er den von Pusher bereitgestellten Key, und der Server gibt eine Identifikations-ID (socket_id) zurück.
Wenn ein Client einen privaten (oder Presence-) Channel abonniert, verwendet der sgcWebSockets-Client den von Pusher bereitgestellten Secret Key, um eine Signatur zu erstellen, die in die Abonnementnachricht aufgenommen wird. Über das Ereignis OnPusherAutentication können Sie die zum Signieren der Nachricht erforderlichen Felder erfassen, eigene Authentifizierungsmethoden implementieren und bei Erfolg die Signatur zurückgeben; diese Signatur wird dann in die Abonnementnachricht aufgenommen und an den Server gesendet.
Beispiel:
oClient := TsgcWebSocketClient.Create(nil);
oPusher := TsgcWSAPI_Pusher.Create(nil);
oPusher.Client := oClient;
oPusher.Cluster := 'eu';
Pusher.Name := 'js';
Pusher.Version := '4.1';
Pusher.TLS := True;
Pusher.Key := '9c3b7ef25qe97a00116c';
Pusher.Secret := ''; // the secret key is not known by the client, only by the authentication module
oPusher.OnPusherAuthentication := OnPusherAuthenticationEvent;
procedure OnPusherAuthenticationEvent(Sender: TObject; AuthRequest: TsgcWSPusherRequestAuthentication;
AuthResponse: TsgcWSPusherResponseAuthentication);
begin
// if the authentication request is successful return the signature
if CustomAuthentication(AuthRequest.Channel, AuthRequest.SocketID) then
AuthResponse.Signature := GetCustomAuthenticationSignature;
end;
Das Format der Signatur lautet:
Private channels: key:HMAC256(SocketID, ChannelName)
Presence-Kanäle: Schlüssel: HMAC256(SocketID, ChannelName, Data)
Das Objekt TsgcWSPusherResponseAuthentication stellt die folgenden Eigenschaften bereit:
| Eigenschaft | Beschreibung |
| Secret | Der Pusher-Secret-Key, der zur Berechnung der HMAC-Signatur verwendet wird. Vorausgefüllt mit Pusher.Secret, falls konfiguriert. |
| Signatur | Die berechnete Authentifizierungssignatur. Wenn leer gelassen, berechnet die Komponente sie automatisch unter Verwendung des Secrets. |
| SharedSecret | Der gemeinsame geheime Schlüssel für privat verschlüsselte Kanäle. Erforderlich beim Abonnieren von pscPrivateEncryptedChannel oder pscPrivateEncryptedCacheChannel. Wird für die End-to-End-Verschlüsselung von Nachrichtendaten verwendet. |