SkyWayの通信モデル

SkyWayを利用するに当たり、知っておくべき概念を説明します。SkyWayでは複数のSDKが提供されていますが、関数名は同一 1であるため、本記事の内容はどのSDKにも活用できます。

Peerについて

SkyWayを利用して何らかのサービスを作る場合、最初にPeer(ピア)というインスタンスを作成します。Peerは、SkyWayのシグナリングサーバや、他のクライアントとの接続を管理するエージェントです。たとえば、1:1で双方向でやり取りするビデオチャットでは、発信側と着信側で2つのエージェントが音声・映像を送受信します。

Peer IDについて

SkyWayで、Peerを作成(new Peer)すると、作成したPeerがシグナリングサーバへ接続します。接続が成功すると、Peer.openイベントの発火と共に、SkyWayサーバ側がランダムに作成するPeer IDという値を取得できます。Peer IDはPeerを一意に識別するためのIDです。接続が失敗した場合はPeer.errorイベントが発火します。

Peer IDはSkyWayサーバ側が作成するのみではなく、開発者自身が独自に指定可能(new Peer('独自のPeer ID'))です。

2つの通信モデル

SkyWayを利用してクライアント間の接続を管理するモデルは大きく2つあります。1つが電話をベースにしたモデル、もう1つはルームをベースにしたモデルです。

1. 電話モデル

携帯電話などで通話する場合と同様に、1:1で通信をするモデルです。通信を開始する場合には相手のPeer IDを何らかの手段で知る必要があります。

音声・映像の場合(メディアチャネル)

相手側に発信する(Peer.call())場合には、電話番号の代わりにPeer IDを指定します。着信すると、callイベントが着信側で発火します。そのcall要求に対してanswer()を呼ぶことで、通信が確立します。発信者・着信者ともに、音声・映像はstreamイベントの発火と共に取得できます。

データの場合(データチャネル)

音声や映像ではなく、データのみをやり取りしたい場合は、Peer.connect()を利用します。接続が確立するとconnectionイベントが発火します。

メディアチャネルと異なり、データチャネルではanswer()を明示的に呼ぶ必要はなく、自動的に接続が確立されます。

2. ルームモデル

同じルームに存在する全てのPeerで会話2するモデルです。

Peerはルーム名を指定してルームに参加(peer.joinRoom(ルーム名など))します。他の参加者から音声/映像などのメディアを受信した場合は、Room.streamイベントが発火し、メディア通信が確立されます。ルームから退出する場合は、Room.close()を利用します。なお、Room.close()はルームから退出するのみで、ルーム全体が削除されるわけではありません(他の参加者がルームに参加していた場合に、それらの参加社の通信が切断されるわけではありません) 。全ての参加者がルームから退出すると、ルームが削除されます。

ルームの名前空間はAPIキー毎に独立しています。つまり、AというAPIキーとBというAPIキーがあった場合に、どちらも同じhogeというルーム名を作成したとしても、2つのルーム名は別個として扱われます。Aのルームの参加者と、Bのルームの参加者同士での通信は確立しません。

なお、ルームの実現方式は、フルメッシュとSFUという方式の2種類があります。これらの方式の詳細は、こちらで確認できます。

メディアストリームの扱いについて

SkyWayで音声や映像を通信相手と送受信したい場合、メディアストリーム(MediaStream)を利用します。 メディアストリームの作成3・加工は、SkyWayのSDKでは提供しておらず、あくまで入力時にSkyWayに渡す/出力時にSkyWay SDKから取得するのみになります。

メディアストリームの作成・加工は、SkyWayのSDKでは提供していない

  1. パラメタ、クラス名などの微差はあります 

  2. Peerは音声や映像を送受信する一方で、受信専用で動作することも可能なため、発言せずに聞き取りに専念するような通信も実現できます。 

  3. iOS/Android SDKは、SDK内部でNavigator.getUserMediaを実装しています。また、JavaScript向けのSkyWay-ScreenShareは、スクリーン共有機能を利用するためのgetUserMedia関数のラッパー機能を提供しています。