console.lealog();

@leader22のWeb系に関する勉強めもブログですのだ

2019年の振り返り

そして転職して1年経っての振り返り。

最近の仕事について

SkyWayという主にWebRTCを扱うプラットフォームの開発(と運用を少々)をやってます。

  • 既存コード(JS/Node.js)のメンテ
  • プラットフォームとしての新機能の開発
  • 未来のプロトコルの味見
  • RFC/ドラフト読み
  • OSS活動
  • etc...

ことあるごとに「これが大企業・・(白目」ってなってますが、引き続きリモートワーク主体でまぁのんびりやってます。

そういう職場なので、この1年やってたのは基本的にはWebRTCに関連することでした。

SkyWay(WebRTCプラットフォーム)のメンテ

最近こそ勧告したい気持ちがあふれてるWebRTCですが、年初はまだ割と大きな変化の中にあって、API的な変更が多かった気がする。
なのでそれをJS-SDKシグナリングサーバーに反映することをやってました。

  • SDPのunified-plan移行
    • それでもなおPlan-Bがまだ現役な世の中らしいですが
  • StreamベースからTrackベースへの移行(Transceiver)
    • それでも(ry
  • SafariでVP8が使えるようになったり
  • `end-of-candidates`の問題(による`connectionState`)の対応
  • mDNSによるhost候補の隠蔽による余波の対応
  • `getDisplayMedia()`のサポート
  • 昔からある単純なバグ修正

ちょっと思い出してもこんな対応をしてました。

ちなみに他人が書いたコードを読むのには耐性があるほうだと思ってましたが、やっぱりキツいものはキツい。
なんとかしたいよな〜とは思ってはいる・・けど・・けど・・。

OSS活動

仕事でWebRTCのSDKをメンテする傍ら、自作のライブラリを書いたりもしてました。

自分で書いておいてあれですが、こっちはなかなか良いデキです。

あとはカッティングエッジなWebRTC SFUである`mediasoup`へのコントリビュートを少ししたり。

今になって思えば、仕事でやってるSkyWayもOSSなので、仕事でOSS活動してると言えなくもないのでは・・・?

SkyWay Conference

SkyWay Conference

これも作りましたシリーズで、SkyWayのSDKを使った会議Webアプリです。

  • TypeScript
  • React(w/ hooks)
  • MobX

という手慣れた組み合わせで、いわゆるWebRTCで会議アプリを作りたいならこんな感じっしょ?っていうやつ。

PCだけでなくモバイルでも動くようになってて、弊チームでも毎日使ってるし、それなりに使えるものを作ったなあと我ながら思っておる。
もちろんデモアプリなので、動作保証はしませんが・・。

フロントエンドっぽいこともやってる!!

WebRTCの仕様を読んで実装する

総合格闘技って言われるWebRTCですが、その真髄を味わうには自分で実装してみるのが一番!ってことで。
RFCやドラフトを読みながら実装してみるチャレンジもやってました。

GitHub - leader22/webrtc-rfcs: WebRTC related RFCs that I have read through.

このリポジトリは、WebRTCに関連するドラフトをマークダウンにしていつでもどこでも読めるようにしつつ、サマリを日本語でまとめたもの。

割とたくさん読んだ・・と思ったけど、WebRTCスタックをすべて実装するにはまだまだ足りて無い。
このリポジトリでいうと上モノのRTPとかコーデックまわりが足りないです。

ただ実際に実装をしないのであれば(SDKをメンテするだけとか、ブラウザのAPIを叩くだけなのであれば)、こんな読み方はしなくていいかなと思います。

で、スタックの下層から仕様読んで実装してをやってたけど、

  • STUN
  • ICE-Lite

と、いわゆるこれから!って段階で実装は頓挫した。

Node.jsでDTLSを使うのが面倒で面倒で・・・。
標準APIに`dtls`はないので、実装するかFFI的な方法でOpenSSLなりを使う必要があって、どうしようかと悶々としてる間に他の仕事タスクが忙しくなってやめてしまった。

ただ経験値としては確かに得るものがあって、パケットやらバイト列を扱う低レイヤーな処理の大変さを知った。
`nodertc`とか、`mediasoup`のC++コードを読んだりしてるうちに、いろいろ満足してしまったのもある。

続・仕様を読む

きたるWebTransportについても同じくドラフトを読んだ。

GitHub - leader22/webtransport-rfcs

おなじようにリポジトリにしてみたけど、WebTransportの実態はQUICなので、この先どうしたものか・・ってなってる。

WebTransportを知るにはQUICとHTTP/3が必要で、それを知るにはTLS1.3が必要で、という感じなので重いな〜という。

WebAudio/WebAssembly

WebRTCがかゆいところに手が届くものではないので、真にやりたい放題やるためにはもっとローなAPIが必要になる。

今そういうことをやるには?きたるべきWebTrasnport時代のためには?ということで、最近あれこれ調べてるのがWebAudioとWebAssembly。

WebAudioは過去に何回も触ってるので、軽く記憶を呼び起こしつつ、おざなりになってた音声信号処理の基礎を固めたりしてました。

WebAssemblyはまったく素人なので、先人の偉業を読んだり、Rustから入ってどうにか使えないかあれこれ試したりしたりしてます。
ただ深みにハマればハマるほど、結局「C/C++とかそのへんをやったことがない」不利が響いてきてて最近つらいです。

まあ少しずつ鍛えるしかないので、日々の筋トレを欠かさないようにしてる今日このごろ。

いまのところの成果としては、OPUSをWorker + WebAudioで送るなんちゃってWebRTCを実装してみたくらい。

転職しての振り返り

転職して1年、最大の転職理由であった要因たちについてどうか。

  • 好奇心を満たせているのか
  • この会社でしかできないことをやっているか

この2つ。

好奇心は満たせているのか

WebRTCをよく知らない頃は、とにかくインプットが必要で、それこそ知らないことばかりで充実してたと思う。

ただこの1年でRFCやら実装やらを読みまくった結果、だいたいわかるようになった。

ブラウザに生えてるAPIはすべて把握してるし、モバイルなどブラウザ差異を踏まえてフロントエンドのコードをどう書けばいいか、SDK作るならこういうAPI・設計がベターみたいなところも自信もっていえるレベルになったと思う。

ただWebRTC自身の仕様策定・実装も進んで、ユースケースも洗練されてきたのと、フロントエンドでやれることを踏まえると、WebRTCそれ自体についての好奇心は、正直なところ下げトレンドである・・。

仕事でそこまでその知識を必要とされるかといわれると微妙(コレは少し不本意ではあるが)なのも一因。

もうひとつの要因としては、界隈の狭さ。
WebRTC界隈は、Theフロントエンドに比べると、本っっっ当に狭いので、自分の狭い観測範囲になると余計に仲間がいない。

仲間がいないってことは、コードの良し悪しやAPIデザインについてあーだこーだ言える人がいないということ。

  • SDPでネゴったらその時点で負けですよね〜とか
  • Firefoxに`setConfiguration()`が実装されるのいつなん?ないとつらくない?とか
  • `end-of-candidates`の扱いどうしてます?
  • `getStats()`ェ・・・

みたいなトークがしたいのに、できない。張り合いがない・・。

なので、また少しピボットして、次の興味をまた探すところから、2020をはじめようかなと思っているところ。

この会社でしかできないこと

特にやれてなくて、少し思惑が外れたなーと思っているところ。
まぁ環境に期待するのではなく、自分がその環境を利用するという観点からは、まだまだやれることはあるはず。

2020年は

  • WebRTCはそこそこに
    • 特に大きな変更はもうないと思うし
  • WebTransport/QUIC系は追う
    • 実装レベルはさておき、ユーザーランドは確実に追う
  • Rust/WASMは興味があるので何かしらやっていきたい
    • ただ何ができそうかはまだ手探り
  • OSS活動はしたい
  • ネタがあれば登壇もしたい

おもしろそうな話があったら教えてください。