Pusher Client Delphi Güncellemesi

· Özellikler

TsgcWS_API_Pusher bileşeni, en güncel Pusher Channels protokol spesifikasyonuyla uyumlu hale getirilecek şekilde güncellendi. Bu sürüm; private-encrypted kanal desteği, dört yeni presence ve cache kanal olayı, iki yeni REST API uç noktası, mevcut uç noktalar için geliştirilmiş sorgu parametreleri ve çeşitli hata düzeltmeleri sunar. Tüm değişiklikler geriye dönük uyumludur. Mevcut kodunuz hiçbir değişiklik yapılmadan çalışmaya devam eder.

İçindekiler

  1. Private-Encrypted Kanal Desteği
  2. Yeni WebSocket Olayları
  3. Yeni REST API Metotları
  4. Güncellenen REST API Metotları
  5. Hata Düzeltmeleri
  6. Özet

1. Private-Encrypted Kanal Desteği

Pusher Channels, olay verilerinin uçtan uca şifrelenmesini sağlayan private-encrypted kanalları destekler; bunun için NaCl Secretbox (XSalsa20-Poly1305) kullanılır. Pusher sunucuları açık metni asla görmez; mesajların şifresini yalnızca iletişim kuran istemciler çözebilir. TsgcWSPusherChannels numaralandırmasına iki yeni kanal türü eklendi:

Enum Değeri Kanal Öneki Açıklama
pscPrivateEncryptedChannel private-encrypted- Uçtan uca şifrelenmiş özel kanal. Veri yükleri, kanal başına paylaşılan bir gizli anahtarla şifrelenir.
pscPrivateEncryptedCacheChannel private-encrypted-cache- Yukarıdakiyle aynı, ayrıca cache kanal davranışı vardır; son olay yeni abonelere iletilir.

TsgcWSPusherResponseAuthentication sınıfı artık bir SharedSecret özelliği içeriyor. Bir private-encrypted- kanalına abone olurken, yetkilendirme uç noktanız kanal başına base64 ile kodlanmış paylaşılan gizli anahtarı döndürmelidir. Bu değeri OnPusherAuthentication olay işleyicisinde ayarlayın:

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;

Şifreli Bir Kanala Abone Olma

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

Şifreli Bir Kanalda Yayınlama

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

2. Yeni WebSocket Olayları

Daha önce işlenmeyen Pusher dahili protokol mesajlarını işlemek için dört yeni olay eklendi. Bu olaylar, ilgili pusher_internal: mesajları WebSocket bağlantısı üzerinden geldiğinde otomatik olarak gönderilir.

Olay Özelliği Protokol Mesajı Açıklama
OnPusherMemberAdded pusher_internal:member_added Yeni bir kullanıcı bir presence kanalına katıldığında tetiklenir. Kanal adını, kullanıcı kimliğini ve kullanıcı bilgisini sağlar.
OnPusherMemberRemoved pusher_internal:member_removed Bir kullanıcı bir presence kanalından ayrıldığında tetiklenir. Kanal adını, kullanıcı kimliğini ve kullanıcı bilgisini sağlar.
OnPusherSubscriptionCount pusher_internal:subscription_count Bir kanalın abonelik sayısı değiştiğinde tetiklenir. Pusher panosunda etkinleştirilmelidir.
OnPusherCacheMiss pusher_internal:cache_miss Önbelleğe alınmış bir olayı bulunmayan bir cache kanalına abone olunduğunda tetiklenir.

OnPusherMemberAdded / OnPusherMemberRemoved

Bu olaylar yeni TsgcWSPusherMemberEvent geri çağırma türünü kullanır; bu tür, kanal adını, kullanıcı kimliğini ve kullanıcı bilgisini ayrı parametreler olarak sağlar:

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

Yeni TsgcWSPusherSubscriptionCountEvent geri çağırma türünü kullanır. Bu olay, Pusher pano ayarlarınızda Subscription Count özelliğinin etkinleştirilmesini gerektirir.

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

Yeni TsgcWSPusherCacheMissEvent geri çağırma türünü kullanır. Bu olay, bir cache kanalına (cache-, private-cache-, private-encrypted-cache-, or presence-cache-) abone olduğunuzda ve önbelleğe alınmış bir olay bulunmadığında tetiklenir.

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. Yeni REST API Metotları

TsgcWS_API_Pusher bileşenine, toplu olay uç noktasını ve kullanıcı bağlantısı sonlandırmayı kapsayan iki yeni sunucu tarafı REST API metodu eklendi; bunlar şunlardır:

Metot Pusher Uç Noktası Açıklama
TriggerBatchEvents POST /apps/{app_id}/batch_events Tek bir HTTP isteğinde en fazla 10 olayı tetikler. Her olay farklı bir kanalı hedefleyebilir.
TerminateUserConnections POST /apps/{app_id}/users/{user_id}/terminate_connections Kimliği doğrulanmış belirli bir kullanıcının tüm WebSocket bağlantılarını sonlandırır.

TriggerBatchEvents

function TriggerBatchEvents(const aBatch: String): String;

aBatch parametresi, olay nesnelerinden oluşan bir batch dizisi içeren bir JSON dizesidir. Her nesne channel, name, and data içermelidir. Toplu işlem başına en fazla 10 olay.

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;

Belirli bir kullanıcının tüm etkin WebSocket bağlantılarını zorla sonlandırır. Bu; bir kullanıcının tüm cihazlarından çıkış yaptırmak veya bir izin değişikliğinden sonra erişimi iptal etmek için kullanışlıdır. Pusher User Authentication yapılandırmasının ayarlanmış olmasını gerektirir.

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

4. Güncellenen REST API Metotları

Mevcut üç REST API metodu, ek isteğe bağlı parametrelerle geliştirildi. Yeni parametrelerin tümü varsayılan değerlere sahip olduğundan, mevcut kod tamamen geriye dönük uyumludur.

TriggerEvent

Önceki İmza

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

Yeni İmza

function TriggerEvent(const aEventName, aChannel, aData: String;
  const aSocketId: String = '';
  const aInfo: String = ''): String;
Parametre Açıklama
aSocketId Bu socket kimliğini olayı almaktan hariç tutar. Gönderenin kendi yayınını almasını önlemek için kullanışlıdır.
aInfo Döndürülecek özniteliklerin virgülle ayrılmış listesi. Geçerli değerler: 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

Önceki İmza

function GetChannels: String;

Yeni İmza

function GetChannels(
  const aFilterByPrefix: String = '';
  const aInfo: String = ''): String;
Parametre Açıklama
aFilterByPrefix Döndürülen kanalları ad önekine göre filtreler. Örnek: presence- yalnızca presence kanallarını döndürür.
aInfo Virgülle ayrılmış öznitelikler. Geçerli değerler: user_count (yalnızca 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

Önceki İmza

function GetChannel(const aChannel: String): String;

Yeni İmza

function GetChannel(const aChannel: String;
  const aInfo: String = ''): String;
Parametre Açıklama
aInfo Virgülle ayrılmış öznitelikler. Geçerli değerler: 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. Hata Düzeltmeleri

Bu sürümde çeşitli hatalar belirlendi ve düzeltildi:

Hata Etki Düzeltme
DoReadEvent içinde yazım hatası: 'puserh:ping' Kritik Sunucu ping'leri hiçbir zaman tanınmıyordu; bu da istemcinin heartbeat isteklerini kaçırmasına yol açıyordu. Bu durum, sunucunun istemciyi hareketsizlik nedeniyle bağlantıdan düşürmesine neden olabilirdi. 'pusher:ping' olarak düzeltildi.
DoSendPong null erişimi Yüksek JSON.Node['data'].Value değerine null denetimi olmadan erişmek, ping mesajında data alanı yoksa bir erişim ihlaline neden olabilirdi. Null denetimi eklendi; data bulunmadığında varsayılan olarak {} kullanılır.
GetUsers sabit kodlanmış önek Yüksek Metot, kanal adının başına her zaman presence- ekliyordu; kullanıcı zaten tam kanal adını geçirdiyse önek ikiye katlanıyordu (örneğin presence-presence-room). Sabit kodlanmış önek kaldırıldı. Kullanıcılar artık presence- öneki dahil tam kanal adını geçirmelidir.
GetUsers çift noktalı virgül Düşük Metodun sonunda başıboş bir çift noktalı virgül ;; bulunuyordu. Fazladan noktalı virgül kaldırıldı.

GetUsers'da kırıcı değişiklik: GetUsers metodu artık otomatik olarak presence- öneki eklemez. Kodunuz kanal adını önek olmadan yalnızca ad olarak geçiriyorsa (örneğin GetUsers('my-room')), tam adı içerecek şekilde güncellemelisiniz: GetUsers('presence-my-room').


6. Özet

Kategori Sayı Ayrıntılar
Yeni Kanal Türleri 2 pscPrivateEncryptedChannel, pscPrivateEncryptedCacheChannel
Yeni WebSocket Olayları 4 OnPusherMemberAdded, OnPusherMemberRemoved, OnPusherSubscriptionCount, OnPusherCacheMiss
Yeni REST Metotları 2 TriggerBatchEvents, TerminateUserConnections
Güncellenen REST Metotları 3 TriggerEvent (+socket_id, +info), GetChannels (+filtre, +info), GetChannel (+info)
Yeni Özellikler 1 SharedSecret on TsgcWSPusherResponseAuthentication
Hata Düzeltmeleri 4 Ping yazım hatası, pong null erişimi, GetUsers öneki, çift noktalı virgül

Tüm değişiklikler geriye dönük uyumludur. Yeni metot parametreleri varsayılan değerleri kullanır ve yeni olay özellikleri isteğe bağlıdır. Tek davranışsal değişiklik, artık otomatik olarak presence- öneki eklemeyen GetUsers metodundadır.