using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace ElectronNET.API { /// /// Electron's process object is extended from the Node.js process object. It adds the /// events, properties, and methods. /// public sealed class Process { internal Process() { } internal static Process Instance { get { if (_process == null) { lock (_syncRoot) { if (_process == null) { _process = new Process(); } } } return _process; } } private static Process _process; private static readonly object _syncRoot = new(); /// /// The process.execPath property returns the absolute pathname of the executable that started the Node.js process. Symbolic links, if any, are resolved. /// /// /// /// var path = await Electron.Process.ExecPathAsync; /// /// public Task ExecPathAsync { get { CancellationToken cancellationToken = new(); cancellationToken.ThrowIfCancellationRequested(); var taskCompletionSource = new TaskCompletionSource(); using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { BridgeConnector.Socket.On("process-execPathCompleted", (text) => { BridgeConnector.Socket.Off("process-execPathCompleted"); taskCompletionSource.SetResult((string) text); }); BridgeConnector.Socket.Emit("process-execPath"); return taskCompletionSource.Task; } } } /// /// TBD /// /// public Task ArgvAsync { get { CancellationToken cancellationToken = new(); cancellationToken.ThrowIfCancellationRequested(); var taskCompletionSource = new TaskCompletionSource(); using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { BridgeConnector.Socket.On("process-argvCompleted", (value) => { BridgeConnector.Socket.Off("process-argvCompleted"); taskCompletionSource.SetResult( ((JArray)value).ToObject() ); }); BridgeConnector.Socket.Emit("process-argv"); return taskCompletionSource.Task; } } } /// /// The process.execPath property returns the absolute pathname of the executable that started the Node.js process. Symbolic links, if any, are resolved. /// /// /// /// var path = await Electron.Process.ExecPathAsync; /// /// public Task TypeAsync { get { CancellationToken cancellationToken = new(); cancellationToken.ThrowIfCancellationRequested(); var taskCompletionSource = new TaskCompletionSource(); using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { BridgeConnector.Socket.On("process-typeCompleted", (text) => { BridgeConnector.Socket.Off("process-typeCompleted"); taskCompletionSource.SetResult((string) text); }); BridgeConnector.Socket.Emit("process-type"); return taskCompletionSource.Task; } } } } }