---
lang: ja
path: cookbook/javascript-sdk/writable-event
labels: クックブック/JavaScript SDK/接続完了を確認してからデータを送信する
metaTitle: 接続完了を確認してからデータを送信する | JavaScript SDK｜ クックブック ｜ SkyWay（スカイウェイ）
---

# 接続完了を確認してからデータを送信する

本ドキュメントでは、SkyWay JavaScript SDK にて `LocalDataStream` クラスの `write` メソッドを利用する際に、データの消失を回避する方法を説明します。

## データを消失する恐れがあるパターン
`DataStream` でデータを送信する際、Publisher と Subscriber の間の接続が確立されていない場合、送信データは破棄されます。
そのため、接続の確立が完了していないにも関わらず送信しようとしたデータは、Subscriber に届けられることなく消失してしまいます。

この事象は、Subscribe 直後にデータを送信する場合などに発生することがあります。
SkyWay の `onSubscribed` イベントの通知に対して、データ通信に利用する接続の確立が間に合わないことが起こり得るためです。
該当するコードの一例は以下のとおりです。
```typescript
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` の構造で通知されます。
```typescript
DataStreamSubscriber {
    id: string,
    name?: string,
}
```

上述の処理を、`onWritable` イベントの発火を契機にデータ送信が開始されるよう変更した実装例は以下の通りです。
```typescript
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();
dataStream.onWritable.add((subscriber) => {
  dataStream.write(`Hello from ${me.id} to ${subscriber.id}`);
});

const publication = await me.publish(dataStream, {type: "p2p"});
```

## onUnwritable イベントの利用方法
`onWritable` イベントとは対照的に Publisher と Subscriber の間でデータ通信の接続が閉じられた場合は、`onUnwritable` イベントが発火します。
一度 `onUnwritable` イベントが発火した LocalDataStream における、当該 Subscriber との間のコネクションについては、以降 `onWritable` イベントが発火することはありません。

`onUnwritable` イベントも `onWritable` イベントと同様に、`DataStreamSubscriber` の構造で Subscriberの情報が通知されます。

以下は、`onUnwritable` イベントの利用例です。
```typescript
dataStream.onUnwritable.add((subscriber) => {
  console.log(`closed connection to ${subscriber.id}`);
});
```

## onWritable イベントを利用できる SDK およびバージョン
`onWritable` イベントは、JavaScript SDK v2.2.0 以降で利用可能です。
他プラットフォーム向けの SDK においては現在開発中です。
ご利用のお客さまにおかれましては、ご不便をおかけしますが今しばらくお待ちください。