Files
HelixJump/Packages/com.merry-yellow.code-assist/Editor/MQTTnetInitializer.cs
2025-12-15 17:49:08 -08:00

135 lines
3.7 KiB
C#

using System;
using UnityEditor;
#pragma warning disable IDE0005
using Serilog = Meryel.Serilog;
using MQTTnet = Meryel.UnityCodeAssist.MQTTnet;
#pragma warning restore IDE0005
#nullable enable
namespace Meryel.UnityCodeAssist.Editor
{
//[InitializeOnLoad]
public static class MQTTnetInitializer
{
public static MQTTnetPublisher? Publisher;
static MQTTnetInitializer()
{
EditorApplication.quitting += EditorApplication_quitting;
AssemblyReloadEvents.beforeAssemblyReload += AssemblyReloadEvents_beforeAssemblyReload;
//AssemblyReloadEvents.afterAssemblyReload += AssemblyReloadEvents_afterAssemblyReload;
RunOnceOnUpdate(Initialize);
}
/// <summary>
/// Empty method for invoking static class ctor
/// </summary>
public static void Bump() { }
/// <summary>
/// false for profiler standalone process
/// </summary>
/// <returns></returns>
public static bool IsMainUnityEditorProcess()
{
#if UNITY_2020_2_OR_NEWER
if (UnityEditor.AssetDatabase.IsAssetImportWorkerProcess())
return false;
#elif UNITY_2019_3_OR_NEWER
if (UnityEditor.Experimental.AssetDatabaseExperimental.IsAssetImportWorkerProcess())
return false;
#endif
#if UNITY_2021_1_OR_NEWER
if (UnityEditor.MPE.ProcessService.level == UnityEditor.MPE.ProcessLevel.Secondary)
return false;
#elif UNITY_2020_2_OR_NEWER
if (UnityEditor.MPE.ProcessService.level == UnityEditor.MPE.ProcessLevel.Slave)
return false;
#elif UNITY_2020_1_OR_NEWER
if (global::Unity.MPE.ProcessService.level == global::Unity.MPE.ProcessLevel.UMP_SLAVE)
return false;
#endif
return true;
}
public static void Initialize()
{
if (!IsMainUnityEditorProcess())
{
// if try to creaate NetMQ, will recieve AddressAlreadyInUseException during binding
Serilog.Log.Debug("MQTTnet won't initialize on secondary processes");
return;
}
Serilog.Log.Debug("MQTTnet initializing");
//Serilog.Log.Debug("MQTTnet constructing");
Publisher = new MQTTnetPublisher();
RunOnShutdown(OnShutDown);
Serilog.Log.Debug("MQTTnet initialized");
}
private static void OnShutDown()
{
Serilog.Log.Debug("MQTTnet OnShutDown");
Clear();
}
//private static void AssemblyReloadEvents_afterAssemblyReload()
//{
// Serilog.Log.Debug("MQTTnet AssemblyReloadEvents_afterAssemblyReload");
//}
private static void AssemblyReloadEvents_beforeAssemblyReload()
{
Serilog.Log.Debug("MQTTnet AssemblyReloadEvents_beforeAssemblyReload");
Clear();
}
private static void EditorApplication_quitting()
{
Serilog.Log.Debug("MQTTnet EditorApplication_quitting");
Publisher?.SendDisconnect();
Clear();
}
static void Clear() => Publisher?.Clear();
private static void RunOnceOnUpdate(Action action)
{
void callback()
{
EditorApplication.update -= callback;
action();
}
EditorApplication.update += callback;
}
private static void RunOnShutdown(Action action)
{
// Mono on OSX has all kinds of quirks on AppDomain shutdown
//if (!VisualStudioEditor.IsWindows)
//return;
#if !UNITY_EDITOR_WIN
return;
#else
AppDomain.CurrentDomain.DomainUnload += (_, __) => action();
#endif
}
}
}