2025年7月21日月曜日

janusのapiはwebsocket接続でもsession維持にkeepAliveが必要


背景

WebRTCの中継サーバーjanusのapiを利用してwebreact-nativeでstream動画を受信する方法を以前把握しました。

上記の記事でstream動画を受信できたものの1分足らずで通信が途切れてしまう症状に悩まされていましたが、janus.jsのコードを調べたところkeepAliveリクエストを送ってsessionの維持が必要と分かりました。
備忘録を兼ねてコードと関連情報を記事に残します。

使ったもの

janusのapiを使うjavascript(やtypescript)のプロジェクト

下記の記事のコードに今回の内容を適用しました。
janusのstream動画をapiとRTCPeerConnectionで受信
react-nativeでjanusのstream動画を受信する

sessionIdとtransactionを付けてkeepAliveを送信


setIntervalで一定時間ごとにkeepAliveを呼べば、sessionが維持されます。
janusの標準のsessionのtimeout時間は60秒なので、下記のコードは40秒ごとにkeepAliveを送っています。
const intervalKeepalive = setInterval(() => {
  const dataToSend = JSON.stringify({
    janus: "keepAlive",
    transaction: transactionId,
    session_id: sessionId,
  })
  socket.send(dataToSend)
}, 40000)

janusの説明書としてはrest apiの説明のWebSocketに関する項目の最後の方に記されています。

RESTful, WebSockets, RabbitMQ, MQTT, Nanomsg and UnixSockets API

websocket接続したらそれの切断まではsessionを維持して欲しいところですが、説明書きによると内部でhttpのrequestと同じ処理を利用しているためkeepAliveの送信がwebsocketの場合も必要らしいです。

janus.jsではkeepAlive関数が定義され、それがtimeoutで一定時間後に呼び出される処理になっていました。

おわり

websocketでjanusから情報取得する場合もkeepAliveの定期的送信でsessionの維持が必要と分かりました。
stream動画の受信が1分で終わってしまう不具合の原因が分かって良かったです。

参考

janus.jsのkeepAliveに関する記述箇所です。
keepAlive関数の定義
keepAliveのtimeout設定

janusのRESTやWebSocketに関する説明書です。
RESTful, WebSockets, RabbitMQ, MQTT, Nanomsg and UnixSockets API

0 件のコメント :