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
- Private-Encrypted Kanal Desteği
- Yeni WebSocket Olayları
- Yeni REST API Metotları
- Güncellenen REST API Metotları
- Hata Düzeltmeleri
- Ö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.
