【Node.js】P2Pビデオチャットアプリをシグナリングサーバー環境から作ってみた

投稿日:

プログラミング初心者の勉強ブログ #124

ジーズアカデミーのLABコースでのJS学習最終課題として行う、「JavaScript選手権」で作成したP2Pビデオチャットアプリについて。JS選手権では、「Node.jsでP2Pシグナリングサーバを自サーバにデプロイする」という個人目標を作り、参考サイトを真似して作成した。期間中ほぼほぼJSではなく環境構築に手間取り時間を費やしたことなどをまとめる。ほぼ日記。

 

目次

 

プロダクト

toppage

https://gslab0707.bob-pop.com/videochat_socketio/

 

見た目は最低限の配置の整列のみ。部屋名を入力すると、同様にその部屋名を入力したユーザー間でビデオチャットが行われる。最初のアクセス時は「default room」に入室している状態であり、default roomでも通信できる。

「オーディオ接続」で端末のオーディオ(カメラとマイク)が起動し、「P2P接続」で同部屋に人がいればコネクションを確立し通話が始まる。端末によってオーディオが取得できないことがあり、まだ完成はしていないが、別IPアドレスでの僕のスマホとPCでの接続はできた。

今回のこだわりポイントはP2P接続で必要なシグナリングサーバーを自前にしたいと思ったところ。SkyWayを使えば良いと言われたらそれまでだが、良くも悪くも環境構築してみたくなってしまった点がこだわりであり、学びが生まれた点でもある。

参考サイトをみながら、NAT越えと呼ばれる対応はしたつもり(わからんけど)。多分FWでIPアドレスを遮断されなければ、P2Pコネクションを確立できるのではないかなと思っている(わからんけど)。TURNサーバーも作ろうと思っていたが、正直僕には通信関係が難しく、今回の実装に到るまで何回も心折れそうになっており、そこまで実装する前にやる気スイッチがOFFになった。開発は結局一人でやるものであり、モチベーションがボトルネックになってしまう。チーム開発であれば存在するであろう、「よしおれが解決してドヤろう」的な感情や「足を引っ張るわけにはいかない」的な感情から生まれるモチベーションスイッチがない。そもそも課題は「JSを使ってプロダクトを作る」であり、そこに強制要素もなく、煮詰まってしまったときのモチベーション維持は、自分の中の意地との闘いの中で生み出していくしかない。

通信が繋がったときの喜びは、自分の中では青函トンネルを貫通させたくらいのスケールだった。青函トンネルの人に失礼なことと、言い過ぎだということは承知の上で述べている。

選手権の結果としては完全ランク外であったが、技術力の経験値は獲得できた。またジーズ内での「どちらかというと技術よりの人」というキャラ定着に向けてポイントをいくらか稼げたと思う。(なにかと言い回しを悪くしてしまうのは僕の愛嬌だと受け止めてほしい。)それだけでも収穫はでかい。ポケモンでいったら体感2レベルくらい上がった気がする。というよりは上がっていてほしいという願望。

 

参考サイト

https://html5experts.jp/series/webrtc-beginner/

 

P2P環境構築

シグナリングサーバーの構築といっても、

さくらのVPS + Cent OS7 + Nginx + Node.js(デプロイにPM2)

でWebsocket(socket.io)を動かしただけであり、デプロイしたappとビデオチャット表示用のappはほとんどコピペで終わる。今回の実装は、コピペしたコードが何をしているのかを理解しながら、P2P通信の仕組みやwebsocket(双方向性通信)の概念、WebRTC、ICE、STUN、TURN、NATなどのアルファベットの羅列が意味する内容を学べた点に意味があるかなと。例えば、リバースプロキシという字面場で学んだ概念が実体験を帯びることで理解が深まる感覚とか。少なからず楽しさを要所要所で見出せたのが良かった。やっぱりアウトプットからの学習は安定感がある。

 

まとめ

コード自体は参考サイトのものをほとんどコピペしただけなので、自分のコードを載せていない。SSL通信でcloudflareを使っていたことが原因でポートが遮断されws通信ができなかったことを発見するのに5日くらい使ってしまった。cloudflare使っている人は注意してほしい。

今回の場合、結果としてNode.jsで動くappをデプロイしたことにはなるが、Node.jsの勉強はあまりできなかった。やっぱりexpressとかフレームワーク使って簡易ブログアプリでも作らないと身につかなそうなので実践したい。ノンブロッキングi/oとかシングルスレッドとかイベントループとか、nodeの代表的な特徴の概念に実体験をつけられたら強くなれそう。今がコールバック地獄なるものを経験できるラスト世代くらいなんじゃないかなと思っているので、今のうちに一回コールバック地獄を経験したい。そうしないとpromiseの良さを真に感じられなそう。

expressはほとんど空っぽの状態の、どちらかと言うと玄人向けのカスタムが自由なフレームワークみたいな印象であり、MVCではなくあくまで「MVCライクに開発できる」に留まるものらしい。色々とモジュール入れて機能拡張しないとrailsみたいに開発できないのかなと思うと、わざわざ裏をNode.jsで動かす意味はあるのかなと考えてもしまう。「前も後ろもJSでかける」に強い魅力を感じていたが、それにそこまでの意味があるのかと思う最近であり、少なくとも「前も後ろもJSでかける」がNode.jsの強みではないんだろうなと調べていて感じた。オールJSを目指すなら、DBもNoSQLのものにしてしまいたいよね。10年後の流行が見れたら話は早いよね。

以上ありがとうございました。

 

 

-G's ACADEMY, プログラミング学習
-, , ,

Copyright© s u p ? , 2019 All Rights Reserved.