10EmscriptenWebSocket::EmscriptenWebSocket()
11 : socket_(0), socket_valid_(false) {
12 state_ = WebSocketState::kDisconnected;
15EmscriptenWebSocket::~EmscriptenWebSocket() {
16 if (socket_valid_ && state_ != WebSocketState::kDisconnected) {
21EM_BOOL EmscriptenWebSocket::OnOpenCallback(
23 const EmscriptenWebSocketOpenEvent* websocketEvent,
26 EmscriptenWebSocket* self =
static_cast<EmscriptenWebSocket*
>(userData);
28 self->state_ = WebSocketState::kConnected;
30 if (self->open_callback_) {
31 self->open_callback_();
37EM_BOOL EmscriptenWebSocket::OnCloseCallback(
39 const EmscriptenWebSocketCloseEvent* websocketEvent,
42 EmscriptenWebSocket* self =
static_cast<EmscriptenWebSocket*
>(userData);
44 self->state_ = WebSocketState::kClosed;
45 self->socket_valid_ =
false;
47 if (self->close_callback_) {
48 self->close_callback_(websocketEvent->code,
49 websocketEvent->reason ? websocketEvent->reason :
"");
52 self->state_ = WebSocketState::kDisconnected;
57EM_BOOL EmscriptenWebSocket::OnErrorCallback(
59 const EmscriptenWebSocketErrorEvent* websocketEvent,
62 EmscriptenWebSocket* self =
static_cast<EmscriptenWebSocket*
>(userData);
64 self->state_ = WebSocketState::kError;
66 if (self->error_callback_) {
67 self->error_callback_(
"WebSocket error occurred");
73EM_BOOL EmscriptenWebSocket::OnMessageCallback(
75 const EmscriptenWebSocketMessageEvent* websocketEvent,
78 EmscriptenWebSocket* self =
static_cast<EmscriptenWebSocket*
>(userData);
80 if (websocketEvent->isText) {
82 if (self->message_callback_) {
84 std::string message(
reinterpret_cast<const char*
>(websocketEvent->data),
85 websocketEvent->numBytes);
86 self->message_callback_(message);
90 if (self->binary_message_callback_) {
91 self->binary_message_callback_(websocketEvent->data,
92 websocketEvent->numBytes);
99absl::Status EmscriptenWebSocket::Connect(
const std::string& url) {
100 if (state_ != WebSocketState::kDisconnected) {
101 return absl::FailedPreconditionError(
102 "WebSocket already connected or connecting");
105 state_ = WebSocketState::kConnecting;
109 EmscriptenWebSocketCreateAttributes attrs = {
116 socket_ = emscripten_websocket_new(&attrs);
119 state_ = WebSocketState::kError;
120 return absl::InternalError(
"Failed to create WebSocket");
123 socket_valid_ =
true;
126 EMSCRIPTEN_RESULT result;
128 result = emscripten_websocket_set_onopen_callback(
129 socket_,
this, OnOpenCallback);
130 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
131 state_ = WebSocketState::kError;
132 socket_valid_ =
false;
133 return absl::InternalError(
"Failed to set onopen callback");
136 result = emscripten_websocket_set_onclose_callback(
137 socket_,
this, OnCloseCallback);
138 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
139 state_ = WebSocketState::kError;
140 socket_valid_ =
false;
141 return absl::InternalError(
"Failed to set onclose callback");
144 result = emscripten_websocket_set_onerror_callback(
145 socket_,
this, OnErrorCallback);
146 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
147 state_ = WebSocketState::kError;
148 socket_valid_ =
false;
149 return absl::InternalError(
"Failed to set onerror callback");
152 result = emscripten_websocket_set_onmessage_callback(
153 socket_,
this, OnMessageCallback);
154 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
155 state_ = WebSocketState::kError;
156 socket_valid_ =
false;
157 return absl::InternalError(
"Failed to set onmessage callback");
163 return absl::OkStatus();
166absl::Status EmscriptenWebSocket::Send(
const std::string& message) {
167 if (state_ != WebSocketState::kConnected || !socket_valid_) {
168 return absl::FailedPreconditionError(
"WebSocket not connected");
171 EMSCRIPTEN_RESULT result = emscripten_websocket_send_utf8_text(
172 socket_, message.c_str());
174 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
175 return absl::InternalError(
"Failed to send text message");
178 return absl::OkStatus();
181absl::Status EmscriptenWebSocket::SendBinary(
const uint8_t* data,
183 if (state_ != WebSocketState::kConnected || !socket_valid_) {
184 return absl::FailedPreconditionError(
"WebSocket not connected");
187 EMSCRIPTEN_RESULT result = emscripten_websocket_send_binary(
188 socket_,
const_cast<void*
>(
static_cast<const void*
>(data)), length);
190 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
191 return absl::InternalError(
"Failed to send binary message");
194 return absl::OkStatus();
197absl::Status EmscriptenWebSocket::Close(
int code,
const std::string& reason) {
198 if (state_ == WebSocketState::kDisconnected ||
199 state_ == WebSocketState::kClosed ||
201 return absl::OkStatus();
204 state_ = WebSocketState::kClosing;
206 EMSCRIPTEN_RESULT result = emscripten_websocket_close(
207 socket_, code, reason.c_str());
209 if (result != EMSCRIPTEN_RESULT_SUCCESS) {
211 state_ = WebSocketState::kClosed;
212 socket_valid_ =
false;
213 return absl::InternalError(
"Failed to close WebSocket");
218 return absl::OkStatus();