فهرست منبع

Merge pull request #953 from paullouisageneau/fix-dc-close-stream

Fix DataChannel to reset stream on close if ack is not received
Paul-Louis Ageneau 1 سال پیش
والد
کامیت
22234347fa
2فایلهای تغییر یافته به همراه6 افزوده شده و 5 حذف شده
  1. 5 4
      src/impl/datachannel.cpp
  2. 1 1
      src/impl/peerconnection.cpp

+ 5 - 4
src/impl/datachannel.cpp

@@ -95,11 +95,12 @@ void DataChannel::close() {
 		transport = mSctpTransport.lock();
 	}
 
-	if (mIsOpen.exchange(false) && transport && mStream.has_value())
-		transport->closeStream(mStream.value());
+	if (!mIsClosed.exchange(true)) {
+		if (transport && mStream.has_value())
+			transport->closeStream(mStream.value());
 
-	if (!mIsClosed.exchange(true))
 		triggerClosed();
+	}
 
 	resetCallbacks();
 }
@@ -140,7 +141,7 @@ Reliability DataChannel::reliability() const {
 	return *mReliability;
 }
 
-bool DataChannel::isOpen(void) const { return mIsOpen; }
+bool DataChannel::isOpen(void) const { return !mIsClosed && mIsOpen; }
 
 bool DataChannel::isClosed(void) const { return mIsClosed; }
 

+ 1 - 1
src/impl/peerconnection.cpp

@@ -435,7 +435,7 @@ void PeerConnection::forwardMessage(message_ptr message) {
 		if (found) {
 			// The stream is already used, the receiver must close the DataChannel
 			PLOG_WARNING << "Got open message on already used stream " << stream;
-			if(channel && channel->isOpen())
+			if(channel && !channel->isClosed())
 				channel->close();
 			else
 				sctpTransport->closeStream(message->stream);