#if UNITY_WEBGL using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using Cysharp.Threading.Tasks; using UnityEngine; using WalletConnectSharp.Core.Models; using MoralisUnity.Platform.Queries.Live; namespace MoralisUnity { public class MoralisLiveQueriesGL { private static bool isConnected; [DllImport("__Internal")] private static extern void OpenWebsocketJs(string key, string path); [DllImport("__Internal")] private static extern void CloseWebsocketJs(string key); [DllImport("__Internal")] private static extern void SendMessageJs(string key, string message); [DllImport("__Internal")] private static extern string OpenWebsocketResponse(); [DllImport("__Internal")] private static extern string CloseWebsocketResponse(); [DllImport("__Internal")] private static extern string GetErrorQueueJs(string key); [DllImport("__Internal")] private static extern string GetResponseQueueJs(string key); [DllImport("__Internal")] private static extern int GetSocketStateJs(string key); /// /// /// /// /// /// public async static UniTask CreateSubscription(string key, string path) { string openResp = String.Empty; bool resp = false; int waitLoops = 240; // approx 2min @ 60FPS int loop = 0; if (String.IsNullOrEmpty(key) || String.IsNullOrEmpty(path)) { throw new ArgumentException("Key and Path requried to establish a websocket connection."); } OpenWebsocketJs(key, path); Debug.Log("Going into wait loop ..."); while (loop < waitLoops && String.IsNullOrEmpty(openResp)) { await UniTask.DelayFrame(30); var r = OpenWebsocketResponse(); if (r != null) { openResp = r; Debug.Log($"Create Subscription response: {openResp}"); break; } else Debug.Log("Response is null"); loop++; } Debug.Log($"Exiting wait loop resp is {openResp}"); if (openResp.Length > 0 && openResp.Contains("\"isTrusted\":true")) { isConnected = true; resp = true; } return resp; } /// /// Indicates if the web3 objects has been created and connected properly. /// /// bool public static bool IsConnected() => isConnected; public async static UniTask CloseWebsocket(string key) { string closeResp = String.Empty; int waitLoops = 240; int loop = 0; if (String.IsNullOrEmpty(key)) { throw new ArgumentException("Key requried to close a websocket connection."); } CloseWebsocketJs(key); while (loop < waitLoops && closeResp.Length < 1) { await UniTask.DelayFrame(30); closeResp = CloseWebsocketResponse(); loop++; } if (closeResp.Length > 0) { isConnected = false; } return closeResp; } public static void SendMessage(string key, string message) { SendMessageJs(key, message); } public static string GetResponseQueue(string key) { string val = GetResponseQueueJs(key); return val; } public static string GetErrorQueue(string key) { return GetErrorQueueJs(key); } public static int GetSocketState(string key) { return GetSocketStateJs(key); } } } #endif