@@ -146,6 +146,9 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate {
146146
147147 private var connectedAtLeastOnce : Bool = false
148148
149+ /// DataChannel シグナリングで type: close メッセージを受信したときにメッセージ内容を保存するための変数
150+ private var dataChannelSignalingClose : ( code: Int , reason: String ) ?
151+
149152 // type: redirect のために SDP を保存しておく
150153 // 値が設定されている場合2回目の type: connect メッセージ送信とみなし、 redirect 中であると判断する
151154 private var sdp : String ?
@@ -982,14 +985,17 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate {
982985
983986 func handleSignalingOverDataChannel( _ signaling: Signaling ) {
984987 Logger . debug (
985- type: . mediaStream ,
988+ type: . peerChannel ,
986989 message: " handle signaling over DataChannel => \( signaling. typeName ( ) ) " )
987990 switch signaling {
988991 case . reOffer( let reOffer) :
989992 createAndSendReAnswerOverDataChannel ( forReOffer: reOffer. sdp)
990993 case . push, . notify:
991994 // 処理は不要
992995 break
996+ case . close( let close) :
997+ // dataChannelSignalingClose に格納した値は basicDisconnect で利用される
998+ dataChannelSignalingClose = ( code: close. code, reason: close. reason)
993999 default :
9941000 Logger . error (
9951001 type: . peerChannel, message: " unexpected signaling type => \( signaling. typeName ( ) ) " )
@@ -1044,6 +1050,19 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate {
10441050
10451051 nativeChannel? . close ( )
10461052
1053+ var error = error
1054+ // DataChannel が正常にクローズされ (reason == .dataChannelClosed)、
1055+ // かつ事前に Sora から "close" メッセージを受信していた場合 (dataChannelSignalingClose != nil)、
1056+ // error を SoraError.dataChannelClosed にする
1057+ if let dataChannelSignalingClose = dataChannelSignalingClose,
1058+ case . dataChannelClosed = reason
1059+ {
1060+ error = SoraError . dataChannelClosed (
1061+ statusCode: dataChannelSignalingClose. code, reason: dataChannelSignalingClose. reason
1062+ )
1063+ }
1064+
1065+ // TODO(zztkm): signalingChannel.ignoreDisconnectWebSocket が true の場合はこの処理は不要かもしれない
10471066 signalingChannel. disconnect ( error: error, reason: reason)
10481067
10491068 Logger . debug ( type: . peerChannel, message: " call onDisconnect " )
@@ -1055,6 +1074,9 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate {
10551074 onConnect = nil
10561075 }
10571076
1077+ // disconnect したあとは基本的に PeerChannel を使い回さないはずだが、一応 nil にしておく
1078+ dataChannelSignalingClose = nil
1079+
10581080 Logger . debug ( type: . peerChannel, message: " did disconnect " )
10591081 }
10601082
0 commit comments