diff --git a/src/ElectronNET.API/Electron.cs b/src/ElectronNET.API/Electron.cs index 23f9902..5c63616 100644 --- a/src/ElectronNET.API/Electron.cs +++ b/src/ElectronNET.API/Electron.cs @@ -88,5 +88,10 @@ /// Control your app in the macOS dock. /// public static Dock Dock { get { return Dock.Instance; } } + + /// + /// Electeon extensions to the Nodejs process object. + /// + public static Process Process { get { return Process.Instance; } } } } \ No newline at end of file diff --git a/src/ElectronNET.API/Process.cs b/src/ElectronNET.API/Process.cs new file mode 100644 index 0000000..daa692b --- /dev/null +++ b/src/ElectronNET.API/Process.cs @@ -0,0 +1,61 @@ +using System.Threading; +using System.Threading.Tasks; + +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(); + + /// + /// TBD + /// + /// + public async Task GetExecPathAsync(CancellationToken cancellationToken = default) + { + 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 await taskCompletionSource.Task + .ConfigureAwait(false); + } + } + } +} diff --git a/src/ElectronNET.API/ServiceCollectionExtensions.cs b/src/ElectronNET.API/ServiceCollectionExtensions.cs index f933731..a63aacf 100644 --- a/src/ElectronNET.API/ServiceCollectionExtensions.cs +++ b/src/ElectronNET.API/ServiceCollectionExtensions.cs @@ -28,6 +28,7 @@ namespace ElectronNET.API .AddSingleton(provider => HostHook.Instance) .AddSingleton(provider => PowerMonitor.Instance) .AddSingleton(provider => NativeTheme.Instance) - .AddSingleton(provider => Dock.Instance); + .AddSingleton(provider => Dock.Instance) + .AddSingleton(provider => Process.Instance); } } diff --git a/src/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs b/src/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs index 205ff7b..c0205b6 100644 --- a/src/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs +++ b/src/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs @@ -42,6 +42,7 @@ namespace ElectronNET.CLI.Commands.Actions EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "browserView.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "powerMonitor.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "nativeTheme.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "process.js", "api."); string splashscreenFolder = Path.Combine(tempPath, "splashscreen"); if (Directory.Exists(splashscreenFolder) == false) diff --git a/src/ElectronNET.CLI/ElectronNET.CLI.csproj b/src/ElectronNET.CLI/ElectronNET.CLI.csproj index fd30a57..074ffd8 100644 --- a/src/ElectronNET.CLI/ElectronNET.CLI.csproj +++ b/src/ElectronNET.CLI/ElectronNET.CLI.csproj @@ -68,6 +68,7 @@ + diff --git a/src/ElectronNET.Host/api/process.js b/src/ElectronNET.Host/api/process.js new file mode 100644 index 0000000..80bdaf7 --- /dev/null +++ b/src/ElectronNET.Host/api/process.js @@ -0,0 +1,10 @@ +"use strict"; +let electronSocket; +module.exports = (socket) => { + electronSocket = socket; + socket.on('process-execPath', () => { + const value = process.execPath; + electronSocket.emit('process-execPathCompleted', value); + }); +}; +//# sourceMappingURL=process.js.map \ No newline at end of file diff --git a/src/ElectronNET.Host/api/process.js.map b/src/ElectronNET.Host/api/process.js.map new file mode 100644 index 0000000..e2e659a --- /dev/null +++ b/src/ElectronNET.Host/api/process.js.map @@ -0,0 +1 @@ +{"version":3,"file":"process.js","sourceRoot":"","sources":["process.ts"],"names":[],"mappings":";AACA,IAAI,cAAc,CAAC;AAEnB,iBAAS,CAAC,MAAc,EAAE,EAAE;IACxB,cAAc,GAAG,MAAM,CAAC;IAExB,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC/B,cAAc,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"} \ No newline at end of file diff --git a/src/ElectronNET.Host/api/process.ts b/src/ElectronNET.Host/api/process.ts new file mode 100644 index 0000000..a559869 --- /dev/null +++ b/src/ElectronNET.Host/api/process.ts @@ -0,0 +1,11 @@ +import { Socket } from 'net'; +let electronSocket; + +export = (socket: Socket) => { + electronSocket = socket; + + socket.on('process-execPath', () => { + const value = process.execPath; + electronSocket.emit('process-execPathCompleted', value); + }); +}; diff --git a/src/ElectronNET.Host/main.js b/src/ElectronNET.Host/main.js index 02c3ff7..f90c2d5 100644 --- a/src/ElectronNET.Host/main.js +++ b/src/ElectronNET.Host/main.js @@ -15,6 +15,7 @@ let nativeTheme; let dock; let launchFile; let launchUrl; +let processApi; let manifestJsonFileName = 'electron.manifest.json'; let watchable = false; @@ -250,6 +251,7 @@ function startSocketApiBridge(port) { if (powerMonitor === undefined) powerMonitor = require('./api/powerMonitor')(socket); if (nativeTheme === undefined) nativeTheme = require('./api/nativeTheme')(socket); if (dock === undefined) dock = require('./api/dock')(socket); + if (processApi === undefined) processApi = require('./api/process')(socket); socket.on('register-app-open-file-event', (id) => { global['electronsocket'] = socket;