From 38a4284f3d44a128fdd3e14e8eb963c6c2fef31e Mon Sep 17 00:00:00 2001 From: johnche Date: Wed, 27 Nov 2024 19:17:15 +0800 Subject: [PATCH] =?UTF-8?q?[unity][unreal]=E5=BD=93readyState=E4=B8=BAOPEN?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E9=80=9A=E8=BF=87ping=E5=8E=BB=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=B8=8B=E8=BF=9E=E6=8E=A5=E7=8A=B6=E6=80=81=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=9B=A0=E4=B8=BA=E6=B2=A1=E5=88=87=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E4=B9=8B=E7=B1=BB=E7=9A=84=E6=93=8D=E4=BD=9C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=B2=A1=E5=8F=8A=E6=97=B6=E6=9B=B4=E6=96=B0js?= =?UTF-8?q?=E4=BE=A7=E7=8A=B6=E6=80=81=E8=80=8C=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/Resources/puerts/websocketpp.mjs | 6 +++++ unity/test/Src/Cases/WebsocketTest.cs | 3 +++ .../Source/JsEnv/Private/WebSocketImpl.cpp | 23 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/unity/Assets/core/upm/Runtime/Resources/puerts/websocketpp.mjs b/unity/Assets/core/upm/Runtime/Resources/puerts/websocketpp.mjs index ddee2a6203..37da6e26da 100644 --- a/unity/Assets/core/upm/Runtime/Resources/puerts/websocketpp.mjs +++ b/unity/Assets/core/upm/Runtime/Resources/puerts/websocketpp.mjs @@ -83,6 +83,12 @@ class WebSocket extends EventTarget { } get readyState() { + if (this._readyState === WebSocket.OPEN) { + const [statue, message] = this._raw.statue(); + if (statue != 0) { + this._fail(`${message}[${statue}]`); + } + } return this._readyState; } diff --git a/unity/test/Src/Cases/WebsocketTest.cs b/unity/test/Src/Cases/WebsocketTest.cs index 88fa464c23..60b7d14023 100644 --- a/unity/test/Src/Cases/WebsocketTest.cs +++ b/unity/test/Src/Cases/WebsocketTest.cs @@ -111,6 +111,9 @@ public async Task SmokeTest() con.addEventListener('open', (ev) => { console.log(`on open`); con.send('puerts websocket'); + if (con.readyState != WebSocket.OPEN) { + throw new Error('invalid readyState'); + } }); con.addEventListener('message', (ev) => { console.log(`on message: ${ev.data}`); diff --git a/unreal/Puerts/Source/JsEnv/Private/WebSocketImpl.cpp b/unreal/Puerts/Source/JsEnv/Private/WebSocketImpl.cpp index ae874d0a41..a28d9c7b41 100644 --- a/unreal/Puerts/Source/JsEnv/Private/WebSocketImpl.cpp +++ b/unreal/Puerts/Source/JsEnv/Private/WebSocketImpl.cpp @@ -109,6 +109,8 @@ class V8WebSocketClientImpl void Close(const v8::FunctionCallbackInfo& Info); + void Statue(const v8::FunctionCallbackInfo& Info); + void CloseImmediately(websocketpp::close::status::value const code, std::string const& reason); void PollOne(); @@ -309,6 +311,20 @@ void V8WebSocketClientImpl::Close(const v8::FunctionCallbackInfo& Inf Cleanup(); } +void V8WebSocketClientImpl::Statue(const v8::FunctionCallbackInfo& Info) +{ + websocketpp::lib::error_code ec; + Client.ping(Handle, "", ec); + auto isolate = Info.GetIsolate(); + auto context = isolate->GetCurrentContext(); + auto res = v8::Array::New(isolate); + + res->Set(context, 0, v8::Int32::New(isolate, ec.value())).Check(); + res->Set(context, 1, + v8::String::NewFromUtf8(isolate, ec.message().c_str(), v8::NewStringType::kNormal, ec.message().size()).ToLocalChecked()); + Info.GetReturnValue().Set(res); +} + void V8WebSocketClientImpl::CloseImmediately(websocketpp::close::status::value const code, std::string const& reason) { if (!Handle.expired()) @@ -444,6 +460,13 @@ void InitWebsocketPPWrap(v8::Local Context) ->Close(Info); })); + WSTemplate->PrototypeTemplate()->Set(v8::String::NewFromUtf8(Isolate, "statue").ToLocalChecked(), + v8::FunctionTemplate::New(Isolate, + [](const v8::FunctionCallbackInfo& Info) { + static_cast(Info.Holder()->GetAlignedPointerFromInternalField(0)) + ->Statue(Info); + })); + WSTemplate->PrototypeTemplate()->Set(v8::String::NewFromUtf8(Isolate, "poll").ToLocalChecked(), v8::FunctionTemplate::New(Isolate, [](const v8::FunctionCallbackInfo& Info)