PeerJSを今後も使い続けるのは危険

PeerJS、WebRTCをかじった事がある人なら、殆どの人が聞いた事があると思います。PeerJSは、WebRTC技術を活用したアプリケーションを開発するためのJavaScriptライブラリとして、2012/12/23にgithub上で開発がスタートしました。

WebRTC黎明期を支えたPeerJS

HTML5 Experts.jpで2014年に、開発者の一人であるEric Zhang氏にインタビューした記事から抜粋します。

PeerJSの開発メンバはEricと氏とMichelle氏の2名で、学生時代に開発をスタートしました。

開発のきっかけは、Eric氏が当時WebRTCに着目、Webアプリケーションでネットワーク技術が活用できる面白い技術である反面、ブラウザのAPI互換の問題や、機能不足、開発者向け情報の少なさ、標準仕様のブレなど、普及に向けた課題は大きいと感じ、 開発を決心したということです。

当時、WebRTCの開発者向けライブラリでシグナリングサーバのソースコードやそれをホスティングしたクラウドサービスまで公開していました。

おまけにすべて無料でした。

──PeerJSのマネタイズはどう考えていますか?
公開しているPeerServer Cloud serviceの運用には、費用はかかります。ですが、開発者の方に素早くサービスを開発してもらうことに重点を置いているため、私達でサーバを維持できるかぎり、有償化するつもりはありません。

PeerJSとPeerServerはかなり貴重な存在で、WebRTCの黎明期を牽引したといっても過言ではありません。二人の残した凄く功績は大きいです。(現在、PeerServer Cloud serviceはサービスを終了しています)

SkyWayとPeerJS

その後、PeerJSは多くの開発者にForkされ色々なところで活用されていきました。日本では、NTT Communicationsが2013年12月、WebRTCプラットフォーム SkyWayのサービスを開始し、そのクライアントSDKとしてForkし、開発を続けてきました。

私もSkyWayの立上げから関わっていますが、まさに、PeerJSあってのSkyWayでした。余談ですが、SkyWayのシグナリングサーバは時雨堂さんにフルスクラッチで開発してもらいましたが、ほぼほぼ完全なPeerServer互換の機能を提供していました。時雨堂製シグナリングサーバは2018/3まで現役で働いていました。こちらも感謝。

さて、PeerJSに話を戻しますが、残念ながらPeerJS本家のcommitは2015年で止まってしまいました。

peer.jsリポジトリのコミットログ抜粋

これ以降もIssuesは活発にアップデートされ、つい最近もこんな叫びが…。

残念ながら、開発者の二人とは音信不通になってしまいました。就職して本業が忙しく開発が回らなくなったという話をどこかで聞いたことが有りますが、本当のところは不明です。

国内ではSkyWayが2017/9までPeerJSのアップデートを続けました。

nttcom/peerjsのライブラリ開発的な最終コミット

SkyWay版PeerJS自体に手を入れた最終コミットは2016/9ですが、その後2017/9に新しいSDKに切り替えるまでの間、Chrome/Firefox/IE/Safariでの動作保証をしていました。IE/Safariはpluginを利用する前提。

PeerJSのコードはもはやレガシーコード

WebRTCの世界は流れが早いです。APIの実装もどんどんアップデートされていきます。PeerJSは、2012年のリリース当時、ブラウザの実装に差分があったことを考慮して、ブラウザごとの差分を吸収する様々なコードが組込まれています。

peer.jsから一部コードを抜粋してみました。

ブラウザサポート状況のチェック

binaryBlob、sctp、onnegotiationneed、DataConnection Reliable option等のサポート状況をチェックし、ブラウザの差分を吸収するためのコードが含まれています。また、現在はベンダープレフィックスが取れているWebRTCのAPIについてもプレフィックスを吸収するコードがあったりします。

ベンダープレフィックスの吸収

WebRTCではadapter.jsというshimが有名で、これらの差分を吸収したければ、adapter.jsを活用するのも手ですが、adapter.jsの初期コミットは2013年9月20日であり、PeerJSの方が実は古いのです。リリース当時は存在しなかったため、当時はshim的な役割も担っていました。

これ以外にも、コードの中には、ChromeとFirefoxの差分を頑張って吸収しようとしていた涙ぐましい努力が見て取れます。

Chrome/Firefoxの差分を吸収する実装(一例) ※2018.05.25 抜粋箇所を変更

PeerJSは今の最新ブラウザで動作するのか

気になっている方も多いかもしれませんが、久々に動作確認してみました。

本家PeerJS x Chrome M66

ご覧の通り動作しません。これについては、onnegotiationneededの発火タイミングが変わったためです。このような感じでif文(558行目)を修正してあげればエラーは消えます。

とはいえ、私の環境ではこの対処をしてP2Pコネクションが確立した後、Calleeで映像が再生されない状況でした。

Firefox60ではまだ正常に動作しています。とはいえ、こちらを見れば分かるように、いくつかのAPIやプロパティがdepricatedになっています。

Firefox 60のコンソール

また、今年は、SDPと呼ばれるWebRTCのセッション情報の交換に利用されるプロトコルのフォーマットが、Plan B(旧来)からUnified Plan(新方式)に切り替わる節目の年となります。それに伴い、メディア操作系APIの実装が最新仕様に準拠される形でどんどん変わっていく予定です。

Removed APIs
The following APIs are still available to PeerConnections configured with PlanB semantics but are not available with UnifiedPlan semantics and will be removed in the future:
AddStream(): replaced by AddTrack()
RemoveStream(): replaced by RemoveTrack()
local_streams(): replaced by GetSenders()
remote_streams(): replaced by GetReceivers()
CreateSender(): replaced by AddTransceiver()
Timeline
The following is the transition plan we’d like to propose along with approximate dates at which the various changes will happen to the head of the WebRTC repository:
End of April 2018: “Unified Plan” and the new APIs stabilizes. We encourage everyone to switch to UnifiedPlan semantics and the new APIs.
July 2018: Default SdpSemantics changes to UnifiedPlan. APIs listed under “Removed APIs” (except CreateSender) are removed at the same time.
No earlier than end of year 2018: PlanB semantics removed and UnifiedPlan becomes the only option.

AddStream()やそれに関係するイベントはPeerJS内でも利用されているため、早くて2018年7月には何らかの影響が出てくるだろうと予想されます。

PeerJSを使い続けるならばブラウザに追従する覚悟が必要

最近、PeerJSを使い続けることに対する不安の投稿とつぶやきを見かけました。(この記事を書いたモチベーションでもあります)

日本語で書かれたPeerJSの技術記事はそれなりに数があるため、検索でたどり着き、とりあえず動かそうとしている方や、PeerJSで過去システムを構築し、ずっと運用されている方がまだかなりいらっしゃるのではと推測しています。

この記事で一番伝えたいことは、「PeerJSはもう死んでいます」ということです。前述したようにブラウザのアップデートには全く追従できていないため、近い将来全く使えなくなります。検索で偶然見つけた一見さんであれば、「動かないや」ですみますが、PeerJSでシステムを構築されている方は、早め早めに移行されることをおすすめします。

2018.05.25 補足

リポジトリには最新のブラウザへの追従のヒントとなるPullRequestが結構出されています。

PeerJSへのPR(抜粋)

しかしながら、これらを管理しマージするメンテナーが不在のため、PeerJSの未来はないなと考えており、「PeerJSはもう死んでいます」と表現しました。

最後に少し宣伝

SkyWayは2017年9月のアップデート以降、PeerJSの利用をやめ、フルスクラッチで開発したJS SDKの提供を開始しました。

こちらは、既存のアプリケーションに配慮し、PeerJS互換のAPIを提供しています。しかし、内部はPeerJSとは全く異なり、ゼロから書き直され、最新のブラウザに追従しています。ChromeやFirefoxは約6週間のサイクルでアップデートされるため、その都度、最新バージョンとその1つ前のバージョンで動作を保証しています。

SkyWayは無償で利用を始める(個人ユースなら無料でも十分事足りる)ことが出来るため、PeerJSの乗り換え先を検討されている方、ちょっと触ってみたい方、よろしければご利用ください。

Like what you read? Give Yusuke Naka a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.