#if UNITY_EDITOR using System.Threading.Tasks; using UnityEditor; using UnityEngine; using UnityEngine.Networking; using Supabase; public static class SupabaseSecretsVerifier { [MenuItem("Tools/Supabase/Verify Secrets (Editor)")] public static void VerifyMenu() { _ = VerifyAsync(); } static string Mask(string s) => string.IsNullOrEmpty(s) ? "" : (s.Length <= 8 ? $"***{s[^4..]}" : $"{s[..4]}***{s[^6..]}"); static async Task VerifyAsync() { try { // 1) Load secrets (dev file in Editor OR Resources if present) var sec = await SupabaseSecretsLoader.LoadAsync(); // 2) Log masked values Debug.Log($"[Supabase] URL: {sec.url}\nAnon: {Mask(sec.anonKey)}"); // 3) Try Client init (no network calls needed here) var opts = new SupabaseOptions { AutoConnectRealtime = false, AutoRefreshToken = true }; var client = new Client(sec.url, sec.anonKey, opts); await client.InitializeAsync(); // 4) Optional lightweight API ping (Auth health -> 200 OK) var healthUrl = $"{sec.url.TrimEnd('/')}/auth/v1/health"; using var req = UnityWebRequest.Get(healthUrl); req.SetRequestHeader("apikey", sec.anonKey); await req.SendWebRequest(); var ok = req.result == UnityWebRequest.Result.Success && req.responseCode == 200; var msg = ok ? "✅ Secrets OK: Editor can init Supabase and reach /auth/v1/health." : $"⚠️ Init OK but health probe returned {req.responseCode} ({req.error}). " + "This can be blocked by firewall; init still proves secrets are loaded."; Debug.Log(msg); EditorUtility.DisplayDialog("Supabase Secrets", msg + $"\n\nHost: {new System.Uri(sec.url).Host}\nAnon: {Mask(sec.anonKey)}", "OK"); } catch (System.Exception ex) { Debug.LogError($"❌ Supabase secrets verification failed: {ex.Message}"); EditorUtility.DisplayDialog("Supabase Secrets", "❌ Verification failed:\n" + ex.Message, "OK"); } } } #endif