From 985dded8305bcaa5915cfcfa52f8fc5b82ad0afc Mon Sep 17 00:00:00 2001 From: FME849 <1414439@gmail.com> Date: Fri, 25 Jul 2025 09:31:45 +0700 Subject: [PATCH 1/2] feat: generate Websocket token from auth --- sdks/csharp/src/Plugins/WebSocket.jslib | 27 ++++++++++++++++++++++--- sdks/csharp/src/WebSocket.cs | 14 +++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/sdks/csharp/src/Plugins/WebSocket.jslib b/sdks/csharp/src/Plugins/WebSocket.jslib index 5fa7605ef47..09763e1b969 100644 --- a/sdks/csharp/src/Plugins/WebSocket.jslib +++ b/sdks/csharp/src/Plugins/WebSocket.jslib @@ -18,12 +18,33 @@ mergeInto(LibraryManager.library, { manager.callbacks.error = errorCallback; }, - WebSocket_Connect: function(uriPtr, protocolPtr, authTokenPtr) { + WebSocket_Connect: async function(baseUriPtr, uriPtr, protocolPtr, authTokenPtr, callbackPtr) { try { var manager = this._webSocketManager; + var host = UTF8ToString(baseUriPtr); var uri = UTF8ToString(uriPtr); var protocol = UTF8ToString(protocolPtr); var authToken = UTF8ToString(authTokenPtr); + if (authToken) + { + var tokenUrl = new URL('v1/identity/websocket-token', host); + tokenUrl.protocol = host.startsWith("wss://") ? 'https:' : 'http:'; + var headers = new Headers(); + headers.set('Authorization', `Bearer ${authToken}`); + + var response = await fetch(tokenUrl, { + method: 'POST', + headers: headers + }); + if (response.ok) { + const { token } = await response.json(); + if (token) { + uri += `&token=${token}`; + } + } else { + throw new Error(`Failed to verify token: ${response.statusText}`); + } + } var socket = new window.WebSocket(uri, protocol); socket.binaryType = "arraybuffer"; @@ -63,10 +84,10 @@ mergeInto(LibraryManager.library, { } }; - return socketId; + dynCall('vi', callbackPtr, [socketId]); } catch (e) { console.error("WebSocket connection error:", e); - return -1; + dynCall('vi', callbackPtr, [-1]); } }, diff --git a/sdks/csharp/src/WebSocket.cs b/sdks/csharp/src/WebSocket.cs index c6359dd46f1..b9b2e3506ab 100644 --- a/sdks/csharp/src/WebSocket.cs +++ b/sdks/csharp/src/WebSocket.cs @@ -75,7 +75,7 @@ IntPtr errorCallback ); [DllImport("__Internal")] - private static extern int WebSocket_Connect(string uri, string protocol, string authToken); + private static extern int WebSocket_Connect(string host, string uri, string protocol, string authToken, IntPtr callbackPtr); [DllImport("__Internal")] private static extern int WebSocket_Send(int socketId, byte[] data, int length); @@ -118,8 +118,15 @@ private static void WebGLOnError(int socketId) Instance?.HandleWebGLError(socketId); } + [AOT.MonoPInvokeCallback(typeof(Action))] + private static void OnSocketIdReceived(int socketId) + { + Instance?._socketId.TrySetResult(socketId); + } + private static WebSocket Instance; private int _webglSocketId = -1; + private TaskCompletionSource _socketId; private void InitializeWebGL() { @@ -145,7 +152,10 @@ public async Task Connect(string? auth, string host, string nameOrAddress, Conne var uri = $"{host}/v1/database/{nameOrAddress}/subscribe?connection_id={connectionId}&compression={compression}"; if (light) uri += "&light=true"; - _webglSocketId = WebSocket_Connect(uri, _options.Protocol, auth); + _socketId = new TaskCompletionSource(); + var callbackPtr = Marshal.GetFunctionPointerForDelegate((Action)OnSocketIdReceived); + WebSocket_Connect(host, uri, _options.Protocol, auth, callbackPtr); + _webglSocketId = await _socketId.Task; if (_webglSocketId == -1) { dispatchQueue.Enqueue(() => OnConnectError?.Invoke( From a79424cd4ddcf37001c67945d900958edbf41796 Mon Sep 17 00:00:00 2001 From: FME849 <1414439@gmail.com> Date: Fri, 25 Jul 2025 09:51:25 +0700 Subject: [PATCH 2/2] chore: fix indentation --- sdks/csharp/src/Plugins/WebSocket.jslib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdks/csharp/src/Plugins/WebSocket.jslib b/sdks/csharp/src/Plugins/WebSocket.jslib index 09763e1b969..d2427954bb8 100644 --- a/sdks/csharp/src/Plugins/WebSocket.jslib +++ b/sdks/csharp/src/Plugins/WebSocket.jslib @@ -25,7 +25,7 @@ mergeInto(LibraryManager.library, { var uri = UTF8ToString(uriPtr); var protocol = UTF8ToString(protocolPtr); var authToken = UTF8ToString(authTokenPtr); - if (authToken) + if (authToken) { var tokenUrl = new URL('v1/identity/websocket-token', host); tokenUrl.protocol = host.startsWith("wss://") ? 'https:' : 'http:';