# Javascript SDK

# はじめに

SkyWayの開発が初めての方は、ドキュメント/はじめにをご確認ください。

# クラス一覧

  • Peer :P2P接続、およびルーム接続機能を操作するためのクラス
  • MediaConnection :接続先Peerへのメディアチャネル接続を管理するクラス
  • DataConnection :接続先Peerへのデータチャネル接続を管理するクラス
  • MeshRoom :メッシュ接続でのルームを管理するクラス
  • SFURoom :SFU接続でのルームを管理するクラス

# EventEmitterについて

すべてのクラスはEventEmitterを継承しています。

EventEmitterは直訳の通り、イベントを発火 or 受け取ることができる機能です。

例えば、着信などのイベントが発生した場合にはon()を利用します。

function onOpen() {
  console.log('着信しました!');
}
// 着信イベントを検知するイベントリスナを設置 
peer.on('open',onOpen);

// イベントリスナを削除
peer.off('open', onOpen);

EventEmitterの詳しい使い方については、公式ドキュメント等をご確認ください。

TIP

エラー検知は、on('error', listener)にて確認するようにしてください。

# Peer

P2P接続、およびルーム接続機能を操作するためのクラスです。

SkyWayを利用するためには、まず最初にPeerインスタンス生成が必要です。

# Constructor(id, options)

# Constructor(options)

新規にPeerインスタンスを生成します。 new Peer() により、SkyWayのシグナリングサーバと接続します。

# Sample

// デバッグ情報を最大(3)にして接続する場合
const peer = new Peer('some-peer-name', {
  key:   "<YOUR-API-KEY>"
  debug: 3,
});
// TURNサーバを強制利用する場合
const peer = new Peer({
  key:   "<YOUR-API-KEY>"
  config: {
    iceTransportPolicy: 'relay',
  },
});

# Parameter

Name Type Required Default Description
id string ユーザのPeer IDです。値を与えなかった場合、Peer IDはシグナリングサーバから与えられます。
options options object 接続に関するパラメータを指定するオプションです。
# options object
Name Type Required Default Description
key string SkyWayのAPIキーです。
debug number 0 ログレベルは NONE: 0, ERROR: 1, WARN: 2, FULL: 3 から選択できます。
turn boolean true SkyWayで提供するTURNを使うかどうかのフラグです。TURN利用が有効の場合のみ使えます。
credential credential object Peerを認証するためのクレデンシャルです。認証機能が有効の場合のみ使えます。
config RTCConfiguration Default RTCConfiguration object RTCPeerConnectionに渡されるRTCConfigurationです。発展的なオプションのため、内容を理解している場合のみご利用ください。
# credential object

Peer認証機能の詳細はPeer認証のサンプルをご確認ください。

Name Type Required Default Description
timestamp number 現在のUNIXタイムスタンプです。
ttl number Time to live(ttl)。タイムスタンプ + ttl の時間でクレデンシャルが失効します。
authToken string HMACを利用して生成する認証用トークンです。
# Default RTCConfiguration object
const defaultConfig = {
  iceServers: [{
    urls: 'stun:stun.webrtc.ecl.ntt.com:3478',
    url:  'stun:stun.webrtc.ecl.ntt.com:3478',
  }],
  iceTransportPolicy: 'all',
  sdpSemantics: 'unified-plan',
};

# Members

Name Type Description
id string ユーザーが指定したPeer ID、もしくはサーバが生成したPeer IDです。
open boolean シグナリングサーバへの接続状況を保持します。
connections Object 全てのコネクションを保持するオブジェクトです。
rooms Object 全てのルームを保持するオブジェクトです。
options Object Constructor()での指定と、SDKのデフォルト設定を反映したオブジェクトです。

# Methods

# call(peerId[, stream][, options])

指定したPeerにメディアチャネル(音声・映像)で接続して、MediaConnectionを作成します。 オプションを指定することで、帯域幅・コーデックなどを指定できます。

# Parameters
Name Type Required Default Description
peerId string 接続先のPeer IDです。
stream MediaStream 接続先のPeerへ送るメディアストリームです。 設定されていない場合は、受信のみモードで発信します。
options call options object 発信時に付与するオプションです。帯域幅・コーデックなどを指定します。
# call options object
Name Type Required Default Description
metadata Object コネクションに関連付けされる任意のメタデータで、接続先のPeerに渡されます。
videoBandwidth number 接続先から受信する映像の最大帯域幅(kbps)です。
audioBandwidth number 接続先から受信する音声の最大帯域幅(kbps)です。
videoCodec string 'H264'などの映像コーデックです。
audioCodec string 'PCMU'などの音声コーデックです。
videoReceiveEnabled boolean 映像を受信のみで使う場合のフラグです。この値がtrueかつstreamに映像トラックが含まれない場合、受信のみで映像の通信を行います。
audioReceiveEnabled boolean 音声を受信のみで使う場合のフラグです。この値がtrueかつstreamに音声トラックが含まれない場合、受信のみで音声の通信を行います。
connectionId string コネクションを識別するIDです。
label string Deprecated! コネクションを識別するのに利用するラベルです。代わりにconnectionIdを使用してください。
# Return value

MediaConnectionのインスタンス

# Sample
// 自身のlocalStreamを設定して、相手に発信する場合
const call = peer.call('peerID', localStream);
// 自身のlocalStreamおよびmetadataを設定して、相手に発信する場合
const call = peer.call('peerID', localStream, {
  metadata: {
    foo: 'bar',
  }
});
// 映像コーデックとしてH264を利用する場合
const call = peer.call('peerID', localStream, {
  videoCodec: 'H264',
});
// 音声のみ接続先から受信する設定で、相手に発信する場合
const call = peer.call('peerID', null, {
  audioReceiveEnabled: true,
});

# connect(peerId[, options])

指定したPeerにデータチャネルで接続して、DataConnectionインスタンスを生成します。

# Parameters
Name Type Required Default Description
peerId string 接続先のPeer IDです。
options connect options object 接続時に付与するオプションです。
# connect options object
Name Type Required Default Description
metadata Object コネクションに関連付けされる任意のメタデータで、接続先のPeerに渡されます。
serialization string 'binary' 送信時のシリアライズ方法を指定します。'binary', 'json', 'none'のいずれかとなります。
dcInit RTCDataChannelInit {} DataChannel利用時に信頼性の有無を指定するためのオプションです。デフォルトでは信頼性有で動作します。
connectionId string コネクションを識別するIDです。
label string Deprecated! コネクションを識別するのに利用するラベルです。代わりにconnectionIdを使用してください。
# Return value

DataConnectionのインスタンス

# Sample
// 単にDataChannelを接続する場合(デフォルトで信頼性有り)
peer.connect('peerId');
// metadata付きでconnectする場合
peer.connect('peerId', {
  metadata: {
    hoge: "foobar",
  }
});
// 信頼性無しモードでDataChannelを接続する場合
peer.connect('peerId', {
  dcInit: {
    // 最大2回、再送する
    maxRetransmits: 2,
  },
});

# destroy()

全てのコネクションを閉じ、シグナリングサーバへの接続を切断します。

# Return value

undefined

# disconnect()

シグナリングサーバへの接続を切断し、disconnectedイベントを送出します。

# Return value

undefined

# reconnect()

シグナリングサーバへ再接続します。

# Return value

undefined

# joinRoom(roomName[, roomOptions])

メッシュ接続のルーム、またはSFU接続のルームに参加します。 メッシュ接続およびSFU接続についてはこちらを確認ください。

# Parameters
Name Type Rquired Default Description
roomName string 参加先のルームの名前です。
roomOptions room options object {} 接続時に選択・付与するオプションです。
# room options object
Name Type Required Default Description
mode string 'mesh' 'sfu'または'mesh'を指定します。
stream MediaStream ユーザーが送信するメディアストリームです。
videoBandwidth number 映像の最大帯域幅(kbps)です。メッシュ接続のみ使用可能です。
audioBandwidth number 音声の最大帯域幅(kbps)です。 メッシュ接続のみ使用可能です。
videoCodec string 'H264'などの映像コーデックです。 メッシュ接続のみ使用可能です。
audioCodec string 'PCMU'などの音声コーデックです。メッシュ接続のみ使用可能です。
videoReceiveEnabled boolean 映像を受信のみで使う場合のフラグです。メッシュ接続のみ使用可能です。
audioReceiveEnabled boolean 音声を受信のみで使う場合のフラグです。メッシュ接続のみ使用可能です。
# Return value

SFURoom または MeshRoom のインスタンス

# Sample
// Mesh接続を利用する場合
const room = peer.joinRoom('roomName', {
  mode: 'mesh',
  stream: localStream,
});
// SFU接続を利用する場合
const room = peer.joinRoom('roomName', {
  mode: 'sfu',
  stream: localStream,
});

# listAllPeers(callback)

REST APIを利用して、APIキーに紐づくPeer ID一覧を取得します。

# Parameters
Name Type Required Default Description
callback Function Peer ID一覧を受け取る関数です。
# Return value

undefined

# Sample
peer.listAllPeers(peers => {
  console.log(peers)
  // => ["yNtQkNyjAojJNGrt", "EzAmgFhCKBQMzKw9"]
});

# getConnection(peerId, connectionId)

作成したMediaConnectionおよびDataConnectionを取得します。

# Parameters
Name Type Required Default Description
peerId string Peer IDです。
connectionId string コネクションのIDです。
# Return value

MediaConnectionのインスタンス、またはDataConnectionのインスタンス、またはnull

# updateCredential(credential)

Peer認証のクレデンシャルのTTLを延長するための更新リクエストの送付します。 Peer認証については、コチラをご確認ください。

# Parameters
Name Type Required Default Description
credential credential object ユーザー側で作成する新しいクレデンシャルです。
# Return value

undefined

# Events

それぞれのイベント名は、PeerクラスのEVENTSプロパティからも参照できます。

// これらは同じ意味
peer.on('open', () => {});
peer.on(Peer.EVENTS.open, () => {});

# Event: 'open'

シグナリングサーバへ正常に接続できたときのイベントです。

Name Type Description
id string Peer ID
peer.on('open', id => {
  // ...
});

# Event: 'call'

接続先のPeerからメディアチャネル(音声・映像)の接続を受信したときのイベントです。

Name Type Description
call MediaConnection MediaConnectionのインスタンスです。
peer.on('call', call => {
  // ...
});

# Event: 'close'

Peerに対する全ての接続を終了したときのイベントです。

peer.on('close', () => {
  // ...
});

# Event: 'connection'

接続先のPeerからDataChannelの接続を受信したときのイベントです。

Name Type Description
conn DataConnection DataConnectionのインスタンスです。
peer.on('connection', conn => {
  // ...
});

# Event: 'disconnected'

シグナリングサーバから切断したときのイベントです。

Name Type Description
id string Peer ID
peer.on('disconnected', id => {
  // ...
});

# Event: 'expiresin'

クレデンシャルが失効する前に発生するイベントです。

Name Type Description
sec number クレデンシャルが失効するまでの時間(秒)です。
peer.on('expiresin', sec => {
  // ...
});

# Event: 'error'

エラーが発生した場合のイベントです。

Name Type Description
error Error エラーオブジェクトです。

typeプロパティから以下を判別できます。

Type Description
room-error ルーム名が指定されていません
ルームタイプが異なります。(メッシュルームとして作成した部屋に、SFUルーム指定で参加した場合)
SFU機能が該当のAPIキーでDisabledです。利用するには、Dashboardからenableにしてください。
不明なエラーが発生しました。少し待って、リトライしてください。
ルームログ取得時にエラーが発生しました。少し待って、リトライしてください。
authentication 指定されたクレデンシャルを用いた認証に失敗しました。
permission 該当のルームの利用が許可されてません。
list-error APIキーのREST APIが許可されてません。
disconnected SkyWayのシグナリングサーバに接続されていません。
socket-error SkyWayのシグナリングサーバとの接続が失われました。
invalid-key APIキーが無効です。
server-error SkyWayのシグナリングサーバからPeer一覧を取得できませんでした。
// 仮にRoom名を指定せずにjoinRoomを呼んだ場合
peer.on('error', error => {
  console.log(`${error.type}: ${error.message}`);
  // => room-error: Room name must be defined.
});

# MediaConnection

接続先Peerへのメディアチャネル接続を管理するクラスです。

SDK内部の利用のみで、コンストラクタは通常利用しません。 MediaConnectionインスタンスは、Peer#call() およびPeercallイベント で生成されます。

# Sample

// 発信側
const mediaConnection = peer.call('peerID', mediaStream);

// 着信側
peer.on('call', mediaConnection => {
  // MediaStreamで応答する
  mediaConnection.answer(mediaStream);
});

# Members

Name Type Description
type string コネクションタイプを示す文字列です。MediaConnectionでは、この値は'media' です。
metadata Object 発信側がPeer#call()実行時に指定したmetadataです。着信側では、発信側が指定した値になります。
localStream MediaStream Peer#call()あるいはMediaConnection#answer()で指定した自身のMediaStreamです。
open boolean コネクションがオープンしているかどうかを示します。MediaConnectionstreamイベントまたは MediaConnection#answer() が呼び出された際にオープンし、 MediaConnection#close()が呼び出されたまたはMediaConnectioncloseイベントが発生した際にクローズします。
remoteId string 接続先PeerのPeer IDです。
peer string Deprecated! 接続先PeerのPeer IDです。remoteIdを使ってください。
id string コネクションを識別するIDです。

# Methods

# answer(stream[, options])

発信側からのメディアチャネル接続の接続要求に対して応答します。

# Parameters
Name Type Required Default Description
stream MediaStream 発信側のPeerへ送るMediaStreamオブジェクトです。
options answer options object 応答時に付与するオプションです。
# answer options object
Name Type Required Default Description
videoBandwidth number 接続先Peerから受信する映像の最大帯域幅(kbps)です。
audioBandwidth number 接続先Peerから受信する音声の最大帯域幅(kbps)です。
videoCodec string 'H264'などの映像コーデックです。
audioCodec string 'PCMU'などの音声コーデックです。
# Return value

undefined

# Sample
peer.on('call', mediaConnection => {
  const answerOption = {
    videoCodec: 'H264',
  };

  mediaConnection.answer(mediaStream, answerOption);
});

# close(forceClose)

接続先PeerとのMediaConnectionの接続を切断します。

# Parameters
Name Type Required Default Description
forceClose boolean false この値がtrueの場合、相手のMediaConnectionも即座にcloseします。falseの場合相手は、ブラウザによるice再接続が失敗してからコネクションをcloseします。
# Return value

undefined

# replaceStream(stream)

送信しているMediaStreamを更新します。 受信のみモードでメディアチャネル接続を行なっている状態で、 新しいMediaStreamがメディアトラックを持つ場合、自動的に送受信モードに切り替わります。

# Parameters
Name Type Required Default Description
stream MediaStream 更新対象となる新しいMediaStreamです。
# Return value

undefined

# getPeerConnection()

接続先PeerとのMediaConnectionが内部的に使用している RTCPeerConnection を取得します。 コネクションのopenプロパティがfalseの場合は、 null が返ります。

!!! 注意 RTCPeerConnectionを直接操作すると、SDKは正しく動作しなくなる可能性があります。

# Return value

RTCPeerConnection のインスタンス または null

# Sample
if (mediaConnection.open) {
  const pc = mediaConnection.getPeerConnection();

  // ...
}

# Events

# Event: 'stream'

MediaStreamを受信したときに発生します。

Name Type Description
stream MediaStream MediaStreamのインスタンスです。
mediaConnection.on('stream', stream => {
  // ...
});

# Event: 'close'

MediaConnection#close()が呼ばれたとき、または接続先Peerとのメディアチャネル接続が切断されたときに発生します。

mediaConnection.on('close', () => {
  // ...
});

# DataConnection

接続先Peerへのデータチャネル接続を管理するクラスです。

SDK内部の利用のみで、コンストラクタは通常利用しません。 DataConnectionインスタンスは、Peer#connect() およびPeerconnectionイベント で生成されます。

# Sample

// 発信側
const dataConnection = peer.connect('peerID');

// 着信側
peer.on('connection', dataConnection => {
  // ...
});

# Members

Name Type Description
type string コネクションタイプを示す文字列です。DataConnectionでは、この値は'data' です。
metadata Object 発信側がPeer#connect()実行時に指定したmetadataです。着信側では、発信側が指定した値になります。
serialization string 発信側がPeer#connect()実行時に指定したserializationです。着信側では、発信側が指定した値になります。
dcInit RTCDataChannelInit 発信側がPeer#connect()実行時に指定したdcInitです。着信側では、発信側が指定した値になります。
open boolean コネクションがオープンしているかどうかを示します。DataConnectionopenイベントが発生した際にオープンし、DataConnection#close()が呼び出されたまたはデータチャネル接続が切断された際にクローズします。
remoteId string 接続先PeerのPeer IDです。
peer string Deprecated! 接続先PeerのPeer IDです。remoteIdを使ってください。
id string コネクションを識別するIDです。

# Methods

# send(data)

接続先Peerにデータを送信します。シリアライズ方法が'binary'である場合は、送信前に分割します。

# Parameters
Name Type Required Default Description
data * 接続先のPeerへ送るデータです。
# Return value

undefined

# Sample
// データを送信する
dataConnection.on('open', () => {
  const data = {
    name: 'SkyWay',
    msg: 'Hello, World!'
  };
  dataConnection.send(data);
});

// データを受信する
dataConnection.on('data', ({ name, msg }) => {
  console.log(`${name}: ${msg}`);
  // => 'SkyWay: Hello, World!'
});

# getPeerConnection()

接続先PeerとのDataConnectionが内部的に使用している RTCPeerConnection を取得します。 コネクションのopenプロパティがfalseの場合は、 null が返ります。

!!! 注意 RTCPeerConnectionを直接操作すると、SDKは正しく動作しなくなる可能性があります。

# Return value

RTCPeerConnection のインスタンス または null

# Sample
if (dataConnection.open) {
  const pc = dataConnection.getPeerConnection();

  // ...
}

# close(forceClose)

接続先PeerとのDataConnectionの接続を切断します。

# Parameters
Name Type Required Default Description
forceClose boolean false この値がtrueの場合、相手のDataConnectionも即座にcloseします。falseの場合相手は、ブラウザによるice再接続が失敗してからコネクションをcloseします。
# Return value

undefined

# Events

# Event: 'open'

データチャネルが接続されたときに発生します。

dataConnection.on('open', () => {
  // ...
});

# Event: 'data'

接続先のPeerからデータを受信したときに発生します。 シリアライズ方法が'binary'である場合は、分割されたデータすべてを受信し、再結合が完了したときに発生します。

Name Type Description
data * 受信したデータです。
dataConnection.on('data', data => {
  // ...
});

# Event: 'close'

DataConnection#close()が呼ばれたとき、または接続先Peerとのデータチャネル接続が切断されたときに発生します。

dataConnection.on('close', () => {
  // ...
});

# Event: 'error'

DataConnection#send()が呼ばれたが、まだデータチャネルが接続されていなかったときに発生します。

dataConnection.on('error', () => {
  // ...
});

# MeshRoom

メッシュ接続でのルームを管理するクラスです。

SDK内部の利用のみで、コンストラクタは通常利用しません。 MeshRoomのインスタンスは、Peer#joinRoom() で生成されます。

# Sample

const meshRoom = peer.joinRoom('roomName', {
  mode: 'mesh',
  stream: localStream,
});
meshRoom.on('open', () => {});

# Members

Name Type Description
name string ルーム名です。
connections Object Peer IDをキーに、ルーム内のコネクションを保持するオブジェクトです。

# Methods

# close()

ルームを退出し、ルーム内のすべてのユーザーとのコネクションを切断します。

# Return value

undefined

# getLog()

シグナリングサーバにルームのログ取得を要求します。 シグナリングサーバからログを受信すると、logイベントが発火します。

# Return value

undefined

# Sample
room.once('log', log => {
  // ...
});
room.getLog();

# replaceStream(stream)

送信しているMediaStreamを更新します。 受信のみモードでメディアチャネル接続を行なっている状態で、 新しいMediaStreamがメディアトラックを持つ場合、自動的に送受信モードに切り替わります。

# Parameters
Name Type Required Default Description
stream MediaStream 更新対象となる新しいMediaStreamです。
# Return value

undefined

# send(data)

WebSocketを使用してルーム内の全てのユーザーにデータを送信します。

注意

  • 送信可能なデータサイズの上限は20MBです。

  • 送信頻度は100msecに1回に制限されています。 送信頻度の制限を超えた送信データはキューに入り、100msec毎に順次送信されます。

# Parameters
Name Type Required Default Description
data * 送信するデータです。
# Return value

undefined

# Events

# Event: 'open'

新規にPeerがルームへ入室したときに発生します。

room.on('open', () => {
  // ...
});

# Event: 'peerJoin'

ルームに新しいPeerが参加したときに発生します。

Name Type Description
peerId string 参加したPeerのIDです。
room.on('peerJoin', peerId => {
  // ...
});

# Event: 'peerLeave'

新規にPeerがルームを退出したときに発生します。

Name Type Description
peerId string 退出したPeerのIDです。
room.on('peerLeave', peerId => {
  // ...
});

# Event: 'log'

ルームのログを受信したときに発生します。

Name Type Description
logs string[] ログ(JSON文字列)の配列です。
room.once('log', logs => {
  for (const logStr of logs) {
    const { messageType, message, timestamp } = JSON.parse(logStr);
    // ...
  }
});

# Event: 'stream'

ルームにJoinしている他のユーザのストリームを受信した時に発生します。 ストリーム送信元のPeer IDはstream.peerIdで取得できます。

Name Type Description
stream MediaStream MediaStreamのインスタンスです。
room.on('stream', stream => {
  // ...
});

# Event: 'data'

他のユーザーから送信されたデータを受信した時に発生します。

Name Type Description
data object data object形式のオブジェクトです。
# data object
Name Type Description
src string データを送信したPeerのIDです。
data * 受信したデータです。
room.on('data', ({ src, data }) => {
  // ...
});

# Event: 'close'

ルームをcloseしたときに発生します。

room.on('close', () => {
  // ...
});

# SFURoom

SFU接続でのルームを管理するクラスです。

SDK内部の利用のみで、コンストラクタは通常利用しません。 SFURoomのインスタンスは、Peer#joinRoom() で生成されます。

# Sample

const sfuRoom = peer.joinRoom('roomName', {
  mode: 'sfu',
  stream: localStream,
});
sfuRoom.on('open', () => {});

# Members

Name Type Description
name string ルーム名です。
remoteStreams Object MediaStream.idをキーに、ルーム内のストリームを保持するオブジェクトです。
members string[] ルーム内に参加しているPeer IDの配列です。

# Methods

# close()

ルームを退出し、SFUとサーバーのコネクションを切断します。

# Return value

undefined

# getLog()

シグナリングサーバにルームのログ取得を要求します。 シグナリングサーバからログを受信すると、logイベントが発火します。

# Return value

undefined

# Sample
room.once('log', log => {
  // ...
});
room.getLog();

# replaceStream(stream)

送信しているMediaStreamを更新します。 受信のみモードでメディアチャネル接続を行なっている状態で、 新しいMediaStreamがメディアトラックを持つ場合、自動的に送受信モードに切り替わります。

# Parameters
Name Type Required Default Description
stream MediaStream 更新対象となる新しいMediaStreamです。
# Return value

undefined

# send(data)

WebSocketを使用してルーム内の全てのユーザーにデータを送信します。

注意

  • 送信可能なデータサイズの上限は20MBです。

  • 送信頻度は100msecに1回に制限されています。 送信頻度の制限を超えた送信データはキューに入り、100msec毎に順次送信されます。

# Parameters
Name Type Required Default Description
data * 送信するデータです。
# Return value

undefined

# Events

# Event: 'open'

新規にPeerがルームへ入室したときに発生します。

room.on('open', () => {
  // ...
});

# Event: 'peerJoin'

ルームに新しいPeerが参加したときに発生します。

Name Type Description
peerId string 参加したPeerのIDです。
room.on('peerJoin', peerId => {
  // ...
});

# Event: 'peerLeave'

新規にPeerがルームを退出したときに発生します。

Name Type Description
peerId string 退出したPeerのIDです。
room.on('peerLeave', peerId => {
  // ...
});

# Event: 'log'

ルームのログを受信したときに発生します。

Name Type Description
logs string[] ログ(JSON文字列)の配列です。
room.once('log', logs => {
  for (const logStr of logs) {
    const { messageType, message, timestamp } = JSON.parse(logStr);
    // ...
  }
});

# Event: 'stream'

ルームにJoinしている他のユーザのストリームを受信した時に発生します。 ストリーム送信元のPeer IDはstream.peerIdで取得できます。

Name Type Description
stream MediaStream MediaStreamのインスタンスです。
room.on('stream', stream => {
  // ...
});

# Event: 'data'

他のユーザーから送信されたデータを受信した時に発生します。

Name Type Description
data object data object形式のオブジェクトです。
# data object
Name Type Description
src string データを送信したPeerのIDです。
data * 受信したデータです。
room.on('data', ({ src, data }) => {
  // ...
});

# Event: 'close'

ルームをcloseしたときに発生します。

room.on('close', () => {
  // ...
});

# TIPS

WARNING

このページの内容はその動作を保証するものではありません。ブラウザの実装によっては動作しない・挙動が異なるなどの可能性があります。

# MediaStreamの取得

Peer#call()Peer#joinRoom()には、引数としてMediaStreamを渡せますが、SkyWayではそのMediaStreamの取得方法を規定していません。

一般的なJavaScriptのAPIでは、次の方法で取得できます。

  • navigator.mediaDevices.getUserMedia(options)
  • navigator.mediaDevices.getDisplayMedia(options)
(async function() {
  // ..

  const stream = await navigator.mediaDevices.getUserMedia({ video: true });
  const call = peer.call('remote-peerId', stream);

  // ...
}());

指定できるoptionsの詳細・挙動については、各ブラウザの実装状況に依存します。

そのほか、HTMLVideoElementHTMLAudioElement、およびHTMLCanvasElementcaptureStream()からも取得できます。

# 画面共有

端末の画面自体をMediaStreamとして取得することができます。

取得したMediaStreamを使うことで、画面共有機能が実現できます。

(async function() {
  // ..

  const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
  const call = peer.call('remote-peerId', stream);

  // ...
}());

# 使用するデバイスの選択

端末に複数のUSBカメラ・マイクが接続されている場合、それらを選択して使用できます。

(async function() {
  // ..

  const defaultVideoStream = await navigator.mediaDevices.getUserMedia({
    video: true,
  });

  // デバイスの一覧を取得
  const devices = await navigator.mediaDevices.enumerateDevices();

  // 任意のデバイスを指定
  const newVideoInputDevice = devices.find(
    device => device.kind === 'videoinput'
  );
  const newVideoStream = await navigator.mediaDevices.getUserMedia({
    video: {
      deviceId: newVideoInputDevice.deviceId,
    },
  });

  // ...
}());

navigator.mediaDevices.enumerateDevices()を使うことで、利用可能なデバイスの一覧を取得できます。 その中から任意のデバイスを参照し、そのdeviceIdgetUserMedia()に渡すことで、入力ソースを指定できます。

# MediaStreamをミュートする

一時的に動画や音声をミュートしたい場合は、MediaStreamTrackenabledプロパティを設定することで実現できます。

(async function() {
  // ..

  const stream = await navigator.mediaDevices.getUserMedia({
    video: true,
    audio: true,
  });
  const call = peer.call('remote-peerId', stream);

  // 音声のみミュート
  stream.getAudioTracks().forEach(track => track.enabled = false);

  // ...
}());

# マルチストリーム

複数のMediaStreamを送りたい場合についてです。

現状、SkyWayではSDKとしてマルチストリームの機能を提供していません。

アプリケーション側で、MediaConnectionを複数用意するなど、実現することはできます。

# sdpSemantics

Peerクラスのコンストラクタ引数として、RTCPeerConnectionのコンストラクタに渡されるRTCConfigurationを指定できます。

ChromeではsdpSemanticsというプロパティを指定できますが、SkyWayでは常にunified-planを使用します。