using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Threading.Tasks; namespace ElectronNET.API { /// /// Allows you to execute native JavaScript/TypeScript code from the host process. /// /// It is only possible if the Electron.NET CLI has previously added an /// ElectronHostHook directory: /// electronize add HostHook /// public sealed class HostHook { private static HostHook _electronHostHook; private static readonly object _syncRoot = new(); readonly string oneCallguid = Guid.NewGuid().ToString(); internal HostHook() { } internal static HostHook Instance { get { if (_electronHostHook == null) { lock (_syncRoot) { if (_electronHostHook == null) { _electronHostHook = new HostHook(); } } } return _electronHostHook; } } /// /// Execute native JavaScript/TypeScript code. /// /// Socket name registered on the host. /// Optional parameters. public void Call(string socketEventName, params dynamic[] arguments) { BridgeConnector.On(socketEventName + "Error" + oneCallguid, (result) => { BridgeConnector.Off(socketEventName + "Error" + oneCallguid); Electron.Dialog.ShowErrorBox("Host Hook Exception", result); }); BridgeConnector.Emit(socketEventName, arguments, oneCallguid); } /// /// Execute native JavaScript/TypeScript code. /// /// Results from the executed host code. /// Socket name registered on the host. /// Optional parameters. /// public Task CallAsync(string socketEventName, params dynamic[] arguments) { var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); BridgeConnector.On(socketEventName + "Error" + guid, (result) => { BridgeConnector.Off(socketEventName + "Error" + guid); Electron.Dialog.ShowErrorBox("Host Hook Exception", result); taskCompletionSource.SetException(new Exception($"Host Hook Exception {result}")); }); BridgeConnector.On(socketEventName + "Complete" + guid, (result) => { BridgeConnector.Off(socketEventName + "Error" + guid); BridgeConnector.Off(socketEventName + "Complete" + guid); taskCompletionSource.SetResult(result); }); BridgeConnector.Emit(socketEventName, arguments, guid); return taskCompletionSource.Task; } } }