Skip to content

Commit

Permalink
Adding parameters to websocket error and close callbacks (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
lmaskati authored May 15, 2023
1 parent 6e4e2d0 commit f4bae60
Show file tree
Hide file tree
Showing 9 changed files with 64 additions and 39 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ if(ANDROID AND NOT TARGET AndroidExtensions)
FetchContent_Declare(
AndroidExtensions
GIT_REPOSITORY https://github.com/BabylonJS/AndroidExtensions.git
GIT_TAG 82f22e834c4fb1eb2d08d560dcbdaac735e7ec30)
GIT_TAG c7c8b44a9d021ee5e1159c4fec98d2ef0735401a)

message(STATUS "Fetching AndroidExtensions")
FetchContent_MakeAvailable(AndroidExtensions)
Expand Down
2 changes: 1 addition & 1 deletion Include/UrlLib/UrlLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ namespace UrlLib
class WebSocket final
{
public:
WebSocket(std::string url, std::function<void()> onOpen, std::function<void()> onClose, std::function<void(std::string)> onMessage, std::function<void()> onError);
WebSocket(const std::string& url, std::function<void()> onOpen, std::function<void(int, const std::string&)> onClose, std::function<void(const std::string&)> onMessage, std::function<void(const std::string&)> onError);
~WebSocket();

// Copy semantics
Expand Down
2 changes: 1 addition & 1 deletion Source/WebSocket_Android.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace UrlLib
class WebSocket::Impl : public ImplBase
{
public:
Impl(std::string url, std::function<void()> onopen, std::function<void()> onclose, std::function<void(std::string)> onmessage, std::function<void()> onerror)
Impl(const std::string& url, std::function<void()> onopen, std::function<void(int, const std::string&)> onclose, std::function<void(const std::string&)> onmessage, std::function<void(const std::string&)> onerror)
: ImplBase{url, onopen, onclose, onmessage, onerror}
, m_webSocket{url, onopen, onclose, onmessage, onerror}
{
Expand Down
12 changes: 7 additions & 5 deletions Source/WebSocket_Apple.mm
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,27 @@
class API_AVAILABLE(ios(13.0)) WebSocket::Impl : public ImplBase
{
public:
Impl(std::string url, std::function<void()> onOpen, std::function<void()> onClose, std::function<void(std::string)> onMessage, std::function<void()> onError)
Impl(const std::string& url, std::function<void()> onOpen, std::function<void(int, const std::string&)> onClose, std::function<void(const std::string&)> onMessage, std::function<void(const std::string&)> onError)
: ImplBase{url, onOpen, onClose, onMessage, onError}
{
void (^openCallback)() = [this]()
{
m_onOpen();
};
void (^closeCallback)() = [this]()
void (^closeCallback)(int code, NSString* reason) = [this](int code, NSString* reason)
{
m_onClose();
std::string cppString( [reason UTF8String] );
m_onClose(code, cppString);
};
void (^messageCallback)(NSString* messageStr) = [this](NSString* messageStr)
{
std::string cppString( [messageStr UTF8String] );
m_onMessage(cppString);
};
void (^errorCallback)() = [this]()
void (^errorCallback)(NSString* errorStr) = [this](NSString* errorStr)
{
m_onError();
std::string cppString( [errorStr UTF8String] );
m_onError(cppString);
};

webSocket = [[WebSocket_ObjC alloc] initWithCallbacks:@(url.data()) onOpen:openCallback onClose:closeCallback onMessage:messageCallback onError:errorCallback];
Expand Down
2 changes: 1 addition & 1 deletion Source/WebSocket_Apple_ObjC.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

API_AVAILABLE(ios(13.0))
@interface WebSocket_ObjC : NSObject
- (instancetype)initWithCallbacks:(NSString *)url onOpen:(void (^)(void))onOpen onClose:(void (^)(void))onClose onMessage:(void (^)(NSString *))onMessage onError:(void (^)(void))onError;
- (instancetype)initWithCallbacks:(NSString *)url onOpen:(void (^)(void))onOpen onClose:(void (^)(int, NSString *))onClose onMessage:(void (^)(NSString *))onMessage onError:(void (^)(NSString *))onError;
- (void)open API_AVAILABLE(ios(13.0));
- (void)close API_AVAILABLE(ios(13.0));
- (void)sendMessage:(NSString *)message API_AVAILABLE(ios(13.0));
Expand Down
30 changes: 18 additions & 12 deletions Source/WebSocket_Apple_ObjC.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ @interface WebSocket_ObjC() <NSURLSessionWebSocketDelegate>
NSString *websocketUrl;
// store callbacks here
void (^openCallback)();
void (^closeCallback)();
void (^closeCallback)(int, NSString *);
void (^messageCallback)(NSString *);
void (^errorCallback)();
void (^errorCallback)(NSString *);
}
@end

@implementation WebSocket_ObjC

- (instancetype)initWithCallbacks:(NSString *)url onOpen:(void (^)(void))onOpen onClose:(void (^)(void))onClose onMessage:(void (^)(NSString *))onMessage onError:(void (^)(void))onError
- (instancetype)initWithCallbacks:(NSString *)url onOpen:(void (^)(void))onOpen onClose:(void (^)(int, NSString *))onClose onMessage:(void (^)(NSString *))onMessage onError:(void (^)(NSString *))onError
{
self = [super init];
websocketUrl = url;
Expand All @@ -37,7 +37,8 @@ -(void) open
- (void) close
{
[webSocketTask cancel];
[self invalidateAndCancel];
NSString *closeStr = [NSString stringWithUTF8String:"Normal close."];
[self invalidateAndCancelWithCloseCode:1000 reason:closeStr];
}

- (void) sendMessage:(NSString *)message
Expand All @@ -46,8 +47,9 @@ - (void) sendMessage:(NSString *)message
{
if (error)
{
errorCallback();
}
NSString *errorMessage = [error localizedDescription];
errorCallback(errorMessage);
}
}];
}

Expand All @@ -57,7 +59,8 @@ - (void)receiveMessage
{
if (error)
{
errorCallback();
NSString *errorMessage = [error localizedDescription];
errorCallback(errorMessage);
}
else if (message.type == NSURLSessionWebSocketMessageTypeString)
{
Expand All @@ -78,25 +81,28 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didComp
{
if (error)
{
errorCallback();
NSString *errorMessage = [error localizedDescription];
errorCallback(errorMessage);
}
}

- (void)URLSession:(NSURLSession *)session webSocketTask:(NSURLSessionWebSocketTask *)webSocketTask didCloseWithCloseCode:(NSInteger)code reason:(NSData *)reason API_AVAILABLE(ios(13.0))
{
NSString *reasonStr = [[NSString alloc] initWithData:reason encoding:NSUTF8StringEncoding];
if (code != 1000)
{
errorCallback();
errorCallback(reasonStr);
}
[self invalidateAndCancel];

[self invalidateAndCancelWithCloseCode:(int)code reason:reasonStr];
}

- (void)invalidateAndCancel
- (void)invalidateAndCancelWithCloseCode:(int)code reason:(NSString *) reason
{
webSocketTask = nil;
[session invalidateAndCancel];
session = nil;
closeCallback();
closeCallback(code, reason);
}

@end
12 changes: 6 additions & 6 deletions Source/WebSocket_Base.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@ namespace UrlLib
class WebSocket::ImplBase
{
public:
ImplBase(std::string url, std::function<void()> onOpen, std::function<void()> onClose, std::function<void(std::string)> onMessage, std::function<void()> onError)
ImplBase(const std::string& url, std::function<void()> onOpen, std::function<void(int, const std::string&)> onClose, std::function<void(const std::string&)> onMessage, std::function<void(const std::string&)> onError)
: m_url(url)
{
m_url = url;
m_onOpen = onOpen;
m_onClose = onClose;
m_onMessage = onMessage;
m_onError = onError;
}

protected:
std::string m_url;
const std::string m_url;
std::function<void()> m_onOpen;
std::function<void()> m_onClose;
std::function<void(std::string)> m_onMessage;
std::function<void()> m_onError;
std::function<void(int, const std::string&)> m_onClose;
std::function<void(const std::string&)> m_onMessage;
std::function<void(const std::string&)> m_onError;
};
}
2 changes: 1 addition & 1 deletion Source/WebSocket_Shared.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace UrlLib
{
WebSocket::WebSocket(std::string url, std::function<void()> onOpen, std::function<void()> onClose, std::function<void(std::string)> onMessage, std::function<void()> onError)
WebSocket::WebSocket(const std::string& url, std::function<void()> onOpen, std::function<void(int, const std::string&)> onClose, std::function<void(const std::string&)> onMessage, std::function<void(const std::string&)> onError)
: m_impl{std::make_unique<WebSocket::Impl>(url, onOpen, onClose, onMessage, onError)}
{
}
Expand Down
39 changes: 28 additions & 11 deletions Source/WebSocket_Windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace UrlLib
class WebSocket::Impl : public ImplBase
{
public:
Impl(std::string url, std::function<void()> onOpen, std::function<void()> onClose, std::function<void(std::string)> onMessage, std::function<void()> onError)
Impl(const std::string& url, std::function<void()> onOpen, std::function<void(int, const std::string&)> onClose, std::function<void(const std::string&)> onMessage, std::function<void(const std::string&)> onError)
: ImplBase{url, onOpen, onClose, onMessage, onError}
{
}
Expand All @@ -40,13 +40,21 @@ namespace UrlLib
{
if (result.has_error())
{
m_onError();
try
{
std::rethrow_exception(result.error());
}
catch (const std::exception& ex)
{
m_onError(ex.what());
}
}
});
}
catch (winrt::hresult_error const&)
catch (winrt::hresult_error const& ex)
{
m_onError();
std::string errorMessage = winrt::to_string(ex.message());
m_onError(errorMessage);
}
}

Expand All @@ -69,13 +77,21 @@ namespace UrlLib
{
if (result.has_error())
{
m_onError();
try
{
std::rethrow_exception(result.error());
}
catch (const std::exception& ex)
{
m_onError(ex.what());
}
}
});
}
catch (hresult_error const&)
catch (hresult_error const& ex)
{
m_onError();
std::string errorMessage = winrt::to_string(ex.message());
m_onError(errorMessage);
}
}

Expand All @@ -89,9 +105,9 @@ namespace UrlLib
{
if (args.Code() != 1000)
{
m_onError();
m_onError(winrt::to_string(args.Reason()));
}
m_onClose();
m_onClose(args.Code(), winrt::to_string(args.Reason()));
}

void OnMessageReceived(Windows::Networking::Sockets::MessageWebSocket const& /* sender */, Windows::Networking::Sockets::MessageWebSocketMessageReceivedEventArgs const& args)
Expand All @@ -104,9 +120,10 @@ namespace UrlLib

m_onMessage(message);
}
catch (winrt::hresult_error const& )
catch (winrt::hresult_error const& ex)
{
m_onError();
std::string errorMessage = winrt::to_string(ex.message());
m_onError(errorMessage);
}
}

Expand Down

0 comments on commit f4bae60

Please sign in to comment.