|
@@ -18,30 +18,34 @@
|
|
|
|
|
|
#include "channel.hpp"
|
|
|
|
|
|
+namespace {}
|
|
|
+
|
|
|
namespace rtc {
|
|
|
|
|
|
void Channel::onOpen(std::function<void()> callback) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
+ std::lock_guard<std::mutex> lock(mCallbackMutex);
|
|
|
mOpenCallback = callback;
|
|
|
}
|
|
|
|
|
|
void Channel::onClosed(std::function<void()> callback) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
+ std::lock_guard<std::mutex> lock(mCallbackMutex);
|
|
|
mClosedCallback = callback;
|
|
|
}
|
|
|
|
|
|
void Channel::onError(std::function<void(const string &error)> callback) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
+ std::lock_guard<std::mutex> lock(mCallbackMutex);
|
|
|
mErrorCallback = callback;
|
|
|
}
|
|
|
|
|
|
void Channel::onMessage(std::function<void(const std::variant<binary, string> &data)> callback) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
+ std::lock_guard<std::mutex> lock(mCallbackMutex);
|
|
|
mMessageCallback = callback;
|
|
|
|
|
|
// Pass pending messages
|
|
|
while (auto message = receive()) {
|
|
|
- mMessageCallback(*message);
|
|
|
+ // The callback might be changed from itself
|
|
|
+ if (auto callback = getCallback(mMessageCallback))
|
|
|
+ callback(*message);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -53,41 +57,49 @@ void Channel::onMessage(std::function<void(const binary &data)> binaryCallback,
|
|
|
}
|
|
|
|
|
|
void Channel::onAvailable(std::function<void()> callback) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
+ std::lock_guard<std::mutex> lock(mCallbackMutex);
|
|
|
mAvailableCallback = callback;
|
|
|
}
|
|
|
|
|
|
-void Channel::triggerOpen(void) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
- if (mOpenCallback)
|
|
|
- mOpenCallback();
|
|
|
+void Channel::onSent(std::function<void()> callback) {
|
|
|
+ std::lock_guard<std::mutex> lock(mCallbackMutex);
|
|
|
+ mSentCallback = callback;
|
|
|
+}
|
|
|
+
|
|
|
+void Channel::triggerOpen() {
|
|
|
+ if (auto callback = getCallback(mOpenCallback))
|
|
|
+ callback();
|
|
|
}
|
|
|
|
|
|
-void Channel::triggerClosed(void) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
- if (mClosedCallback)
|
|
|
- mClosedCallback();
|
|
|
+void Channel::triggerClosed() {
|
|
|
+ if (auto callback = getCallback(mClosedCallback))
|
|
|
+ callback();
|
|
|
}
|
|
|
|
|
|
void Channel::triggerError(const string &error) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
- if (mErrorCallback)
|
|
|
- mErrorCallback(error);
|
|
|
+ if (auto callback = getCallback(mErrorCallback))
|
|
|
+ callback(error);
|
|
|
}
|
|
|
|
|
|
void Channel::triggerAvailable(size_t available) {
|
|
|
- std::lock_guard<std::recursive_mutex> lock(mCallbackMutex);
|
|
|
- if (mAvailableCallback && available == 1) {
|
|
|
- mAvailableCallback();
|
|
|
+ if (available == 1) {
|
|
|
+ if (auto callback = getCallback(mAvailableCallback))
|
|
|
+ callback();
|
|
|
}
|
|
|
- // The callback might be changed from itself
|
|
|
- while (mMessageCallback && available--) {
|
|
|
+ while (available--) {
|
|
|
auto message = receive();
|
|
|
if (!message)
|
|
|
break;
|
|
|
- mMessageCallback(*message);
|
|
|
+ // The callback might be changed from itself
|
|
|
+ if (auto callback = getCallback(mMessageCallback))
|
|
|
+ callback(*message);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void Channel::triggerSent() {
|
|
|
+ if (auto callback = getCallback(mSentCallback))
|
|
|
+ callback();
|
|
|
+}
|
|
|
+
|
|
|
} // namespace rtc
|
|
|
|