mirror of
https://github.com/defold/extension-websocket.git
synced 2025-09-30 09:12:18 +02:00
Websocket now supports html5 as well
This commit is contained in:
@@ -1,8 +1,81 @@
|
||||
#include "websocket.h"
|
||||
|
||||
#if defined(HAVE_WSLAY)
|
||||
|
||||
namespace dmWebsocket
|
||||
{
|
||||
|
||||
const struct wslay_event_callbacks g_WslCallbacks = {
|
||||
WSL_RecvCallback,
|
||||
WSL_SendCallback,
|
||||
WSL_GenmaskCallback,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
WSL_OnMsgRecvCallback
|
||||
};
|
||||
|
||||
#define WSLAY_CASE(_X) case _X: return #_X;
|
||||
|
||||
const char* WSL_ResultToString(int err)
|
||||
{
|
||||
switch(err) {
|
||||
WSLAY_CASE(WSLAY_ERR_WANT_READ);
|
||||
WSLAY_CASE(WSLAY_ERR_WANT_WRITE);
|
||||
WSLAY_CASE(WSLAY_ERR_PROTO);
|
||||
WSLAY_CASE(WSLAY_ERR_INVALID_ARGUMENT);
|
||||
WSLAY_CASE(WSLAY_ERR_INVALID_CALLBACK);
|
||||
WSLAY_CASE(WSLAY_ERR_NO_MORE_MSG);
|
||||
WSLAY_CASE(WSLAY_ERR_CALLBACK_FAILURE);
|
||||
WSLAY_CASE(WSLAY_ERR_WOULDBLOCK);
|
||||
WSLAY_CASE(WSLAY_ERR_NOMEM);
|
||||
default: return "Unknown error";
|
||||
};
|
||||
}
|
||||
|
||||
#undef WSLAY_CASE
|
||||
|
||||
|
||||
int WSL_Init(wslay_event_context_ptr* ctx, ssize_t buffer_size, void* userctx)
|
||||
{
|
||||
// Currently only supports client implementation
|
||||
int ret = -1;
|
||||
ret = wslay_event_context_client_init(ctx, &g_WslCallbacks, userctx);
|
||||
if (ret == 0)
|
||||
wslay_event_config_set_max_recv_msg_length(*ctx, buffer_size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void WSL_Exit(wslay_event_context_ptr ctx)
|
||||
{
|
||||
wslay_event_context_free(ctx);
|
||||
}
|
||||
|
||||
int WSL_Close(wslay_event_context_ptr ctx)
|
||||
{
|
||||
const char* reason = "Client wants to close";
|
||||
wslay_event_queue_close(ctx, 0, (const uint8_t*)reason, strlen(reason));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WSL_Poll(wslay_event_context_ptr ctx)
|
||||
{
|
||||
int r = 0;
|
||||
if ((r = wslay_event_recv(ctx)) != 0 || (r = wslay_event_send(ctx)) != 0) {
|
||||
dmLogError("Websocket poll error: %s", WSL_ResultToString(r));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
int WSL_WantsExit(wslay_event_context_ptr ctx)
|
||||
{
|
||||
if ((wslay_event_get_close_sent(ctx) && wslay_event_get_close_received(ctx))) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t WSL_RecvCallback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, int flags, void *user_data)
|
||||
{
|
||||
WebsocketConnection* conn = (WebsocketConnection*)user_data;
|
||||
@@ -135,3 +208,5 @@ int WSL_GenmaskCallback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, v
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_WSLAY
|
Reference in New Issue
Block a user