研究会

機械学習、データベース、分散システム、その他技術的なことを書く研究会です

PeerJS でコネクションプールを実装した webrtc-connectionpool を公開しました

概要

WebRTC の定番ライブラリ PeerJS を使ってコネクションプールを実装した webrtc-connectionpool を公開しました。

tsujio/webrtc-connectionpool - GitHub

詳細

WebRTC のデータチャンネルはコネクション指向の通信インターフェースであり、コネクションを確立するためにはシグナリングサーバーによる SDP/ICE メッセージの中継が必要になります。

これでは例えば不特定多数の人とデータチャンネルでやり取りする場合に毎回コネクションを確立したりコネクションを大量に保持しすぎたりといった状況が発生し、パフォーマンスが心配になってしまいます。

そこで確立したコネクションを再利用できるように一定期間保持し、かつ保持するコネクション数を調節できるようにした webrtc-connectionpool を実装し公開しました。

特徴としては以下の通りです。

  • WebRTC ライブラリとして PeerJS を利用している
  • 一旦確立したコネクションは一定期間保持し、再利用される
  • 保持するコネクション数はパラメーターとして指定可能
  • コネクションが最大保持数を超えた場合は LRU 方式で破棄される

また、コネクションプール機能以外にもデータの送信とコネクションのクローズが重なった場合の対処など、webrtc-chord で得たノウハウが詰まったライブラリとなっております。

使い方

こんな感じで使えます。

セットアップ

// Setup
var connectionFactory = new ConnectionFactory({
  // An object to pass to the Peer constructor.
  // See the PeerJS document for details.
  peer: {
    id: 'yourid',
    options: {
      host: ...,
      ...
    }
  },

  // The capacity of the connection pool.
  connectionPoolSize: 10 
});

connectionFactory.onopen = function(myPeerId) {
  console.log("Setup ConnectionFactory: " + myPeerId);
};

connectionFactory.onconnection = function(connection) {
  console.log("Connection from " + connection.getRemotePeerId());

  connection.ondata = function(data) {
    console.log("Received data: " + data);
  };

  connection.onerror = function(error) {
    console.log("ERROR: " + error);
  };
};

connectionFactory.onerror = function(error) {
  console.log("ERROR: " + error);
};

コネクションの生成とデータの送信

// Create connection and send data
connectionFactory.create(peerIdToConnect, function(connection, error) {
  if (error) {
    console.log("Failed to create connection: " + error);
    return;
  }

  connection.ondata = function(data) {
    console.log("Received data: " + data);
  };

  connection.onerror = function(error) {
    console.log("ERROR: " + error);
  };

  connection.send(data);
});

まとめ

  • PeerJS でデータコネクションをプールするライブラリを書いた

  • 不特定多数の人とコネクションを張る時に使えます

  • WebRTC を使って大規模な P2P ネットワークを張るサービスを作ろう