SkyWayは、シグナリングサーバーもサービス内で提供していますが、SDKにおいてはほぼ隠蔽されており、WebRTCを使用する分には気にする必要がありませんが、このシグナリングサーバーのみを使用したいとなった場合、どうすればいいか。
SkyWayのSDK(クライアント)はPeerJSがベースとなっており、WebSocketのライブラリにSocket.IOが使用されています。
Peerインスタンスのopenイベントは、シグナリングサーバーに接続が完了したイベントですので、openイベント後にSocket.IOのインスタンスを取得することができればいいわけです。
(SkyWay SDK内部においては、いったんdispatcherUrlにリクエストを投げ、レスポンスからシグナリングサーバーのURLを取得してから、シグナリングサーバーに接続しています。)
const peer = new Peer({key:'---'});
peer.on('open', id => {
const socket = peer.socket._io; // peer.socket._ioがSocket.IOインスタンス
});
シグナリング(WebSocket)サーバー側もPeerJSのサーバーをベースにしています。
PeerJSのサーバーは、特定のイベント名のメッセージ以外ははじく仕様となっています。
イベント名とは、Socket.IOのemit()で第1引数に指定する値のことです。
SkyWayでクライアントからサーバーにメッセージを送信するときに使用されているイベント名
イベント名 |
---|
'SEND_OFFER' |
'SEND_ANSWER' |
'SEND_CANDIDATE' |
'SEND_LEAVE' |
'ROOM_JOIN' |
'ROOM_LEAVE' |
'ROOM_GET_LOGS' |
'ROOM_GET_USERS' |
'ROOM_SEND_DATA' |
'SFU_GET_OFFER' |
'SFU_ANSWER' |
'SFU_CANDIDATE' |
'PING' |
'UPDATE_CREDENTIAL' |
これら以外のイベント名でメッセージをクライアントから送信すると、サーバー側ではじかれます。
'SEND_'から始まらないイベント名は、サーバー側で処理されるメッセージですので、使用できません。
クライアントから別のクライアントにメッセージを送信するには、'SEND_'から始まるイベント名、
'SEND_OFFER'
'SEND_ANSWER'
'SEND_CANDIDATE'
'SEND_LEAVE'
のいずれかを使用します。
ただし、サーバーから別のクライアントへメッセージが送信されるときは、'SEND_'がないイベント名で送信されます。
また、特定の別クライアントにメッセージを送信したい場合は、送信データにdstプロパティを追加し値にpeerIdを設定することで、そのpeerIdへメッセージが送信されます。
ちなみに、srcプロパティで送信元のpeerIdを設定することができます。
_io.emit('SEND_OFFER', {
data: {},
dst: destPeerId,
src: sourcePeerId
});
|
V
<< Signaling Server >>
|
V
_io.on('OFFER', data => {
//...
});
これにより、シグナリングサーバー経由で独自のメッセージの送受信が行えます。
call(MediaConnection)やconnection(DataConnection)を生成した場合、内部でシグナリングメッセージハンドラーが生成されるため、独自のメッセージを送受信する場合は、そのハンドラーを回避する必要があります。回避できなくはないですが、SDK内部を修正する必要があるため面倒になります。
ですので、シグナリングのみを使用するだけでしたら面倒なことは避けられますので、生のWebRTCの動作確認の用途等で使用することができます。
もちろん、独自のメッセージをシグナリングサーバー経由で送受信する方法は公式に公表されていませんので、使用には十分注意してください。