TsgcWS_API_Pusher コンポーネントが最新の
Pusher Channels プロトコル仕様に合わせて更新されました。
このリリースでは、プライベート暗号化チャネルのサポート、4 つのプレゼンス・キャッシュチャネルイベント、
2 つの新しい REST API エンドポイント、既存エンドポイントへのクエリパラメーター拡張、およびいくつかのバグ修正が導入されました。
すべての変更は後方互換性があります — 既存のコードは変更なしで動作し続けます。
目次
1. プライベート暗号化チャネルのサポート
Pusher Channels は NaCl Secretbox(XSalsa20-Poly1305)を使用してイベントデータをエンドツーエンドで暗号化するプライベート暗号化チャネルをサポートしています。Pusher サーバーは平文を見ることがなく、通信するクライアントだけがメッセージを復号できます。TsgcWSPusherChannels 列挙型に 2 つの新しいチャネルタイプが追加されました:
| 列挙値 | チャネルプレフィックス | 説明 |
|---|---|---|
pscPrivateEncryptedChannel |
private-encrypted- |
エンドツーエンド暗号化プライベートチャネル。データペイロードはチャネルごとの共有シークレットで暗号化されます。 |
pscPrivateEncryptedCacheChannel |
private-encrypted-cache- |
上記と同様ですが、キャッシュチャネルの動作も備えます — 最後のイベントが新規サブスクライバーに配信されます。 |
TsgcWSPusherResponseAuthentication クラスに SharedSecret プロパティが追加されました。private-encrypted- チャネルをサブスクライブする際、認可エンドポイントはチャネルごとの Base64 エンコードされた共有シークレットを返す必要があります。この値を OnPusherAuthentication イベントハンドラーで設定してください:
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;
暗号化チャネルへのサブスクライブ
// 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);
暗号化チャネルへの公開
// Client events work on private-encrypted channels just like private channels
sgcPusher.Publish('my-event', 'my-secret-channel',
pscPrivateEncryptedChannel, '{"message":"Hello encrypted!"}');
2. 新しい WebSocket イベント
これまで未処理だった Pusher 内部プロトコルメッセージを処理するために 4 つの新しいイベントが追加されました。これらのイベントは、対応する pusher_internal: メッセージが WebSocket 接続を通じて届くと自動的にディスパッチされます。
| イベントプロパティ | プロトコルメッセージ | 説明 |
|---|---|---|
OnPusherMemberAdded |
pusher_internal:member_added |
新しいユーザーがプレゼンスチャネルに参加したときに発火します。チャネル名、ユーザー ID、ユーザー情報を提供します。 |
OnPusherMemberRemoved |
pusher_internal:member_removed |
ユーザーがプレゼンスチャネルから退出したときに発火します。チャネル名、ユーザー ID、ユーザー情報を提供します。 |
OnPusherSubscriptionCount |
pusher_internal:subscription_count |
チャネルのサブスクリプション数が変化したときに発火します。Pusher ダッシュボードで有効化する必要があります。 |
OnPusherCacheMiss |
pusher_internal:cache_miss |
キャッシュされたイベントがないキャッシュチャネルをサブスクライブしたときに発火します。 |
OnPusherMemberAdded / OnPusherMemberRemoved
これらのイベントは新しい TsgcWSPusherMemberEvent コールバックタイプを使用し、チャネル名、ユーザー ID、ユーザー情報を個別のパラメーターとして提供します:
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
新しい TsgcWSPusherSubscriptionCountEvent コールバックタイプを使用します。このイベントは Pusher ダッシュボード設定で Subscription Count 機能を有効化する必要があります。
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
新しい TsgcWSPusherCacheMissEvent コールバックタイプを使用します。このイベントはキャッシュチャネル(cache-、private-cache-、private-encrypted-cache-、presence-cache-)をサブスクライブしたときにキャッシュされたイベントがない場合に発火します。
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. 新しい REST API メソッド
TsgcWS_API_Pusher コンポーネントに 2 つの新しいサーバーサイド REST API メソッドが追加されました。バッチイベントエンドポイントとユーザー接続の終了を対象としています。
| メソッド | Pusher エンドポイント | 説明 |
|---|---|---|
TriggerBatchEvents |
POST /apps/{app_id}/batch_events |
1 回の HTTP リクエストで最大 10 個のイベントを発火します。各イベントは異なるチャネルを対象にできます。 |
TerminateUserConnections |
POST /apps/{app_id}/users/{user_id}/terminate_connections |
特定の認証済みユーザーのすべての WebSocket 接続を終了します。 |
TriggerBatchEvents
function TriggerBatchEvents(const aBatch: String): String;
aBatch パラメーターはイベントオブジェクトの batch 配列を含む JSON 文字列です。各オブジェクトには channel、name、data を含める必要があります。バッチあたり最大 10 イベントです。
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;
特定ユーザーのすべてのアクティブな WebSocket 接続を強制終了します。すべてのデバイスからユーザーをログアウトさせる場合や、権限変更後にアクセスを取り消す場合に便利です。Pusher の User Authentication の設定が必要です。
var
vResult: string;
begin
// Disconnect user "user-123" from all sessions
vResult := sgcPusher.TerminateUserConnections('user-123');
Memo1.Lines.Add(vResult);
end;
4. 更新された REST API メソッド
既存の 3 つの REST API メソッドが追加のオプションパラメーターで拡張されました。新しいパラメーターはすべてデフォルト値を持つため、既存のコードは完全に後方互換性があります。
TriggerEvent
変更前のシグネチャ
function TriggerEvent(const aEventName, aChannel, aData: String): String;
新しいシグネチャ
function TriggerEvent(const aEventName, aChannel, aData: String;
const aSocketId: String = '';
const aInfo: String = ''): String;
| パラメーター | 説明 |
|---|---|
aSocketId |
このソケット ID をイベント受信から除外します。送信者が自分のブロードキャストを受け取らないようにするのに便利です。 |
aInfo |
返す属性のカンマ区切りリスト。有効な値: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
変更前のシグネチャ
function GetChannels: String;
新しいシグネチャ
function GetChannels(
const aFilterByPrefix: String = '';
const aInfo: String = ''): String;
| パラメーター | 説明 |
|---|---|
aFilterByPrefix |
名前プレフィックスで返すチャネルをフィルタリングします。例:presence- はプレゼンスチャネルのみを返します。 |
aInfo |
カンマ区切りの属性。有効な値:user_count(プレゼンスのみ)、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
変更前のシグネチャ
function GetChannel(const aChannel: String): String;
新しいシグネチャ
function GetChannel(const aChannel: String;
const aInfo: String = ''): String;
| パラメーター | 説明 |
|---|---|
aInfo |
カンマ区切りの属性。有効な値: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. バグ修正
このリリースでいくつかのバグが特定され修正されました:
| バグ | 影響 | 修正 |
|---|---|---|
Typo in DoReadEvent: 'puserh:ping' |
重大 サーバーの Ping が認識されず、クライアントがハートビートリクエストを見逃していました。これにより、サーバーが非アクティブとしてクライアントを切断する可能性がありました。 | 'pusher:ping' に修正しました。 |
DoSendPong null access |
高 Null チェックなしで JSON.Node['data'].Value にアクセスすると、Ping メッセージにデータフィールドがない場合にアクセス違反が発生する可能性がありました。 |
Null チェックを追加しました。データが存在しない場合は {} をデフォルト値とします。 |
GetUsers hardcoded prefix |
高 メソッドが常にチャネル名に presence- を付加するため、ユーザーがすでにフルチャネル名を渡した場合にプレフィックスが重複していました(例:presence-presence-room)。 |
ハードコードされたプレフィックスを削除しました。ユーザーは presence- プレフィックスを含む完全なチャネル名を渡す必要があります。 |
GetUsers double semicolon |
低 メソッドの末尾に不要な二重セミコロン ;; がありました。 |
余分なセミコロンを削除しました。 |
GetUsers の破壊的変更:GetUsers メソッドは presence- を自動的に付加しなくなりました。プレフィックスなしのチャネル名を渡しているコード(例:GetUsers('my-room'))は、完全な名前を含めるよう更新する必要があります:GetUsers('presence-my-room')。
6. まとめ
| カテゴリー | 件数 | 詳細 |
|---|---|---|
| 新しいチャネルタイプ | 2 | pscPrivateEncryptedChannel, pscPrivateEncryptedCacheChannel |
| 新しい WebSocket イベント | 4 | OnPusherMemberAdded, OnPusherMemberRemoved, OnPusherSubscriptionCount, OnPusherCacheMiss |
| 新しい REST メソッド | 2 | TriggerBatchEvents, TerminateUserConnections |
| 更新された REST メソッド | 3 | TriggerEvent (+socket_id, +info), GetChannels (+filter, +info), GetChannel (+info) |
| 新しいプロパティ | 1 | SharedSecret on TsgcWSPusherResponseAuthentication |
| バグ修正 | 4 | Ping タイポ、Pong Null アクセス、GetUsers プレフィックス、二重セミコロン |
すべての変更は後方互換性があります。新しいメソッドパラメーターはデフォルト値を使用し、新しいイベントプロパティはオプションです。唯一の動作変更は GetUsers にあり、presence- プレフィックスを自動的に付加しなくなりました。
