|
|
@@ -131,50 +131,8 @@ static int WSCallback(struct lws *wsi, enum lws_callback_reasons reason, void *u
|
|
|
|
|
|
case LWS_CALLBACK_CLIENT_WRITEABLE:
|
|
|
if (WSClientInstance) {
|
|
|
-#ifdef __EMSCRIPTEN__
|
|
|
- if(WSClientInstance->GetNumOutgoingPackets(wsi))
|
|
|
- {
|
|
|
- auto packet = WSClientInstance->GetOutgoingPacket(wsi);
|
|
|
- if (packet)
|
|
|
- {
|
|
|
- int retval = EM_ASM_INT({
|
|
|
- var socket = Module.__libwebsocket.socket;
|
|
|
- if( ! socket ) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- // alloc a Uint8Array backed by the incoming data.
|
|
|
- var data_in = new Uint8Array(Module.HEAPU8.buffer, $1, $2 );
|
|
|
- // allow the dest array
|
|
|
- var data = new Uint8Array($2);
|
|
|
- // set the dest from the src
|
|
|
- data.set(data_in);
|
|
|
- socket.send(data);
|
|
|
-
|
|
|
- return $2;
|
|
|
-
|
|
|
- }, packet->second_.GetData(), packet->second_.GetSize());
|
|
|
- if (retval < packet->second_.GetSize()) {
|
|
|
- URHO3D_LOGERRORF("Failed to write to WS, bytes written = %d", retval);
|
|
|
- break;
|
|
|
- }
|
|
|
- WSClientInstance->RemoveOutgoingPacket(wsi);
|
|
|
- }
|
|
|
- }
|
|
|
-#else
|
|
|
- if(WSClientInstance->GetNumOutgoingPackets(wsi)) {
|
|
|
- auto packet = WSClientInstance->GetOutgoingPacket(wsi);
|
|
|
- if (packet) {
|
|
|
- unsigned char buf[LWS_PRE + packet->second_.GetSize()];
|
|
|
- memcpy(&buf[LWS_PRE], packet->second_.GetData(), packet->second_.GetSize());
|
|
|
- int retval = lws_write(wsi, &buf[LWS_PRE], packet->second_.GetSize(), LWS_WRITE_BINARY);
|
|
|
- if (retval < packet->second_.GetSize()) {
|
|
|
- URHO3D_LOGERRORF("Failed to write to WS, bytes written = %d", retval);
|
|
|
- break;:
|
|
|
- }
|
|
|
- WSClientInstance->RemoveOutgoingPacket(wsi);
|
|
|
- }
|
|
|
- }
|
|
|
- lws_callback_on_writable(wsi);
|
|
|
+#ifndef __EMSCRIPTEN__
|
|
|
+ WSClientInstance->SendOutMessages(wsi);
|
|
|
#endif
|
|
|
}
|
|
|
break;
|
|
|
@@ -294,8 +252,8 @@ ws_(nullptr)
|
|
|
this.destroy();
|
|
|
};
|
|
|
libwebsocket.destroy = function() {
|
|
|
+ libwebsocket.on_event(libwebsocket.socket.id, 75, 0, 0, 0);
|
|
|
libwebsocket.socket = false;
|
|
|
- libwebsocket.on_event(this.id, 75, 0, 0, 0);
|
|
|
};
|
|
|
|
|
|
Module.__libwebsocket = libwebsocket;
|
|
|
@@ -373,36 +331,8 @@ void WSClient::Update(float timestep)
|
|
|
}
|
|
|
}
|
|
|
#else
|
|
|
- if(WSClientInstance->GetNumOutgoingPackets(ws_))
|
|
|
- {
|
|
|
- auto packet = WSClientInstance->GetOutgoingPacket(ws_);
|
|
|
- if (packet)
|
|
|
- {
|
|
|
- int retval = EM_ASM_INT({
|
|
|
- var socket = Module.__libwebsocket.socket;
|
|
|
- if( ! socket ) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- // alloc a Uint8Array backed by the incoming data.
|
|
|
- var data_in = new Uint8Array(Module.HEAPU8.buffer, $0, $1);
|
|
|
- // allow the dest array
|
|
|
- var data = new Uint8Array($1);
|
|
|
- // set the dest from the src
|
|
|
- data.set(data_in);
|
|
|
- socket.send(data);
|
|
|
-
|
|
|
- return $1;
|
|
|
-
|
|
|
- }, packet->second_.GetData(), packet->second_.GetSize());
|
|
|
- if (retval < packet->second_.GetSize())
|
|
|
- {
|
|
|
- URHO3D_LOGERRORF("Failed to write to WS, bytes written = %d", retval);
|
|
|
- }
|
|
|
- else
|
|
|
- WSClientInstance->RemoveOutgoingPacket(ws_);
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
+ // For web port we can send out messages immediatelly
|
|
|
+ SendOutMessages(GetWSConnection());
|
|
|
#endif
|
|
|
|
|
|
while (GetNumIncomingPackets()) {
|
|
|
@@ -454,4 +384,54 @@ void WSClient::HandleWorkItemFinished(StringHash eventType, VariantMap& eventDat
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void WSClient::SendOutMessages(lws *ws)
|
|
|
+{
|
|
|
+#ifdef __EMSCRIPTEN__
|
|
|
+ if(GetNumOutgoingPackets(ws))
|
|
|
+ {
|
|
|
+ auto packet = GetOutgoingPacket(ws);
|
|
|
+ if (packet)
|
|
|
+ {
|
|
|
+ int retval = EM_ASM_INT({
|
|
|
+ var socket = Module.__libwebsocket.socket;
|
|
|
+ if( ! socket ) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ // alloc a Uint8Array backed by the incoming data.
|
|
|
+ var data_in = new Uint8Array(Module.HEAPU8.buffer, $0, $1);
|
|
|
+ // allow the dest array
|
|
|
+ var data = new Uint8Array($1);
|
|
|
+ // set the dest from the src
|
|
|
+ data.set(data_in);
|
|
|
+ socket.send(data);
|
|
|
+
|
|
|
+ return $1;
|
|
|
+
|
|
|
+ }, packet->second_.GetData(), packet->second_.GetSize());
|
|
|
+ if (retval < packet->second_.GetSize())
|
|
|
+ {
|
|
|
+ URHO3D_LOGERRORF("Failed to write to WS, bytes written = %d", retval);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ RemoveOutgoingPacket(ws);
|
|
|
+ }
|
|
|
+ }
|
|
|
+#else
|
|
|
+ if(WSClientInstance->GetNumOutgoingPackets(ws)) {
|
|
|
+ auto packet = WSClientInstance->GetOutgoingPacket(ws);
|
|
|
+ if (packet) {
|
|
|
+ unsigned char buf[LWS_PRE + packet->second_.GetSize()];
|
|
|
+ memcpy(&buf[LWS_PRE], packet->second_.GetData(), packet->second_.GetSize());
|
|
|
+ int retval = lws_write(ws, &buf[LWS_PRE], packet->second_.GetSize(), LWS_WRITE_BINARY);
|
|
|
+ if (retval < packet->second_.GetSize()) {
|
|
|
+ URHO3D_LOGERRORF("Failed to write to WS, bytes written = %d", retval);
|
|
|
+ break;:
|
|
|
+ }
|
|
|
+ WSClientInstance->RemoveOutgoingPacket(ws);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lws_callback_on_writable(ws);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
#endif
|