概要
requestData(ArtworkData, layer) が Request パケットを送信後、応答が File (MessageType=204) パケットで返ってくるが、pending request のマッチングが機能せず Promise が永久にハングする。
再現手順
- TCNASDP認証を有効にして接続
await client.requestData(TCNetDataPacketType.ArtworkData, layer) を実行
- Promise が resolve/reject されず永久にハングする
原因
requestData は pending request を dataType-layer キーで登録し、受信パケットとマッチングする。しかし Artwork の応答は File (MessageType=204) パケットで返ってくるため、Data (MessageType=200) パケットを期待するマッチングロジックに合致しない。
応答データは data イベントとして発火するが、pending request は消費されないまま残り、requestTimeout も発火しない。
期待動作
File (204) パケットの応答も pending request とマッチングし、Promise が正しく resolve される。または requestTimeout が確実に発火して reject される。
ワークアラウンド
tcnet-viewer 側では requestData を fire-and-forget にし、data イベントハンドラで Artwork データを処理している。
概要
requestData(ArtworkData, layer)が Request パケットを送信後、応答が File (MessageType=204) パケットで返ってくるが、pending request のマッチングが機能せず Promise が永久にハングする。再現手順
await client.requestData(TCNetDataPacketType.ArtworkData, layer)を実行原因
requestDataは pending request をdataType-layerキーで登録し、受信パケットとマッチングする。しかし Artwork の応答は File (MessageType=204) パケットで返ってくるため、Data (MessageType=200) パケットを期待するマッチングロジックに合致しない。応答データは
dataイベントとして発火するが、pending request は消費されないまま残り、requestTimeoutも発火しない。期待動作
File (204) パケットの応答も pending request とマッチングし、Promise が正しく resolve される。または
requestTimeoutが確実に発火して reject される。ワークアラウンド
tcnet-viewer 側では
requestDataを fire-and-forget にし、dataイベントハンドラで Artwork データを処理している。