JavaScript SDK
接続完了を確認してからデータを送信する
本ドキュメントでは、SkyWay JavaScript SDK にて LocalDataStream クラスの write メソッドを利用する際に、データの消失を回避する方法を説明します。
データを消失する恐れがあるパターン
DataStream でデータを送信する際、Publisher と Subscriber の間の接続が確立されていない場合、送信データは破棄されます。
そのため、接続の確立が完了していないにも関わらず送信しようとしたデータは、Subscriber に届けられることなく消失してしまいます。
この事象は、Subscribe 直後にデータを送信する場合などに発生することがあります。
SkyWay の onSubscribed イベントの通知に対して、データ通信に利用する接続の確立が間に合わないことが起こり得るためです。
該当するコードの一例は以下のとおりです。
const context = await SkyWayContext.Create(token); const channel = await SkyWayRoom.FindOrCreate(context, { name: "sample-room" }); const me = await channel.join(); const dataStream = await SkyWayStreamFactory.createDataStream(); const publication = await me.publish(dataStream, {type: "p2p"}); publication.onSubscribed.add((subscriptionEvent) => { dataStream.write(`Hello from ${me.id} to ${subscriptionEvent.subscription.subscriber.id}`); });
上記のような事態を回避したい場合、LocalDataStream クラスの onWritable イベントを利用してください。
onWritable イベントの利用方法
onWritable イベントは、Publisher と Subscriber の間で接続が確立されたことを通知するイベントです。
onWritable イベントの発火を待機してから通信を開始することで、データの消失を回避できます。
onWritable イベントでは、どの Subscriber との間で接続が確立されたかを示す情報が、以下のような DataStreamSubscriber の構造で通知されます。
DataStreamSubscriber { id: string, name?: string, }
上述の処理を、onWritable イベントの発火を契機にデータ送信が開始されるよう変更した実装例は以下の通りです。
const context = await SkyWayContext.Create(token); const channel = await SkyWayRoom.FindOrCreate(context, { name: "sample-room" }); const me = await channel.join(); const dataStream = await SkyWayStreamFactory.createDataStream(); const publication = await me.publish(dataStream, {type: "p2p"}); publication.onSubscribed.add(() => { dataStream.onWritable.asPromise().then((subscriber) => { dataStream.write(`Hello from ${me.id} to ${subscriber.id}`); }); });
onUnwritable イベントの利用方法
onWritable イベントとは対照的に Publisher と Subscriber の間でデータ通信の接続が閉じられた場合は、onUnwritable イベントが発火します。
onUnwritable イベントも onWritable イベントと同様に、DataStreamSubscriber の構造で Subscriberの情報が通知されます。
以下は、onUnwritable イベントの利用例です。
dataStream.onUnwritable.add((subscriber) => { console.log(`disconnected connection to ${subscriber.id}`); });
onWritable イベントを利用できる SDK およびバージョン
onWritable イベントは、JavaScript SDK v2.2.0 以降で利用可能です。
他プラットフォーム向けの SDK においては現在開発中です。
ご利用のお客さまにおかれましては、ご不便をおかけしますが今しばらくお待ちください。