diff --git a/ElectronNET.API/App.cs b/ElectronNET.API/App.cs index 69d8722c..274786c5 100644 --- a/ElectronNET.API/App.cs +++ b/ElectronNET.API/App.cs @@ -15,6 +15,11 @@ namespace ElectronNET.API /// public sealed class App { + /// + /// Print every message sent to the socket + /// + public static bool SocketDebug { get; set; } + /// /// Emitted when all windows have been closed. /// @@ -30,7 +35,7 @@ public event Action WindowAllClosed { if (_windowAllClosed == null) { - BridgeConnector.Socket.On("app-window-all-closed" + GetHashCode(), () => + BridgeConnector.On("app-window-all-closed" + GetHashCode(), () => { if (!Electron.WindowManager.IsQuitOnWindowAllClosed || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { @@ -38,7 +43,7 @@ public event Action WindowAllClosed } }); - BridgeConnector.Socket.Emit("register-app-window-all-closed-event", GetHashCode()); + BridgeConnector.Emit("register-app-window-all-closed-event", GetHashCode()); } _windowAllClosed += value; } @@ -47,7 +52,7 @@ public event Action WindowAllClosed _windowAllClosed -= value; if(_windowAllClosed == null) - BridgeConnector.Socket.Off("app-window-all-closed" + GetHashCode()); + BridgeConnector.Off("app-window-all-closed" + GetHashCode()); } } @@ -67,7 +72,7 @@ public event Func BeforeQuit { if (_beforeQuit == null) { - BridgeConnector.Socket.On("app-before-quit" + GetHashCode(), async () => + BridgeConnector.On("app-before-quit" + GetHashCode(), async () => { await _beforeQuit(new QuitEventArgs()); @@ -110,7 +115,7 @@ public event Func BeforeQuit } }); - BridgeConnector.Socket.Emit("register-app-before-quit-event", GetHashCode()); + BridgeConnector.Emit("register-app-before-quit-event", GetHashCode()); } _beforeQuit += value; } @@ -119,7 +124,7 @@ public event Func BeforeQuit _beforeQuit -= value; if (_beforeQuit == null) - BridgeConnector.Socket.Off("app-before-quit" + GetHashCode()); + BridgeConnector.Off("app-before-quit" + GetHashCode()); } } @@ -139,7 +144,7 @@ public event Func WillQuit { if (_willQuit == null) { - BridgeConnector.Socket.On("app-will-quit" + GetHashCode(), async () => + BridgeConnector.On("app-will-quit" + GetHashCode(), async () => { await _willQuit(new QuitEventArgs()); @@ -161,7 +166,7 @@ public event Func WillQuit } }); - BridgeConnector.Socket.Emit("register-app-will-quit-event", GetHashCode()); + BridgeConnector.Emit("register-app-will-quit-event", GetHashCode()); } _willQuit += value; } @@ -170,7 +175,7 @@ public event Func WillQuit _willQuit -= value; if (_willQuit == null) - BridgeConnector.Socket.Off("app-will-quit" + GetHashCode()); + BridgeConnector.Off("app-will-quit" + GetHashCode()); } } @@ -187,7 +192,7 @@ public event Func Quitting { if (_quitting == null) { - BridgeConnector.Socket.On("app-will-quit" + GetHashCode() + "quitting", async () => + BridgeConnector.On("app-will-quit" + GetHashCode() + "quitting", async () => { if(_willQuit == null) { @@ -196,7 +201,7 @@ public event Func Quitting } }); - BridgeConnector.Socket.Emit("register-app-will-quit-event", GetHashCode() + "quitting"); + BridgeConnector.Emit("register-app-will-quit-event", GetHashCode() + "quitting"); } _quitting += value; } @@ -205,7 +210,7 @@ public event Func Quitting _quitting -= value; if (_quitting == null) - BridgeConnector.Socket.Off("app-will-quit" + GetHashCode() + "quitting"); + BridgeConnector.Off("app-will-quit" + GetHashCode() + "quitting"); } } @@ -220,12 +225,12 @@ public event Action BrowserWindowBlur { if (_browserWindowBlur == null) { - BridgeConnector.Socket.On("app-browser-window-blur" + GetHashCode(), () => + BridgeConnector.On("app-browser-window-blur" + GetHashCode(), () => { _browserWindowBlur(); }); - BridgeConnector.Socket.Emit("register-app-browser-window-blur-event", GetHashCode()); + BridgeConnector.Emit("register-app-browser-window-blur-event", GetHashCode()); } _browserWindowBlur += value; } @@ -234,7 +239,7 @@ public event Action BrowserWindowBlur _browserWindowBlur -= value; if (_browserWindowBlur == null) - BridgeConnector.Socket.Off("app-browser-window-blur" + GetHashCode()); + BridgeConnector.Off("app-browser-window-blur" + GetHashCode()); } } @@ -249,12 +254,12 @@ public event Action BrowserWindowFocus { if (_browserWindowFocus == null) { - BridgeConnector.Socket.On("app-browser-window-focus" + GetHashCode(), () => + BridgeConnector.On("app-browser-window-focus" + GetHashCode(), () => { _browserWindowFocus(); }); - BridgeConnector.Socket.Emit("register-app-browser-window-focus-event", GetHashCode()); + BridgeConnector.Emit("register-app-browser-window-focus-event", GetHashCode()); } _browserWindowFocus += value; } @@ -263,7 +268,7 @@ public event Action BrowserWindowFocus _browserWindowFocus -= value; if (_browserWindowFocus == null) - BridgeConnector.Socket.Off("app-browser-window-focus" + GetHashCode()); + BridgeConnector.Off("app-browser-window-focus" + GetHashCode()); } } @@ -278,12 +283,12 @@ public event Action BrowserWindowCreated { if (_browserWindowCreated == null) { - BridgeConnector.Socket.On("app-browser-window-created" + GetHashCode(), () => + BridgeConnector.On("app-browser-window-created" + GetHashCode(), () => { _browserWindowCreated(); }); - BridgeConnector.Socket.Emit("register-app-browser-window-created-event", GetHashCode()); + BridgeConnector.Emit("register-app-browser-window-created-event", GetHashCode()); } _browserWindowCreated += value; } @@ -292,7 +297,7 @@ public event Action BrowserWindowCreated _browserWindowCreated -= value; if (_browserWindowCreated == null) - BridgeConnector.Socket.Off("app-browser-window-created" + GetHashCode()); + BridgeConnector.Off("app-browser-window-created" + GetHashCode()); } } @@ -307,12 +312,12 @@ public event Action WebContentsCreated { if (_webContentsCreated == null) { - BridgeConnector.Socket.On("app-web-contents-created" + GetHashCode(), () => + BridgeConnector.On("app-web-contents-created" + GetHashCode(), () => { _webContentsCreated(); }); - BridgeConnector.Socket.Emit("register-app-web-contents-created-event", GetHashCode()); + BridgeConnector.Emit("register-app-web-contents-created-event", GetHashCode()); } _webContentsCreated += value; } @@ -321,7 +326,7 @@ public event Action WebContentsCreated _webContentsCreated -= value; if (_webContentsCreated == null) - BridgeConnector.Socket.Off("app-web-contents-created" + GetHashCode()); + BridgeConnector.Off("app-web-contents-created" + GetHashCode()); } } @@ -338,12 +343,12 @@ public event Action AccessibilitySupportChanged { if (_accessibilitySupportChanged == null) { - BridgeConnector.Socket.On("app-accessibility-support-changed" + GetHashCode(), (state) => + BridgeConnector.On("app-accessibility-support-changed" + GetHashCode(), (state) => { - _accessibilitySupportChanged((bool)state); + _accessibilitySupportChanged(state); }); - BridgeConnector.Socket.Emit("register-app-accessibility-support-changed-event", GetHashCode()); + BridgeConnector.Emit("register-app-accessibility-support-changed-event", GetHashCode()); } _accessibilitySupportChanged += value; } @@ -352,7 +357,7 @@ public event Action AccessibilitySupportChanged _accessibilitySupportChanged -= value; if (_accessibilitySupportChanged == null) - BridgeConnector.Socket.Off("app-accessibility-support-changed" + GetHashCode()); + BridgeConnector.Off("app-accessibility-support-changed" + GetHashCode()); } } @@ -396,6 +401,7 @@ internal set } } } + private bool _isReady = false; /// @@ -411,12 +417,12 @@ public event Action OpenFile { if (_openFile == null) { - BridgeConnector.Socket.On("app-open-file" + GetHashCode(), (file) => + BridgeConnector.On("app-open-file" + GetHashCode(), (file) => { - _openFile(file.ToString()); + _openFile(file); }); - BridgeConnector.Socket.Emit("register-app-open-file-event", GetHashCode()); + BridgeConnector.Emit("register-app-open-file-event", GetHashCode()); } _openFile += value; } @@ -425,7 +431,7 @@ public event Action OpenFile _openFile -= value; if (_openFile == null) - BridgeConnector.Socket.Off("app-open-file" + GetHashCode()); + BridgeConnector.Off("app-open-file" + GetHashCode()); } } @@ -442,12 +448,12 @@ public event Action OpenUrl { if (_openUrl == null) { - BridgeConnector.Socket.On("app-open-url" + GetHashCode(), (url) => + BridgeConnector.On("app-open-url" + GetHashCode(), (url) => { - _openUrl(url.ToString()); + _openUrl(url); }); - BridgeConnector.Socket.Emit("register-app-open-url-event", GetHashCode()); + BridgeConnector.Emit("register-app-open-url-event", GetHashCode()); } _openUrl += value; } @@ -456,7 +462,7 @@ public event Action OpenUrl _openUrl -= value; if (_openUrl == null) - BridgeConnector.Socket.Off("app-open-url" + GetHashCode()); + BridgeConnector.Off("app-open-url" + GetHashCode()); } } @@ -472,14 +478,9 @@ public event Action OpenUrl /// public string Name { - [Obsolete("Use the asynchronous version NameAsync instead")] - get - { - return NameAsync.Result; - } set { - BridgeConnector.Socket.Emit("appSetName", value); + BridgeConnector.Emit("appSetName", value); } } @@ -491,26 +492,7 @@ public string Name /// should usually also specify a productName field, which is your application's full capitalized name, and /// which will be preferred over name by Electron. /// - public Task NameAsync - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetNameCompleted", (result) => - { - BridgeConnector.Socket.Off("appGetNameCompleted"); - taskCompletionSource.SetResult((string)result); - }); - - BridgeConnector.Socket.Emit("appGetName"); - - return taskCompletionSource.Task; - }); - } - } + public Task GetNameAsync() => BridgeConnector.OnResult("appGetName", "appGetNameCompleted"); internal App() @@ -537,14 +519,17 @@ internal static App Instance } } + /// + /// Manually set that the app is ready instead of using the UseElectron extension method + /// + public static void ManuallySetIsReady() + { + Instance.IsReady = true; + } + private static App _app; private static object _syncRoot = new object(); - private readonly JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }; - /// /// Try to close all windows. The event will be emitted first. If all windows are successfully /// closed, the event will be emitted and by default the application will terminate. This method @@ -553,7 +538,7 @@ internal static App Instance /// public void Quit() { - BridgeConnector.Socket.Emit("appQuit"); + BridgeConnector.EmitSync("appQuit"); } /// @@ -563,7 +548,7 @@ public void Quit() /// Exits immediately with exitCode. exitCode defaults to 0. public void Exit(int exitCode = 0) { - BridgeConnector.Socket.Emit("appExit", exitCode); + BridgeConnector.EmitSync("appExit", exitCode); } /// @@ -578,7 +563,7 @@ public void Exit(int exitCode = 0) /// public void Relaunch() { - BridgeConnector.Socket.Emit("appRelaunch"); + BridgeConnector.EmitSync("appRelaunch"); } /// @@ -596,7 +581,7 @@ public void Relaunch() /// Options for the relaunch. public void Relaunch(RelaunchOptions relaunchOptions) { - BridgeConnector.Socket.Emit("appRelaunch", JObject.FromObject(relaunchOptions, _jsonSerializer)); + BridgeConnector.EmitSync("appRelaunch", JObject.FromObject(relaunchOptions, _jsonSerializer)); } /// @@ -605,7 +590,7 @@ public void Relaunch(RelaunchOptions relaunchOptions) /// public void Focus() { - BridgeConnector.Socket.Emit("appFocus"); + BridgeConnector.Emit("appFocus"); } /// @@ -616,7 +601,7 @@ public void Focus() /// public void Focus(FocusOptions focusOptions) { - BridgeConnector.Socket.Emit("appFocus", JObject.FromObject(focusOptions, _jsonSerializer)); + BridgeConnector.Emit("appFocus", JObject.FromObject(focusOptions, _jsonSerializer)); } /// @@ -624,7 +609,7 @@ public void Focus(FocusOptions focusOptions) /// public void Hide() { - BridgeConnector.Socket.Emit("appHide"); + BridgeConnector.Emit("appHide"); } /// @@ -632,31 +617,13 @@ public void Hide() /// public void Show() { - BridgeConnector.Socket.Emit("appShow"); + BridgeConnector.Emit("appShow"); } /// /// The current application directory. /// - public async Task GetAppPathAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetAppPathCompleted", (path) => - { - BridgeConnector.Socket.Off("appGetAppPathCompleted"); - taskCompletionSource.SetResult(path.ToString()); - }); - - BridgeConnector.Socket.Emit("appGetAppPath"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetAppPathAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetAppPath", "appGetAppPathCompleted", cancellationToken); /// /// Sets or creates a directory your app's logs which can then be manipulated with @@ -668,7 +635,7 @@ public async Task GetAppPathAsync(CancellationToken cancellationToken = /// A custom path for your logs. Must be absolute. public void SetAppLogsPath(string path) { - BridgeConnector.Socket.Emit("appSetAppLogsPath", path); + BridgeConnector.Emit("appSetAppLogsPath", path); } /// @@ -679,26 +646,8 @@ public void SetAppLogsPath(string path) /// Special directory. /// The cancellation token. /// A path to a special directory or file associated with name. - public async Task GetPathAsync(PathName pathName, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetPathCompleted", (path) => - { - BridgeConnector.Socket.Off("appGetPathCompleted"); - - taskCompletionSource.SetResult(path.ToString()); - }); + public Task GetPathAsync(PathName pathName, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetPath", "appGetPathCompleted", cancellationToken, pathName.GetDescription()); - BridgeConnector.Socket.Emit("appGetPath", pathName.GetDescription()); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } /// /// Overrides the path to a special directory or file associated with name. If the path specifies a directory @@ -714,7 +663,7 @@ public async Task GetPathAsync(PathName pathName, CancellationToken canc /// public void SetPath(PathName name, string path) { - BridgeConnector.Socket.Emit("appSetPath", name.GetDescription(), path); + BridgeConnector.Emit("appSetPath", name.GetDescription(), path); } /// @@ -722,25 +671,7 @@ public void SetPath(PathName name, string path) /// the version of the current bundle or executable is returned. /// /// The version of the loaded application. - public async Task GetVersionAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetVersionCompleted", (version) => - { - BridgeConnector.Socket.Off("appGetVersionCompleted"); - taskCompletionSource.SetResult(version.ToString()); - }); - - BridgeConnector.Socket.Emit("appGetVersion"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetVersionAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetVersion", "appGetVersionCompleted", cancellationToken); /// /// The current application locale. Possible return values are documented here. @@ -750,25 +681,7 @@ public async Task GetVersionAsync(CancellationToken cancellationToken = /// Note: On Windows, you have to call it after the events gets emitted. /// /// The current application locale. - public async Task GetLocaleAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetLocaleCompleted", (local) => - { - BridgeConnector.Socket.Off("appGetLocaleCompleted"); - taskCompletionSource.SetResult(local.ToString()); - }); - - BridgeConnector.Socket.Emit("appGetLocale"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetLocaleAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetLocale", "appGetLocaleCompleted", cancellationToken); /// /// Adds path to the recent documents list. This list is managed by the OS. On Windows you can visit the @@ -777,7 +690,7 @@ public async Task GetLocaleAsync(CancellationToken cancellationToken = d /// Path to add. public void AddRecentDocument(string path) { - BridgeConnector.Socket.Emit("appAddRecentDocument", path); + BridgeConnector.Emit("appAddRecentDocument", path); } /// @@ -785,7 +698,7 @@ public void AddRecentDocument(string path) /// public void ClearRecentDocuments() { - BridgeConnector.Socket.Emit("appClearRecentDocuments"); + BridgeConnector.Emit("appClearRecentDocuments"); } /// @@ -876,25 +789,7 @@ public async Task SetAsDefaultProtocolClientAsync(string protocol, string /// Arguments passed to the executable. Defaults to an empty array. /// The cancellation token. /// Whether the call succeeded. - public async Task SetAsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => - { - BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol, path, args); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task SetAsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appSetAsDefaultProtocolClient", "appSetAsDefaultProtocolClientCompleted", cancellationToken, protocol, path, args); /// /// This method checks if the current executable as the default handler for a protocol (aka URI scheme). @@ -930,25 +825,8 @@ public async Task RemoveAsDefaultProtocolClientAsync(string protocol, stri /// Defaults to an empty array. /// The cancellation token. /// Whether the call succeeded. - public async Task RemoveAsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); + public Task RemoveAsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appRemoveAsDefaultProtocolClient", "appRemoveAsDefaultProtocolClientCompleted", cancellationToken, protocol, path, args); - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => - { - BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol, path, args); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } /// /// This method checks if the current executable is the default handler for a protocol (aka URI scheme). @@ -1002,25 +880,8 @@ public async Task IsDefaultProtocolClientAsync(string protocol, string pat /// Defaults to an empty array. /// The cancellation token. /// Whether the current executable is the default handler for a protocol (aka URI scheme). - public async Task IsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); + public Task IsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appIsDefaultProtocolClient", "appIsDefaultProtocolClientCompleted", cancellationToken, protocol, path, args); - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => - { - BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol, path, args); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } /// /// Adds tasks to the category of the JumpList on Windows. @@ -1030,50 +891,14 @@ public async Task IsDefaultProtocolClientAsync(string protocol, string pat /// Array of objects. /// The cancellation token. /// Whether the call succeeded. - public async Task SetUserTasksAsync(UserTask[] userTasks, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appSetUserTasksCompleted", (success) => - { - BridgeConnector.Socket.Off("appSetUserTasksCompleted"); - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("appSetUserTasks", JArray.FromObject(userTasks, _jsonSerializer)); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task SetUserTasksAsync(UserTask[] userTasks, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appSetUserTasks", "appSetUserTasksCompleted", cancellationToken, JArray.FromObject(userTasks, _jsonSerializer)); /// /// Jump List settings for the application. /// /// The cancellation token. /// Jump List settings. - public async Task GetJumpListSettingsAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetJumpListSettingsCompleted", (jumpListSettings) => - { - BridgeConnector.Socket.Off("appGetJumpListSettingsCompleted"); - taskCompletionSource.SetResult(JObject.Parse(jumpListSettings.ToString()).ToObject()); - }); - - BridgeConnector.Socket.Emit("appGetJumpListSettings"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetJumpListSettingsAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetJumpListSettings", "appGetJumpListSettingsCompleted", cancellationToken); /// /// Sets or removes a custom Jump List for the application. If categories is null the previously set custom @@ -1093,7 +918,7 @@ public async Task GetJumpListSettingsAsync(CancellationToken c /// Array of objects. public void SetJumpList(JumpListCategory[] categories) { - BridgeConnector.Socket.Emit("appSetJumpList", JArray.FromObject(categories, _jsonSerializer)); + BridgeConnector.Emit("appSetJumpList", JArray.FromObject(categories, _jsonSerializer)); } /// @@ -1117,33 +942,28 @@ public void SetJumpList(JumpListCategory[] categories) /// should continue loading. And returns true if your process has sent its parameters to another instance, and /// you should immediately quit. /// - public async Task RequestSingleInstanceLockAsync(Action newInstanceOpened, CancellationToken cancellationToken = default) + public async Task RequestSingleInstanceLockAsync(Action newInstanceOpened, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.On("appRequestSingleInstanceLockCompleted", (success) => + BridgeConnector.On("appRequestSingleInstanceLockCompleted", (success) => { - BridgeConnector.Socket.Off("appRequestSingleInstanceLockCompleted"); - taskCompletionSource.SetResult((bool)success); + BridgeConnector.Off("appRequestSingleInstanceLockCompleted"); + taskCompletionSource.SetResult(success); }); - BridgeConnector.Socket.Off("secondInstance"); - BridgeConnector.Socket.On("secondInstance", (result) => + BridgeConnector.Off("secondInstance"); + BridgeConnector.On("secondInstance", (result) => { - JArray results = (JArray)result; - string[] args = results.First.ToObject(); - string workingDirectory = results.Last.ToObject(); - - newInstanceOpened(args, workingDirectory); + newInstanceOpened(result.args, result.workingDirectory); }); - BridgeConnector.Socket.Emit("appRequestSingleInstanceLock"); + BridgeConnector.Emit("appRequestSingleInstanceLock"); - return await taskCompletionSource.Task - .ConfigureAwait(false); + return await taskCompletionSource.Task.ConfigureAwait(false); } } @@ -1153,7 +973,7 @@ public async Task RequestSingleInstanceLockAsync(Action /// public void ReleaseSingleInstanceLock() { - BridgeConnector.Socket.Emit("appReleaseSingleInstanceLock"); + BridgeConnector.Emit("appReleaseSingleInstanceLock"); } /// @@ -1162,25 +982,7 @@ public void ReleaseSingleInstanceLock() /// . /// /// The cancellation token. - public async Task HasSingleInstanceLockAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appHasSingleInstanceLockCompleted", (hasLock) => - { - BridgeConnector.Socket.Off("appHasSingleInstanceLockCompleted"); - taskCompletionSource.SetResult((bool) hasLock); - }); - - BridgeConnector.Socket.Emit("appHasSingleInstanceLock"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task HasSingleInstanceLockAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appHasSingleInstanceLock", "appHasSingleInstanceLockCompleted", cancellationToken); /// /// Creates an NSUserActivity and sets it as the current activity. The activity is @@ -1208,39 +1010,22 @@ public void SetUserActivity(string type, object userInfo) /// public void SetUserActivity(string type, object userInfo, string webpageUrl) { - BridgeConnector.Socket.Emit("appSetUserActivity", type, userInfo, webpageUrl); + BridgeConnector.Emit("appSetUserActivity", type, userInfo, webpageUrl); } /// /// The type of the currently running activity. /// /// The cancellation token. - public async Task GetCurrentActivityTypeAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetCurrentActivityTypeCompleted", (activityType) => - { - BridgeConnector.Socket.Off("appGetCurrentActivityTypeCompleted"); - taskCompletionSource.SetResult(activityType.ToString()); - }); + public Task GetCurrentActivityTypeAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetCurrentActivityType", "appGetCurrentActivityTypeCompleted", cancellationToken); - BridgeConnector.Socket.Emit("appGetCurrentActivityType"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } /// /// Invalidates the current Handoff user activity. /// public void InvalidateCurrentActivity() { - BridgeConnector.Socket.Emit("appInvalidateCurrentActivity"); + BridgeConnector.Emit("appInvalidateCurrentActivity"); } /// @@ -1248,7 +1033,7 @@ public void InvalidateCurrentActivity() /// public void ResignCurrentActivity() { - BridgeConnector.Socket.Emit("appResignCurrentActivity"); + BridgeConnector.Emit("appResignCurrentActivity"); } /// @@ -1257,7 +1042,7 @@ public void ResignCurrentActivity() /// Model Id. public void SetAppUserModelId(string id) { - BridgeConnector.Socket.Emit("appSetAppUserModelId", id); + BridgeConnector.Emit("appSetAppUserModelId", id); } /// TODO: Check new parameter which is a function [App.ImportCertificate] @@ -1269,25 +1054,7 @@ public void SetAppUserModelId(string id) /// /// The cancellation token. /// Result of import. Value of 0 indicates success. - public async Task ImportCertificateAsync(ImportCertificateOptions options, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appImportCertificateCompleted", (result) => - { - BridgeConnector.Socket.Off("appImportCertificateCompleted"); - taskCompletionSource.SetResult((int) result); - }); - - BridgeConnector.Socket.Emit("appImportCertificate", JObject.FromObject(options, _jsonSerializer)); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task ImportCertificateAsync(ImportCertificateOptions options, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appImportCertificate", "appImportCertificateCompleted", cancellationToken, JObject.FromObject(options, _jsonSerializer)); /// /// Memory and cpu usage statistics of all the processes associated with the app. @@ -1297,27 +1064,7 @@ public async Task ImportCertificateAsync(ImportCertificateOptions options, /// statistics of all the processes associated with the app. /// The cancellation token. /// - public async Task GetAppMetricsAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetAppMetricsCompleted", (result) => - { - BridgeConnector.Socket.Off("appGetAppMetricsCompleted"); - var processMetrics = ((JArray)result).ToObject(); - - taskCompletionSource.SetResult(processMetrics); - }); - - BridgeConnector.Socket.Emit("appGetAppMetrics"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetAppMetricsAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetAppMetrics", "appGetAppMetricsCompleted", cancellationToken); /// /// The Graphics Feature Status from chrome://gpu/. @@ -1325,27 +1072,7 @@ public async Task GetAppMetricsAsync(CancellationToken cancella /// Note: This information is only usable after the gpu-info-update event is emitted. /// The cancellation token. /// - public async Task GetGpuFeatureStatusAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetGpuFeatureStatusCompleted", (result) => - { - BridgeConnector.Socket.Off("appGetGpuFeatureStatusCompleted"); - var gpuFeatureStatus = ((JObject)result).ToObject(); - - taskCompletionSource.SetResult(gpuFeatureStatus); - }); - - BridgeConnector.Socket.Emit("appGetGpuFeatureStatus"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetGpuFeatureStatusAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetGpuFeatureStatus", "appGetGpuFeatureStatusCompleted", cancellationToken); /// /// Sets the counter badge for current app. Setting the count to 0 will hide the badge. @@ -1357,49 +1084,13 @@ public async Task GetGpuFeatureStatusAsync(CancellationToken c /// Counter badge. /// The cancellation token. /// Whether the call succeeded. - public async Task SetBadgeCountAsync(int count, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appSetBadgeCountCompleted", (success) => - { - BridgeConnector.Socket.Off("appSetBadgeCountCompleted"); - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("appSetBadgeCount", count); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task SetBadgeCountAsync(int count, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appSetBadgeCount", "appSetBadgeCountCompleted", cancellationToken, count); /// /// The current value displayed in the counter badge. /// /// The cancellation token. - public async Task GetBadgeCountAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetBadgeCountCompleted", (count) => - { - BridgeConnector.Socket.Off("appGetBadgeCountCompleted"); - taskCompletionSource.SetResult((int)count); - }); - - BridgeConnector.Socket.Emit("appGetBadgeCount"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetBadgeCountAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appGetBadgeCount", "appGetBadgeCountCompleted", cancellationToken); /// /// A object that allows you to read and manipulate the command line arguments that Chromium uses. @@ -1410,25 +1101,7 @@ public async Task GetBadgeCountAsync(CancellationToken cancellationToken = /// Whether the current desktop environment is Unity launcher. /// /// The cancellation token. - public async Task IsUnityRunningAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appIsUnityRunningCompleted", (isUnityRunning) => - { - BridgeConnector.Socket.Off("appIsUnityRunningCompleted"); - taskCompletionSource.SetResult((bool)isUnityRunning); - }); - - BridgeConnector.Socket.Emit("appIsUnityRunning"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task IsUnityRunningAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appIsUnityRunning", "appIsUnityRunningCompleted", cancellationToken); /// /// If you provided path and args options to then you need to pass the same @@ -1445,35 +1118,9 @@ public async Task GetLoginItemSettingsAsync(CancellationToken /// /// /// The cancellation token. - public async Task GetLoginItemSettingsAsync(LoginItemSettingsOptions options, CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appGetLoginItemSettingsCompleted", (loginItemSettings) => - { - BridgeConnector.Socket.Off("appGetLoginItemSettingsCompleted"); - - var result = ((JObject) loginItemSettings).ToObject(); - - taskCompletionSource.SetResult(result); - }); - - if (options == null) - { - BridgeConnector.Socket.Emit("appGetLoginItemSettings"); - } - else - { - BridgeConnector.Socket.Emit("appGetLoginItemSettings", JObject.FromObject(options, _jsonSerializer)); - } - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetLoginItemSettingsAsync(LoginItemSettingsOptions options, CancellationToken cancellationToken = default) => + options is null ? BridgeConnector.OnResult("appGetLoginItemSettings", "appGetLoginItemSettingsCompleted", cancellationToken) + : BridgeConnector.OnResult("appGetLoginItemSettings", "appGetLoginItemSettingsCompleted", cancellationToken, JObject.FromObject(options, _jsonSerializer)); /// /// Set the app's login item settings. @@ -1483,7 +1130,7 @@ public async Task GetLoginItemSettingsAsync(LoginItemSettings /// public void SetLoginItemSettings(LoginSettings loginSettings) { - BridgeConnector.Socket.Emit("appSetLoginItemSettings", JObject.FromObject(loginSettings, _jsonSerializer)); + BridgeConnector.Emit("appSetLoginItemSettings", JObject.FromObject(loginSettings, _jsonSerializer)); } /// @@ -1492,25 +1139,8 @@ public void SetLoginItemSettings(LoginSettings loginSettings) /// See Chromium's accessibility docs for more details. /// /// if Chrome’s accessibility support is enabled, otherwise. - public async Task IsAccessibilitySupportEnabledAsync(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appIsAccessibilitySupportEnabledCompleted", (isAccessibilitySupportEnabled) => - { - BridgeConnector.Socket.Off("appIsAccessibilitySupportEnabledCompleted"); - taskCompletionSource.SetResult((bool)isAccessibilitySupportEnabled); - }); + public Task IsAccessibilitySupportEnabledAsync(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appIsAccessibilitySupportEnabled", "appIsAccessibilitySupportEnabledCompleted", cancellationToken); - BridgeConnector.Socket.Emit("appIsAccessibilitySupportEnabled"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } /// /// Manually enables Chrome's accessibility support, allowing to expose accessibility switch to users in application settings. @@ -1524,7 +1154,7 @@ public async Task IsAccessibilitySupportEnabledAsync(CancellationToken can /// Enable or disable accessibility tree rendering. public void SetAccessibilitySupportEnabled(bool enabled) { - BridgeConnector.Socket.Emit("appSetAboutPanelOptions", enabled); + BridgeConnector.Emit("appSetAboutPanelOptions", enabled); } /// @@ -1533,7 +1163,7 @@ public void SetAccessibilitySupportEnabled(bool enabled) /// public void ShowAboutPanel() { - BridgeConnector.Socket.Emit("appShowAboutPanel"); + BridgeConnector.Emit("appShowAboutPanel"); } /// @@ -1549,7 +1179,7 @@ public void ShowAboutPanel() /// About panel options. public void SetAboutPanelOptions(AboutPanelOptions options) { - BridgeConnector.Socket.Emit("appSetAboutPanelOptions", JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("appSetAboutPanelOptions", JObject.FromObject(options, _jsonSerializer)); } /// @@ -1562,14 +1192,9 @@ public void SetAboutPanelOptions(AboutPanelOptions options) /// public string UserAgentFallback { - [Obsolete("Use the asynchronous version UserAgentFallbackAsync instead")] - get - { - return UserAgentFallbackAsync.Result; - } set { - BridgeConnector.Socket.Emit("appSetUserAgentFallback", value); + BridgeConnector.Emit("appSetUserAgentFallback", value); } } @@ -1581,26 +1206,7 @@ public string UserAgentFallback /// custom value as early as possible in your app's initialization to ensure that your overridden value /// is used. /// - public Task UserAgentFallbackAsync - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetUserAgentFallbackCompleted", (result) => - { - BridgeConnector.Socket.Off("appGetUserAgentFallbackCompleted"); - taskCompletionSource.SetResult((string)result); - }); - - BridgeConnector.Socket.Emit("appGetUserAgentFallback"); - - return taskCompletionSource.Task; - }); - } - } + public Task GetUserAgentFallbackAsync() => BridgeConnector.OnResult("appGetUserAgentFallback", "appGetUserAgentFallbackCompleted"); internal void PreventQuit() { @@ -1615,28 +1221,32 @@ internal void PreventQuit() /// /// The event name /// The handler - public void On(string eventName, Action fn) - => Events.Instance.On(ModuleName, eventName, fn); + public void On(string eventName, Action fn) => Events.Instance.On(ModuleName, eventName, fn); + /// /// Subscribe to an unmapped event on the module. /// /// The event name /// The handler - public void On(string eventName, Action fn) - => Events.Instance.On(ModuleName, eventName, fn); + public void On(string eventName, Action fn) => Events.Instance.On(ModuleName, eventName, fn); + /// /// Subscribe to an unmapped event on the module once. /// /// The event name /// The handler - public void Once(string eventName, Action fn) - => Events.Instance.Once(ModuleName, eventName, fn); + public void Once(string eventName, Action fn) => Events.Instance.Once(ModuleName, eventName, fn); + /// /// Subscribe to an unmapped event on the module once. /// /// The event name /// The handler - public void Once(string eventName, Action fn) - => Events.Instance.Once(ModuleName, eventName, fn); + public void Once(string eventName, Action fn) => Events.Instance.Once(ModuleName, eventName, fn); + + private readonly JsonSerializer _jsonSerializer = new JsonSerializer() + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }; } } \ No newline at end of file diff --git a/ElectronNET.API/AutoUpdater.cs b/ElectronNET.API/AutoUpdater.cs index da1001fa..d21ed041 100644 --- a/ElectronNET.API/AutoUpdater.cs +++ b/ElectronNET.API/AutoUpdater.cs @@ -16,28 +16,40 @@ public sealed class AutoUpdater /// /// Whether to automatically download an update when it is found. (Default is true) /// - public bool AutoDownload - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); + public Task IsAutoDownloadEnabledAsync() => BridgeConnector.OnResult("autoUpdater-autoDownload-get", "autoUpdater-autoDownload-get-reply"); - BridgeConnector.Socket.On("autoUpdater-autoDownload-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-autoDownload-get-reply"); - taskCompletionSource.SetResult((bool)result); - }); + /// + /// Whether to automatically install a downloaded update on app quit (if `QuitAndInstall` was not called before). + /// + /// Applicable only on Windows and Linux. + /// + public Task IsAutoInstallOnAppQuitEnabledAsync() => BridgeConnector.OnResult("autoUpdater-autoInstallOnAppQuit-get", "autoUpdater-autoInstallOnAppQuit-get-reply"); + + /// + /// *GitHub provider only.* Whether to allow update to pre-release versions. + /// Defaults to "true" if application version contains prerelease components (e.g. "0.12.1-alpha.1", here "alpha" is a prerelease component), otherwise "false". + /// + /// If "true", downgrade will be allowed("allowDowngrade" will be set to "true"). + /// + public Task IsAllowPrereleaseEnabledAsync() => BridgeConnector.OnResult("autoUpdater-allowPrerelease-get", "autoUpdater-allowPrerelease-get-reply"); - BridgeConnector.Socket.Emit("autoUpdater-autoDownload-get"); + /// + /// *GitHub provider only.* + /// Get all release notes (from current version to latest), not just the latest (Default is false). + /// + public Task IsFullChangeLogEnabledAsync() => BridgeConnector.OnResult("autoUpdater-fullChangelog-get", "autoUpdater-fullChangelog-get-reply"); - return taskCompletionSource.Task; - }).Result; - } + public Task IsAllowDowngradeEnabledAsync() => BridgeConnector.OnResult("autoUpdater-allowDowngrade-get", "autoUpdater-allowDowngrade-get-reply"); + + + /// + /// Whether to automatically download an update when it is found. (Default is true) + /// + public bool AutoDownload + { set { - BridgeConnector.Socket.Emit("autoUpdater-autoDownload-set", value); + BridgeConnector.Emit("autoUpdater-autoDownload-set", value); } } @@ -48,26 +60,9 @@ public bool AutoDownload /// public bool AutoInstallOnAppQuit { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-autoInstallOnAppQuit-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-autoInstallOnAppQuit-get-reply"); - taskCompletionSource.SetResult((bool)result); - }); - - BridgeConnector.Socket.Emit("autoUpdater-autoInstallOnAppQuit-get"); - - return taskCompletionSource.Task; - }).Result; - } set { - BridgeConnector.Socket.Emit("autoUpdater-autoInstallOnAppQuit-set", value); + BridgeConnector.Emit("autoUpdater-autoInstallOnAppQuit-set", value); } } @@ -79,26 +74,9 @@ public bool AutoInstallOnAppQuit /// public bool AllowPrerelease { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-allowPrerelease-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-allowPrerelease-get-reply"); - taskCompletionSource.SetResult((bool)result); - }); - - BridgeConnector.Socket.Emit("autoUpdater-allowPrerelease-get"); - - return taskCompletionSource.Task; - }).Result; - } set { - BridgeConnector.Socket.Emit("autoUpdater-allowPrerelease-set", value); + BridgeConnector.Emit("autoUpdater-allowPrerelease-set", value); } } @@ -108,26 +86,9 @@ public bool AllowPrerelease /// public bool FullChangelog { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-fullChangelog-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-fullChangelog-get-reply"); - taskCompletionSource.SetResult((bool)result); - }); - - BridgeConnector.Socket.Emit("autoUpdater-fullChangelog-get"); - - return taskCompletionSource.Task; - }).Result; - } set { - BridgeConnector.Socket.Emit("autoUpdater-fullChangelog-set", value); + BridgeConnector.Emit("autoUpdater-fullChangelog-set", value); } } @@ -138,137 +99,32 @@ public bool FullChangelog /// public bool AllowDowngrade { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-allowDowngrade-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-allowDowngrade-get-reply"); - taskCompletionSource.SetResult((bool)result); - }); - - BridgeConnector.Socket.Emit("autoUpdater-allowDowngrade-get"); - - return taskCompletionSource.Task; - }).Result; - } set { - BridgeConnector.Socket.Emit("autoUpdater-allowDowngrade-set", value); + BridgeConnector.Emit("autoUpdater-allowDowngrade-set", value); } } /// /// For test only. /// - public string UpdateConfigPath - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-updateConfigPath-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-updateConfigPath-get-reply"); - taskCompletionSource.SetResult(result.ToString()); - }); - - BridgeConnector.Socket.Emit("autoUpdater-updateConfigPath-get"); - - return taskCompletionSource.Task; - }).Result; - } - } + public Task GetUpdateConfigPathAsync() => BridgeConnector.OnResult("autoUpdater-updateConfigPath-get", "autoUpdater-updateConfigPath-get-reply"); /// /// The current application version /// - public Task CurrentVersionAsync - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-currentVersion-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-currentVersion-get-reply"); - SemVer version = ((JObject)result).ToObject(); - taskCompletionSource.SetResult(version); - }); - BridgeConnector.Socket.Emit("autoUpdater-currentVersion-get"); - - return taskCompletionSource.Task; - }); - } - } + public Task GetCurrentVersionAsync() => BridgeConnector.OnResult("autoUpdater-updateConcurrentVersionfigPath-get", "autoUpdater-currentVersion-get-reply"); /// /// Get the update channel. Not applicable for GitHub. /// Doesn’t return channel from the update configuration, only if was previously set. /// - [Obsolete("Use the asynchronous version ChannelAsync instead")] - public string Channel - { - get - { - return ChannelAsync.Result; - } - } - - /// - /// Get the update channel. Not applicable for GitHub. - /// Doesn’t return channel from the update configuration, only if was previously set. - /// - public Task ChannelAsync - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("autoUpdater-channel-get-reply", (result) => - { - BridgeConnector.Socket.Off("autoUpdater-channel-get-reply"); - taskCompletionSource.SetResult(result.ToString()); - }); - BridgeConnector.Socket.Emit("autoUpdater-channel-get"); - - return taskCompletionSource.Task; - }); - } - } - - + public Task GetChannelAsync() => BridgeConnector.OnResult("autoUpdater-channel-get", "autoUpdater-channel-get-reply"); /// /// The request headers. /// - public Task> RequestHeadersAsync - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource>(); - BridgeConnector.Socket.On("autoUpdater-requestHeaders-get-reply", (headers) => - { - BridgeConnector.Socket.Off("autoUpdater-requestHeaders-get-reply"); - Dictionary result = ((JObject)headers).ToObject>(); - taskCompletionSource.SetResult(result); - }); - BridgeConnector.Socket.Emit("autoUpdater-requestHeaders-get"); - return taskCompletionSource.Task; - }); - } - } + public Task> GetRequestHeadersAsync() => BridgeConnector.OnResult>("autoUpdater-requestHeaders-get", "autoUpdater-requestHeaders-get-reply"); /// /// The request headers. @@ -277,7 +133,7 @@ public Dictionary RequestHeaders { set { - BridgeConnector.Socket.Emit("autoUpdater-requestHeaders-set", JObject.FromObject(value, _jsonSerializer)); + BridgeConnector.Emit("autoUpdater-requestHeaders-set", value); } } @@ -290,12 +146,12 @@ public event Action OnError { if (_error == null) { - BridgeConnector.Socket.On("autoUpdater-error" + GetHashCode(), (message) => + BridgeConnector.On("autoUpdater-error" + GetHashCode(), (message) => { _error(message.ToString()); }); - BridgeConnector.Socket.Emit("register-autoUpdater-error-event", GetHashCode()); + BridgeConnector.Emit("register-autoUpdater-error-event", GetHashCode()); } _error += value; } @@ -304,7 +160,7 @@ public event Action OnError _error -= value; if (_error == null) - BridgeConnector.Socket.Off("autoUpdater-error" + GetHashCode()); + BridgeConnector.Off("autoUpdater-error" + GetHashCode()); } } @@ -319,12 +175,12 @@ public event Action OnCheckingForUpdate { if (_checkingForUpdate == null) { - BridgeConnector.Socket.On("autoUpdater-checking-for-update" + GetHashCode(), () => + BridgeConnector.On("autoUpdater-checking-for-update" + GetHashCode(), () => { _checkingForUpdate(); }); - BridgeConnector.Socket.Emit("register-autoUpdater-checking-for-update-event", GetHashCode()); + BridgeConnector.Emit("register-autoUpdater-checking-for-update-event", GetHashCode()); } _checkingForUpdate += value; } @@ -333,7 +189,7 @@ public event Action OnCheckingForUpdate _checkingForUpdate -= value; if (_checkingForUpdate == null) - BridgeConnector.Socket.Off("autoUpdater-checking-for-update" + GetHashCode()); + BridgeConnector.Off("autoUpdater-checking-for-update" + GetHashCode()); } } @@ -349,12 +205,12 @@ public event Action OnUpdateAvailable { if (_updateAvailable == null) { - BridgeConnector.Socket.On("autoUpdater-update-available" + GetHashCode(), (updateInfo) => + BridgeConnector.On("autoUpdater-update-available" + GetHashCode(), (updateInfo) => { - _updateAvailable(JObject.Parse(updateInfo.ToString()).ToObject()); + _updateAvailable(updateInfo); }); - BridgeConnector.Socket.Emit("register-autoUpdater-update-available-event", GetHashCode()); + BridgeConnector.Emit("register-autoUpdater-update-available-event", GetHashCode()); } _updateAvailable += value; } @@ -363,7 +219,7 @@ public event Action OnUpdateAvailable _updateAvailable -= value; if (_updateAvailable == null) - BridgeConnector.Socket.Off("autoUpdater-update-available" + GetHashCode()); + BridgeConnector.Off("autoUpdater-update-available" + GetHashCode()); } } @@ -378,12 +234,12 @@ public event Action OnUpdateNotAvailable { if (_updateNotAvailable == null) { - BridgeConnector.Socket.On("autoUpdater-update-not-available" + GetHashCode(), (updateInfo) => + BridgeConnector.On("autoUpdater-update-not-available" + GetHashCode(), (updateInfo) => { - _updateNotAvailable(JObject.Parse(updateInfo.ToString()).ToObject()); + _updateNotAvailable(updateInfo); }); - BridgeConnector.Socket.Emit("register-autoUpdater-update-not-available-event", GetHashCode()); + BridgeConnector.Emit("register-autoUpdater-update-not-available-event", GetHashCode()); } _updateNotAvailable += value; } @@ -392,7 +248,7 @@ public event Action OnUpdateNotAvailable _updateNotAvailable -= value; if (_updateNotAvailable == null) - BridgeConnector.Socket.Off("autoUpdater-update-not-available" + GetHashCode()); + BridgeConnector.Off("autoUpdater-update-not-available" + GetHashCode()); } } @@ -407,12 +263,12 @@ public event Action OnDownloadProgress { if (_downloadProgress == null) { - BridgeConnector.Socket.On("autoUpdater-download-progress" + GetHashCode(), (progressInfo) => + BridgeConnector.On("autoUpdater-download-progress" + GetHashCode(), (progressInfo) => { - _downloadProgress(JObject.Parse(progressInfo.ToString()).ToObject()); + _downloadProgress(progressInfo); }); - BridgeConnector.Socket.Emit("register-autoUpdater-download-progress-event", GetHashCode()); + BridgeConnector.Emit("register-autoUpdater-download-progress-event", GetHashCode()); } _downloadProgress += value; } @@ -421,7 +277,7 @@ public event Action OnDownloadProgress _downloadProgress -= value; if (_downloadProgress == null) - BridgeConnector.Socket.Off("autoUpdater-download-progress" + GetHashCode()); + BridgeConnector.Off("autoUpdater-download-progress" + GetHashCode()); } } @@ -436,12 +292,12 @@ public event Action OnUpdateDownloaded { if (_updateDownloaded == null) { - BridgeConnector.Socket.On("autoUpdater-update-downloaded" + GetHashCode(), (updateInfo) => + BridgeConnector.On("autoUpdater-update-downloaded" + GetHashCode(), (updateInfo) => { - _updateDownloaded(JObject.Parse(updateInfo.ToString()).ToObject()); + _updateDownloaded(updateInfo); }); - BridgeConnector.Socket.Emit("register-autoUpdater-update-downloaded-event", GetHashCode()); + BridgeConnector.Emit("register-autoUpdater-update-downloaded-event", GetHashCode()); } _updateDownloaded += value; } @@ -450,7 +306,7 @@ public event Action OnUpdateDownloaded _updateDownloaded -= value; if (_updateDownloaded == null) - BridgeConnector.Socket.Off("autoUpdater-update-downloaded" + GetHashCode()); + BridgeConnector.Off("autoUpdater-update-downloaded" + GetHashCode()); } } @@ -486,33 +342,33 @@ internal static AutoUpdater Instance /// public Task CheckForUpdatesAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("autoUpdaterCheckForUpdatesComplete" + guid, (updateCheckResult) => + BridgeConnector.On("autoUpdaterCheckForUpdatesComplete" + guid, (updateCheckResult) => { try { - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesComplete" + guid); - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesError" + guid); - taskCompletionSource.SetResult(JObject.Parse(updateCheckResult.ToString()).ToObject()); + BridgeConnector.Off("autoUpdaterCheckForUpdatesComplete" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesError" + guid); + taskCompletionSource.SetResult(updateCheckResult); } catch (Exception ex) { taskCompletionSource.SetException(ex); } }); - BridgeConnector.Socket.On("autoUpdaterCheckForUpdatesError" + guid, (error) => + BridgeConnector.On("autoUpdaterCheckForUpdatesError" + guid, (error) => { - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesComplete" + guid); - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesError" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesComplete" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesError" + guid); string message = "An error occurred in CheckForUpdatesAsync"; if (error != null && !string.IsNullOrEmpty(error.ToString())) message = JsonConvert.SerializeObject(error); taskCompletionSource.SetException(new Exception(message)); }); - BridgeConnector.Socket.Emit("autoUpdaterCheckForUpdates", guid); + BridgeConnector.Emit("autoUpdaterCheckForUpdates", guid); return taskCompletionSource.Task; } @@ -525,36 +381,36 @@ public Task CheckForUpdatesAsync() /// public Task CheckForUpdatesAndNotifyAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("autoUpdaterCheckForUpdatesAndNotifyComplete" + guid, (updateCheckResult) => + BridgeConnector.On("autoUpdaterCheckForUpdatesAndNotifyComplete" + guid, (updateCheckResult) => { try { - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesAndNotifyComplete" + guid); - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesAndNotifyError" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesAndNotifyComplete" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesAndNotifyError" + guid); if (updateCheckResult == null) taskCompletionSource.SetResult(null); else - taskCompletionSource.SetResult(JObject.Parse(updateCheckResult.ToString()).ToObject()); + taskCompletionSource.SetResult(updateCheckResult); } catch (Exception ex) { taskCompletionSource.SetException(ex); } }); - BridgeConnector.Socket.On("autoUpdaterCheckForUpdatesAndNotifyError" + guid, (error) => + BridgeConnector.On("autoUpdaterCheckForUpdatesAndNotifyError" + guid, (error) => { - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesAndNotifyComplete" + guid); - BridgeConnector.Socket.Off("autoUpdaterCheckForUpdatesAndNotifyError" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesAndNotifyComplete" + guid); + BridgeConnector.Off("autoUpdaterCheckForUpdatesAndNotifyError" + guid); string message = "An error occurred in autoUpdaterCheckForUpdatesAndNotify"; if (error != null) message = JsonConvert.SerializeObject(error); taskCompletionSource.SetException(new Exception(message)); }); - BridgeConnector.Socket.Emit("autoUpdaterCheckForUpdatesAndNotify", guid); + BridgeConnector.Emit("autoUpdaterCheckForUpdatesAndNotify", guid); return taskCompletionSource.Task; } @@ -570,7 +426,7 @@ public Task CheckForUpdatesAndNotifyAsync() /// Run the app after finish even on silent install. Not applicable for macOS. Ignored if `isSilent` is set to `false`. public void QuitAndInstall(bool isSilent = false, bool isForceRunAfter = false) { - BridgeConnector.Socket.Emit("autoUpdaterQuitAndInstall", isSilent, isForceRunAfter); + BridgeConnector.EmitSync("autoUpdaterQuitAndInstall", isSilent, isForceRunAfter); } /// @@ -579,16 +435,16 @@ public void QuitAndInstall(bool isSilent = false, bool isForceRunAfter = false) /// Path to downloaded file. public Task DownloadUpdateAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("autoUpdaterDownloadUpdateComplete" + guid, (downloadedPath) => + BridgeConnector.On("autoUpdaterDownloadUpdateComplete" + guid, (downloadedPath) => { - BridgeConnector.Socket.Off("autoUpdaterDownloadUpdateComplete" + guid); + BridgeConnector.Off("autoUpdaterDownloadUpdateComplete" + guid); taskCompletionSource.SetResult(downloadedPath.ToString()); }); - BridgeConnector.Socket.Emit("autoUpdaterDownloadUpdate", guid); + BridgeConnector.Emit("autoUpdaterDownloadUpdate", guid); return taskCompletionSource.Task; } @@ -599,23 +455,18 @@ public Task DownloadUpdateAsync() /// Feed URL. public Task GetFeedURLAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("autoUpdaterGetFeedURLComplete" + guid, (downloadedPath) => + BridgeConnector.On("autoUpdaterGetFeedURLComplete" + guid, (downloadedPath) => { - BridgeConnector.Socket.Off("autoUpdaterGetFeedURLComplete" + guid); + BridgeConnector.Off("autoUpdaterGetFeedURLComplete" + guid); taskCompletionSource.SetResult(downloadedPath.ToString()); }); - BridgeConnector.Socket.Emit("autoUpdaterGetFeedURL", guid); + BridgeConnector.Emit("autoUpdaterGetFeedURL", guid); return taskCompletionSource.Task; } - - private readonly JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }; } } diff --git a/ElectronNET.API/BridgeConnector.cs b/ElectronNET.API/BridgeConnector.cs index 08a84745..1088f9e1 100644 --- a/ElectronNET.API/BridgeConnector.cs +++ b/ElectronNET.API/BridgeConnector.cs @@ -1,44 +1,318 @@ -using Quobject.SocketIoClientDotNet.Client; -using System; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using SocketIOClient; +using SocketIOClient.JsonSerializer; +using SocketIOClient.Newtonsoft.Json; namespace ElectronNET.API { internal static class BridgeConnector { - private static Socket _socket; + internal static class EventTasks + { + //Although SocketIO already manage event handlers, we need to manage this here as well for the OnResult calls, + //because SocketIO will simply replace the existing event handler on every call to On(key, ...) , which means there is + //a race condition between On / Off calls that can lead to tasks deadlocking forever without ever triggering their On handler + + private static readonly Dictionary> _taskCompletionSources = new(); + private static readonly Dictionary _eventKeys = new(); + private static readonly object _lock = new(); + + /// + /// Get or add a new TaskCompletionSource for a given event key + /// + /// + /// + /// + /// + /// Returns true if a new TaskCompletionSource was added to the dictionary + internal static bool TryGetOrAdd(string key, string eventKey, out TaskCompletionSource taskCompletionSource, out Task waitThisFirstAndThenTryAgain) + { + lock (_lock) + { + if (!_taskCompletionSources.TryGetValue(key, out taskCompletionSource)) + { + taskCompletionSource = new(TaskCreationOptions.RunContinuationsAsynchronously); + _taskCompletionSources[key] = taskCompletionSource; + _eventKeys[key] = eventKey; + waitThisFirstAndThenTryAgain = null; + return true; //Was added, so we need to also register the socket events + } + + if(_eventKeys.TryGetValue(key, out var existingEventKey) && existingEventKey == eventKey) + { + waitThisFirstAndThenTryAgain = null; + return false; //No need to register the socket events twice + } + + waitThisFirstAndThenTryAgain = taskCompletionSource.Task; //Will need to try again after the previous existing one is done + + taskCompletionSource = null; + + return true; //Need to register the socket events, but must first await the previous task to complete + } + } + + /// + /// Clean up the TaskCompletionSource from the dictionary if and only if it is the same as the passed argument + /// + /// + /// + /// + internal static void DoneWith(string key, string eventKey, TaskCompletionSource taskCompletionSource) + { + lock (_lock) + { + if (_taskCompletionSources.TryGetValue(key, out var existingTaskCompletionSource) + && ReferenceEquals(existingTaskCompletionSource, taskCompletionSource)) + { + _taskCompletionSources.Remove(key); + } + + if (_eventKeys.TryGetValue(key, out var existingEventKey) && existingEventKey == eventKey) + { + _eventKeys.Remove(key); + } + } + } + } + + private static SocketIO _socket; + private static object _syncRoot = new object(); - public static Socket Socket + public static void Emit(string eventString, params object[] args) { - get + //We don't care about waiting for the event to be emitted, so this doesn't need to be async + + Task.Run(async () => + { + if (App.SocketDebug) + { + Console.WriteLine($"Sending event {eventString}"); + } + + await Socket.EmitAsync(eventString, args); + + if (App.SocketDebug) + { + Console.WriteLine($"Sent event {eventString}"); + } + }); + } + + /// + /// This method is only used on places where we need to be sure the event was sent on the socket, such as Quit, Exit, Relaunch and QuitAndInstall methods + /// + /// + /// + internal static void EmitSync(string eventString, params object[] args) + { + if (App.SocketDebug) + { + Console.WriteLine($"Sending event {eventString}"); + } + + Socket.EmitAsync(eventString, args).Wait(); + + if (App.SocketDebug) + { + Console.WriteLine($"Sent event {eventString}"); + } + } + + public static void Off(string eventString) + { + Socket.Off(eventString); + } + + public static void On(string eventString, Action fn) + { + Socket.On(eventString, _ => fn()); + } + + public static void On(string eventString, Action fn) + { + Socket.On(eventString, (o) => fn(o.GetValue(0))); + } + + public static void Once(string eventString, Action fn) + { + On(eventString, (o) => + { + Off(eventString); + fn(o); + }); + } + + public static async Task OnResult(string triggerEvent, string completedEvent, params object[] args) + { + string eventKey = completedEvent; + + if (args is object && args.Length > 0) // If there are arguments passed, we generate a unique event key with the arguments + // this allow us to wait for previous events first before registering new ones + { + var hash = new HashCode(); + foreach(var obj in args) + { + hash.Add(obj); + } + eventKey = $"{eventKey}-{(uint)hash.ToHashCode()}"; + } + + if (EventTasks.TryGetOrAdd(completedEvent, eventKey, out var taskCompletionSource, out var waitThisFirstAndThenTryAgain)) + { + if (waitThisFirstAndThenTryAgain is object) + { + //There was a pending call with different parameters, so we need to wait that first and then call here again + try + { + await waitThisFirstAndThenTryAgain; + } + catch + { + //Ignore any exceptions here so we can set a new event below + //The exception will also be visible to the original first caller due to taskCompletionSource.Task + } + + //Try again to set the event + return await OnResult(triggerEvent, completedEvent, args); + } + else + { + //A new TaskCompletionSource was added, so we need to register the completed event here + + On(completedEvent, (result) => + { + Off(completedEvent); + taskCompletionSource.SetResult(result); + EventTasks.DoneWith(completedEvent, eventKey, taskCompletionSource); + }); + + Emit(triggerEvent, args); + } + } + + return await taskCompletionSource.Task; + } + + + public static async Task OnResult(string triggerEvent, string completedEvent, CancellationToken cancellationToken, params object[] args) + { + string eventKey = completedEvent; + + if (args is object && args.Length > 0) // If there are arguments passed, we generate a unique event key with the arguments + // this allow us to wait for previous events first before registering new ones { - if(_socket == null && HybridSupport.IsElectronActive) + var hash = new HashCode(); + foreach (var obj in args) + { + hash.Add(obj); + } + eventKey = $"{eventKey}-{(uint)hash.ToHashCode()}"; + } + + if (EventTasks.TryGetOrAdd(completedEvent, eventKey, out var taskCompletionSource, out var waitThisFirstAndThenTryAgain)) + { + if (waitThisFirstAndThenTryAgain is object) + { + //There was a pending call with different parameters, so we need to wait that first and then call here again + try + { + await Task.Run(() => waitThisFirstAndThenTryAgain, cancellationToken); + } + catch + { + //Ignore any exceptions here so we can set a new event below + //The exception will also be visible to the original first caller due to taskCompletionSource.Task + } + + //Try again to set the event + return await OnResult(triggerEvent, completedEvent, cancellationToken, args); + } + else { - lock (_syncRoot) + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - if (_socket == null && HybridSupport.IsElectronActive) + //A new TaskCompletionSource was added, so we need to register the completed event here + + On(completedEvent, (result) => { - _socket = IO.Socket("http://localhost:" + BridgeSettings.SocketPort); - _socket.On(Socket.EVENT_CONNECT, () => - { - Console.WriteLine("BridgeConnector connected!"); - }); - } + Off(completedEvent); + taskCompletionSource.SetResult(result); + EventTasks.DoneWith(completedEvent, eventKey, taskCompletionSource); + }); + + Emit(triggerEvent, args); } } - else if(_socket == null && !HybridSupport.IsElectronActive) + } + + return await taskCompletionSource.Task; + } + private static SocketIO Socket + { + get + { + if (_socket is null) { - lock (_syncRoot) + if (HybridSupport.IsElectronActive) { - if (_socket == null && !HybridSupport.IsElectronActive) + + lock (_syncRoot) { - _socket = IO.Socket(new Uri("http://localhost"), new IO.Options { AutoConnect = false }); + if (_socket is null && HybridSupport.IsElectronActive) + { + var socket = new SocketIO($"http://localhost:{BridgeSettings.SocketPort}", new SocketIOOptions() + { + EIO = 3 + }); + + socket.JsonSerializer = new CamelCaseNewtonsoftJsonSerializer(socket.Options.EIO); + + + socket.OnConnected += (_, __) => + { + Console.WriteLine("BridgeConnector connected!"); + }; + + socket.ConnectAsync().Wait(); + + _socket = socket; + } } } + else + { + throw new Exception("Missing Socket Port"); + } } return _socket; } } + + private class CamelCaseNewtonsoftJsonSerializer : NewtonsoftJsonSerializer + { + public CamelCaseNewtonsoftJsonSerializer(int eio) : base(eio) + { + } + + public override JsonSerializerSettings CreateOptions() + { + return new JsonSerializerSettings() + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + NullValueHandling = NullValueHandling.Ignore, + DefaultValueHandling = DefaultValueHandling.Ignore + }; + } + } } } diff --git a/ElectronNET.API/BridgeSettings.cs b/ElectronNET.API/BridgeSettings.cs index 96a2653a..daa230a1 100644 --- a/ElectronNET.API/BridgeSettings.cs +++ b/ElectronNET.API/BridgeSettings.cs @@ -20,5 +20,16 @@ public static class BridgeSettings /// The web port. /// public static string WebPort { get; internal set; } + + /// + /// Manually set the port values instead of using the UseElectron extension method + /// + /// + /// + public static void InitializePorts(int socketPort, int webPort) + { + SocketPort = socketPort.ToString(); + WebPort = webPort.ToString(); + } } } diff --git a/ElectronNET.API/BrowserView.cs b/ElectronNET.API/BrowserView.cs index 96bddd7f..09a44cbd 100644 --- a/ElectronNET.API/BrowserView.cs +++ b/ElectronNET.API/BrowserView.cs @@ -31,29 +31,11 @@ public class BrowserView /// /// (experimental) /// - public Rectangle Bounds - { - get - { - return Task.Run(() => - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserView-getBounds-reply", (result) => - { - BridgeConnector.Socket.Off("browserView-getBounds-reply"); - taskCompletionSource.SetResult((Rectangle)result); - }); - - BridgeConnector.Socket.Emit("browserView-getBounds", Id); + public Task GetBoundsAsync() => BridgeConnector.OnResult("browserView-getBounds", "browserView-getBounds-reply" + Id, Id); - return taskCompletionSource.Task; - }).Result; - } - set - { - BridgeConnector.Socket.Emit("browserView-setBounds", Id, JObject.FromObject(value, _jsonSerializer)); - } + public void SetBounds(Rectangle value) + { + BridgeConnector.Emit("browserView-setBounds", Id, value); } /// @@ -74,7 +56,7 @@ internal BrowserView(int id) /// public void SetAutoResize(AutoResizeOptions options) { - BridgeConnector.Socket.Emit("browserView-setAutoResize", Id, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("browserView-setAutoResize", Id, options); } /// @@ -85,13 +67,7 @@ public void SetAutoResize(AutoResizeOptions options) /// Color in #aarrggbb or #argb form. The alpha channel is optional. public void SetBackgroundColor(string color) { - BridgeConnector.Socket.Emit("browserView-setBackgroundColor", Id, color); + BridgeConnector.Emit("browserView-setBackgroundColor", Id, color); } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore - }; } } diff --git a/ElectronNET.API/BrowserWindow.cs b/ElectronNET.API/BrowserWindow.cs index 2c4590ac..0b8222c5 100644 --- a/ElectronNET.API/BrowserWindow.cs +++ b/ElectronNET.API/BrowserWindow.cs @@ -34,12 +34,12 @@ public event Action OnReadyToShow { if (_readyToShow == null) { - BridgeConnector.Socket.On("browserWindow-ready-to-show" + Id, () => + BridgeConnector.On("browserWindow-ready-to-show" + Id, () => { _readyToShow(); }); - BridgeConnector.Socket.Emit("register-browserWindow-ready-to-show", Id); + BridgeConnector.Emit("register-browserWindow-ready-to-show", Id); } _readyToShow += value; } @@ -48,7 +48,7 @@ public event Action OnReadyToShow _readyToShow -= value; if (_readyToShow == null) - BridgeConnector.Socket.Off("browserWindow-ready-to-show" + Id); + BridgeConnector.Off("browserWindow-ready-to-show" + Id); } } @@ -63,12 +63,12 @@ public event Action OnPageTitleUpdated { if (_pageTitleUpdated == null) { - BridgeConnector.Socket.On("browserWindow-page-title-updated" + Id, (title) => + BridgeConnector.On("browserWindow-page-title-updated" + Id, (title) => { - _pageTitleUpdated(title.ToString()); + _pageTitleUpdated(title); }); - BridgeConnector.Socket.Emit("register-browserWindow-page-title-updated", Id); + BridgeConnector.Emit("register-browserWindow-page-title-updated", Id); } _pageTitleUpdated += value; } @@ -77,7 +77,7 @@ public event Action OnPageTitleUpdated _pageTitleUpdated -= value; if (_pageTitleUpdated == null) - BridgeConnector.Socket.Off("browserWindow-page-title-updated" + Id); + BridgeConnector.Off("browserWindow-page-title-updated" + Id); } } @@ -92,12 +92,12 @@ public event Action OnClose { if (_close == null) { - BridgeConnector.Socket.On("browserWindow-close" + Id, () => + BridgeConnector.On("browserWindow-close" + Id, () => { _close(); }); - BridgeConnector.Socket.Emit("register-browserWindow-close", Id); + BridgeConnector.Emit("register-browserWindow-close", Id); } _close += value; } @@ -106,7 +106,7 @@ public event Action OnClose _close -= value; if (_close == null) - BridgeConnector.Socket.Off("browserWindow-close" + Id); + BridgeConnector.Off("browserWindow-close" + Id); } } @@ -123,12 +123,12 @@ public event Action OnClosed { if (_closed == null) { - BridgeConnector.Socket.On("browserWindow-closed" + Id, () => + BridgeConnector.On("browserWindow-closed" + Id, () => { _closed(); }); - BridgeConnector.Socket.Emit("register-browserWindow-closed", Id); + BridgeConnector.Emit("register-browserWindow-closed", Id); } _closed += value; } @@ -137,7 +137,7 @@ public event Action OnClosed _closed -= value; if (_closed == null) - BridgeConnector.Socket.Off("browserWindow-closed" + Id); + BridgeConnector.Off("browserWindow-closed" + Id); } } @@ -152,12 +152,12 @@ public event Action OnSessionEnd { if (_sessionEnd == null) { - BridgeConnector.Socket.On("browserWindow-session-end" + Id, () => + BridgeConnector.On("browserWindow-session-end" + Id, () => { _sessionEnd(); }); - BridgeConnector.Socket.Emit("register-browserWindow-session-end", Id); + BridgeConnector.Emit("register-browserWindow-session-end", Id); } _sessionEnd += value; } @@ -166,7 +166,7 @@ public event Action OnSessionEnd _sessionEnd -= value; if (_sessionEnd == null) - BridgeConnector.Socket.Off("browserWindow-session-end" + Id); + BridgeConnector.Off("browserWindow-session-end" + Id); } } @@ -181,12 +181,12 @@ public event Action OnUnresponsive { if (_unresponsive == null) { - BridgeConnector.Socket.On("browserWindow-unresponsive" + Id, () => + BridgeConnector.On("browserWindow-unresponsive" + Id, () => { _unresponsive(); }); - BridgeConnector.Socket.Emit("register-browserWindow-unresponsive", Id); + BridgeConnector.Emit("register-browserWindow-unresponsive", Id); } _unresponsive += value; } @@ -195,7 +195,7 @@ public event Action OnUnresponsive _unresponsive -= value; if (_unresponsive == null) - BridgeConnector.Socket.Off("browserWindow-unresponsive" + Id); + BridgeConnector.Off("browserWindow-unresponsive" + Id); } } @@ -210,12 +210,12 @@ public event Action OnResponsive { if (_responsive == null) { - BridgeConnector.Socket.On("browserWindow-responsive" + Id, () => + BridgeConnector.On("browserWindow-responsive" + Id, () => { _responsive(); }); - BridgeConnector.Socket.Emit("register-browserWindow-responsive", Id); + BridgeConnector.Emit("register-browserWindow-responsive", Id); } _responsive += value; } @@ -224,7 +224,7 @@ public event Action OnResponsive _responsive -= value; if (_responsive == null) - BridgeConnector.Socket.Off("browserWindow-responsive" + Id); + BridgeConnector.Off("browserWindow-responsive" + Id); } } @@ -239,12 +239,12 @@ public event Action OnBlur { if (_blur == null) { - BridgeConnector.Socket.On("browserWindow-blur" + Id, () => + BridgeConnector.On("browserWindow-blur" + Id, () => { _blur(); }); - BridgeConnector.Socket.Emit("register-browserWindow-blur", Id); + BridgeConnector.Emit("register-browserWindow-blur", Id); } _blur += value; } @@ -253,7 +253,7 @@ public event Action OnBlur _blur -= value; if (_blur == null) - BridgeConnector.Socket.Off("browserWindow-blur" + Id); + BridgeConnector.Off("browserWindow-blur" + Id); } } @@ -268,12 +268,12 @@ public event Action OnFocus { if (_focus == null) { - BridgeConnector.Socket.On("browserWindow-focus" + Id, () => + BridgeConnector.On("browserWindow-focus" + Id, () => { _focus(); }); - BridgeConnector.Socket.Emit("register-browserWindow-focus", Id); + BridgeConnector.Emit("register-browserWindow-focus", Id); } _focus += value; } @@ -282,7 +282,7 @@ public event Action OnFocus _focus -= value; if (_focus == null) - BridgeConnector.Socket.Off("browserWindow-focus" + Id); + BridgeConnector.Off("browserWindow-focus" + Id); } } @@ -297,12 +297,12 @@ public event Action OnShow { if (_show == null) { - BridgeConnector.Socket.On("browserWindow-show" + Id, () => + BridgeConnector.On("browserWindow-show" + Id, () => { _show(); }); - BridgeConnector.Socket.Emit("register-browserWindow-show", Id); + BridgeConnector.Emit("register-browserWindow-show", Id); } _show += value; } @@ -311,7 +311,7 @@ public event Action OnShow _show -= value; if (_show == null) - BridgeConnector.Socket.Off("browserWindow-show" + Id); + BridgeConnector.Off("browserWindow-show" + Id); } } @@ -326,12 +326,12 @@ public event Action OnHide { if (_hide == null) { - BridgeConnector.Socket.On("browserWindow-hide" + Id, () => + BridgeConnector.On("browserWindow-hide" + Id, () => { _hide(); }); - BridgeConnector.Socket.Emit("register-browserWindow-hide", Id); + BridgeConnector.Emit("register-browserWindow-hide", Id); } _hide += value; } @@ -340,7 +340,7 @@ public event Action OnHide _hide -= value; if (_hide == null) - BridgeConnector.Socket.Off("browserWindow-hide" + Id); + BridgeConnector.Off("browserWindow-hide" + Id); } } @@ -355,12 +355,12 @@ public event Action OnMaximize { if (_maximize == null) { - BridgeConnector.Socket.On("browserWindow-maximize" + Id, () => + BridgeConnector.On("browserWindow-maximize" + Id, () => { _maximize(); }); - BridgeConnector.Socket.Emit("register-browserWindow-maximize", Id); + BridgeConnector.Emit("register-browserWindow-maximize", Id); } _maximize += value; } @@ -369,7 +369,7 @@ public event Action OnMaximize _maximize -= value; if (_maximize == null) - BridgeConnector.Socket.Off("browserWindow-maximize" + Id); + BridgeConnector.Off("browserWindow-maximize" + Id); } } @@ -384,12 +384,12 @@ public event Action OnUnmaximize { if (_unmaximize == null) { - BridgeConnector.Socket.On("browserWindow-unmaximize" + Id, () => + BridgeConnector.On("browserWindow-unmaximize" + Id, () => { _unmaximize(); }); - BridgeConnector.Socket.Emit("register-browserWindow-unmaximize", Id); + BridgeConnector.Emit("register-browserWindow-unmaximize", Id); } _unmaximize += value; } @@ -398,7 +398,7 @@ public event Action OnUnmaximize _unmaximize -= value; if (_unmaximize == null) - BridgeConnector.Socket.Off("browserWindow-unmaximize" + Id); + BridgeConnector.Off("browserWindow-unmaximize" + Id); } } @@ -413,12 +413,12 @@ public event Action OnMinimize { if (_minimize == null) { - BridgeConnector.Socket.On("browserWindow-minimize" + Id, () => + BridgeConnector.On("browserWindow-minimize" + Id, () => { _minimize(); }); - BridgeConnector.Socket.Emit("register-browserWindow-minimize", Id); + BridgeConnector.Emit("register-browserWindow-minimize", Id); } _minimize += value; } @@ -427,7 +427,7 @@ public event Action OnMinimize _minimize -= value; if (_minimize == null) - BridgeConnector.Socket.Off("browserWindow-minimize" + Id); + BridgeConnector.Off("browserWindow-minimize" + Id); } } @@ -442,12 +442,12 @@ public event Action OnRestore { if (_restore == null) { - BridgeConnector.Socket.On("browserWindow-restore" + Id, () => + BridgeConnector.On("browserWindow-restore" + Id, () => { _restore(); }); - BridgeConnector.Socket.Emit("register-browserWindow-restore", Id); + BridgeConnector.Emit("register-browserWindow-restore", Id); } _restore += value; } @@ -456,7 +456,7 @@ public event Action OnRestore _restore -= value; if (_restore == null) - BridgeConnector.Socket.Off("browserWindow-restore" + Id); + BridgeConnector.Off("browserWindow-restore" + Id); } } @@ -471,12 +471,12 @@ public event Action OnResize { if (_resize == null) { - BridgeConnector.Socket.On("browserWindow-resize" + Id, () => + BridgeConnector.On("browserWindow-resize" + Id, () => { _resize(); }); - BridgeConnector.Socket.Emit("register-browserWindow-resize", Id); + BridgeConnector.Emit("register-browserWindow-resize", Id); } _resize += value; } @@ -485,7 +485,7 @@ public event Action OnResize _resize -= value; if (_resize == null) - BridgeConnector.Socket.Off("browserWindow-resize" + Id); + BridgeConnector.Off("browserWindow-resize" + Id); } } @@ -502,12 +502,12 @@ public event Action OnMove { if (_move == null) { - BridgeConnector.Socket.On("browserWindow-move" + Id, () => + BridgeConnector.On("browserWindow-move" + Id, () => { _move(); }); - BridgeConnector.Socket.Emit("register-browserWindow-move", Id); + BridgeConnector.Emit("register-browserWindow-move", Id); } _move += value; } @@ -516,7 +516,7 @@ public event Action OnMove _move -= value; if (_move == null) - BridgeConnector.Socket.Off("browserWindow-move" + Id); + BridgeConnector.Off("browserWindow-move" + Id); } } @@ -531,12 +531,12 @@ public event Action OnMoved { if (_moved == null) { - BridgeConnector.Socket.On("browserWindow-moved" + Id, () => + BridgeConnector.On("browserWindow-moved" + Id, () => { _moved(); }); - BridgeConnector.Socket.Emit("register-browserWindow-moved", Id); + BridgeConnector.Emit("register-browserWindow-moved", Id); } _moved += value; } @@ -545,7 +545,7 @@ public event Action OnMoved _moved -= value; if (_moved == null) - BridgeConnector.Socket.Off("browserWindow-moved" + Id); + BridgeConnector.Off("browserWindow-moved" + Id); } } @@ -560,12 +560,12 @@ public event Action OnEnterFullScreen { if (_enterFullScreen == null) { - BridgeConnector.Socket.On("browserWindow-enter-full-screen" + Id, () => + BridgeConnector.On("browserWindow-enter-full-screen" + Id, () => { _enterFullScreen(); }); - BridgeConnector.Socket.Emit("register-browserWindow-enter-full-screen", Id); + BridgeConnector.Emit("register-browserWindow-enter-full-screen", Id); } _enterFullScreen += value; } @@ -574,7 +574,7 @@ public event Action OnEnterFullScreen _enterFullScreen -= value; if (_enterFullScreen == null) - BridgeConnector.Socket.Off("browserWindow-enter-full-screen" + Id); + BridgeConnector.Off("browserWindow-enter-full-screen" + Id); } } @@ -589,12 +589,12 @@ public event Action OnLeaveFullScreen { if (_leaveFullScreen == null) { - BridgeConnector.Socket.On("browserWindow-leave-full-screen" + Id, () => + BridgeConnector.On("browserWindow-leave-full-screen" + Id, () => { _leaveFullScreen(); }); - BridgeConnector.Socket.Emit("register-browserWindow-leave-full-screen", Id); + BridgeConnector.Emit("register-browserWindow-leave-full-screen", Id); } _leaveFullScreen += value; } @@ -603,7 +603,7 @@ public event Action OnLeaveFullScreen _leaveFullScreen -= value; if (_leaveFullScreen == null) - BridgeConnector.Socket.Off("browserWindow-leave-full-screen" + Id); + BridgeConnector.Off("browserWindow-leave-full-screen" + Id); } } @@ -618,12 +618,12 @@ public event Action OnEnterHtmlFullScreen { if (_enterHtmlFullScreen == null) { - BridgeConnector.Socket.On("browserWindow-enter-html-full-screen" + Id, () => + BridgeConnector.On("browserWindow-enter-html-full-screen" + Id, () => { _enterHtmlFullScreen(); }); - BridgeConnector.Socket.Emit("register-browserWindow-enter-html-full-screen", Id); + BridgeConnector.Emit("register-browserWindow-enter-html-full-screen", Id); } _enterHtmlFullScreen += value; } @@ -632,7 +632,7 @@ public event Action OnEnterHtmlFullScreen _enterHtmlFullScreen -= value; if (_enterHtmlFullScreen == null) - BridgeConnector.Socket.Off("browserWindow-enter-html-full-screen" + Id); + BridgeConnector.Off("browserWindow-enter-html-full-screen" + Id); } } @@ -647,12 +647,12 @@ public event Action OnLeaveHtmlFullScreen { if (_leaveHtmlFullScreen == null) { - BridgeConnector.Socket.On("browserWindow-leave-html-full-screen" + Id, () => + BridgeConnector.On("browserWindow-leave-html-full-screen" + Id, () => { _leaveHtmlFullScreen(); }); - BridgeConnector.Socket.Emit("register-browserWindow-leave-html-full-screen", Id); + BridgeConnector.Emit("register-browserWindow-leave-html-full-screen", Id); } _leaveHtmlFullScreen += value; } @@ -661,7 +661,7 @@ public event Action OnLeaveHtmlFullScreen _leaveHtmlFullScreen -= value; if (_leaveHtmlFullScreen == null) - BridgeConnector.Socket.Off("browserWindow-leave-html-full-screen" + Id); + BridgeConnector.Off("browserWindow-leave-html-full-screen" + Id); } } @@ -682,12 +682,12 @@ public event Action OnAppCommand { if (_appCommand == null) { - BridgeConnector.Socket.On("browserWindow-app-command" + Id, (command) => + BridgeConnector.On("browserWindow-app-command" + Id, (command) => { - _appCommand(command.ToString()); + _appCommand(command); }); - BridgeConnector.Socket.Emit("register-browserWindow-app-command", Id); + BridgeConnector.Emit("register-browserWindow-app-command", Id); } _appCommand += value; } @@ -696,7 +696,7 @@ public event Action OnAppCommand _appCommand -= value; if (_appCommand == null) - BridgeConnector.Socket.Off("browserWindow-app-command" + Id); + BridgeConnector.Off("browserWindow-app-command" + Id); } } @@ -711,12 +711,12 @@ public event Action OnScrollTouchBegin { if (_scrollTouchBegin == null) { - BridgeConnector.Socket.On("browserWindow-scroll-touch-begin" + Id, () => + BridgeConnector.On("browserWindow-scroll-touch-begin" + Id, () => { _scrollTouchBegin(); }); - BridgeConnector.Socket.Emit("register-browserWindow-scroll-touch-begin", Id); + BridgeConnector.Emit("register-browserWindow-scroll-touch-begin", Id); } _scrollTouchBegin += value; } @@ -725,7 +725,7 @@ public event Action OnScrollTouchBegin _scrollTouchBegin -= value; if (_scrollTouchBegin == null) - BridgeConnector.Socket.Off("browserWindow-scroll-touch-begin" + Id); + BridgeConnector.Off("browserWindow-scroll-touch-begin" + Id); } } @@ -740,12 +740,12 @@ public event Action OnScrollTouchEnd { if (_scrollTouchEnd == null) { - BridgeConnector.Socket.On("browserWindow-scroll-touch-end" + Id, () => + BridgeConnector.On("browserWindow-scroll-touch-end" + Id, () => { _scrollTouchEnd(); }); - BridgeConnector.Socket.Emit("register-browserWindow-scroll-touch-end", Id); + BridgeConnector.Emit("register-browserWindow-scroll-touch-end", Id); } _scrollTouchEnd += value; } @@ -754,7 +754,7 @@ public event Action OnScrollTouchEnd _scrollTouchEnd -= value; if (_scrollTouchEnd == null) - BridgeConnector.Socket.Off("browserWindow-scroll-touch-end" + Id); + BridgeConnector.Off("browserWindow-scroll-touch-end" + Id); } } @@ -769,12 +769,12 @@ public event Action OnScrollTouchEdge { if (_scrollTouchEdge == null) { - BridgeConnector.Socket.On("browserWindow-scroll-touch-edge" + Id, () => + BridgeConnector.On("browserWindow-scroll-touch-edge" + Id, () => { _scrollTouchEdge(); }); - BridgeConnector.Socket.Emit("register-browserWindow-scroll-touch-edge", Id); + BridgeConnector.Emit("register-browserWindow-scroll-touch-edge", Id); } _scrollTouchEdge += value; } @@ -783,7 +783,7 @@ public event Action OnScrollTouchEdge _scrollTouchEdge -= value; if (_scrollTouchEdge == null) - BridgeConnector.Socket.Off("browserWindow-scroll-touch-edge" + Id); + BridgeConnector.Off("browserWindow-scroll-touch-edge" + Id); } } @@ -798,12 +798,12 @@ public event Action OnSwipe { if (_swipe == null) { - BridgeConnector.Socket.On("browserWindow-swipe" + Id, (direction) => + BridgeConnector.On("browserWindow-swipe" + Id, (direction) => { - _swipe(direction.ToString()); + _swipe(direction); }); - BridgeConnector.Socket.Emit("register-browserWindow-swipe", Id); + BridgeConnector.Emit("register-browserWindow-swipe", Id); } _swipe += value; } @@ -812,7 +812,7 @@ public event Action OnSwipe _swipe -= value; if (_swipe == null) - BridgeConnector.Socket.Off("browserWindow-swipe" + Id); + BridgeConnector.Off("browserWindow-swipe" + Id); } } @@ -827,12 +827,12 @@ public event Action OnSheetBegin { if (_sheetBegin == null) { - BridgeConnector.Socket.On("browserWindow-sheet-begin" + Id, () => + BridgeConnector.On("browserWindow-sheet-begin" + Id, () => { _sheetBegin(); }); - BridgeConnector.Socket.Emit("register-browserWindow-sheet-begin", Id); + BridgeConnector.Emit("register-browserWindow-sheet-begin", Id); } _sheetBegin += value; } @@ -841,7 +841,7 @@ public event Action OnSheetBegin _sheetBegin -= value; if (_sheetBegin == null) - BridgeConnector.Socket.Off("browserWindow-sheet-begin" + Id); + BridgeConnector.Off("browserWindow-sheet-begin" + Id); } } @@ -856,12 +856,12 @@ public event Action OnSheetEnd { if (_sheetEnd == null) { - BridgeConnector.Socket.On("browserWindow-sheet-end" + Id, () => + BridgeConnector.On("browserWindow-sheet-end" + Id, () => { _sheetEnd(); }); - BridgeConnector.Socket.Emit("register-browserWindow-sheet-end", Id); + BridgeConnector.Emit("register-browserWindow-sheet-end", Id); } _sheetEnd += value; } @@ -870,7 +870,7 @@ public event Action OnSheetEnd _sheetEnd -= value; if (_sheetEnd == null) - BridgeConnector.Socket.Off("browserWindow-sheet-end" + Id); + BridgeConnector.Off("browserWindow-sheet-end" + Id); } } @@ -885,12 +885,12 @@ public event Action OnNewWindowForTab { if (_newWindowForTab == null) { - BridgeConnector.Socket.On("browserWindow-new-window-for-tab" + Id, () => + BridgeConnector.On("browserWindow-new-window-for-tab" + Id, () => { _newWindowForTab(); }); - BridgeConnector.Socket.Emit("register-browserWindow-new-window-for-tab", Id); + BridgeConnector.Emit("register-browserWindow-new-window-for-tab", Id); } _newWindowForTab += value; } @@ -899,7 +899,7 @@ public event Action OnNewWindowForTab _newWindowForTab -= value; if (_newWindowForTab == null) - BridgeConnector.Socket.Off("browserWindow-new-window-for-tab" + Id); + BridgeConnector.Off("browserWindow-new-window-for-tab" + Id); } } @@ -917,7 +917,7 @@ internal BrowserWindow(int id) { /// public void Destroy() { - BridgeConnector.Socket.Emit("browserWindowDestroy", Id); + BridgeConnector.Emit("browserWindowDestroy", Id); } /// @@ -926,7 +926,7 @@ public void Destroy() /// public void Close() { - BridgeConnector.Socket.Emit("browserWindowClose", Id); + BridgeConnector.Emit("browserWindowClose", Id); } /// @@ -934,7 +934,7 @@ public void Close() /// public void Focus() { - BridgeConnector.Socket.Emit("browserWindowFocus", Id); + BridgeConnector.Emit("browserWindowFocus", Id); } /// @@ -942,53 +942,27 @@ public void Focus() /// public void Blur() { - BridgeConnector.Socket.Emit("browserWindowBlur", Id); + BridgeConnector.Emit("browserWindowBlur", Id); } /// /// Whether the window is focused. /// /// - public Task IsFocusedAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isFocused-completed", (isFocused) => { - BridgeConnector.Socket.Off("browserWindow-isFocused-completed"); - - taskCompletionSource.SetResult((bool)isFocused); - }); - - BridgeConnector.Socket.Emit("browserWindowIsFocused", Id); - - return taskCompletionSource.Task; - } + public Task IsFocusedAsync() => BridgeConnector.OnResult("browserWindowIsFocused", "browserWindow-isFocused-completed" + Id, Id); /// /// Whether the window is destroyed. /// /// - public Task IsDestroyedAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isDestroyed-completed", (isDestroyed) => { - BridgeConnector.Socket.Off("browserWindow-isDestroyed-completed"); - - taskCompletionSource.SetResult((bool)isDestroyed); - }); - - BridgeConnector.Socket.Emit("browserWindowIsDestroyed", Id); - - return taskCompletionSource.Task; - } + public Task IsDestroyedAsync() => BridgeConnector.OnResult("browserWindowIsDestroyed", "browserWindow-isDestroyed-completed" + Id, Id); /// /// Shows and gives focus to the window. /// public void Show() { - BridgeConnector.Socket.Emit("browserWindowShow", Id); + BridgeConnector.Emit("browserWindowShow", Id); } /// @@ -996,7 +970,7 @@ public void Show() /// public void ShowInactive() { - BridgeConnector.Socket.Emit("browserWindowShowInactive", Id); + BridgeConnector.Emit("browserWindowShowInactive", Id); } /// @@ -1004,7 +978,7 @@ public void ShowInactive() /// public void Hide() { - BridgeConnector.Socket.Emit("browserWindowHide", Id); + BridgeConnector.Emit("browserWindowHide", Id); } /// @@ -1013,17 +987,7 @@ public void Hide() /// public Task IsVisibleAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isVisible-completed", (isVisible) => { - BridgeConnector.Socket.Off("browserWindow-isVisible-completed"); - - taskCompletionSource.SetResult((bool)isVisible); - }); - - BridgeConnector.Socket.Emit("browserWindowIsVisible", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsVisible", "browserWindow-isVisible-completed" + Id, Id); } /// @@ -1032,17 +996,7 @@ public Task IsVisibleAsync() /// public Task IsModalAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isModal-completed", (isModal) => { - BridgeConnector.Socket.Off("browserWindow-isModal-completed"); - - taskCompletionSource.SetResult((bool)isModal); - }); - - BridgeConnector.Socket.Emit("browserWindowIsModal", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsModal", "browserWindow-isModal-completed" + Id, Id); } /// @@ -1050,7 +1004,7 @@ public Task IsModalAsync() /// public void Maximize() { - BridgeConnector.Socket.Emit("browserWindowMaximize", Id); + BridgeConnector.Emit("browserWindowMaximize", Id); } /// @@ -1058,7 +1012,7 @@ public void Maximize() /// public void Unmaximize() { - BridgeConnector.Socket.Emit("browserWindowUnmaximize", Id); + BridgeConnector.Emit("browserWindowUnmaximize", Id); } /// @@ -1067,17 +1021,7 @@ public void Unmaximize() /// public Task IsMaximizedAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMaximized-completed", (isMaximized) => { - BridgeConnector.Socket.Off("browserWindow-isMaximized-completed"); - - taskCompletionSource.SetResult((bool)isMaximized); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMaximized", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMaximized", "browserWindow-isMaximized-completed" + Id, Id); } /// @@ -1085,7 +1029,7 @@ public Task IsMaximizedAsync() /// public void Minimize() { - BridgeConnector.Socket.Emit("browserWindowMinimize", Id); + BridgeConnector.Emit("browserWindowMinimize", Id); } /// @@ -1093,7 +1037,7 @@ public void Minimize() /// public void Restore() { - BridgeConnector.Socket.Emit("browserWindowRestore", Id); + BridgeConnector.Emit("browserWindowRestore", Id); } /// @@ -1102,17 +1046,7 @@ public void Restore() /// public Task IsMinimizedAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMinimized-completed", (isMinimized) => { - BridgeConnector.Socket.Off("browserWindow-isMinimized-completed"); - - taskCompletionSource.SetResult((bool)isMinimized); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMinimized", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMinimized", "browserWindow-isMinimized-completed" + Id, Id); } /// @@ -1120,7 +1054,7 @@ public Task IsMinimizedAsync() /// public void SetFullScreen(bool flag) { - BridgeConnector.Socket.Emit("browserWindowSetFullScreen", Id, flag); + BridgeConnector.Emit("browserWindowSetFullScreen", Id, flag); } /// @@ -1129,17 +1063,7 @@ public void SetFullScreen(bool flag) /// public Task IsFullScreenAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isFullScreen-completed", (isFullScreen) => { - BridgeConnector.Socket.Off("browserWindow-isFullScreen-completed"); - - taskCompletionSource.SetResult((bool)isFullScreen); - }); - - BridgeConnector.Socket.Emit("browserWindowIsFullScreen", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsFullScreen", "browserWindow-isFullScreen-completed" + Id, Id); } /// @@ -1158,7 +1082,7 @@ public Task IsFullScreenAsync() /// The extra size not to be included while maintaining the aspect ratio. public void SetAspectRatio(int aspectRatio, Size extraSize) { - BridgeConnector.Socket.Emit("browserWindowSetAspectRatio", Id, aspectRatio, JObject.FromObject(extraSize, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetAspectRatio", Id, aspectRatio, extraSize); } /// @@ -1169,7 +1093,7 @@ public void SetAspectRatio(int aspectRatio, Size extraSize) /// file to open. public void PreviewFile(string path) { - BridgeConnector.Socket.Emit("browserWindowPreviewFile", Id, path); + BridgeConnector.Emit("browserWindowPreviewFile", Id, path); } /// @@ -1182,7 +1106,7 @@ public void PreviewFile(string path) /// purely visual and does not affect the content type of the file. Defaults to path. public void PreviewFile(string path, string displayname) { - BridgeConnector.Socket.Emit("browserWindowPreviewFile", Id, path, displayname); + BridgeConnector.Emit("browserWindowPreviewFile", Id, path, displayname); } /// @@ -1190,7 +1114,7 @@ public void PreviewFile(string path, string displayname) /// public void CloseFilePreview() { - BridgeConnector.Socket.Emit("browserWindowCloseFilePreview", Id); + BridgeConnector.Emit("browserWindowCloseFilePreview", Id); } /// @@ -1199,7 +1123,7 @@ public void CloseFilePreview() /// public void SetBounds(Rectangle bounds) { - BridgeConnector.Socket.Emit("browserWindowSetBounds", Id, JObject.FromObject(bounds, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetBounds", Id, bounds); } /// @@ -1209,7 +1133,7 @@ public void SetBounds(Rectangle bounds) /// public void SetBounds(Rectangle bounds, bool animate) { - BridgeConnector.Socket.Emit("browserWindowSetBounds", Id, JObject.FromObject(bounds, _jsonSerializer), animate); + BridgeConnector.Emit("browserWindowSetBounds", Id, bounds, animate); } /// @@ -1218,17 +1142,7 @@ public void SetBounds(Rectangle bounds, bool animate) /// public Task GetBoundsAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getBounds-completed", (getBounds) => { - BridgeConnector.Socket.Off("browserWindow-getBounds-completed"); - - taskCompletionSource.SetResult(((JObject)getBounds).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetBounds", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetBounds", "browserWindow-getBounds-completed" + Id, Id); } /// @@ -1237,7 +1151,7 @@ public Task GetBoundsAsync() /// public void SetContentBounds(Rectangle bounds) { - BridgeConnector.Socket.Emit("browserWindowSetContentBounds", Id, JObject.FromObject(bounds, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetContentBounds", Id, bounds); } /// @@ -1247,7 +1161,7 @@ public void SetContentBounds(Rectangle bounds) /// public void SetContentBounds(Rectangle bounds, bool animate) { - BridgeConnector.Socket.Emit("browserWindowSetContentBounds", Id, JObject.FromObject(bounds, _jsonSerializer), animate); + BridgeConnector.Emit("browserWindowSetContentBounds", Id, bounds, animate); } /// @@ -1256,17 +1170,7 @@ public void SetContentBounds(Rectangle bounds, bool animate) /// public Task GetContentBoundsAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getContentBounds-completed", (getContentBounds) => { - BridgeConnector.Socket.Off("browserWindow-getContentBounds-completed"); - - taskCompletionSource.SetResult(((JObject)getContentBounds).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetContentBounds", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetContentBounds", "browserWindow-getContentBounds-completed" + Id, Id); } /// @@ -1276,7 +1180,7 @@ public Task GetContentBoundsAsync() /// public void SetSize(int width, int height) { - BridgeConnector.Socket.Emit("browserWindowSetSize", Id, width, height); + BridgeConnector.Emit("browserWindowSetSize", Id, width, height); } /// @@ -1287,7 +1191,7 @@ public void SetSize(int width, int height) /// public void SetSize(int width, int height, bool animate) { - BridgeConnector.Socket.Emit("browserWindowSetSize", Id, width, height, animate); + BridgeConnector.Emit("browserWindowSetSize", Id, width, height, animate); } /// @@ -1296,17 +1200,7 @@ public void SetSize(int width, int height, bool animate) /// public Task GetSizeAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getSize-completed", (size) => { - BridgeConnector.Socket.Off("browserWindow-getSize-completed"); - - taskCompletionSource.SetResult(((JArray)size).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetSize", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetSize", "browserWindow-getSize-completed" + Id, Id); } /// @@ -1316,7 +1210,7 @@ public Task GetSizeAsync() /// public void SetContentSize(int width, int height) { - BridgeConnector.Socket.Emit("browserWindowSetContentSize", Id, width, height); + BridgeConnector.Emit("browserWindowSetContentSize", Id, width, height); } /// @@ -1327,7 +1221,7 @@ public void SetContentSize(int width, int height) /// public void SetContentSize(int width, int height, bool animate) { - BridgeConnector.Socket.Emit("browserWindowSetContentSize", Id, width, height, animate); + BridgeConnector.Emit("browserWindowSetContentSize", Id, width, height, animate); } /// @@ -1336,17 +1230,7 @@ public void SetContentSize(int width, int height, bool animate) /// public Task GetContentSizeAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getContentSize-completed", (size) => { - BridgeConnector.Socket.Off("browserWindow-getContentSize-completed"); - - taskCompletionSource.SetResult(((JArray)size).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetContentSize", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetContentSize", "browserWindow-getContentSize-completed" + Id, Id); } /// @@ -1356,7 +1240,7 @@ public Task GetContentSizeAsync() /// public void SetMinimumSize(int width, int height) { - BridgeConnector.Socket.Emit("browserWindowSetMinimumSize", Id, width, height); + BridgeConnector.Emit("browserWindowSetMinimumSize", Id, width, height); } /// @@ -1365,17 +1249,7 @@ public void SetMinimumSize(int width, int height) /// public Task GetMinimumSizeAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getMinimumSize-completed", (size) => { - BridgeConnector.Socket.Off("browserWindow-getMinimumSize-completed"); - - taskCompletionSource.SetResult(((JArray)size).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetMinimumSize", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetMinimumSize", "browserWindow-getMinimumSize-completed" + Id, Id); } /// @@ -1385,7 +1259,7 @@ public Task GetMinimumSizeAsync() /// public void SetMaximumSize(int width, int height) { - BridgeConnector.Socket.Emit("browserWindowSetMaximumSize", Id, width, height); + BridgeConnector.Emit("browserWindowSetMaximumSize", Id, width, height); } /// @@ -1394,17 +1268,7 @@ public void SetMaximumSize(int width, int height) /// public Task GetMaximumSizeAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getMaximumSize-completed", (size) => { - BridgeConnector.Socket.Off("browserWindow-getMaximumSize-completed"); - - taskCompletionSource.SetResult(((JArray)size).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetMaximumSize", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetMaximumSize", "browserWindow-getMaximumSize-completed" + Id, Id); } /// @@ -1413,7 +1277,7 @@ public Task GetMaximumSizeAsync() /// public void SetResizable(bool resizable) { - BridgeConnector.Socket.Emit("browserWindowSetResizable", Id, resizable); + BridgeConnector.Emit("browserWindowSetResizable", Id, resizable); } /// @@ -1422,17 +1286,7 @@ public void SetResizable(bool resizable) /// public Task IsResizableAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isResizable-completed", (resizable) => { - BridgeConnector.Socket.Off("browserWindow-isResizable-completed"); - - taskCompletionSource.SetResult((bool)resizable); - }); - - BridgeConnector.Socket.Emit("browserWindowIsResizable", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsResizable", "browserWindow-isResizable-completed" + Id, Id); } /// @@ -1441,7 +1295,7 @@ public Task IsResizableAsync() /// public void SetMovable(bool movable) { - BridgeConnector.Socket.Emit("browserWindowSetMovable", Id, movable); + BridgeConnector.Emit("browserWindowSetMovable", Id, movable); } /// @@ -1452,17 +1306,7 @@ public void SetMovable(bool movable) /// On Linux always returns true. public Task IsMovableAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMovable-completed", (movable) => { - BridgeConnector.Socket.Off("browserWindow-isMovable-completed"); - - taskCompletionSource.SetResult((bool)movable); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMovable", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMovable", "browserWindow-isMovable-completed" + Id, Id); } /// @@ -1471,7 +1315,7 @@ public Task IsMovableAsync() /// public void SetMinimizable(bool minimizable) { - BridgeConnector.Socket.Emit("browserWindowSetMinimizable", Id, minimizable); + BridgeConnector.Emit("browserWindowSetMinimizable", Id, minimizable); } /// @@ -1482,17 +1326,7 @@ public void SetMinimizable(bool minimizable) /// On Linux always returns true. public Task IsMinimizableAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMinimizable-completed", (minimizable) => { - BridgeConnector.Socket.Off("browserWindow-isMinimizable-completed"); - - taskCompletionSource.SetResult((bool)minimizable); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMinimizable", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMinimizable", "browserWindow-isMinimizable-completed" + Id, Id); } /// @@ -1501,7 +1335,7 @@ public Task IsMinimizableAsync() /// public void SetMaximizable(bool maximizable) { - BridgeConnector.Socket.Emit("browserWindowSetMaximizable", Id, maximizable); + BridgeConnector.Emit("browserWindowSetMaximizable", Id, maximizable); } /// @@ -1512,17 +1346,7 @@ public void SetMaximizable(bool maximizable) /// On Linux always returns true. public Task IsMaximizableAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMaximizable-completed", (maximizable) => { - BridgeConnector.Socket.Off("browserWindow-isMaximizable-completed"); - - taskCompletionSource.SetResult((bool)maximizable); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMaximizable", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMaximizable", "browserWindow-isMaximizable-completed" + Id, Id); } /// @@ -1531,7 +1355,7 @@ public Task IsMaximizableAsync() /// public void SetFullScreenable(bool fullscreenable) { - BridgeConnector.Socket.Emit("browserWindowSetFullScreenable", Id, fullscreenable); + BridgeConnector.Emit("browserWindowSetFullScreenable", Id, fullscreenable); } /// @@ -1540,17 +1364,7 @@ public void SetFullScreenable(bool fullscreenable) /// public Task IsFullScreenableAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isFullScreenable-completed", (fullscreenable) => { - BridgeConnector.Socket.Off("browserWindow-isFullScreenable-completed"); - - taskCompletionSource.SetResult((bool)fullscreenable); - }); - - BridgeConnector.Socket.Emit("browserWindowIsFullScreenable", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsFullScreenable", "browserWindow-isFullScreenable-completed" + Id, Id); } /// @@ -1559,7 +1373,7 @@ public Task IsFullScreenableAsync() /// public void SetClosable(bool closable) { - BridgeConnector.Socket.Emit("browserWindowSetClosable", Id, closable); + BridgeConnector.Emit("browserWindowSetClosable", Id, closable); } /// @@ -1570,17 +1384,7 @@ public void SetClosable(bool closable) /// On Linux always returns true. public Task IsClosableAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isClosable-completed", (closable) => { - BridgeConnector.Socket.Off("browserWindow-isClosable-completed"); - - taskCompletionSource.SetResult((bool)closable); - }); - - BridgeConnector.Socket.Emit("browserWindowIsClosable", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsClosable", "browserWindow-isClosable-completed" + Id, Id); } /// @@ -1591,7 +1395,7 @@ public Task IsClosableAsync() /// public void SetAlwaysOnTop(bool flag) { - BridgeConnector.Socket.Emit("browserWindowSetAlwaysOnTop", Id, flag); + BridgeConnector.Emit("browserWindowSetAlwaysOnTop", Id, flag); } /// @@ -1605,7 +1409,7 @@ public void SetAlwaysOnTop(bool flag) /// See the macOS docs public void SetAlwaysOnTop(bool flag, OnTopLevel level) { - BridgeConnector.Socket.Emit("browserWindowSetAlwaysOnTop", Id, flag, level.GetDescription()); + BridgeConnector.Emit("browserWindowSetAlwaysOnTop", Id, flag, level.GetDescription()); } /// @@ -1621,7 +1425,7 @@ public void SetAlwaysOnTop(bool flag, OnTopLevel level) /// The default is 0. Note that Apple discourages setting levels higher than 1 above screen-saver. public void SetAlwaysOnTop(bool flag, OnTopLevel level, int relativeLevel) { - BridgeConnector.Socket.Emit("browserWindowSetAlwaysOnTop", Id, flag, level.GetDescription(), relativeLevel); + BridgeConnector.Emit("browserWindowSetAlwaysOnTop", Id, flag, level.GetDescription(), relativeLevel); } /// @@ -1630,17 +1434,7 @@ public void SetAlwaysOnTop(bool flag, OnTopLevel level, int relativeLevel) /// public Task IsAlwaysOnTopAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isAlwaysOnTop-completed", (isAlwaysOnTop) => { - BridgeConnector.Socket.Off("browserWindow-isAlwaysOnTop-completed"); - - taskCompletionSource.SetResult((bool)isAlwaysOnTop); - }); - - BridgeConnector.Socket.Emit("browserWindowIsAlwaysOnTop", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsAlwaysOnTop", "browserWindow-isAlwaysOnTop-completed" + Id, Id); } /// @@ -1648,7 +1442,7 @@ public Task IsAlwaysOnTopAsync() /// public void Center() { - BridgeConnector.Socket.Emit("browserWindowCenter", Id); + BridgeConnector.Emit("browserWindowCenter", Id); } /// @@ -1665,7 +1459,7 @@ public void SetPosition(int x, int y) x = x - 7; } - BridgeConnector.Socket.Emit("browserWindowSetPosition", Id, x, y); + BridgeConnector.Emit("browserWindowSetPosition", Id, x, y); } /// @@ -1683,7 +1477,7 @@ public void SetPosition(int x, int y, bool animate) x = x - 7; } - BridgeConnector.Socket.Emit("browserWindowSetPosition", Id, x, y, animate); + BridgeConnector.Emit("browserWindowSetPosition", Id, x, y, animate); } private bool isWindows10() @@ -1697,17 +1491,7 @@ private bool isWindows10() /// public Task GetPositionAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getPosition-completed", (position) => { - BridgeConnector.Socket.Off("browserWindow-getPosition-completed"); - - taskCompletionSource.SetResult(((JArray)position).ToObject()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetPosition", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetPosition", "browserWindow-getPosition-completed" + Id, Id); } /// @@ -1716,7 +1500,7 @@ public Task GetPositionAsync() /// public void SetTitle(string title) { - BridgeConnector.Socket.Emit("browserWindowSetTitle", Id, title); + BridgeConnector.Emit("browserWindowSetTitle", Id, title); } /// @@ -1727,17 +1511,7 @@ public void SetTitle(string title) /// public Task GetTitleAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getTitle-completed", (title) => { - BridgeConnector.Socket.Off("browserWindow-getTitle-completed"); - - taskCompletionSource.SetResult(title.ToString()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetTitle", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetTitle", "browserWindow-getTitle-completed" + Id, Id); } /// @@ -1748,7 +1522,7 @@ public Task GetTitleAsync() /// public void SetSheetOffset(float offsetY) { - BridgeConnector.Socket.Emit("browserWindowSetSheetOffset", Id, offsetY); + BridgeConnector.Emit("browserWindowSetSheetOffset", Id, offsetY); } /// @@ -1760,7 +1534,7 @@ public void SetSheetOffset(float offsetY) /// public void SetSheetOffset(float offsetY, float offsetX) { - BridgeConnector.Socket.Emit("browserWindowSetSheetOffset", Id, offsetY, offsetX); + BridgeConnector.Emit("browserWindowSetSheetOffset", Id, offsetY, offsetX); } /// @@ -1769,7 +1543,7 @@ public void SetSheetOffset(float offsetY, float offsetX) /// public void FlashFrame(bool flag) { - BridgeConnector.Socket.Emit("browserWindowFlashFrame", Id, flag); + BridgeConnector.Emit("browserWindowFlashFrame", Id, flag); } /// @@ -1778,7 +1552,7 @@ public void FlashFrame(bool flag) /// public void SetSkipTaskbar(bool skip) { - BridgeConnector.Socket.Emit("browserWindowSetSkipTaskbar", Id, skip); + BridgeConnector.Emit("browserWindowSetSkipTaskbar", Id, skip); } /// @@ -1787,7 +1561,7 @@ public void SetSkipTaskbar(bool skip) /// public void SetKiosk(bool flag) { - BridgeConnector.Socket.Emit("browserWindowSetKiosk", Id, flag); + BridgeConnector.Emit("browserWindowSetKiosk", Id, flag); } /// @@ -1796,17 +1570,7 @@ public void SetKiosk(bool flag) /// public Task IsKioskAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isKiosk-completed", (isKiosk) => { - BridgeConnector.Socket.Off("browserWindow-isKiosk-completed"); - - taskCompletionSource.SetResult((bool)isKiosk); - }); - - BridgeConnector.Socket.Emit("browserWindowIsKiosk", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsKiosk", "browserWindow-isKiosk-completed" + Id, Id); } /// @@ -1815,17 +1579,7 @@ public Task IsKioskAsync() /// string of the native handle obtained, HWND on Windows, NSView* on macOS, and Window (unsigned long) on Linux. public Task GetNativeWindowHandle() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getNativeWindowHandle-completed", (nativeWindowHandle) => - { - BridgeConnector.Socket.Off("browserWindow-getNativeWindowHandle-completed"); - taskCompletionSource.SetResult(nativeWindowHandle.ToString()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetNativeWindowHandle", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetNativeWindowHandle", "browserWindow-getNativeWindowHandle-completed" + Id, Id); } /// @@ -1835,7 +1589,7 @@ public Task GetNativeWindowHandle() /// public void SetRepresentedFilename(string filename) { - BridgeConnector.Socket.Emit("browserWindowSetRepresentedFilename", Id, filename); + BridgeConnector.Emit("browserWindowSetRepresentedFilename", Id, filename); } /// @@ -1844,17 +1598,7 @@ public void SetRepresentedFilename(string filename) /// public Task GetRepresentedFilenameAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getRepresentedFilename-completed", (pathname) => { - BridgeConnector.Socket.Off("browserWindow-getRepresentedFilename-completed"); - - taskCompletionSource.SetResult(pathname.ToString()); - }); - - BridgeConnector.Socket.Emit("browserWindowGetRepresentedFilename", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowGetRepresentedFilename", "browserWindow-getRepresentedFilename-completed" + Id, Id); } /// @@ -1864,7 +1608,7 @@ public Task GetRepresentedFilenameAsync() /// public void SetDocumentEdited(bool edited) { - BridgeConnector.Socket.Emit("browserWindowSetDocumentEdited", Id, edited); + BridgeConnector.Emit("browserWindowSetDocumentEdited", Id, edited); } /// @@ -1873,17 +1617,7 @@ public void SetDocumentEdited(bool edited) /// public Task IsDocumentEditedAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isDocumentEdited-completed", (edited) => { - BridgeConnector.Socket.Off("browserWindow-isDocumentEdited-completed"); - - taskCompletionSource.SetResult((bool)edited); - }); - - BridgeConnector.Socket.Emit("browserWindowIsDocumentEdited", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsDocumentEdited", "browserWindow-isDocumentEdited-completed" + Id, Id); } /// @@ -1891,7 +1625,7 @@ public Task IsDocumentEditedAsync() /// public void FocusOnWebView() { - BridgeConnector.Socket.Emit("browserWindowFocusOnWebView", Id); + BridgeConnector.Emit("browserWindowFocusOnWebView", Id); } /// @@ -1899,7 +1633,7 @@ public void FocusOnWebView() /// public void BlurWebView() { - BridgeConnector.Socket.Emit("browserWindowBlurWebView", Id); + BridgeConnector.Emit("browserWindowBlurWebView", Id); } /// @@ -1909,7 +1643,7 @@ public void BlurWebView() /// public void LoadURL(string url) { - BridgeConnector.Socket.Emit("browserWindowLoadURL", Id, url); + BridgeConnector.Emit("browserWindowLoadURL", Id, url); } /// @@ -1920,7 +1654,7 @@ public void LoadURL(string url) /// public void LoadURL(string url, LoadURLOptions options) { - BridgeConnector.Socket.Emit("browserWindowLoadURL", Id, url, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("browserWindowLoadURL", Id, url, options); } /// @@ -1928,7 +1662,7 @@ public void LoadURL(string url, LoadURLOptions options) /// public void Reload() { - BridgeConnector.Socket.Emit("browserWindowReload", Id); + BridgeConnector.Emit("browserWindowReload", Id); } /// @@ -1948,12 +1682,13 @@ public void Reload() public void SetMenu(MenuItem[] menuItems) { menuItems.AddMenuItemsId(); - BridgeConnector.Socket.Emit("browserWindowSetMenu", Id, JArray.FromObject(menuItems, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetMenu", Id, JArray.FromObject(menuItems, _jsonSerializer)); _items.AddRange(menuItems); - BridgeConnector.Socket.Off("windowMenuItemClicked"); - BridgeConnector.Socket.On("windowMenuItemClicked", (id) => { - MenuItem menuItem = _items.GetMenuItem(id.ToString()); + BridgeConnector.Off("windowMenuItemClicked"); + BridgeConnector.On("windowMenuItemClicked", (id) => + { + MenuItem menuItem = _items.GetMenuItem(id); menuItem?.Click(); }); } @@ -1963,7 +1698,7 @@ public void SetMenu(MenuItem[] menuItems) /// public void RemoveMenu() { - BridgeConnector.Socket.Emit("browserWindowRemoveMenu", Id); + BridgeConnector.Emit("browserWindowRemoveMenu", Id); } /// @@ -1979,7 +1714,7 @@ public void RemoveMenu() /// public void SetProgressBar(double progress) { - BridgeConnector.Socket.Emit("browserWindowSetProgressBar", Id, progress); + BridgeConnector.Emit("browserWindowSetProgressBar", Id, progress); } /// @@ -1996,7 +1731,7 @@ public void SetProgressBar(double progress) /// public void SetProgressBar(double progress, ProgressBarOptions progressBarOptions) { - BridgeConnector.Socket.Emit("browserWindowSetProgressBar", Id, progress, JObject.FromObject(progressBarOptions, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetProgressBar", Id, progress, progressBarOptions); } /// @@ -2005,7 +1740,7 @@ public void SetProgressBar(double progress, ProgressBarOptions progressBarOption /// public void SetHasShadow(bool hasShadow) { - BridgeConnector.Socket.Emit("browserWindowSetHasShadow", Id, hasShadow); + BridgeConnector.Emit("browserWindowSetHasShadow", Id, hasShadow); } /// @@ -2016,17 +1751,7 @@ public void SetHasShadow(bool hasShadow) /// public Task HasShadowAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-hasShadow-completed", (hasShadow) => { - BridgeConnector.Socket.Off("browserWindow-hasShadow-completed"); - - taskCompletionSource.SetResult((bool)hasShadow); - }); - - BridgeConnector.Socket.Emit("browserWindowHasShadow", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowHasShadow", "browserWindow-hasShadow-completed" + Id, Id); } /// @@ -2036,6 +1761,7 @@ public Task HasShadowAsync() /// The thumbar buttons. /// public IReadOnlyCollection ThumbarButtons { get { return _thumbarButtons.AsReadOnly(); } } + private List _thumbarButtons = new List(); /// @@ -2052,22 +1778,24 @@ public Task HasShadowAsync() /// Whether the buttons were added successfully. public Task SetThumbarButtonsAsync(ThumbarButton[] thumbarButtons) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("browserWindowSetThumbarButtons-completed", (success) => { - BridgeConnector.Socket.Off("browserWindowSetThumbarButtons-completed"); + BridgeConnector.On("browserWindowSetThumbarButtons-completed" + Id, (success) => + { + BridgeConnector.Off("browserWindowSetThumbarButtons-completed" + Id); - taskCompletionSource.SetResult((bool)success); + taskCompletionSource.SetResult(success); }); thumbarButtons.AddThumbarButtonsId(); - BridgeConnector.Socket.Emit("browserWindowSetThumbarButtons", Id, JArray.FromObject(thumbarButtons, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetThumbarButtons", Id, JArray.FromObject(thumbarButtons, _jsonSerializer)); _thumbarButtons.Clear(); _thumbarButtons.AddRange(thumbarButtons); - BridgeConnector.Socket.Off("thumbarButtonClicked"); - BridgeConnector.Socket.On("thumbarButtonClicked", (id) => { - ThumbarButton thumbarButton = _thumbarButtons.GetThumbarButton(id.ToString()); + BridgeConnector.Off("thumbarButtonClicked"); + BridgeConnector.On("thumbarButtonClicked", (id) => + { + ThumbarButton thumbarButton = _thumbarButtons.GetThumbarButton(id); thumbarButton?.Click(); }); @@ -2082,7 +1810,7 @@ public Task SetThumbarButtonsAsync(ThumbarButton[] thumbarButtons) /// public void SetThumbnailClip(Rectangle rectangle) { - BridgeConnector.Socket.Emit("browserWindowSetThumbnailClip", Id, rectangle); + BridgeConnector.Emit("browserWindowSetThumbnailClip", Id, rectangle); } /// @@ -2091,7 +1819,7 @@ public void SetThumbnailClip(Rectangle rectangle) /// public void SetThumbnailToolTip(string tooltip) { - BridgeConnector.Socket.Emit("browserWindowSetThumbnailToolTip", Id, tooltip); + BridgeConnector.Emit("browserWindowSetThumbnailToolTip", Id, tooltip); } /// @@ -2103,7 +1831,7 @@ public void SetThumbnailToolTip(string tooltip) /// public void SetAppDetails(AppDetailsOptions options) { - BridgeConnector.Socket.Emit("browserWindowSetAppDetails", Id, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetAppDetails", Id, options); } /// @@ -2111,7 +1839,7 @@ public void SetAppDetails(AppDetailsOptions options) /// public void ShowDefinitionForSelection() { - BridgeConnector.Socket.Emit("browserWindowShowDefinitionForSelection", Id); + BridgeConnector.Emit("browserWindowShowDefinitionForSelection", Id); } /// @@ -2123,7 +1851,7 @@ public void ShowDefinitionForSelection() /// public void SetAutoHideMenuBar(bool hide) { - BridgeConnector.Socket.Emit("browserWindowSetAutoHideMenuBar", Id, hide); + BridgeConnector.Emit("browserWindowSetAutoHideMenuBar", Id, hide); } /// @@ -2132,17 +1860,7 @@ public void SetAutoHideMenuBar(bool hide) /// public Task IsMenuBarAutoHideAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMenuBarAutoHide-completed", (isMenuBarAutoHide) => { - BridgeConnector.Socket.Off("browserWindow-isMenuBarAutoHide-completed"); - - taskCompletionSource.SetResult((bool)isMenuBarAutoHide); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMenuBarAutoHide", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMenuBarAutoHide", "browserWindow-isMenuBarAutoHide-completed" + Id, Id); } /// @@ -2152,7 +1870,7 @@ public Task IsMenuBarAutoHideAsync() /// public void SetMenuBarVisibility(bool visible) { - BridgeConnector.Socket.Emit("browserWindowSetMenuBarVisibility", Id, visible); + BridgeConnector.Emit("browserWindowSetMenuBarVisibility", Id, visible); } /// @@ -2161,17 +1879,7 @@ public void SetMenuBarVisibility(bool visible) /// public Task IsMenuBarVisibleAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isMenuBarVisible-completed", (isMenuBarVisible) => { - BridgeConnector.Socket.Off("browserWindow-isMenuBarVisible-completed"); - - taskCompletionSource.SetResult((bool)isMenuBarVisible); - }); - - BridgeConnector.Socket.Emit("browserWindowIsMenuBarVisible", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsMenuBarVisible", "browserWindow-isMenuBarVisible-completed" + Id, Id); } /// @@ -2182,7 +1890,7 @@ public Task IsMenuBarVisibleAsync() /// public void SetVisibleOnAllWorkspaces(bool visible) { - BridgeConnector.Socket.Emit("browserWindowSetVisibleOnAllWorkspaces", Id, visible); + BridgeConnector.Emit("browserWindowSetVisibleOnAllWorkspaces", Id, visible); } /// @@ -2193,17 +1901,7 @@ public void SetVisibleOnAllWorkspaces(bool visible) /// public Task IsVisibleOnAllWorkspacesAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-isVisibleOnAllWorkspaces-completed", (isVisibleOnAllWorkspaces) => { - BridgeConnector.Socket.Off("browserWindow-isVisibleOnAllWorkspaces-completed"); - - taskCompletionSource.SetResult((bool)isVisibleOnAllWorkspaces); - }); - - BridgeConnector.Socket.Emit("browserWindowIsVisibleOnAllWorkspaces", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("browserWindowIsVisibleOnAllWorkspaces", "browserWindow-isVisibleOnAllWorkspaces-completed" + Id, Id); } /// @@ -2215,7 +1913,7 @@ public Task IsVisibleOnAllWorkspacesAsync() /// public void SetIgnoreMouseEvents(bool ignore) { - BridgeConnector.Socket.Emit("browserWindowSetIgnoreMouseEvents", Id, ignore); + BridgeConnector.Emit("browserWindowSetIgnoreMouseEvents", Id, ignore); } /// @@ -2227,7 +1925,7 @@ public void SetIgnoreMouseEvents(bool ignore) /// public void SetContentProtection(bool enable) { - BridgeConnector.Socket.Emit("browserWindowSetContentProtection", Id, enable); + BridgeConnector.Emit("browserWindowSetContentProtection", Id, enable); } /// @@ -2236,7 +1934,7 @@ public void SetContentProtection(bool enable) /// public void SetFocusable(bool focusable) { - BridgeConnector.Socket.Emit("browserWindowSetFocusable", Id, focusable); + BridgeConnector.Emit("browserWindowSetFocusable", Id, focusable); } /// @@ -2246,56 +1944,27 @@ public void SetFocusable(bool focusable) /// public void SetParentWindow(BrowserWindow parent) { - BridgeConnector.Socket.Emit("browserWindowSetParentWindow", Id, JObject.FromObject(parent, _jsonSerializer)); + BridgeConnector.Emit("browserWindowSetParentWindow", Id, parent); } /// /// The parent window. /// /// - public Task GetParentWindowAsync() + public async Task GetParentWindowAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("browserWindow-getParentWindow-completed", (id) => { - BridgeConnector.Socket.Off("browserWindow-getParentWindow-completed"); - var browserWindowId = int.Parse(id.ToString()); - var browserWindow = Electron.WindowManager.BrowserWindows.ToList().Single(x => x.Id == browserWindowId); - - taskCompletionSource.SetResult(browserWindow); - }); - - BridgeConnector.Socket.Emit("browserWindowGetParentWindow", Id); - - return taskCompletionSource.Task; + var windowID = await BridgeConnector.OnResult("browserWindowGetParentWindow", "browserWindow-getParentWindow-completed" + Id, Id); + return Electron.WindowManager.BrowserWindows.Where(w => w.Id == windowID).Single(); } /// /// All child windows. /// /// - public Task> GetChildWindowsAsync() + public async Task> GetChildWindowsAsync() { - var taskCompletionSource = new TaskCompletionSource>(); - - BridgeConnector.Socket.On("browserWindow-getChildWindows-completed", (ids) => { - BridgeConnector.Socket.Off("browserWindow-getChildWindows-completed"); - var browserWindowIds = ((JArray)ids).ToObject(); - var browserWindows = new List(); - - browserWindowIds.ToList().ForEach(id => - { - var browserWindow = Electron.WindowManager.BrowserWindows.ToList().Single(x => x.Id == id); - browserWindows.Add(browserWindow); - }); - - - taskCompletionSource.SetResult(browserWindows); - }); - - BridgeConnector.Socket.Emit("browserWindowGetChildWindows", Id); - - return taskCompletionSource.Task; + var windowIDs = new HashSet(await BridgeConnector.OnResult("browserWindowGetChildWindows", "browserWindow-getChildWindows-completed" + Id, Id)); + return Electron.WindowManager.BrowserWindows.Where(w => windowIDs.Contains(w.Id)).ToList(); } /// @@ -2304,7 +1973,7 @@ public Task> GetChildWindowsAsync() /// public void SetAutoHideCursor(bool autoHide) { - BridgeConnector.Socket.Emit("browserWindowSetAutoHideCursor", Id, autoHide); + BridgeConnector.Emit("browserWindowSetAutoHideCursor", Id, autoHide); } /// @@ -2316,7 +1985,7 @@ public void SetAutoHideCursor(bool autoHide) /// See the macOS documentation for more details. public void SetVibrancy(Vibrancy type) { - BridgeConnector.Socket.Emit("browserWindowSetVibrancy", Id, type.GetDescription()); + BridgeConnector.Emit("browserWindowSetVibrancy", Id, type.GetDescription()); } /// @@ -2332,10 +2001,10 @@ public void SetVibrancy(Vibrancy type) /// public void SetBrowserView(BrowserView browserView) { - BridgeConnector.Socket.Emit("browserWindow-setBrowserView", Id, browserView.Id); + BridgeConnector.Emit("browserWindow-setBrowserView", Id, browserView.Id); } - private JsonSerializer _jsonSerializer = new JsonSerializer() + private static readonly JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore diff --git a/ElectronNET.API/Clipboard.cs b/ElectronNET.API/Clipboard.cs index e7535378..b757bb0d 100644 --- a/ElectronNET.API/Clipboard.cs +++ b/ElectronNET.API/Clipboard.cs @@ -40,21 +40,7 @@ internal static Clipboard Instance /// /// /// The content in the clipboard as plain text. - public Task ReadTextAsync(string type = "") - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-readText-Completed", (text) => - { - BridgeConnector.Socket.Off("clipboard-readText-Completed"); - - taskCompletionSource.SetResult(text.ToString()); - }); - - BridgeConnector.Socket.Emit("clipboard-readText", type); - - return taskCompletionSource.Task; - } + public Task ReadTextAsync(string type = "") => BridgeConnector.OnResult("clipboard-readText", "clipboard-readText-Completed", type); /// /// Writes the text into the clipboard as plain text. @@ -63,7 +49,7 @@ public Task ReadTextAsync(string type = "") /// public void WriteText(string text, string type = "") { - BridgeConnector.Socket.Emit("clipboard-writeText", text, type); + BridgeConnector.Emit("clipboard-writeText", text, type); } /// @@ -71,21 +57,7 @@ public void WriteText(string text, string type = "") /// /// /// - public Task ReadHTMLAsync(string type = "") - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-readHTML-Completed", (text) => - { - BridgeConnector.Socket.Off("clipboard-readHTML-Completed"); - - taskCompletionSource.SetResult(text.ToString()); - }); - - BridgeConnector.Socket.Emit("clipboard-readHTML", type); - - return taskCompletionSource.Task; - } + public Task ReadHTMLAsync(string type = "") => BridgeConnector.OnResult("clipboard-readHTML", "clipboard-readHTML-Completed", type); /// /// Writes markup to the clipboard. @@ -94,7 +66,7 @@ public Task ReadHTMLAsync(string type = "") /// public void WriteHTML(string markup, string type = "") { - BridgeConnector.Socket.Emit("clipboard-writeHTML", markup, type); + BridgeConnector.Emit("clipboard-writeHTML", markup, type); } /// @@ -102,21 +74,8 @@ public void WriteHTML(string markup, string type = "") /// /// /// - public Task ReadRTFAsync(string type = "") - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-readRTF-Completed", (text) => - { - BridgeConnector.Socket.Off("clipboard-readRTF-Completed"); - - taskCompletionSource.SetResult(text.ToString()); - }); - - BridgeConnector.Socket.Emit("clipboard-readRTF", type); + public Task ReadRTFAsync(string type = "") => BridgeConnector.OnResult("clipboard-readRTF", "clipboard-readRTF-Completed", type); - return taskCompletionSource.Task; - } /// /// Writes the text into the clipboard in RTF. @@ -125,7 +84,7 @@ public Task ReadRTFAsync(string type = "") /// public void WriteRTF(string text, string type = "") { - BridgeConnector.Socket.Emit("clipboard-writeHTML", text, type); + BridgeConnector.Emit("clipboard-writeHTML", text, type); } /// @@ -134,21 +93,7 @@ public void WriteRTF(string text, string type = "") /// be empty strings when the bookmark is unavailable. /// /// - public Task ReadBookmarkAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-readBookmark-Completed", (bookmark) => - { - BridgeConnector.Socket.Off("clipboard-readBookmark-Completed"); - - taskCompletionSource.SetResult(((JObject)bookmark).ToObject()); - }); - - BridgeConnector.Socket.Emit("clipboard-readBookmark"); - - return taskCompletionSource.Task; - } + public Task ReadBookmarkAsync() => BridgeConnector.OnResult("clipboard-readBookmark", "clipboard-readBookmark-Completed"); /// /// Writes the title and url into the clipboard as a bookmark. @@ -162,7 +107,7 @@ public Task ReadBookmarkAsync() /// public void WriteBookmark(string title, string url, string type = "") { - BridgeConnector.Socket.Emit("clipboard-writeBookmark", title, url, type); + BridgeConnector.Emit("clipboard-writeBookmark", title, url, type); } /// @@ -171,21 +116,7 @@ public void WriteBookmark(string title, string url, string type = "") /// find pasteboard whenever the application is activated. /// /// - public Task ReadFindTextAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-readFindText-Completed", (text) => - { - BridgeConnector.Socket.Off("clipboard-readFindText-Completed"); - - taskCompletionSource.SetResult(text.ToString()); - }); - - BridgeConnector.Socket.Emit("clipboard-readFindText"); - - return taskCompletionSource.Task; - } + public Task ReadFindTextAsync() => BridgeConnector.OnResult("clipboard-readFindText", "clipboard-readFindText-Completed"); /// /// macOS: Writes the text into the find pasteboard as plain text. This method uses @@ -194,7 +125,7 @@ public Task ReadFindTextAsync() /// public void WriteFindText(string text) { - BridgeConnector.Socket.Emit("clipboard-writeFindText", text); + BridgeConnector.Emit("clipboard-writeFindText", text); } /// @@ -203,7 +134,7 @@ public void WriteFindText(string text) /// public void Clear(string type = "") { - BridgeConnector.Socket.Emit("clipboard-clear", type); + BridgeConnector.Emit("clipboard-clear", type); } /// @@ -211,21 +142,7 @@ public void Clear(string type = "") /// /// /// - public Task AvailableFormatsAsync(string type = "") - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-availableFormats-Completed", (formats) => - { - BridgeConnector.Socket.Off("clipboard-availableFormats-Completed"); - - taskCompletionSource.SetResult(((JArray)formats).ToObject()); - }); - - BridgeConnector.Socket.Emit("clipboard-availableFormats", type); - - return taskCompletionSource.Task; - } + public Task AvailableFormatsAsync(string type = "") => BridgeConnector.OnResult("clipboard-availableFormats", "clipboard-availableFormats-Completed", type); /// /// Writes data to the clipboard. @@ -234,7 +151,7 @@ public Task AvailableFormatsAsync(string type = "") /// public void Write(Data data, string type = "") { - BridgeConnector.Socket.Emit("clipboard-write", JObject.FromObject(data, _jsonSerializer), type); + BridgeConnector.Emit("clipboard-write", data, type); } /// @@ -242,24 +159,7 @@ public void Write(Data data, string type = "") /// /// /// - public Task ReadImageAsync(string type = "") - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("clipboard-readImage-Completed", (image) => - { - BridgeConnector.Socket.Off("clipboard-readImage-Completed"); - - var nativeImage = ((JObject)image).ToObject(); - - taskCompletionSource.SetResult(nativeImage); - - }); - - BridgeConnector.Socket.Emit("clipboard-readImage", type); - - return taskCompletionSource.Task; - } + public Task ReadImageAsync(string type = "") => BridgeConnector.OnResult("clipboard-readImage", "clipboard-readImage-Completed", type); /// /// Writes an image to the clipboard. @@ -268,14 +168,7 @@ public Task ReadImageAsync(string type = "") /// public void WriteImage(NativeImage image, string type = "") { - BridgeConnector.Socket.Emit("clipboard-writeImage", JsonConvert.SerializeObject(image), type); + BridgeConnector.Emit("clipboard-writeImage", JsonConvert.SerializeObject(image), type); } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } \ No newline at end of file diff --git a/ElectronNET.API/CommandLine.cs b/ElectronNET.API/CommandLine.cs index 63466b4b..26a116cd 100644 --- a/ElectronNET.API/CommandLine.cs +++ b/ElectronNET.API/CommandLine.cs @@ -43,7 +43,7 @@ internal static CommandLine Instance /// public void AppendSwitch(string the_switch, string value = "") { - BridgeConnector.Socket.Emit("appCommandLineAppendSwitch", the_switch, value); + BridgeConnector.Emit("appCommandLineAppendSwitch", the_switch, value); } /// @@ -57,7 +57,7 @@ public void AppendSwitch(string the_switch, string value = "") /// public void AppendArgument(string value) { - BridgeConnector.Socket.Emit("appCommandLineAppendArgument", value); + BridgeConnector.Emit("appCommandLineAppendArgument", value); } /// @@ -66,24 +66,7 @@ public void AppendArgument(string value) /// A command-line switch /// /// Whether the command-line switch is present. - public async Task HasSwitchAsync(string switchName, CancellationToken cancellationToken = default(CancellationToken)) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appCommandLineHasSwitchCompleted", (result) => - { - BridgeConnector.Socket.Off("appCommandLineHasSwitchCompleted"); - taskCompletionSource.SetResult((bool)result); - }); - - BridgeConnector.Socket.Emit("appCommandLineHasSwitch", switchName); - - return await taskCompletionSource.Task.ConfigureAwait(false); - } - } + public Task HasSwitchAsync(string switchName, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appCommandLineHasSwitch", "appCommandLineHasSwitchCompleted", cancellationToken, switchName); /// /// The command-line switch value. @@ -94,23 +77,6 @@ public void AppendArgument(string value) /// /// Note: When the switch is not present or has no value, it returns empty string. /// - public async Task GetSwitchValueAsync(string switchName, CancellationToken cancellationToken = default(CancellationToken)) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("appCommandLineGetSwitchValueCompleted", (result) => - { - BridgeConnector.Socket.Off("appCommandLineGetSwitchValueCompleted"); - taskCompletionSource.SetResult((string)result); - }); - - BridgeConnector.Socket.Emit("appCommandLineGetSwitchValue", switchName); - - return await taskCompletionSource.Task.ConfigureAwait(false); - } - } + public Task GetSwitchValueAsync(string switchName, CancellationToken cancellationToken = default) => BridgeConnector.OnResult("appCommandLineGetSwitchValue", "appCommandLineGetSwitchValueCompleted", cancellationToken, switchName); } } diff --git a/ElectronNET.API/Cookies.cs b/ElectronNET.API/Cookies.cs index 98be3d42..67f16b0c 100644 --- a/ElectronNET.API/Cookies.cs +++ b/ElectronNET.API/Cookies.cs @@ -34,15 +34,12 @@ public event Action OnChanged { if (_changed == null) { - BridgeConnector.Socket.On("webContents-session-cookies-changed" + Id, (args) => + BridgeConnector.On("webContents-session-cookies-changed" + Id, (args) => { - Cookie cookie = ((JArray)args)[0].ToObject(); - CookieChangedCause cause = ((JArray)args)[1].ToObject(); - bool removed = ((JArray)args)[2].ToObject(); - _changed(cookie, cause, removed); + _changed(args.cookie, args.cause, args.removed); }); - BridgeConnector.Socket.Emit("register-webContents-session-cookies-changed", Id); + BridgeConnector.Emit("register-webContents-session-cookies-changed", Id); } _changed += value; } @@ -51,7 +48,7 @@ public event Action OnChanged _changed -= value; if (_changed == null) - BridgeConnector.Socket.Off("webContents-session-cookies-changed" + Id); + BridgeConnector.Off("webContents-session-cookies-changed" + Id); } } @@ -65,18 +62,16 @@ public event Action OnChanged /// A task which resolves an array of cookie objects. public Task GetAsync(CookieFilter filter) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-cookies-get-completed" + guid, (cookies) => + BridgeConnector.On("webContents-session-cookies-get-completed" + guid, (cookies) => { - Cookie[] result = ((JArray)cookies).ToObject(); - - BridgeConnector.Socket.Off("webContents-session-cookies-get-completed" + guid); - taskCompletionSource.SetResult(result); + BridgeConnector.Off("webContents-session-cookies-get-completed" + guid); + taskCompletionSource.SetResult(cookies); }); - BridgeConnector.Socket.Emit("webContents-session-cookies-get", Id, JObject.FromObject(filter, _jsonSerializer), guid); + BridgeConnector.Emit("webContents-session-cookies-get", Id, filter, guid); return taskCompletionSource.Task; } @@ -88,16 +83,16 @@ public Task GetAsync(CookieFilter filter) /// public Task SetAsync(CookieDetails details) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-cookies-set-completed" + guid, () => + BridgeConnector.On("webContents-session-cookies-set-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-cookies-set-completed" + guid); + BridgeConnector.Off("webContents-session-cookies-set-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-cookies-set", Id, JObject.FromObject(details, _jsonSerializer), guid); + BridgeConnector.Emit("webContents-session-cookies-set", Id, details, guid); return taskCompletionSource.Task; } @@ -110,16 +105,16 @@ public Task SetAsync(CookieDetails details) /// A task which resolves when the cookie has been removed public Task RemoveAsync(string url, string name) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-cookies-remove-completed" + guid, () => + BridgeConnector.On("webContents-session-cookies-remove-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-cookies-remove-completed" + guid); + BridgeConnector.Off("webContents-session-cookies-remove-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-cookies-remove", Id, url, name, guid); + BridgeConnector.Emit("webContents-session-cookies-remove", Id, url, name, guid); return taskCompletionSource.Task; } @@ -130,25 +125,18 @@ public Task RemoveAsync(string url, string name) /// A task which resolves when the cookie store has been flushed public Task FlushStoreAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-cookies-flushStore-completed" + guid, () => + BridgeConnector.On("webContents-session-cookies-flushStore-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-cookies-flushStore-completed" + guid); + BridgeConnector.Off("webContents-session-cookies-flushStore-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-cookies-flushStore", Id, guid); + BridgeConnector.Emit("webContents-session-cookies-flushStore", Id, guid); return taskCompletionSource.Task; } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } \ No newline at end of file diff --git a/ElectronNET.API/Dialog.cs b/ElectronNET.API/Dialog.cs index 7b626b4e..a8ecb824 100644 --- a/ElectronNET.API/Dialog.cs +++ b/ElectronNET.API/Dialog.cs @@ -48,26 +48,23 @@ internal static Dialog Instance /// An array of file paths chosen by the user public Task ShowOpenDialogAsync(BrowserWindow browserWindow, OpenDialogOptions options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("showOpenDialogComplete" + guid, (filePaths) => + BridgeConnector.On("showOpenDialogComplete" + guid, (filePaths) => { - BridgeConnector.Socket.Off("showOpenDialogComplete" + guid); + BridgeConnector.Off("showOpenDialogComplete" + guid); - var result = ((JArray)filePaths).ToObject(); var list = new List(); - foreach (var item in result) + + foreach (var item in filePaths) { list.Add(HttpUtility.UrlDecode(item)); } taskCompletionSource.SetResult(list.ToArray()); }); - - BridgeConnector.Socket.Emit("showOpenDialog", - JObject.FromObject(browserWindow, _jsonSerializer), - JObject.FromObject(options, _jsonSerializer), guid); + BridgeConnector.Emit("showOpenDialog", browserWindow, options, guid); return taskCompletionSource.Task; } @@ -80,20 +77,17 @@ public Task ShowOpenDialogAsync(BrowserWindow browserWindow, OpenDialo /// Returns String, the path of the file chosen by the user, if a callback is provided it returns an empty string. public Task ShowSaveDialogAsync(BrowserWindow browserWindow, SaveDialogOptions options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("showSaveDialogComplete" + guid, (filename) => + BridgeConnector.On("showSaveDialogComplete" + guid, (filename) => { - BridgeConnector.Socket.Off("showSaveDialogComplete" + guid); + BridgeConnector.Off("showSaveDialogComplete" + guid); - taskCompletionSource.SetResult(filename.ToString()); + taskCompletionSource.SetResult(filename); }); - BridgeConnector.Socket.Emit("showSaveDialog", - JObject.FromObject(browserWindow, _jsonSerializer), - JObject.FromObject(options, _jsonSerializer), - guid); + BridgeConnector.Emit("showSaveDialog", browserWindow, options, guid); return taskCompletionSource.Task; } @@ -149,32 +143,27 @@ public async Task ShowMessageBoxAsync(BrowserWindow browserWin /// The API call will be asynchronous and the result will be passed via MessageBoxResult. public Task ShowMessageBoxAsync(BrowserWindow browserWindow, MessageBoxOptions messageBoxOptions) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("showMessageBoxComplete" + guid, (args) => + BridgeConnector.On("showMessageBoxComplete" + guid, (args) => { - BridgeConnector.Socket.Off("showMessageBoxComplete" + guid); - - var result = ((JArray)args); + BridgeConnector.Off("showMessageBoxComplete" + guid); taskCompletionSource.SetResult(new MessageBoxResult { - Response = (int)result.First, - CheckboxChecked = (bool)result.Last + Response = args.response, + CheckboxChecked = args.@checked }); }); if (browserWindow == null) { - BridgeConnector.Socket.Emit("showMessageBox", JObject.FromObject(messageBoxOptions, _jsonSerializer), guid); + BridgeConnector.Emit("showMessageBox", messageBoxOptions, guid); } else { - BridgeConnector.Socket.Emit("showMessageBox", - JObject.FromObject(browserWindow, _jsonSerializer), - JObject.FromObject(messageBoxOptions, _jsonSerializer), - guid); + BridgeConnector.Emit("showMessageBox", browserWindow , messageBoxOptions, guid); } return taskCompletionSource.Task; @@ -192,7 +181,7 @@ public Task ShowMessageBoxAsync(BrowserWindow browserWindow, M /// The text content to display in the error box. public void ShowErrorBox(string title, string content) { - BridgeConnector.Socket.Emit("showErrorBox", title, content); + BridgeConnector.Emit("showErrorBox", title, content); } /// @@ -217,28 +206,18 @@ public Task ShowCertificateTrustDialogAsync(CertificateTrustDialogOptions option /// public Task ShowCertificateTrustDialogAsync(BrowserWindow browserWindow, CertificateTrustDialogOptions options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("showCertificateTrustDialogComplete" + guid, () => + BridgeConnector.On("showCertificateTrustDialogComplete" + guid, () => { - BridgeConnector.Socket.Off("showCertificateTrustDialogComplete" + guid); + BridgeConnector.Off("showCertificateTrustDialogComplete" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("showCertificateTrustDialog", - JObject.FromObject(browserWindow, _jsonSerializer), - JObject.FromObject(options, _jsonSerializer), - guid); + BridgeConnector.Emit("showCertificateTrustDialog", browserWindow, options, guid); return taskCompletionSource.Task; } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } diff --git a/ElectronNET.API/Dock.cs b/ElectronNET.API/Dock.cs index 03276842..9c00b2d3 100644 --- a/ElectronNET.API/Dock.cs +++ b/ElectronNET.API/Dock.cs @@ -50,24 +50,11 @@ internal static Dock Instance /// Can be critical or informational. The default is informational. /// The cancellation token. /// Return an ID representing the request. - public async Task BounceAsync(DockBounceType type, CancellationToken cancellationToken = default) + public Task BounceAsync(DockBounceType type, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("dock-bounce-completed", (id) => - { - BridgeConnector.Socket.Off("dock-bounce-completed"); - taskCompletionSource.SetResult((int) id); - }); - - BridgeConnector.Socket.Emit("dock-bounce", type.GetDescription()); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } + return BridgeConnector.OnResult("dock-bounce", "dock-bounce-completed", cancellationToken, type.GetDescription()); } /// @@ -76,7 +63,7 @@ public async Task BounceAsync(DockBounceType type, CancellationToken cancel /// Id of the request. public void CancelBounce(int id) { - BridgeConnector.Socket.Emit("dock-cancelBounce", id); + BridgeConnector.Emit("dock-cancelBounce", id); } /// @@ -85,7 +72,7 @@ public void CancelBounce(int id) /// public void DownloadFinished(string filePath) { - BridgeConnector.Socket.Emit("dock-downloadFinished", filePath); + BridgeConnector.Emit("dock-downloadFinished", filePath); } /// @@ -94,7 +81,7 @@ public void DownloadFinished(string filePath) /// public void SetBadge(string text) { - BridgeConnector.Socket.Emit("dock-setBadge", text); + BridgeConnector.Emit("dock-setBadge", text); } /// @@ -102,24 +89,10 @@ public void SetBadge(string text) /// /// The cancellation token. /// The badge string of the dock. - public async Task GetBadgeAsync(CancellationToken cancellationToken = default) + public Task GetBadgeAsync(CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("dock-getBadge-completed", (text) => - { - BridgeConnector.Socket.Off("dock-getBadge-completed"); - taskCompletionSource.SetResult((string) text); - }); - - BridgeConnector.Socket.Emit("dock-getBadge"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } + return BridgeConnector.OnResult("dock-getBadge", "dock-getBadge-completed", cancellationToken); } /// @@ -127,7 +100,7 @@ public async Task GetBadgeAsync(CancellationToken cancellationToken = de /// public void Hide() { - BridgeConnector.Socket.Emit("dock-hide"); + BridgeConnector.Emit("dock-hide"); } /// @@ -135,7 +108,7 @@ public void Hide() /// public void Show() { - BridgeConnector.Socket.Emit("dock-show"); + BridgeConnector.Emit("dock-show"); } /// @@ -144,24 +117,10 @@ public void Show() /// /// The cancellation token. /// Whether the dock icon is visible. - public async Task IsVisibleAsync(CancellationToken cancellationToken = default) + public Task IsVisibleAsync(CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("dock-isVisible-completed", (isVisible) => - { - BridgeConnector.Socket.Off("dock-isVisible-completed"); - taskCompletionSource.SetResult((bool) isVisible); - }); - - BridgeConnector.Socket.Emit("dock-isVisible"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } + return BridgeConnector.OnResult("dock-isVisible", "dock-isVisible-completed", cancellationToken); } /// @@ -179,40 +138,21 @@ public async Task IsVisibleAsync(CancellationToken cancellationToken = def public void SetMenu(MenuItem[] menuItems) { menuItems.AddMenuItemsId(); - BridgeConnector.Socket.Emit("dock-setMenu", JArray.FromObject(menuItems, _jsonSerializer)); + BridgeConnector.Emit("dock-setMenu", JArray.FromObject(menuItems, _jsonSerializer)); _items.AddRange(menuItems); - BridgeConnector.Socket.Off("dockMenuItemClicked"); - BridgeConnector.Socket.On("dockMenuItemClicked", (id) => { - MenuItem menuItem = _items.GetMenuItem(id.ToString()); + BridgeConnector.Off("dockMenuItemClicked"); + BridgeConnector.On("dockMenuItemClicked", (id) => { + MenuItem menuItem = _items.GetMenuItem(id); menuItem?.Click(); }); - } /// /// TODO: Menu (macOS) still to be implemented /// Gets the application's dock menu. /// - public async Task GetMenu(CancellationToken cancellationToken = default) - { - cancellationToken.ThrowIfCancellationRequested(); - - var taskCompletionSource = new TaskCompletionSource(); - using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) - { - BridgeConnector.Socket.On("dock-getMenu-completed", (menu) => - { - BridgeConnector.Socket.Off("dock-getMenu-completed"); - taskCompletionSource.SetResult(((JObject)menu).ToObject()); - }); - - BridgeConnector.Socket.Emit("dock-getMenu"); - - return await taskCompletionSource.Task - .ConfigureAwait(false); - } - } + public Task GetMenu(CancellationToken cancellationToken = default) => BridgeConnector.OnResult("dock-getMenu", "dock-getMenu-completed", cancellationToken); /// /// Sets the image associated with this dock icon. @@ -220,10 +160,10 @@ public async Task GetMenu(CancellationToken cancellationToken = default) /// public void SetIcon(string image) { - BridgeConnector.Socket.Emit("dock-setIcon", image); + BridgeConnector.Emit("dock-setIcon", image); } - private JsonSerializer _jsonSerializer = new JsonSerializer() + private static readonly JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore diff --git a/ElectronNET.API/ElectronNET.API.csproj b/ElectronNET.API/ElectronNET.API.csproj index 7e948cff..eeb858f7 100644 --- a/ElectronNET.API/ElectronNET.API.csproj +++ b/ElectronNET.API/ElectronNET.API.csproj @@ -5,14 +5,14 @@ true ..\artifacts ElectronNET.API - Gregor Biswanger, Robert Muehsig + Gregor Biswanger, Robert Muehsig, Rafael Oliveira Electron.NET MIT - https://github.com/ElectronNET/Electron.NET/ + https://github.com/ElectronNet/Electron.NET/ Building cross platform electron based desktop apps with .NET Core and ASP.NET Core. This package contains the API to access the "native" electron API. - https://github.com/ElectronNET/Electron.NET/ + https://github.com/ElectronNet/Electron.NET/ git true electron aspnetcore @@ -40,8 +40,10 @@ This package contains the API to access the "native" electron API. all runtime; build; native; contentfiles; analyzers - - + + + + diff --git a/ElectronNET.API/Entities/CookieChangedCause.cs b/ElectronNET.API/Entities/CookieChangedCause.cs index d42430da..f48c8f91 100644 --- a/ElectronNET.API/Entities/CookieChangedCause.cs +++ b/ElectronNET.API/Entities/CookieChangedCause.cs @@ -1,7 +1,9 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace ElectronNET.API.Entities { +namespace ElectronNET.API.Entities +{ + /// /// The cause of the change /// diff --git a/ElectronNET.API/Entities/CookieRemovedResponse.cs b/ElectronNET.API/Entities/CookieRemovedResponse.cs new file mode 100644 index 00000000..88dece6f --- /dev/null +++ b/ElectronNET.API/Entities/CookieRemovedResponse.cs @@ -0,0 +1,10 @@ +namespace ElectronNET.API.Entities +{ + public class CookieRemovedResponse + { + public Cookie cookie {get;set;} + + public CookieChangedCause cause { get; set; } + public bool removed { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/Display.cs b/ElectronNET.API/Entities/Display.cs index cdf9ac87..4d44f32e 100644 --- a/ElectronNET.API/Entities/Display.cs +++ b/ElectronNET.API/Entities/Display.cs @@ -1,5 +1,10 @@ namespace ElectronNET.API.Entities { + public class DisplayChanged + { + public Display display { get; set; } + public string[] metrics { get; set; } + } /// /// /// diff --git a/ElectronNET.API/Entities/JumpListSettings.cs b/ElectronNET.API/Entities/JumpListSettings.cs index 82184ed1..150d0b78 100644 --- a/ElectronNET.API/Entities/JumpListSettings.cs +++ b/ElectronNET.API/Entities/JumpListSettings.cs @@ -1,8 +1,5 @@ namespace ElectronNET.API.Entities { - /// - /// - /// public class JumpListSettings { /// diff --git a/ElectronNET.API/Entities/MessageBoxResult.cs b/ElectronNET.API/Entities/MessageBoxResult.cs index 835c292c..8910dff1 100644 --- a/ElectronNET.API/Entities/MessageBoxResult.cs +++ b/ElectronNET.API/Entities/MessageBoxResult.cs @@ -1,5 +1,11 @@ namespace ElectronNET.API.Entities { + internal class MessageBoxResponse + { + public int response { get; set; } + public bool @checked { get; set; } + } + /// /// /// diff --git a/ElectronNET.API/Entities/ReleaseNoteInfo.cs b/ElectronNET.API/Entities/ReleaseNoteInfo.cs deleted file mode 100644 index c9ebf2aa..00000000 --- a/ElectronNET.API/Entities/ReleaseNoteInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace ElectronNET.API.Entities -{ - /// - /// - /// - public class ReleaseNoteInfo - { - /// - /// The version. - /// - public string Version { get; set; } - - /// - /// The note. - /// - public string Note { get; set; } - } -} diff --git a/ElectronNET.API/Entities/SecondInstanceResponse.cs b/ElectronNET.API/Entities/SecondInstanceResponse.cs new file mode 100644 index 00000000..de3e2eca --- /dev/null +++ b/ElectronNET.API/Entities/SecondInstanceResponse.cs @@ -0,0 +1,9 @@ +namespace ElectronNET.API.Entities +{ + public class SecondInstanceResponse + { + public string[] args { get; set; } + + public string workingDirectory { get;set;} + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/TrayClickEventArgs.cs b/ElectronNET.API/Entities/TrayClickEventArgs.cs index 516e192a..ca3a4449 100644 --- a/ElectronNET.API/Entities/TrayClickEventArgs.cs +++ b/ElectronNET.API/Entities/TrayClickEventArgs.cs @@ -1,5 +1,6 @@ namespace ElectronNET.API { + /// /// /// diff --git a/ElectronNET.API/Entities/TrayClickEventResponse.cs b/ElectronNET.API/Entities/TrayClickEventResponse.cs new file mode 100644 index 00000000..e0a51703 --- /dev/null +++ b/ElectronNET.API/Entities/TrayClickEventResponse.cs @@ -0,0 +1,8 @@ +namespace ElectronNET.API.Entities +{ + public class TrayClickEventResponse + { + public TrayClickEventArgs eventArgs { get; set; } + public Rectangle bounds { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/UpdateInfo.cs b/ElectronNET.API/Entities/UpdateInfo.cs index 5b33bf0b..01dc54bc 100644 --- a/ElectronNET.API/Entities/UpdateInfo.cs +++ b/ElectronNET.API/Entities/UpdateInfo.cs @@ -23,7 +23,7 @@ public class UpdateInfo /// /// The release notes. /// - public ReleaseNoteInfo[] ReleaseNotes { get; set; } = new ReleaseNoteInfo[0]; + public string ReleaseNotes { get; set; } /// /// diff --git a/ElectronNET.API/Entities/WebPreferences.cs b/ElectronNET.API/Entities/WebPreferences.cs index 382de6aa..34a65317 100644 --- a/ElectronNET.API/Entities/WebPreferences.cs +++ b/ElectronNET.API/Entities/WebPreferences.cs @@ -184,6 +184,7 @@ public class WebPreferences /// can access this context in the dev tools by selecting the 'Electron Isolated /// Context' entry in the combo box at the top of the Console tab. This option is /// currently experimental and may change or be removed in future Electron releases. + /// Default value is false. /// [DefaultValue(false)] public bool ContextIsolation { get; set; } = false; diff --git a/ElectronNET.API/Events.cs b/ElectronNET.API/Events.cs index bbbee340..6c01cdc2 100644 --- a/ElectronNET.API/Events.cs +++ b/ElectronNET.API/Events.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using Quobject.EngineIoClientDotNet.ComponentEmitter; namespace ElectronNET.API { @@ -42,17 +41,8 @@ public static Events Instance /// The name of the module, e.g. app, dock, etc... /// The name of the event /// The event handler - public void On(string moduleName, string eventName, Action fn) - => On(moduleName, eventName, new ListenerImpl(fn)); + public void On(string moduleName, string eventName, Action fn) => On(moduleName, eventName, _ => fn()); - /// - /// Subscribe to an unmapped electron event. - /// - /// The name of the module, e.g. app, dock, etc... - /// The name of the event - /// The event handler - public void On(string moduleName, string eventName, Action fn) - => On(moduleName, eventName, new ListenerImpl(fn)); /// /// Subscribe to an unmapped electron event. @@ -60,13 +50,13 @@ public void On(string moduleName, string eventName, Action fn) /// The name of the module, e.g. app, dock, etc... /// The name of the event /// The event handler - private void On(string moduleName, string eventName, IListener fn) + public void On(string moduleName, string eventName, Action fn) { var listener = $"{moduleName}{_ti.ToTitleCase(eventName)}Completed"; var subscriber = $"register-{moduleName}-on-event"; - BridgeConnector.Socket.On(listener, fn); - BridgeConnector.Socket.Emit(subscriber, eventName, listener); + BridgeConnector.On(listener, fn); + BridgeConnector.Emit(subscriber, eventName, listener); } /// @@ -75,8 +65,7 @@ private void On(string moduleName, string eventName, IListener fn) /// The name of the module, e.g. app, dock, etc... /// The name of the event /// The event handler - public void Once(string moduleName, string eventName, Action fn) - => Once(moduleName, eventName, new ListenerImpl(fn)); + public void Once(string moduleName, string eventName, Action fn) => Once(moduleName, eventName, _ => fn()); /// /// Subscribe to an unmapped electron event. @@ -85,21 +74,11 @@ public void Once(string moduleName, string eventName, Action fn) /// The name of the event /// The event handler public void Once(string moduleName, string eventName, Action fn) - => Once(moduleName, eventName, new ListenerImpl(fn)); - - /// - /// Subscribe to an unmapped electron event. - /// - /// The name of the module, e.g. app, dock, etc... - /// The name of the event - /// The event handler - private void Once(string moduleName, string eventName, IListener fn) { var listener = $"{moduleName}{_ti.ToTitleCase(eventName)}Completed"; var subscriber = $"register-{moduleName}-once-event"; - BridgeConnector.Socket.Once(listener, fn); - BridgeConnector.Socket.Emit(subscriber, eventName, listener); + BridgeConnector.Once(listener, fn); + BridgeConnector.Emit(subscriber, eventName, listener); } - } } diff --git a/ElectronNET.API/GlobalShortcut.cs b/ElectronNET.API/GlobalShortcut.cs index d2867ecd..9efbdf27 100644 --- a/ElectronNET.API/GlobalShortcut.cs +++ b/ElectronNET.API/GlobalShortcut.cs @@ -49,16 +49,16 @@ public void Register(string accelerator, Action function) { _shortcuts.Add(accelerator, function); - BridgeConnector.Socket.Off("globalShortcut-pressed"); - BridgeConnector.Socket.On("globalShortcut-pressed", (shortcut) => + BridgeConnector.Off("globalShortcut-pressed"); + BridgeConnector.On("globalShortcut-pressed", (shortcut) => { - if (_shortcuts.ContainsKey(shortcut.ToString())) + if (_shortcuts.ContainsKey(shortcut)) { _shortcuts[shortcut.ToString()](); } }); - BridgeConnector.Socket.Emit("globalShortcut-register", accelerator); + BridgeConnector.Emit("globalShortcut-register", accelerator); } } @@ -68,21 +68,8 @@ public void Register(string accelerator, Action function) /// since they don’t want applications to fight for global shortcuts. /// /// Whether this application has registered accelerator. - public Task IsRegisteredAsync(string accelerator) - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("globalShortcut-isRegisteredCompleted", (isRegistered) => - { - BridgeConnector.Socket.Off("globalShortcut-isRegisteredCompleted"); + public Task IsRegisteredAsync(string accelerator) => BridgeConnector.OnResult("globalShortcut-isRegistered", "globalShortcut-isRegisteredCompleted", accelerator); - taskCompletionSource.SetResult((bool)isRegistered); - }); - - BridgeConnector.Socket.Emit("globalShortcut-isRegistered", accelerator); - - return taskCompletionSource.Task; - } /// /// Unregisters the global shortcut of accelerator. @@ -90,7 +77,7 @@ public Task IsRegisteredAsync(string accelerator) public void Unregister(string accelerator) { _shortcuts.Remove(accelerator); - BridgeConnector.Socket.Emit("globalShortcut-unregister", accelerator); + BridgeConnector.Emit("globalShortcut-unregister", accelerator); } /// @@ -99,7 +86,7 @@ public void Unregister(string accelerator) public void UnregisterAll() { _shortcuts.Clear(); - BridgeConnector.Socket.Emit("globalShortcut-unregisterAll"); + BridgeConnector.Emit("globalShortcut-unregisterAll"); } } } \ No newline at end of file diff --git a/ElectronNET.API/HostHook.cs b/ElectronNET.API/HostHook.cs index 37606250..a5c4e9a9 100644 --- a/ElectronNET.API/HostHook.cs +++ b/ElectronNET.API/HostHook.cs @@ -47,13 +47,13 @@ internal static HostHook Instance /// Optional parameters. public void Call(string socketEventName, params dynamic[] arguments) { - BridgeConnector.Socket.On(socketEventName + "Error" + oneCallguid, (result) => + BridgeConnector.On(socketEventName + "Error" + oneCallguid, (result) => { - BridgeConnector.Socket.Off(socketEventName + "Error" + oneCallguid); - Electron.Dialog.ShowErrorBox("Host Hook Exception", result.ToString()); + BridgeConnector.Off(socketEventName + "Error" + oneCallguid); + Electron.Dialog.ShowErrorBox("Host Hook Exception", result); }); - BridgeConnector.Socket.Emit(socketEventName, arguments, oneCallguid); + BridgeConnector.Emit(socketEventName, arguments, oneCallguid); } /// @@ -65,64 +65,26 @@ public void Call(string socketEventName, params dynamic[] arguments) /// public Task CallAsync(string socketEventName, params dynamic[] arguments) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On(socketEventName + "Error" + guid, (result) => + BridgeConnector.On(socketEventName + "Error" + guid, (result) => { - BridgeConnector.Socket.Off(socketEventName + "Error" + guid); - Electron.Dialog.ShowErrorBox("Host Hook Exception", result.ToString()); + BridgeConnector.Off(socketEventName + "Error" + guid); + Electron.Dialog.ShowErrorBox("Host Hook Exception", result); taskCompletionSource.SetException(new Exception($"Host Hook Exception {result}")); }); - BridgeConnector.Socket.On(socketEventName + "Complete" + guid, (result) => + BridgeConnector.On(socketEventName + "Complete" + guid, (result) => { - BridgeConnector.Socket.Off(socketEventName + "Error" + guid); - BridgeConnector.Socket.Off(socketEventName + "Complete" + guid); - T data = default; - - try - { - if (result.GetType().IsValueType || result is string) - { - data = (T)result; - } - else - { - var token = JToken.Parse(result.ToString()); - if (token is JArray) - { - data = token.ToObject(); - } - else if (token is JObject) - { - data = token.ToObject(); - } - else - { - data = (T)result; - } - } - } - catch (Exception exception) - { - taskCompletionSource.SetException(exception); - //throw new InvalidCastException("Return value does not match with the generic type.", exception); - } - - taskCompletionSource.SetResult(data); + BridgeConnector.Off(socketEventName + "Error" + guid); + BridgeConnector.Off(socketEventName + "Complete" + guid); + taskCompletionSource.SetResult(result); }); - BridgeConnector.Socket.Emit(socketEventName, arguments, guid); + BridgeConnector.Emit(socketEventName, arguments, guid); return taskCompletionSource.Task; } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } diff --git a/ElectronNET.API/IpcMain.cs b/ElectronNET.API/IpcMain.cs index 3e950c12..eae3f3cf 100644 --- a/ElectronNET.API/IpcMain.cs +++ b/ElectronNET.API/IpcMain.cs @@ -45,11 +45,11 @@ internal static IpcMain Instance /// Callback Method. public void On(string channel, Action listener) { - BridgeConnector.Socket.Emit("registerIpcMainChannel", channel); - BridgeConnector.Socket.Off(channel); - BridgeConnector.Socket.On(channel, (args) => + BridgeConnector.Emit("registerIpcMainChannel", channel); + BridgeConnector.Off(channel); + BridgeConnector.On(channel, (args) => { - List objectArray = FormatArguments(args); + var objectArray = FormatArguments(args); if(objectArray.Count == 1) { @@ -62,20 +62,9 @@ public void On(string channel, Action listener) }); } - private List FormatArguments(object args) + private List FormatArguments(object[] objectArray) { - List objectArray = ((JArray)args).ToObject().ToList(); - - for (int index = 0; index < objectArray.Count; index++) - { - var item = objectArray[index]; - if (item == null) - { - objectArray.Remove(item); - } - } - - return objectArray; + return objectArray.Where(o => o is object).ToList(); } /// @@ -89,9 +78,9 @@ private List FormatArguments(object args) /// public void OnSync(string channel, Func listener) { - BridgeConnector.Socket.Emit("registerSyncIpcMainChannel", channel); - BridgeConnector.Socket.On(channel, (args) => { - List objectArray = FormatArguments(args); + BridgeConnector.Emit("registerSyncIpcMainChannel", channel); + BridgeConnector.On(channel, (args) => { + var objectArray = FormatArguments(args); object parameter; if (objectArray.Count == 1) { @@ -103,7 +92,7 @@ public void OnSync(string channel, Func listener) } var result = listener(parameter); - BridgeConnector.Socket.Emit(channel + "Sync", result); + BridgeConnector.Emit(channel + "Sync", result); }); } @@ -115,10 +104,10 @@ public void OnSync(string channel, Func listener) /// Callback Method. public void Once(string channel, Action listener) { - BridgeConnector.Socket.Emit("registerOnceIpcMainChannel", channel); - BridgeConnector.Socket.On(channel, (args) => + BridgeConnector.Emit("registerOnceIpcMainChannel", channel); + BridgeConnector.On(channel, (args) => { - List objectArray = FormatArguments(args); + var objectArray = FormatArguments(args); if (objectArray.Count == 1) { @@ -137,7 +126,7 @@ public void Once(string channel, Action listener) /// Channelname. public void RemoveAllListeners(string channel) { - BridgeConnector.Socket.Emit("removeAllListenersIpcMainChannel", channel); + BridgeConnector.Emit("removeAllListenersIpcMainChannel", channel); } /// @@ -171,11 +160,11 @@ public void Send(BrowserWindow browserWindow, string channel, params object[] da if(jobjects.Count > 0 || jarrays.Count > 0) { - BridgeConnector.Socket.Emit("sendToIpcRenderer", JObject.FromObject(browserWindow, _jsonSerializer), channel, jarrays.ToArray(), jobjects.ToArray(), objects.ToArray()); + BridgeConnector.Emit("sendToIpcRenderer", JObject.FromObject(browserWindow, _jsonSerializer), channel, jarrays.ToArray(), jobjects.ToArray(), objects.ToArray()); } else { - BridgeConnector.Socket.Emit("sendToIpcRenderer", JObject.FromObject(browserWindow, _jsonSerializer), channel, data); + BridgeConnector.Emit("sendToIpcRenderer", JObject.FromObject(browserWindow, _jsonSerializer), channel, data); } } @@ -210,14 +199,35 @@ public void Send(BrowserView browserView, string channel, params object[] data) if(jobjects.Count > 0 || jarrays.Count > 0) { - BridgeConnector.Socket.Emit("sendToIpcRendererBrowserView", browserView.Id, channel, jarrays.ToArray(), jobjects.ToArray(), objects.ToArray()); + BridgeConnector.Emit("sendToIpcRendererBrowserView", browserView.Id, channel, jarrays.ToArray(), jobjects.ToArray(), objects.ToArray()); } else { - BridgeConnector.Socket.Emit("sendToIpcRendererBrowserView", browserView.Id, channel, data); + BridgeConnector.Emit("sendToIpcRendererBrowserView", browserView.Id, channel, data); } } + /// + /// Log a message to the console output pipe. This is used when running with "detachedProcess" : true on the electron.manifest.json, + /// as in that case we can't open pipes to read the console output from the child process anymore + /// + /// Message to log + public static void ConsoleLog(string text) + { + BridgeConnector.Emit("console-stdout", text); + } + + /// + /// Log a message to the console error pipe. This is used when running with "detachedProcess" : true on the electron.manifest.json, + /// as in that case we can't open pipes to read the console output from the child process anymore + /// + /// Message to log + + public static void ConsoleError(string text) + { + BridgeConnector.Emit("console-stderr", text); + } + private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), diff --git a/ElectronNET.API/Menu.cs b/ElectronNET.API/Menu.cs index 8397a10d..aa98613a 100644 --- a/ElectronNET.API/Menu.cs +++ b/ElectronNET.API/Menu.cs @@ -58,12 +58,12 @@ public void SetApplicationMenu(MenuItem[] menuItems) menuItems.AddMenuItemsId(); menuItems.AddSubmenuTypes(); - BridgeConnector.Socket.Emit("menu-setApplicationMenu", JArray.FromObject(menuItems, _jsonSerializer)); + BridgeConnector.Emit("menu-setApplicationMenu", JArray.FromObject(menuItems, _jsonSerializer)); _menuItems.AddRange(menuItems); - BridgeConnector.Socket.Off("menuItemClicked"); - BridgeConnector.Socket.On("menuItemClicked", (id) => { - MenuItem menuItem = _menuItems.GetMenuItem(id.ToString()); + BridgeConnector.Off("menuItemClicked"); + BridgeConnector.On("menuItemClicked", (id) => { + MenuItem menuItem = _menuItems.GetMenuItem(id); menuItem.Click?.Invoke(); }); } @@ -87,7 +87,7 @@ public void SetContextMenu(BrowserWindow browserWindow, MenuItem[] menuItems) menuItems.AddMenuItemsId(); menuItems.AddSubmenuTypes(); - BridgeConnector.Socket.Emit("menu-setContextMenu", browserWindow.Id, JArray.FromObject(menuItems, _jsonSerializer)); + BridgeConnector.Emit("menu-setContextMenu", browserWindow.Id, JArray.FromObject(menuItems, _jsonSerializer)); if (!_contextMenuItems.ContainsKey(browserWindow.Id)) { @@ -96,13 +96,10 @@ public void SetContextMenu(BrowserWindow browserWindow, MenuItem[] menuItems) ContextMenuItems = new ReadOnlyDictionary>(x); } - BridgeConnector.Socket.Off("contextMenuItemClicked"); - BridgeConnector.Socket.On("contextMenuItemClicked", (results) => + BridgeConnector.Off("contextMenuItemClicked"); + BridgeConnector.On("contextMenuItemClicked", (results) => { - var id = ((JArray)results).First.ToString(); - var browserWindowId = (int)((JArray)results).Last; - - MenuItem menuItem = _contextMenuItems[browserWindowId].GetMenuItem(id); + MenuItem menuItem = _contextMenuItems[results.windowId].GetMenuItem(results.id); menuItem.Click?.Invoke(); }); } @@ -113,7 +110,7 @@ public void SetContextMenu(BrowserWindow browserWindow, MenuItem[] menuItems) /// The browser window. public void ContextMenuPopup(BrowserWindow browserWindow) { - BridgeConnector.Socket.Emit("menu-contextMenuPopup", browserWindow.Id); + BridgeConnector.Emit("menu-contextMenuPopup", browserWindow.Id); } private JsonSerializer _jsonSerializer = new JsonSerializer() diff --git a/ElectronNET.API/MenuResponse.cs b/ElectronNET.API/MenuResponse.cs new file mode 100644 index 00000000..876a3634 --- /dev/null +++ b/ElectronNET.API/MenuResponse.cs @@ -0,0 +1,8 @@ +namespace ElectronNET.API +{ + internal class MenuResponse + { + public string id { get; set; } + public int windowId { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/NativeTheme.cs b/ElectronNET.API/NativeTheme.cs index 037a97a6..12bce45a 100644 --- a/ElectronNET.API/NativeTheme.cs +++ b/ElectronNET.API/NativeTheme.cs @@ -94,88 +94,33 @@ public void SetThemeSource(ThemeSourceMode themeSourceMode) { var themeSource = themeSourceMode.GetDescription(); - BridgeConnector.Socket.Emit("nativeTheme-themeSource", themeSource); + BridgeConnector.Emit("nativeTheme-themeSource", themeSource); } /// /// A property that can be , or . It is used to override () and /// supercede the value that Chromium has chosen to use internally. /// - public Task GetThemeSourceAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("nativeTheme-themeSource-getCompleted", (themeSource) => - { - BridgeConnector.Socket.Off("nativeTheme-themeSource-getCompleted"); - - var themeSourceValue = (ThemeSourceMode)Enum.Parse(typeof(ThemeSourceMode), (string)themeSource, true); - - taskCompletionSource.SetResult(themeSourceValue); - }); - - BridgeConnector.Socket.Emit("nativeTheme-themeSource-get"); - - return taskCompletionSource.Task; - } + public async Task GetThemeSourceAsync() => Enum.Parse(await BridgeConnector.OnResult("nativeTheme-themeSource-get", "nativeTheme-themeSource-getCompleted"), true); /// /// A for if the OS / Chromium currently has a dark mode enabled or is /// being instructed to show a dark-style UI. If you want to modify this value you /// should use . /// - public Task ShouldUseDarkColorsAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("nativeTheme-shouldUseDarkColors-completed", (shouldUseDarkColors) => { - BridgeConnector.Socket.Off("nativeTheme-shouldUseDarkColors-completed"); - - taskCompletionSource.SetResult((bool)shouldUseDarkColors); - }); - - BridgeConnector.Socket.Emit("nativeTheme-shouldUseDarkColors"); - - return taskCompletionSource.Task; - } + public Task ShouldUseDarkColorsAsync() => BridgeConnector.OnResult("nativeTheme-shouldUseDarkColors", "nativeTheme-shouldUseDarkColors-completed"); /// /// A for if the OS / Chromium currently has high-contrast mode enabled or is /// being instructed to show a high-contrast UI. /// - public Task ShouldUseHighContrastColorsAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("nativeTheme-shouldUseHighContrastColors-completed", (shouldUseHighContrastColors) => { - BridgeConnector.Socket.Off("nativeTheme-shouldUseHighContrastColors-completed"); - - taskCompletionSource.SetResult((bool)shouldUseHighContrastColors); - }); - - BridgeConnector.Socket.Emit("nativeTheme-shouldUseHighContrastColors"); - - return taskCompletionSource.Task; - } + public Task ShouldUseHighContrastColorsAsync() => BridgeConnector.OnResult("nativeTheme-shouldUseHighContrastColors", "nativeTheme-shouldUseHighContrastColors-completed"); /// /// A for if the OS / Chromium currently has an inverted color scheme or is /// being instructed to use an inverted color scheme. /// - public Task ShouldUseInvertedColorSchemeAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("nativeTheme-shouldUseInvertedColorScheme-completed", (shouldUseInvertedColorScheme) => { - BridgeConnector.Socket.Off("nativeTheme-shouldUseInvertedColorScheme-completed"); - - taskCompletionSource.SetResult((bool)shouldUseInvertedColorScheme); - }); - - BridgeConnector.Socket.Emit("nativeTheme-shouldUseInvertedColorScheme"); - - return taskCompletionSource.Task; - } + public Task ShouldUseInvertedColorSchemeAsync() => BridgeConnector.OnResult("nativeTheme-shouldUseInvertedColorScheme", "nativeTheme-shouldUseInvertedColorScheme-completed"); /// /// Emitted when something in the underlying NativeTheme has changed. This normally means that either the value of , @@ -187,12 +132,12 @@ public event Action Updated { if (_updated == null) { - BridgeConnector.Socket.On("nativeTheme-updated" + GetHashCode(), () => + BridgeConnector.On("nativeTheme-updated" + GetHashCode(), () => { _updated(); }); - BridgeConnector.Socket.Emit("register-nativeTheme-updated-event", GetHashCode()); + BridgeConnector.Emit("register-nativeTheme-updated-event", GetHashCode()); } _updated += value; } @@ -202,7 +147,7 @@ public event Action Updated if (_updated == null) { - BridgeConnector.Socket.Off("nativeTheme-updated" + GetHashCode()); + BridgeConnector.Off("nativeTheme-updated" + GetHashCode()); } } } diff --git a/ElectronNET.API/Notification.cs b/ElectronNET.API/Notification.cs index 68ac4e14..7f93f96f 100644 --- a/ElectronNET.API/Notification.cs +++ b/ElectronNET.API/Notification.cs @@ -48,7 +48,7 @@ public void Show(NotificationOptions notificationOptions) { GenerateIDsForDefinedActions(notificationOptions); - BridgeConnector.Socket.Emit("createNotification", JObject.FromObject(notificationOptions, _jsonSerializer)); + BridgeConnector.Emit("createNotification", notificationOptions); } private static void GenerateIDsForDefinedActions(NotificationOptions notificationOptions) @@ -60,9 +60,9 @@ private static void GenerateIDsForDefinedActions(NotificationOptions notificatio notificationOptions.ShowID = Guid.NewGuid().ToString(); isActionDefined = true; - BridgeConnector.Socket.Off("NotificationEventShow"); - BridgeConnector.Socket.On("NotificationEventShow", (id) => { - _notificationOptions.Single(x => x.ShowID == id.ToString()).OnShow(); + BridgeConnector.Off("NotificationEventShow"); + BridgeConnector.On("NotificationEventShow", (id) => { + _notificationOptions.Single(x => x.ShowID == id).OnShow(); }); } @@ -71,9 +71,9 @@ private static void GenerateIDsForDefinedActions(NotificationOptions notificatio notificationOptions.ClickID = Guid.NewGuid().ToString(); isActionDefined = true; - BridgeConnector.Socket.Off("NotificationEventClick"); - BridgeConnector.Socket.On("NotificationEventClick", (id) => { - _notificationOptions.Single(x => x.ClickID == id.ToString()).OnClick(); + BridgeConnector.Off("NotificationEventClick"); + BridgeConnector.On("NotificationEventClick", (id) => { + _notificationOptions.Single(x => x.ClickID == id).OnClick(); }); } @@ -82,8 +82,8 @@ private static void GenerateIDsForDefinedActions(NotificationOptions notificatio notificationOptions.CloseID = Guid.NewGuid().ToString(); isActionDefined = true; - BridgeConnector.Socket.Off("NotificationEventClose"); - BridgeConnector.Socket.On("NotificationEventClose", (id) => { + BridgeConnector.Off("NotificationEventClose"); + BridgeConnector.On("NotificationEventClose", (id) => { _notificationOptions.Single(x => x.CloseID == id.ToString()).OnClose(); }); } @@ -93,10 +93,9 @@ private static void GenerateIDsForDefinedActions(NotificationOptions notificatio notificationOptions.ReplyID = Guid.NewGuid().ToString(); isActionDefined = true; - BridgeConnector.Socket.Off("NotificationEventReply"); - BridgeConnector.Socket.On("NotificationEventReply", (args) => { - var arguments = ((JArray)args).ToObject(); - _notificationOptions.Single(x => x.ReplyID == arguments[0].ToString()).OnReply(arguments[1].ToString()); + BridgeConnector.Off("NotificationEventReply"); + BridgeConnector.On("NotificationEventReply", (args) => { + _notificationOptions.Single(x => x.ReplyID == args[0].ToString()).OnReply(args[1].ToString()); }); } @@ -105,10 +104,9 @@ private static void GenerateIDsForDefinedActions(NotificationOptions notificatio notificationOptions.ActionID = Guid.NewGuid().ToString(); isActionDefined = true; - BridgeConnector.Socket.Off("NotificationEventAction"); - BridgeConnector.Socket.On("NotificationEventAction", (args) => { - var arguments = ((JArray)args).ToObject(); - _notificationOptions.Single(x => x.ReplyID == arguments[0].ToString()).OnAction(arguments[1].ToString()); + BridgeConnector.Off("NotificationEventAction"); + BridgeConnector.On("NotificationEventAction", (args) => { + _notificationOptions.Single(x => x.ReplyID == args[0].ToString()).OnAction(args[1].ToString()); }); } @@ -124,24 +122,17 @@ private static void GenerateIDsForDefinedActions(NotificationOptions notificatio /// public Task IsSupportedAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("notificationIsSupportedComplete", (isSupported) => + BridgeConnector.On("notificationIsSupportedComplete", (isSupported) => { - BridgeConnector.Socket.Off("notificationIsSupportedComplete"); - taskCompletionSource.SetResult((bool)isSupported); + BridgeConnector.Off("notificationIsSupportedComplete"); + taskCompletionSource.SetResult(isSupported); }); - BridgeConnector.Socket.Emit("notificationIsSupported"); + BridgeConnector.Emit("notificationIsSupported"); return taskCompletionSource.Task; } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } diff --git a/ElectronNET.API/PowerMonitor.cs b/ElectronNET.API/PowerMonitor.cs index 03e68748..8a7ab809 100644 --- a/ElectronNET.API/PowerMonitor.cs +++ b/ElectronNET.API/PowerMonitor.cs @@ -17,12 +17,12 @@ public event Action OnLockScreen { if (_lockScreen == null) { - BridgeConnector.Socket.On("pm-lock-screen" , () => + BridgeConnector.On("pm-lock-screen" , () => { _lockScreen(); }); - BridgeConnector.Socket.Emit("register-pm-lock-screen"); + BridgeConnector.Emit("register-pm-lock-screen"); } _lockScreen += value; } @@ -31,7 +31,7 @@ public event Action OnLockScreen _lockScreen -= value; if (_lockScreen == null) - BridgeConnector.Socket.Off("pm-lock-screen"); + BridgeConnector.Off("pm-lock-screen"); } } @@ -46,12 +46,12 @@ public event Action OnUnLockScreen { if (_unlockScreen == null) { - BridgeConnector.Socket.On("pm-unlock-screen", () => + BridgeConnector.On("pm-unlock-screen", () => { _unlockScreen(); }); - BridgeConnector.Socket.Emit("register-pm-unlock-screen"); + BridgeConnector.Emit("register-pm-unlock-screen"); } _unlockScreen += value; } @@ -60,7 +60,7 @@ public event Action OnUnLockScreen _unlockScreen -= value; if (_unlockScreen == null) - BridgeConnector.Socket.Off("pm-unlock-screen"); + BridgeConnector.Off("pm-unlock-screen"); } } @@ -75,12 +75,12 @@ public event Action OnSuspend { if (_suspend == null) { - BridgeConnector.Socket.On("pm-suspend", () => + BridgeConnector.On("pm-suspend", () => { _suspend(); }); - BridgeConnector.Socket.Emit("register-pm-suspend"); + BridgeConnector.Emit("register-pm-suspend"); } _suspend += value; } @@ -89,7 +89,7 @@ public event Action OnSuspend _suspend -= value; if (_suspend == null) - BridgeConnector.Socket.Off("pm-suspend"); + BridgeConnector.Off("pm-suspend"); } } @@ -104,12 +104,12 @@ public event Action OnResume { if (_resume == null) { - BridgeConnector.Socket.On("pm-resume", () => + BridgeConnector.On("pm-resume", () => { _resume(); }); - BridgeConnector.Socket.Emit("register-pm-resume"); + BridgeConnector.Emit("register-pm-resume"); } _resume += value; } @@ -118,7 +118,7 @@ public event Action OnResume _resume -= value; if (_resume == null) - BridgeConnector.Socket.Off("pm-resume"); + BridgeConnector.Off("pm-resume"); } } @@ -133,12 +133,12 @@ public event Action OnAC { if (_onAC == null) { - BridgeConnector.Socket.On("pm-on-ac", () => + BridgeConnector.On("pm-on-ac", () => { _onAC(); }); - BridgeConnector.Socket.Emit("register-pm-on-ac"); + BridgeConnector.Emit("register-pm-on-ac"); } _onAC += value; } @@ -147,7 +147,7 @@ public event Action OnAC _onAC -= value; if (_onAC == null) - BridgeConnector.Socket.Off("pm-on-ac"); + BridgeConnector.Off("pm-on-ac"); } } @@ -162,12 +162,12 @@ public event Action OnBattery { if (_onBattery == null) { - BridgeConnector.Socket.On("pm-on-battery", () => + BridgeConnector.On("pm-on-battery", () => { _onBattery(); }); - BridgeConnector.Socket.Emit("register-pm-on-battery"); + BridgeConnector.Emit("register-pm-on-battery"); } _onBattery += value; } @@ -176,7 +176,7 @@ public event Action OnBattery _onBattery -= value; if (_onBattery == null) - BridgeConnector.Socket.Off("pm-on-battery"); + BridgeConnector.Off("pm-on-battery"); } } @@ -195,12 +195,12 @@ public event Action OnShutdown { if (_shutdown == null) { - BridgeConnector.Socket.On("pm-shutdown", () => + BridgeConnector.On("pm-shutdown", () => { _shutdown(); }); - BridgeConnector.Socket.Emit("register-pm-shutdown"); + BridgeConnector.Emit("register-pm-shutdown"); } _shutdown += value; } @@ -209,7 +209,7 @@ public event Action OnShutdown _shutdown -= value; if (_shutdown == null) - BridgeConnector.Socket.Off("pm-on-shutdown"); + BridgeConnector.Off("pm-on-shutdown"); } } diff --git a/ElectronNET.API/Screen.cs b/ElectronNET.API/Screen.cs index 31cecb5f..48bf392a 100644 --- a/ElectronNET.API/Screen.cs +++ b/ElectronNET.API/Screen.cs @@ -21,12 +21,12 @@ public event Action OnDisplayAdded { if (_onDisplayAdded == null) { - BridgeConnector.Socket.On("screen-display-added-event" + GetHashCode(), (display) => + BridgeConnector.On("screen-display-added-event" + GetHashCode(), (display) => { - _onDisplayAdded(((JObject)display).ToObject()); + _onDisplayAdded(display); }); - BridgeConnector.Socket.Emit("register-screen-display-added", GetHashCode()); + BridgeConnector.Emit("register-screen-display-added", GetHashCode()); } _onDisplayAdded += value; } @@ -35,7 +35,7 @@ public event Action OnDisplayAdded _onDisplayAdded -= value; if (_onDisplayAdded == null) - BridgeConnector.Socket.Off("screen-display-added-event" + GetHashCode()); + BridgeConnector.Off("screen-display-added-event" + GetHashCode()); } } @@ -50,12 +50,12 @@ public event Action OnDisplayRemoved { if (_onDisplayRemoved == null) { - BridgeConnector.Socket.On("screen-display-removed-event" + GetHashCode(), (display) => + BridgeConnector.On("screen-display-removed-event" + GetHashCode(), (display) => { - _onDisplayRemoved(((JObject)display).ToObject()); + _onDisplayRemoved(display); }); - BridgeConnector.Socket.Emit("register-screen-display-removed", GetHashCode()); + BridgeConnector.Emit("register-screen-display-removed", GetHashCode()); } _onDisplayRemoved += value; } @@ -64,7 +64,7 @@ public event Action OnDisplayRemoved _onDisplayRemoved -= value; if (_onDisplayRemoved == null) - BridgeConnector.Socket.Off("screen-display-removed-event" + GetHashCode()); + BridgeConnector.Off("screen-display-removed-event" + GetHashCode()); } } @@ -81,15 +81,12 @@ public event Action OnDisplayMetricsChanged { if (_onDisplayMetricsChanged == null) { - BridgeConnector.Socket.On("screen-display-metrics-changed-event" + GetHashCode(), (args) => + BridgeConnector.On("screen-display-metrics-changed-event" + GetHashCode(), (args) => { - var display = ((JArray)args).First.ToObject(); - var metrics = ((JArray)args).Last.ToObject(); - - _onDisplayMetricsChanged(display, metrics); + _onDisplayMetricsChanged(args.display, args.metrics); }); - BridgeConnector.Socket.Emit("register-screen-display-metrics-changed", GetHashCode()); + BridgeConnector.Emit("register-screen-display-metrics-changed", GetHashCode()); } _onDisplayMetricsChanged += value; } @@ -98,7 +95,7 @@ public event Action OnDisplayMetricsChanged _onDisplayMetricsChanged -= value; if (_onDisplayMetricsChanged == null) - BridgeConnector.Socket.Off("screen-display-metrics-changed-event" + GetHashCode()); + BridgeConnector.Off("screen-display-metrics-changed-event" + GetHashCode()); } } @@ -132,128 +129,38 @@ internal static Screen Instance /// The current absolute position of the mouse pointer. /// /// - public Task GetCursorScreenPointAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("screen-getCursorScreenPointCompleted", (point) => - { - BridgeConnector.Socket.Off("screen-getCursorScreenPointCompleted"); - - taskCompletionSource.SetResult(((JObject)point).ToObject()); - }); - - BridgeConnector.Socket.Emit("screen-getCursorScreenPoint"); - - return taskCompletionSource.Task; - } + public Task GetCursorScreenPointAsync() => BridgeConnector.OnResult("screen-getCursorScreenPoint", "screen-getCursorScreenPointCompleted"); /// /// macOS: The height of the menu bar in pixels. /// /// The height of the menu bar in pixels. - public Task GetMenuBarHeightAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("screen-getMenuBarHeightCompleted", (height) => - { - BridgeConnector.Socket.Off("screen-getMenuBarHeightCompleted"); - - taskCompletionSource.SetResult(int.Parse(height.ToString())); - }); - - BridgeConnector.Socket.Emit("screen-getMenuBarHeight"); - - return taskCompletionSource.Task; - } + public Task GetMenuBarHeightAsync() => BridgeConnector.OnResult("screen-getMenuBarHeight", "screen-getMenuBarHeightCompleted"); /// /// The primary display. /// /// - public Task GetPrimaryDisplayAsync() - { - var taskCompletionSource = new TaskCompletionSource(); + public Task GetPrimaryDisplayAsync() => BridgeConnector.OnResult("screen-getPrimaryDisplay", "screen-getPrimaryDisplayCompleted"); - BridgeConnector.Socket.On("screen-getPrimaryDisplayCompleted", (display) => - { - BridgeConnector.Socket.Off("screen-getPrimaryDisplayCompleted"); - - taskCompletionSource.SetResult(((JObject)display).ToObject()); - }); - - BridgeConnector.Socket.Emit("screen-getPrimaryDisplay"); - - return taskCompletionSource.Task; - } /// /// An array of displays that are currently available. /// /// An array of displays that are currently available. - public Task GetAllDisplaysAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("screen-getAllDisplaysCompleted", (displays) => - { - BridgeConnector.Socket.Off("screen-getAllDisplaysCompleted"); - - taskCompletionSource.SetResult(((JArray)displays).ToObject()); - }); - - BridgeConnector.Socket.Emit("screen-getAllDisplays"); - - return taskCompletionSource.Task; - } + public Task GetAllDisplaysAsync() => BridgeConnector.OnResult("screen-getAllDisplays", "screen-getAllDisplaysCompleted"); /// /// The display nearest the specified point. /// /// The display nearest the specified point. - public Task GetDisplayNearestPointAsync(Point point) - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("screen-getDisplayNearestPointCompleted", (display) => - { - BridgeConnector.Socket.Off("screen-getDisplayNearestPointCompleted"); - - taskCompletionSource.SetResult(((JObject)display).ToObject()); - }); - - BridgeConnector.Socket.Emit("screen-getDisplayNearestPoint", JObject.FromObject(point, _jsonSerializer)); - - return taskCompletionSource.Task; - } + public Task GetDisplayNearestPointAsync(Point point) => BridgeConnector.OnResult("screen-getDisplayNearestPoint", "screen-getDisplayNearestPointCompleted", point); /// /// The display that most closely intersects the provided bounds. /// /// /// The display that most closely intersects the provided bounds. - public Task GetDisplayMatchingAsync(Rectangle rectangle) - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("screen-getDisplayMatching", (display) => - { - BridgeConnector.Socket.Off("screen-getDisplayMatching"); - - taskCompletionSource.SetResult(((JObject)display).ToObject()); - }); - - BridgeConnector.Socket.Emit("screen-getDisplayMatching", JObject.FromObject(rectangle, _jsonSerializer)); - - return taskCompletionSource.Task; - } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; + public Task GetDisplayMatchingAsync(Rectangle rectangle) => BridgeConnector.OnResult("screen-getDisplayMatching", "screen-getDisplayMatchingCompleted", rectangle); } } \ No newline at end of file diff --git a/ElectronNET.API/Session.cs b/ElectronNET.API/Session.cs index a4cb6bb6..83bfa8fe 100644 --- a/ElectronNET.API/Session.cs +++ b/ElectronNET.API/Session.cs @@ -37,7 +37,7 @@ internal Session(int id) /// A comma-separated list of servers for which integrated authentication is enabled. public void AllowNTLMCredentialsForDomains(string domains) { - BridgeConnector.Socket.Emit("webContents-session-allowNTLMCredentialsForDomains", Id, domains); + BridgeConnector.Emit("webContents-session-allowNTLMCredentialsForDomains", Id, domains); } /// @@ -47,16 +47,16 @@ public void AllowNTLMCredentialsForDomains(string domains) /// public Task ClearAuthCacheAsync(RemovePassword options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-clearAuthCache-completed" + guid, () => + BridgeConnector.On("webContents-session-clearAuthCache-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-clearAuthCache-completed" + guid); + BridgeConnector.Off("webContents-session-clearAuthCache-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-clearAuthCache", Id, JObject.FromObject(options, _jsonSerializer), guid); + BridgeConnector.Emit("webContents-session-clearAuthCache", Id, options, guid); return taskCompletionSource.Task; } @@ -66,16 +66,16 @@ public Task ClearAuthCacheAsync(RemovePassword options) /// public Task ClearAuthCacheAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-clearAuthCache-completed" + guid, () => + BridgeConnector.On("webContents-session-clearAuthCache-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-clearAuthCache-completed" + guid); + BridgeConnector.Off("webContents-session-clearAuthCache-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-clearAuthCache", Id, guid); + BridgeConnector.Emit("webContents-session-clearAuthCache", Id, guid); return taskCompletionSource.Task; } @@ -86,16 +86,16 @@ public Task ClearAuthCacheAsync() /// public Task ClearCacheAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-clearCache-completed" + guid, () => + BridgeConnector.On("webContents-session-clearCache-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-clearCache-completed" + guid); + BridgeConnector.Off("webContents-session-clearCache-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-clearCache", Id, guid); + BridgeConnector.Emit("webContents-session-clearCache", Id, guid); return taskCompletionSource.Task; } @@ -106,16 +106,16 @@ public Task ClearCacheAsync() /// public Task ClearHostResolverCacheAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-clearHostResolverCache-completed" + guid, () => + BridgeConnector.On("webContents-session-clearHostResolverCache-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-clearHostResolverCache-completed" + guid); + BridgeConnector.Off("webContents-session-clearHostResolverCache-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-clearHostResolverCache", Id, guid); + BridgeConnector.Emit("webContents-session-clearHostResolverCache", Id, guid); return taskCompletionSource.Task; } @@ -126,16 +126,16 @@ public Task ClearHostResolverCacheAsync() /// public Task ClearStorageDataAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-clearStorageData-completed" + guid, () => + BridgeConnector.On("webContents-session-clearStorageData-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-clearStorageData-completed" + guid); + BridgeConnector.Off("webContents-session-clearStorageData-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-clearStorageData", Id, guid); + BridgeConnector.Emit("webContents-session-clearStorageData", Id, guid); return taskCompletionSource.Task; } @@ -147,16 +147,16 @@ public Task ClearStorageDataAsync() /// public Task ClearStorageDataAsync(ClearStorageDataOptions options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-clearStorageData-options-completed" + guid, () => + BridgeConnector.On("webContents-session-clearStorageData-options-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-clearStorageData-options-completed" + guid); + BridgeConnector.Off("webContents-session-clearStorageData-options-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-clearStorageData-options", Id, JObject.FromObject(options, _jsonSerializer), guid); + BridgeConnector.Emit("webContents-session-clearStorageData-options", Id, options, guid); return taskCompletionSource.Task; } @@ -171,7 +171,7 @@ public Task ClearStorageDataAsync(ClearStorageDataOptions options) /// public void CreateInterruptedDownload(CreateInterruptedDownloadOptions options) { - BridgeConnector.Socket.Emit("webContents-session-createInterruptedDownload", Id, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("webContents-session-createInterruptedDownload", Id, options); } /// @@ -180,7 +180,7 @@ public void CreateInterruptedDownload(CreateInterruptedDownloadOptions options) /// public void DisableNetworkEmulation() { - BridgeConnector.Socket.Emit("webContents-session-disableNetworkEmulation", Id); + BridgeConnector.Emit("webContents-session-disableNetworkEmulation", Id); } /// @@ -189,7 +189,7 @@ public void DisableNetworkEmulation() /// public void EnableNetworkEmulation(EnableNetworkEmulationOptions options) { - BridgeConnector.Socket.Emit("webContents-session-enableNetworkEmulation", Id, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("webContents-session-enableNetworkEmulation", Id, options); } /// @@ -197,7 +197,7 @@ public void EnableNetworkEmulation(EnableNetworkEmulationOptions options) /// public void FlushStorageData() { - BridgeConnector.Socket.Emit("webContents-session-flushStorageData", Id); + BridgeConnector.Emit("webContents-session-flushStorageData", Id); } /// @@ -207,18 +207,16 @@ public void FlushStorageData() /// public Task GetBlobDataAsync(string identifier) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-getBlobData-completed" + guid, (buffer) => + BridgeConnector.On("webContents-session-getBlobData-completed" + guid, (buffer) => { - var result = ((JArray)buffer).ToObject(); - - BridgeConnector.Socket.Off("webContents-session-getBlobData-completed" + guid); - taskCompletionSource.SetResult(result); + BridgeConnector.Off("webContents-session-getBlobData-completed" + guid); + taskCompletionSource.SetResult(buffer); }); - BridgeConnector.Socket.Emit("webContents-session-getBlobData", Id, identifier, guid); + BridgeConnector.Emit("webContents-session-getBlobData", Id, identifier, guid); return taskCompletionSource.Task; } @@ -229,16 +227,16 @@ public Task GetBlobDataAsync(string identifier) /// Callback is invoked with the session's current cache size. public Task GetCacheSizeAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-getCacheSize-completed" + guid, (size) => + BridgeConnector.On("webContents-session-getCacheSize-completed" + guid, (size) => { - BridgeConnector.Socket.Off("webContents-session-getCacheSize-completed" + guid); - taskCompletionSource.SetResult((int)size); + BridgeConnector.Off("webContents-session-getCacheSize-completed" + guid); + taskCompletionSource.SetResult(size); }); - BridgeConnector.Socket.Emit("webContents-session-getCacheSize", Id, guid); + BridgeConnector.Emit("webContents-session-getCacheSize", Id, guid); return taskCompletionSource.Task; } @@ -249,17 +247,16 @@ public Task GetCacheSizeAsync() /// public Task GetPreloadsAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-getPreloads-completed" + guid, (preloads) => + BridgeConnector.On("webContents-session-getPreloads-completed" + guid, (preloads) => { - var result = ((JArray)preloads).ToObject(); - BridgeConnector.Socket.Off("webContents-session-getPreloads-completed" + guid); - taskCompletionSource.SetResult(result); + BridgeConnector.Off("webContents-session-getPreloads-completed" + guid); + taskCompletionSource.SetResult(preloads); }); - BridgeConnector.Socket.Emit("webContents-session-getPreloads", Id, guid); + BridgeConnector.Emit("webContents-session-getPreloads", Id, guid); return taskCompletionSource.Task; } @@ -270,16 +267,16 @@ public Task GetPreloadsAsync() /// public Task GetUserAgent() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-getUserAgent-completed" + guid, (userAgent) => + BridgeConnector.On("webContents-session-getUserAgent-completed" + guid, (userAgent) => { - BridgeConnector.Socket.Off("webContents-session-getUserAgent-completed" + guid); + BridgeConnector.Off("webContents-session-getUserAgent-completed" + guid); taskCompletionSource.SetResult(userAgent.ToString()); }); - BridgeConnector.Socket.Emit("webContents-session-getUserAgent", Id, guid); + BridgeConnector.Emit("webContents-session-getUserAgent", Id, guid); return taskCompletionSource.Task; } @@ -292,16 +289,16 @@ public Task GetUserAgent() /// public Task ResolveProxyAsync(string url) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-resolveProxy-completed" + guid, (proxy) => + BridgeConnector.On("webContents-session-resolveProxy-completed" + guid, (proxy) => { - BridgeConnector.Socket.Off("webContents-session-resolveProxy-completed" + guid); + BridgeConnector.Off("webContents-session-resolveProxy-completed" + guid); taskCompletionSource.SetResult(proxy.ToString()); }); - BridgeConnector.Socket.Emit("webContents-session-resolveProxy", Id, url, guid); + BridgeConnector.Emit("webContents-session-resolveProxy", Id, url, guid); return taskCompletionSource.Task; } @@ -313,7 +310,7 @@ public Task ResolveProxyAsync(string url) /// public void SetDownloadPath(string path) { - BridgeConnector.Socket.Emit("webContents-session-setDownloadPath", Id, path); + BridgeConnector.Emit("webContents-session-setDownloadPath", Id, path); } /// @@ -323,7 +320,7 @@ public void SetDownloadPath(string path) /// public void SetPreloads(string[] preloads) { - BridgeConnector.Socket.Emit("webContents-session-setPreloads", Id, preloads); + BridgeConnector.Emit("webContents-session-setPreloads", Id, preloads); } /// @@ -334,16 +331,16 @@ public void SetPreloads(string[] preloads) /// public Task SetProxyAsync(ProxyConfig config) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); string guid = Guid.NewGuid().ToString(); - BridgeConnector.Socket.On("webContents-session-setProxy-completed" + guid, () => + BridgeConnector.On("webContents-session-setProxy-completed" + guid, () => { - BridgeConnector.Socket.Off("webContents-session-setProxy-completed" + guid); + BridgeConnector.Off("webContents-session-setProxy-completed" + guid); taskCompletionSource.SetResult(null); }); - BridgeConnector.Socket.Emit("webContents-session-setProxy", Id, JObject.FromObject(config, _jsonSerializer), guid); + BridgeConnector.Emit("webContents-session-setProxy", Id, config, guid); return taskCompletionSource.Task; } @@ -356,7 +353,7 @@ public Task SetProxyAsync(ProxyConfig config) /// public void SetUserAgent(string userAgent) { - BridgeConnector.Socket.Emit("webContents-session-setUserAgent", Id, userAgent); + BridgeConnector.Emit("webContents-session-setUserAgent", Id, userAgent); } /// @@ -372,7 +369,7 @@ public void SetUserAgent(string userAgent) /// example "en-US,fr,de,ko,zh-CN,ja". public void SetUserAgent(string userAgent, string acceptLanguages) { - BridgeConnector.Socket.Emit("webContents-session-setUserAgent", Id, userAgent, acceptLanguages); + BridgeConnector.Emit("webContents-session-setUserAgent", Id, userAgent, acceptLanguages); } /// @@ -382,17 +379,15 @@ public void SetUserAgent(string userAgent, string acceptLanguages) /// public Task GetAllExtensionsAsync() { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("webContents-session-getAllExtensions-completed", (extensionslist) => + BridgeConnector.On("webContents-session-getAllExtensions-completed", (extensionslist) => { - BridgeConnector.Socket.Off("webContents-session-getAllExtensions-completed"); - var chromeExtensionInfos = ((JArray)extensionslist).ToObject(); - - taskCompletionSource.SetResult(chromeExtensionInfos); + BridgeConnector.Off("webContents-session-getAllExtensions-completed"); + taskCompletionSource.SetResult(extensionslist); }); - BridgeConnector.Socket.Emit("webContents-session-getAllExtensions", Id); + BridgeConnector.Emit("webContents-session-getAllExtensions", Id); return taskCompletionSource.Task; } @@ -404,7 +399,7 @@ public Task GetAllExtensionsAsync() /// Name of the Chrome extension to remove public void RemoveExtension(string name) { - BridgeConnector.Socket.Emit("webContents-session-removeExtension", Id, name); + BridgeConnector.Emit("webContents-session-removeExtension", Id, name); } /// @@ -436,25 +431,18 @@ public void RemoveExtension(string name) /// public Task LoadExtensionAsync(string path, bool allowFileAccess = false) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("webContents-session-loadExtension-completed", (extension) => + BridgeConnector.On("webContents-session-loadExtension-completed", (extension) => { - BridgeConnector.Socket.Off("webContents-session-loadExtension-completed"); + BridgeConnector.Off("webContents-session-loadExtension-completed"); - taskCompletionSource.SetResult(((JObject)extension).ToObject()); + taskCompletionSource.SetResult(extension); }); - BridgeConnector.Socket.Emit("webContents-session-loadExtension", Id, path, allowFileAccess); + BridgeConnector.Emit("webContents-session-loadExtension", Id, path, allowFileAccess); return taskCompletionSource.Task; } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } diff --git a/ElectronNET.API/Shell.cs b/ElectronNET.API/Shell.cs index 71f458e4..5bf82c4a 100644 --- a/ElectronNET.API/Shell.cs +++ b/ElectronNET.API/Shell.cs @@ -42,14 +42,14 @@ internal static Shell Instance /// The full path to the directory / file. public Task ShowItemInFolderAsync(string fullPath) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("shell-showItemInFolderCompleted", () => + BridgeConnector.On("shell-showItemInFolderCompleted", () => { - BridgeConnector.Socket.Off("shell-showItemInFolderCompleted"); + BridgeConnector.Off("shell-showItemInFolderCompleted"); }); - BridgeConnector.Socket.Emit("shell-showItemInFolder", fullPath); + BridgeConnector.Emit("shell-showItemInFolder", fullPath); return taskCompletionSource.Task; } @@ -61,16 +61,16 @@ public Task ShowItemInFolderAsync(string fullPath) /// The error message corresponding to the failure if a failure occurred, otherwise . public Task OpenPathAsync(string path) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("shell-openPathCompleted", (errorMessage) => + BridgeConnector.On("shell-openPathCompleted", (errorMessage) => { - BridgeConnector.Socket.Off("shell-openPathCompleted"); + BridgeConnector.Off("shell-openPathCompleted"); - taskCompletionSource.SetResult((string) errorMessage); + taskCompletionSource.SetResult(errorMessage); }); - BridgeConnector.Socket.Emit("shell-openPath", path); + BridgeConnector.Emit("shell-openPath", path); return taskCompletionSource.Task; } @@ -95,22 +95,22 @@ public Task OpenExternalAsync(string url) /// The error message corresponding to the failure if a failure occurred, otherwise . public Task OpenExternalAsync(string url, OpenExternalOptions options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("shell-openExternalCompleted", (error) => + BridgeConnector.On("shell-openExternalCompleted", (error) => { - BridgeConnector.Socket.Off("shell-openExternalCompleted"); + BridgeConnector.Off("shell-openExternalCompleted"); - taskCompletionSource.SetResult((string) error); + taskCompletionSource.SetResult(error); }); if (options == null) { - BridgeConnector.Socket.Emit("shell-openExternal", url); + BridgeConnector.Emit("shell-openExternal", url); } else { - BridgeConnector.Socket.Emit("shell-openExternal", url, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("shell-openExternal", url, options); } return taskCompletionSource.Task; @@ -123,18 +123,7 @@ public Task OpenExternalAsync(string url, OpenExternalOptions options) /// Whether the item was successfully moved to the trash. public Task TrashItemAsync(string fullPath) { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("shell-trashItem-completed", (success) => - { - BridgeConnector.Socket.Off("shell-trashItem-completed"); - - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("shell-trashItem", fullPath); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("shell-trashItem", "shell-trashItem-completed", fullPath); } /// @@ -142,7 +131,7 @@ public Task TrashItemAsync(string fullPath) /// public void Beep() { - BridgeConnector.Socket.Emit("shell-beep"); + BridgeConnector.Emit("shell-beep"); } /// @@ -154,18 +143,7 @@ public void Beep() /// Whether the shortcut was created successfully. public Task WriteShortcutLinkAsync(string shortcutPath, ShortcutLinkOperation operation, ShortcutDetails options) { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("shell-writeShortcutLinkCompleted", (success) => - { - BridgeConnector.Socket.Off("shell-writeShortcutLinkCompleted"); - - taskCompletionSource.SetResult((bool) success); - }); - - BridgeConnector.Socket.Emit("shell-writeShortcutLink", shortcutPath, operation.GetDescription(), JObject.FromObject(options, _jsonSerializer)); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("shell-writeShortcutLink", "shell-writeShortcutLinkCompleted", shortcutPath, operation.GetDescription(), options); } /// @@ -176,28 +154,7 @@ public Task WriteShortcutLinkAsync(string shortcutPath, ShortcutLinkOperat /// of the shortcut. public Task ReadShortcutLinkAsync(string shortcutPath) { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("shell-readShortcutLinkCompleted", (shortcutDetails) => - { - BridgeConnector.Socket.Off("shell-readShortcutLinkCompleted"); - - var shortcutObject = shortcutDetails as JObject; - var details = shortcutObject?.ToObject(); - - taskCompletionSource.SetResult(details); - }); - - BridgeConnector.Socket.Emit("shell-readShortcutLink", shortcutPath); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("shell-readShortcutLink", "shell-readShortcutLinkCompleted", shortcutPath); } - - private readonly JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } diff --git a/ElectronNET.API/Tray.cs b/ElectronNET.API/Tray.cs index a5aac8a1..c37f5fe6 100644 --- a/ElectronNET.API/Tray.cs +++ b/ElectronNET.API/Tray.cs @@ -23,15 +23,12 @@ public event Action OnClick { if (_click == null) { - BridgeConnector.Socket.On("tray-click-event" + GetHashCode(), (result) => + BridgeConnector.On("tray-click-event" + GetHashCode(), (result) => { - var args = ((JArray)result).ToObject(); - var trayClickEventArgs = ((JObject)args[0]).ToObject(); - var bounds = ((JObject)args[1]).ToObject(); - _click(trayClickEventArgs, bounds); + _click(result.eventArgs, result.bounds); }); - BridgeConnector.Socket.Emit("register-tray-click", GetHashCode()); + BridgeConnector.Emit("register-tray-click", GetHashCode()); } _click += value; } @@ -40,7 +37,7 @@ public event Action OnClick _click -= value; if (_click == null) - BridgeConnector.Socket.Off("tray-click-event" + GetHashCode()); + BridgeConnector.Off("tray-click-event" + GetHashCode()); } } @@ -55,15 +52,12 @@ public event Action OnRightClick { if (_rightClick == null) { - BridgeConnector.Socket.On("tray-right-click-event" + GetHashCode(), (result) => + BridgeConnector.On("tray-right-click-event" + GetHashCode(), (result) => { - var args = ((JArray)result).ToObject(); - var trayClickEventArgs = ((JObject)args[0]).ToObject(); - var bounds = ((JObject)args[1]).ToObject(); - _rightClick(trayClickEventArgs, bounds); + _rightClick(result.eventArgs, result.bounds); }); - BridgeConnector.Socket.Emit("register-tray-right-click", GetHashCode()); + BridgeConnector.Emit("register-tray-right-click", GetHashCode()); } _rightClick += value; } @@ -72,7 +66,7 @@ public event Action OnRightClick _rightClick -= value; if (_rightClick == null) - BridgeConnector.Socket.Off("tray-right-click-event" + GetHashCode()); + BridgeConnector.Off("tray-right-click-event" + GetHashCode()); } } @@ -87,15 +81,12 @@ public event Action OnDoubleClick { if (_doubleClick == null) { - BridgeConnector.Socket.On("tray-double-click-event" + GetHashCode(), (result) => + BridgeConnector.On("tray-double-click-event" + GetHashCode(), (result) => { - var args = ((JArray)result).ToObject(); - var trayClickEventArgs = ((JObject)args[0]).ToObject(); - var bounds = ((JObject)args[1]).ToObject(); - _doubleClick(trayClickEventArgs, bounds); + _doubleClick(result.eventArgs, result.bounds); }); - BridgeConnector.Socket.Emit("register-tray-double-click", GetHashCode()); + BridgeConnector.Emit("register-tray-double-click", GetHashCode()); } _doubleClick += value; } @@ -104,7 +95,7 @@ public event Action OnDoubleClick _doubleClick -= value; if (_doubleClick == null) - BridgeConnector.Socket.Off("tray-double-click-event" + GetHashCode()); + BridgeConnector.Off("tray-double-click-event" + GetHashCode()); } } @@ -119,12 +110,12 @@ public event Action OnBalloonShow { if (_balloonShow == null) { - BridgeConnector.Socket.On("tray-balloon-show-event" + GetHashCode(), () => + BridgeConnector.On("tray-balloon-show-event" + GetHashCode(), () => { _balloonShow(); }); - BridgeConnector.Socket.Emit("register-tray-balloon-show", GetHashCode()); + BridgeConnector.Emit("register-tray-balloon-show", GetHashCode()); } _balloonShow += value; } @@ -133,7 +124,7 @@ public event Action OnBalloonShow _balloonShow -= value; if (_balloonShow == null) - BridgeConnector.Socket.Off("tray-balloon-show-event" + GetHashCode()); + BridgeConnector.Off("tray-balloon-show-event" + GetHashCode()); } } @@ -148,12 +139,12 @@ public event Action OnBalloonClick { if (_balloonClick == null) { - BridgeConnector.Socket.On("tray-balloon-click-event" + GetHashCode(), () => + BridgeConnector.On("tray-balloon-click-event" + GetHashCode(), () => { _balloonClick(); }); - BridgeConnector.Socket.Emit("register-tray-balloon-click", GetHashCode()); + BridgeConnector.Emit("register-tray-balloon-click", GetHashCode()); } _balloonClick += value; } @@ -162,7 +153,7 @@ public event Action OnBalloonClick _balloonClick -= value; if (_balloonClick == null) - BridgeConnector.Socket.Off("tray-balloon-click-event" + GetHashCode()); + BridgeConnector.Off("tray-balloon-click-event" + GetHashCode()); } } @@ -178,12 +169,12 @@ public event Action OnBalloonClosed { if (_balloonClosed == null) { - BridgeConnector.Socket.On("tray-balloon-closed-event" + GetHashCode(), () => + BridgeConnector.On("tray-balloon-closed-event" + GetHashCode(), () => { _balloonClosed(); }); - BridgeConnector.Socket.Emit("register-tray-balloon-closed", GetHashCode()); + BridgeConnector.Emit("register-tray-balloon-closed", GetHashCode()); } _balloonClosed += value; } @@ -192,7 +183,7 @@ public event Action OnBalloonClosed _balloonClosed -= value; if (_balloonClosed == null) - BridgeConnector.Socket.Off("tray-balloon-closed-event" + GetHashCode()); + BridgeConnector.Off("tray-balloon-closed-event" + GetHashCode()); } } @@ -251,12 +242,12 @@ public void Show(string image, MenuItem menuItem) public void Show(string image, MenuItem[] menuItems) { menuItems.AddMenuItemsId(); - BridgeConnector.Socket.Emit("create-tray", image, JArray.FromObject(menuItems, _jsonSerializer)); + BridgeConnector.Emit("create-tray", image, JArray.FromObject(menuItems, _jsonSerializer)); _items.Clear(); _items.AddRange(menuItems); - BridgeConnector.Socket.Off("trayMenuItemClicked"); - BridgeConnector.Socket.On("trayMenuItemClicked", (id) => + BridgeConnector.Off("trayMenuItemClicked"); + BridgeConnector.On("trayMenuItemClicked", (id) => { MenuItem menuItem = _items.GetMenuItem(id.ToString()); menuItem?.Click(); @@ -269,7 +260,7 @@ public void Show(string image, MenuItem[] menuItems) /// The image. public void Show(string image) { - BridgeConnector.Socket.Emit("create-tray", image); + BridgeConnector.Emit("create-tray", image); } /// @@ -277,7 +268,7 @@ public void Show(string image) /// public void Destroy() { - BridgeConnector.Socket.Emit("tray-destroy"); + BridgeConnector.Emit("tray-destroy"); _items.Clear(); } @@ -287,7 +278,7 @@ public void Destroy() /// public void SetImage(string image) { - BridgeConnector.Socket.Emit("tray-setImage", image); + BridgeConnector.Emit("tray-setImage", image); } /// @@ -296,7 +287,7 @@ public void SetImage(string image) /// public void SetPressedImage(string image) { - BridgeConnector.Socket.Emit("tray-setPressedImage", image); + BridgeConnector.Emit("tray-setPressedImage", image); } /// @@ -305,7 +296,7 @@ public void SetPressedImage(string image) /// public void SetToolTip(string toolTip) { - BridgeConnector.Socket.Emit("tray-setToolTip", toolTip); + BridgeConnector.Emit("tray-setToolTip", toolTip); } /// @@ -314,7 +305,7 @@ public void SetToolTip(string toolTip) /// public void SetTitle(string title) { - BridgeConnector.Socket.Emit("tray-setTitle", title); + BridgeConnector.Emit("tray-setTitle", title); } /// @@ -323,63 +314,49 @@ public void SetTitle(string title) /// public void DisplayBalloon(DisplayBalloonOptions options) { - BridgeConnector.Socket.Emit("tray-displayBalloon", JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("tray-displayBalloon", options); } /// /// Whether the tray icon is destroyed. /// /// - public Task IsDestroyedAsync() - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("tray-isDestroyedCompleted", (isDestroyed) => - { - BridgeConnector.Socket.Off("tray-isDestroyedCompleted"); - - taskCompletionSource.SetResult((bool)isDestroyed); - }); - - BridgeConnector.Socket.Emit("tray-isDestroyed"); - - return taskCompletionSource.Task; - } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore - }; + public Task IsDestroyedAsync() => BridgeConnector.OnResult("tray-isDestroyed", "tray-isDestroyedCompleted"); private const string ModuleName = "tray"; + /// /// Subscribe to an unmapped event on the module. /// /// The event name /// The handler - public void On(string eventName, Action fn) - => Events.Instance.On(ModuleName, eventName, fn); + public void On(string eventName, Action fn) => Events.Instance.On(ModuleName, eventName, fn); + /// /// Subscribe to an unmapped event on the module. /// /// The event name /// The handler - public void On(string eventName, Action fn) - => Events.Instance.On(ModuleName, eventName, fn); + public void On(string eventName, Action fn) => Events.Instance.On(ModuleName, eventName, fn); + /// /// Subscribe to an unmapped event on the module once. /// /// The event name /// The handler - public void Once(string eventName, Action fn) - => Events.Instance.Once(ModuleName, eventName, fn); + public void Once(string eventName, Action fn) => Events.Instance.Once(ModuleName, eventName, fn); + /// /// Subscribe to an unmapped event on the module once. /// /// The event name /// The handler - public void Once(string eventName, Action fn) - => Events.Instance.Once(ModuleName, eventName, fn); + public void Once(string eventName, Action fn) => Events.Instance.Once(ModuleName, eventName, fn); + + private JsonSerializer _jsonSerializer = new JsonSerializer() + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + NullValueHandling = NullValueHandling.Ignore + }; } } diff --git a/ElectronNET.API/WebContents.cs b/ElectronNET.API/WebContents.cs index 66800d5f..c91a3177 100644 --- a/ElectronNET.API/WebContents.cs +++ b/ElectronNET.API/WebContents.cs @@ -34,12 +34,12 @@ public event Action OnCrashed { if (_crashed == null) { - BridgeConnector.Socket.On("webContents-crashed" + Id, (killed) => + BridgeConnector.On("webContents-crashed" + Id, (killed) => { - _crashed((bool)killed); + _crashed(killed); }); - BridgeConnector.Socket.Emit("register-webContents-crashed", Id); + BridgeConnector.Emit("register-webContents-crashed", Id); } _crashed += value; } @@ -48,7 +48,7 @@ public event Action OnCrashed _crashed -= value; if (_crashed == null) - BridgeConnector.Socket.Off("webContents-crashed" + Id); + BridgeConnector.Off("webContents-crashed" + Id); } } @@ -64,12 +64,12 @@ public event Action OnDidFinishLoad { if (_didFinishLoad == null) { - BridgeConnector.Socket.On("webContents-didFinishLoad" + Id, () => + BridgeConnector.On("webContents-didFinishLoad" + Id, () => { _didFinishLoad(); }); - BridgeConnector.Socket.Emit("register-webContents-didFinishLoad", Id); + BridgeConnector.Emit("register-webContents-didFinishLoad", Id); } _didFinishLoad += value; } @@ -78,7 +78,7 @@ public event Action OnDidFinishLoad _didFinishLoad -= value; if (_didFinishLoad == null) - BridgeConnector.Socket.Off("webContents-didFinishLoad" + Id); + BridgeConnector.Off("webContents-didFinishLoad" + Id); } } @@ -95,7 +95,7 @@ internal WebContents(int id) /// public void OpenDevTools() { - BridgeConnector.Socket.Emit("webContentsOpenDevTools", Id); + BridgeConnector.Emit("webContentsOpenDevTools", Id); } /// @@ -104,7 +104,7 @@ public void OpenDevTools() /// public void OpenDevTools(OpenDevToolsOptions openDevToolsOptions) { - BridgeConnector.Socket.Emit("webContentsOpenDevTools", Id, JObject.FromObject(openDevToolsOptions, _jsonSerializer)); + BridgeConnector.Emit("webContentsOpenDevTools", Id, openDevToolsOptions); } /// @@ -113,18 +113,7 @@ public void OpenDevTools(OpenDevToolsOptions openDevToolsOptions) /// printers public Task GetPrintersAsync() { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("webContents-getPrinters-completed", (printers) => - { - BridgeConnector.Socket.Off("webContents-getPrinters-completed"); - - taskCompletionSource.SetResult(((Newtonsoft.Json.Linq.JArray)printers).ToObject()); - }); - - BridgeConnector.Socket.Emit("webContents-getPrinters", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("webContents-getPrinters", "webContents-getPrinters-completed" + Id, Id); } /// @@ -132,27 +121,8 @@ public Task GetPrintersAsync() /// /// /// success - public Task PrintAsync(PrintOptions options = null) - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("webContents-print-completed", (success) => - { - BridgeConnector.Socket.Off("webContents-print-completed"); - taskCompletionSource.SetResult((bool)success); - }); - - if(options == null) - { - BridgeConnector.Socket.Emit("webContents-print", Id, ""); - } - else - { - BridgeConnector.Socket.Emit("webContents-print", Id, JObject.FromObject(options, _jsonSerializer)); - } - - return taskCompletionSource.Task; - } + public Task PrintAsync(PrintOptions options = null) => options is null ? BridgeConnector.OnResult("webContents-print", "webContents-print-completed" + Id, Id, "") + : BridgeConnector.OnResult("webContents-print", "webContents-print-completed" + Id, Id, options); /// /// Prints window's web page as PDF with Chromium's preview printing custom @@ -163,27 +133,8 @@ public Task PrintAsync(PrintOptions options = null) /// /// /// success - public Task PrintToPDFAsync(string path, PrintToPDFOptions options = null) - { - var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("webContents-printToPDF-completed", (success) => - { - BridgeConnector.Socket.Off("webContents-printToPDF-completed"); - taskCompletionSource.SetResult((bool)success); - }); - - if(options == null) - { - BridgeConnector.Socket.Emit("webContents-printToPDF", Id, "", path); - } - else - { - BridgeConnector.Socket.Emit("webContents-printToPDF", Id, JObject.FromObject(options, _jsonSerializer), path); - } - - return taskCompletionSource.Task; - } + public Task PrintToPDFAsync(string path, PrintToPDFOptions options = null) => options is null ? BridgeConnector.OnResult("webContents-printToPDF", "webContents-printToPDF-completed" + Id, Id, "", path) + : BridgeConnector.OnResult("webContents-printToPDF", "webContents-printToPDF-completed" + Id, Id, options, path); /// /// Is used to get the Url of the loaded page. @@ -192,18 +143,7 @@ public Task PrintToPDFAsync(string path, PrintToPDFOptions options = null) /// URL of the loaded page public Task GetUrl() { - var taskCompletionSource = new TaskCompletionSource(); - - var eventString = "webContents-getUrl" + Id; - BridgeConnector.Socket.On(eventString, (url) => - { - BridgeConnector.Socket.Off(eventString); - taskCompletionSource.SetResult((string)url); - }); - - BridgeConnector.Socket.Emit("webContents-getUrl", Id); - - return taskCompletionSource.Task; + return BridgeConnector.OnResult("webContents-getUrl", "webContents-getUrl" + Id, Id); } /// @@ -237,23 +177,24 @@ public Task LoadURLAsync(string url) /// /// public Task LoadURLAsync(string url, LoadURLOptions options) - { - var taskCompletionSource = new TaskCompletionSource(); + { + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("webContents-loadURL-complete" + Id, () => + BridgeConnector.On("webContents-loadURL-complete" + Id, () => { - BridgeConnector.Socket.Off("webContents-loadURL-complete" + Id); - BridgeConnector.Socket.Off("webContents-loadURL-error" + Id); - taskCompletionSource.SetResult(null); + BridgeConnector.Off("webContents-loadURL-complete" + Id); + BridgeConnector.Off("webContents-loadURL-error" + Id); + taskCompletionSource.SetResult(); }); - BridgeConnector.Socket.On("webContents-loadURL-error" + Id, (error) => + BridgeConnector.On("webContents-loadURL-error" + Id, (error) => { - BridgeConnector.Socket.Off("webContents-loadURL-error" + Id); + BridgeConnector.Off("webContents-loadURL-error" + Id); + BridgeConnector.Off("webContents-loadURL-complete" + Id); taskCompletionSource.SetException(new InvalidOperationException(error.ToString())); }); - BridgeConnector.Socket.Emit("webContents-loadURL", Id, url, JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Emit("webContents-loadURL", Id, url, options); return taskCompletionSource.Task; } @@ -267,14 +208,7 @@ public Task LoadURLAsync(string url, LoadURLOptions options) /// Absolute path to the CSS file location public void InsertCSS(bool isBrowserWindow, string path) { - BridgeConnector.Socket.Emit("webContents-insertCSS", Id, isBrowserWindow, path); + BridgeConnector.Emit("webContents-insertCSS", Id, isBrowserWindow, path); } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } \ No newline at end of file diff --git a/ElectronNET.API/WindowManager.cs b/ElectronNET.API/WindowManager.cs index 4ac85dab..e8869d3a 100644 --- a/ElectronNET.API/WindowManager.cs +++ b/ElectronNET.API/WindowManager.cs @@ -50,7 +50,7 @@ public bool IsQuitOnWindowAllClosed get { return _isQuitOnWindowAllClosed; } set { - BridgeConnector.Socket.Emit("quit-app-window-all-closed-event", value); + BridgeConnector.Emit("quit-app-window-all-closed-event", value); _isQuitOnWindowAllClosed = value; } } @@ -92,24 +92,21 @@ public async Task CreateWindowAsync(string loadUrl = "http://loca /// public Task CreateWindowAsync(BrowserWindowOptions options, string loadUrl = "http://localhost") { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("BrowserWindowCreated", (id) => + BridgeConnector.On("BrowserWindowCreated", (id) => { - BridgeConnector.Socket.Off("BrowserWindowCreated"); + BridgeConnector.Off("BrowserWindowCreated"); - string windowId = id.ToString(); - BrowserWindow browserWindow = new BrowserWindow(int.Parse(windowId)); + BrowserWindow browserWindow = new BrowserWindow(id); _browserWindows.Add(browserWindow); taskCompletionSource.SetResult(browserWindow); }); - BridgeConnector.Socket.Off("BrowserWindowClosed"); - BridgeConnector.Socket.On("BrowserWindowClosed", (ids) => + BridgeConnector.Off("BrowserWindowClosed"); + BridgeConnector.On("BrowserWindowClosed", (browserWindowIds) => { - var browserWindowIds = ((JArray)ids).ToObject(); - for (int index = 0; index < _browserWindows.Count; index++) { if (!browserWindowIds.Contains(_browserWindows[index].Id)) @@ -137,7 +134,7 @@ public Task CreateWindowAsync(BrowserWindowOptions options, strin options.X = 0; options.Y = 0; - BridgeConnector.Socket.Emit("createBrowserWindow", JObject.FromObject(options, _jsonSerializer), loadUrl); + BridgeConnector.Emit("createBrowserWindow", options, loadUrl); } else { @@ -153,7 +150,8 @@ public Task CreateWindowAsync(BrowserWindowOptions options, strin ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore }; - BridgeConnector.Socket.Emit("createBrowserWindow", JObject.FromObject(options, ownjsonSerializer), loadUrl); + + BridgeConnector.Emit("createBrowserWindow", JObject.FromObject(options, ownjsonSerializer), loadUrl); } return taskCompletionSource.Task; @@ -184,35 +182,28 @@ public Task CreateBrowserViewAsync() /// public Task CreateBrowserViewAsync(BrowserViewConstructorOptions options) { - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - BridgeConnector.Socket.On("BrowserViewCreated", (id) => + BridgeConnector.On("BrowserViewCreated", (id) => { - BridgeConnector.Socket.Off("BrowserViewCreated"); + BridgeConnector.Off("BrowserViewCreated"); - string browserViewId = id.ToString(); - BrowserView browserView = new BrowserView(int.Parse(browserViewId)); + BrowserView browserView = new BrowserView(id); _browserViews.Add(browserView); taskCompletionSource.SetResult(browserView); }); - var ownjsonSerializer = new JsonSerializer() + var keepDefaultValuesSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore + NullValueHandling = NullValueHandling.Ignore, + DefaultValueHandling = DefaultValueHandling.Include }; - BridgeConnector.Socket.Emit("createBrowserView", JObject.FromObject(options, ownjsonSerializer)); + BridgeConnector.Emit("createBrowserView", JObject.FromObject(options, keepDefaultValuesSerializer)); return taskCompletionSource.Task; } - - private JsonSerializer _jsonSerializer = new JsonSerializer() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore - }; } } diff --git a/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs b/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs index fcefcd45..64b26d43 100644 --- a/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs +++ b/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs @@ -6,6 +6,8 @@ public static class DeployEmbeddedElectronFiles { public static void Do(string tempPath) { + EmbeddedFileHelper.PrintAllResources(); + EmbeddedFileHelper.DeployEmbeddedFile(tempPath, "main.js"); EmbeddedFileHelper.DeployEmbeddedFile(tempPath, "package.json"); EmbeddedFileHelper.DeployEmbeddedFile(tempPath, "build-helper.js"); diff --git a/ElectronNET.CLI/Commands/BuildCommand.cs b/ElectronNET.CLI/Commands/BuildCommand.cs index ae09b1e2..353ee95f 100644 --- a/ElectronNET.CLI/Commands/BuildCommand.cs +++ b/ElectronNET.CLI/Commands/BuildCommand.cs @@ -35,18 +35,19 @@ public BuildCommand(string[] args) _args = args; } - private string _paramTarget = "target"; - private string _paramDotNetConfig = "dotnet-configuration"; - private string _paramElectronArch = "electron-arch"; - private string _paramElectronParams = "electron-params"; - private string _paramOutputDirectory = "relative-path"; - private string _paramAbsoluteOutput = "absolute-path"; - private string _paramPackageJson = "package-json"; - private string _paramForceNodeInstall = "install-modules"; - private string _manifest = "manifest"; - private string _paramPublishReadyToRun = "PublishReadyToRun"; - private string _paramPublishSingleFile = "PublishSingleFile"; - private string _paramVersion = "Version"; + private const string _paramTarget = "target"; + private const string _paramDotNetConfig = "dotnet-configuration"; + private const string _paramElectronArch = "electron-arch"; + private const string _paramElectronParams = "electron-params"; + private const string _paramElectronVersion = "electron-version"; + private const string _paramOutputDirectory = "relative-path"; + private const string _paramAbsoluteOutput = "absolute-path"; + private const string _paramPackageJson = "package-json"; + private const string _paramForceNodeInstall = "install-modules"; + private const string _manifest = "manifest"; + private const string _paramPublishReadyToRun = "PublishReadyToRun"; + private const string _paramPublishSingleFile = "PublishSingleFile"; + private const string _paramVersion = "Version"; public Task ExecuteAsync() { @@ -105,7 +106,7 @@ public Task ExecuteAsync() Console.WriteLine($"Build ASP.NET Core App for {platformInfo.NetCorePublishRid} under {configuration}-Configuration..."); - var dotNetPublishFlags = GetDotNetPublishFlags(parser); + var dotNetPublishFlags = GetDotNetPublishFlags(parser, "false", "false"); var command = $"dotnet publish -r {platformInfo.NetCorePublishRid} -c \"{configuration}\" --output \"{tempBinPath}\" {string.Join(' ', dotNetPublishFlags.Select(kvp => $"{kvp.Key}={kvp.Value}"))} --self-contained"; @@ -135,10 +136,11 @@ public Task ExecuteAsync() var checkForNodeModulesDirPath = Path.Combine(tempPath, "node_modules"); - if (Directory.Exists(checkForNodeModulesDirPath) == false || parser.Contains(_paramForceNodeInstall) || parser.Contains(_paramPackageJson)) - + if (!Directory.Exists(checkForNodeModulesDirPath)|| parser.Contains(_paramForceNodeInstall) || parser.Contains(_paramPackageJson)) + { Console.WriteLine("Start npm install..."); - ProcessHelper.CmdExecute("npm install --production", tempPath); + ProcessHelper.CmdExecute("npm install --production", tempPath); + } Console.WriteLine("ElectronHostHook handling started..."); @@ -177,6 +179,12 @@ public Task ExecuteAsync() electronArch = parser.Arguments[_paramElectronArch][0]; } + string electronVersion = "13.1.5"; + if (parser.Arguments.ContainsKey(_paramElectronVersion)) + { + electronVersion = parser.Arguments[_paramElectronVersion][0]; + } + string electronParams = ""; if (parser.Arguments.ContainsKey(_paramElectronParams)) { @@ -199,7 +207,7 @@ public Task ExecuteAsync() : $"node build-helper.js {manifestFileName} {version}", tempPath); Console.WriteLine($"Package Electron App for Platform {platformInfo.ElectronPackerPlatform}..."); - ProcessHelper.CmdExecute($"npx electron-builder --config=./bin/electron-builder.json --{platformInfo.ElectronPackerPlatform} --{electronArch} -c.electronVersion=13.1.5 {electronParams}", tempPath); + ProcessHelper.CmdExecute($"npx electron-builder --config=./bin/electron-builder.json --{platformInfo.ElectronPackerPlatform} --{electronArch} -c.electronVersion={electronVersion} {electronParams}", tempPath); Console.WriteLine("... done"); @@ -207,12 +215,12 @@ public Task ExecuteAsync() }); } - private Dictionary GetDotNetPublishFlags(SimpleCommandLineParser parser) + internal static Dictionary GetDotNetPublishFlags(SimpleCommandLineParser parser, string defaultReadyToRun, string defaultSingleFile) { var dotNetPublishFlags = new Dictionary { - {"/p:PublishReadyToRun", parser.TryGet(_paramPublishReadyToRun, out var rtr) ? rtr[0] : "true"}, - {"/p:PublishSingleFile", parser.TryGet(_paramPublishSingleFile, out var psf) ? psf[0] : "false"}, + {"/p:PublishReadyToRun", parser.TryGet(_paramPublishReadyToRun, out var rtr) ? rtr[0] : defaultReadyToRun}, + {"/p:PublishSingleFile", parser.TryGet(_paramPublishSingleFile, out var psf) ? psf[0] : defaultSingleFile}, }; if (parser.Arguments.ContainsKey(_paramVersion)) diff --git a/ElectronNET.CLI/Commands/StartElectronCommand.cs b/ElectronNET.CLI/Commands/StartElectronCommand.cs index 03382ecd..ff013cdc 100644 --- a/ElectronNET.CLI/Commands/StartElectronCommand.cs +++ b/ElectronNET.CLI/Commands/StartElectronCommand.cs @@ -22,14 +22,13 @@ public StartElectronCommand(string[] args) _args = args; } - private string _aspCoreProjectPath = "project-path"; - private string _arguments = "args"; - private string _manifest = "manifest"; - private string _clearCache = "clear-cache"; - private string _paramPublishReadyToRun = "PublishReadyToRun"; - private string _paramPublishSingleFile = "PublishSingleFile"; - private string _paramDotNetConfig = "dotnet-configuration"; - private string _paramTarget = "target"; + private const string _aspCoreProjectPath = "project-path"; + private const string _arguments = "args"; + private const string _manifest = "manifest"; + private const string _clearCache = "clear-cache"; + private const string _paramDotNetConfig = "dotnet-configuration"; + private const string _paramTarget = "target"; + private const string _buildInsteadOfPublish = "simple-build"; public Task ExecuteAsync() { @@ -55,34 +54,26 @@ public Task ExecuteAsync() aspCoreProjectPath = Directory.GetCurrentDirectory(); } + + bool buildInsteadOfPublish = false; + + if (parser.Arguments.ContainsKey(_buildInsteadOfPublish)) + { + buildInsteadOfPublish = bool.Parse(parser.Arguments[_buildInsteadOfPublish].First()); + } + string tempPath = Path.Combine(aspCoreProjectPath, "obj", "Host"); if (Directory.Exists(tempPath) == false) { Directory.CreateDirectory(tempPath); } - string tempBinPath = Path.Combine(tempPath, "bin"); - var resultCode = 0; + string tempBinPath = Path.GetFullPath(Path.Combine(tempPath, "bin")); - string publishReadyToRun = "/p:PublishReadyToRun="; - if (parser.Arguments.ContainsKey(_paramPublishReadyToRun)) - { - publishReadyToRun += parser.Arguments[_paramPublishReadyToRun][0]; - } - else - { - publishReadyToRun += "true"; - } + var dotNetPublishFlags = BuildCommand.GetDotNetPublishFlags(parser, "false", "false"); + + var resultCode = 0; - string publishSingleFile = "/p:PublishSingleFile="; - if (parser.Arguments.ContainsKey(_paramPublishSingleFile)) - { - publishSingleFile += parser.Arguments[_paramPublishSingleFile][0]; - } - else - { - publishSingleFile += "true"; - } // If target is specified as a command line argument, use it. // Format is the same as the build command. @@ -105,9 +96,19 @@ public Task ExecuteAsync() configuration = parser.Arguments[_paramDotNetConfig][0]; } - if (parser != null && !parser.Arguments.ContainsKey("watch")) + if (!buildInsteadOfPublish) + { + if (parser != null && !parser.Arguments.ContainsKey("watch")) + { + resultCode = ProcessHelper.CmdExecute($"dotnet publish -r {platformInfo.NetCorePublishRid} -c \"{configuration}\" --output \"{tempBinPath}\" {string.Join(' ', dotNetPublishFlags.Select(kvp => $"{kvp.Key}={kvp.Value}"))} --no-self-contained /p:DisabledWarnings=true", aspCoreProjectPath); + } + } + else { - resultCode = ProcessHelper.CmdExecute($"dotnet publish -r {platformInfo.NetCorePublishRid} -c \"{configuration}\" --output \"{tempBinPath}\" {publishReadyToRun} {publishSingleFile} --no-self-contained", aspCoreProjectPath); + if (parser != null && !parser.Arguments.ContainsKey("watch")) + { + resultCode = ProcessHelper.CmdExecute($"dotnet build -r {platformInfo.NetCorePublishRid} -c \"{configuration}\" --output \"{tempBinPath}\" {string.Join(' ', dotNetPublishFlags.Select(kvp => $"{kvp.Key}={kvp.Value}"))} /p:DisabledWarnings=true", aspCoreProjectPath); + } } if (resultCode != 0) @@ -120,10 +121,40 @@ public Task ExecuteAsync() var nodeModulesDirPath = Path.Combine(tempPath, "node_modules"); - Console.WriteLine("node_modules missing in: " + nodeModulesDirPath); + bool runNpmInstall = false; + + Console.WriteLine("node_modules in: " + nodeModulesDirPath); + + if (!Directory.Exists(nodeModulesDirPath)) + { + runNpmInstall = true; + } + + var packagesJson = Path.Combine(tempPath, "package.json"); + var packagesPrevious = Path.Combine(tempPath, "package.json.previous"); - Console.WriteLine("Start npm install..."); - ProcessHelper.CmdExecute("npm install", tempPath); + if (!runNpmInstall) + { + + if (File.Exists(packagesPrevious)) + { + if (File.ReadAllText(packagesPrevious) != File.ReadAllText(packagesJson)) + { + runNpmInstall = true; + } + } + else + { + runNpmInstall = true; + } + } + + if (runNpmInstall) + { + Console.WriteLine("Start npm install..."); + ProcessHelper.CmdExecute("npm install", tempPath); + File.Copy(packagesJson, packagesPrevious, true); + } Console.WriteLine("ElectronHostHook handling started..."); @@ -169,12 +200,14 @@ public Task ExecuteAsync() if (isWindows) { Console.WriteLine("Invoke electron.cmd - in dir: " + path); + Console.WriteLine("\n\n---------------------------------------------------\n\n\n"); ProcessHelper.CmdExecute(@"electron.cmd ""..\..\main.js"" " + arguments, path); } else { Console.WriteLine("Invoke electron - in dir: " + path); + Console.WriteLine("\n\n---------------------------------------------------\n\n\n"); ProcessHelper.CmdExecute(@"./electron ""../../main.js"" " + arguments, path); } diff --git a/ElectronNET.CLI/ElectronNET.CLI.csproj b/ElectronNET.CLI/ElectronNET.CLI.csproj index a4bd0118..f3c4bfad 100644 --- a/ElectronNET.CLI/ElectronNET.CLI.csproj +++ b/ElectronNET.CLI/ElectronNET.CLI.csproj @@ -13,7 +13,7 @@ ElectronNET.CLI 99.0.0.0 - Gregor Biswanger, Robert Muehsig + Gregor Biswanger, Robert Muehsig, Rafael Oliveira Electron.NET @@ -81,6 +81,7 @@ all runtime; build; native; contentfiles; analyzers + diff --git a/ElectronNET.CLI/EmbeddedFileHelper.cs b/ElectronNET.CLI/EmbeddedFileHelper.cs index d41e657e..0f65ea71 100644 --- a/ElectronNET.CLI/EmbeddedFileHelper.cs +++ b/ElectronNET.CLI/EmbeddedFileHelper.cs @@ -7,13 +7,38 @@ namespace ElectronNET.CLI public static class EmbeddedFileHelper { private const string ResourcePath = "ElectronNET.CLI.{0}"; + private const string ResourcePath2 = "ElectronNet.CLI.{0}"; private static Stream GetTestResourceFileStream(string folderAndFileInProjectPath) { var asm = Assembly.GetExecutingAssembly(); var resource = string.Format(ResourcePath, folderAndFileInProjectPath); + var resource2 = string.Format(ResourcePath2, folderAndFileInProjectPath); - return asm.GetManifestResourceStream(resource); + var stream = asm.GetManifestResourceStream(resource) ?? asm.GetManifestResourceStream(resource2); + + if(stream is null) + { + PrintAllResources(); + + Console.WriteLine("Was missing resource: {0}", resource); + + return null; + } + else + { + return stream; + } + } + + public static void PrintAllResources() + { + var asm = Assembly.GetExecutingAssembly(); + + foreach (var n in asm.GetManifestResourceNames()) + { + Console.WriteLine("Found resource : {0}", n); + } } public static void DeployEmbeddedFile(string targetPath, string file, string namespacePath = "") diff --git a/ElectronNET.CLI/ProcessHelper.cs b/ElectronNET.CLI/ProcessHelper.cs index 9e0048f4..5f7d6cc1 100644 --- a/ElectronNET.CLI/ProcessHelper.cs +++ b/ElectronNET.CLI/ProcessHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Diagnostics; using System.Runtime.InteropServices; @@ -6,6 +7,33 @@ namespace ElectronNET.CLI { public class ProcessHelper { + private static ConcurrentDictionary _activeProcess = new(); + + public static void KillActive() + { + foreach(var kv in _activeProcess) + { + if (!kv.Key.HasExited) + { + try + { + kv.Key.CloseMainWindow(); + } + catch + { + + } + try + { + kv.Key.Kill(true); + } + catch + { + + } + } + } + } public static int CmdExecute(string command, string workingDirectoryPath, bool output = true, bool waitForExit = true) { using (Process cmd = new Process()) @@ -43,7 +71,11 @@ public static int CmdExecute(string command, string workingDirectoryPath, bool o if (waitForExit) { + _activeProcess[cmd] = true; + cmd.WaitForExit(); + + _activeProcess.TryRemove(cmd, out _); } return cmd.ExitCode; diff --git a/ElectronNET.CLI/Program.cs b/ElectronNET.CLI/Program.cs index 2030030c..891b15ef 100644 --- a/ElectronNET.CLI/Program.cs +++ b/ElectronNET.CLI/Program.cs @@ -4,12 +4,13 @@ using System.Linq; using System.Reflection; using System.Text; +using System.Threading.Tasks; namespace ElectronNET.CLI { class Program { - static void Main(string[] args) + static async Task Main(string[] args) { if (args.Length == 0) { @@ -18,6 +19,12 @@ static void Main(string[] args) Environment.Exit(-1); } + Console.CancelKeyPress += (s,e) => + { + ProcessHelper.KillActive(); + Environment.Exit(-1); + }; + ICommand command = null; switch (args[0]) @@ -56,7 +63,7 @@ static void Main(string[] args) if (command != null) { - var success = command.ExecuteAsync().Result; + var success = await command.ExecuteAsync(); if (!success) { Environment.Exit(-1); diff --git a/ElectronNET.Host/api/app.js b/ElectronNET.Host/api/app.js index 783b204a..e9fb535d 100644 --- a/ElectronNET.Host/api/app.js +++ b/ElectronNET.Host/api/app.js @@ -151,7 +151,7 @@ module.exports = (socket, app) => { const success = app.requestSingleInstanceLock(); electronSocket.emit('appRequestSingleInstanceLockCompleted', success); app.on('second-instance', (event, args = [], workingDirectory = '') => { - electronSocket.emit('secondInstance', [args, workingDirectory]); + electronSocket.emit('secondInstance', { args: args, workingDirectory: workingDirectory }); }); }); socket.on('appHasSingleInstanceLock', () => { diff --git a/ElectronNET.Host/api/app.ts b/ElectronNET.Host/api/app.ts index 1f04f9f0..4d8df783 100644 --- a/ElectronNET.Host/api/app.ts +++ b/ElectronNET.Host/api/app.ts @@ -190,7 +190,7 @@ export = (socket: Socket, app: Electron.App) => { electronSocket.emit('appRequestSingleInstanceLockCompleted', success); app.on('second-instance', (event, args = [], workingDirectory = '') => { - electronSocket.emit('secondInstance', [args, workingDirectory]); + electronSocket.emit('secondInstance', { args: args, workingDirectory: workingDirectory }); }); }); diff --git a/ElectronNET.Host/api/browserView.js b/ElectronNET.Host/api/browserView.js index 17e01897..b0d23cc4 100644 --- a/ElectronNET.Host/api/browserView.js +++ b/ElectronNET.Host/api/browserView.js @@ -24,7 +24,7 @@ const browserViewApi = (socket) => { }); socket.on('browserView-getBounds', (id) => { const bounds = getBrowserViewById(id).getBounds(); - electronSocket.emit('browserView-getBounds-reply', bounds); + electronSocket.emit('browserView-getBounds-reply' + id, bounds); }); socket.on('browserView-setBounds', (id, bounds) => { getBrowserViewById(id).setBounds(bounds); diff --git a/ElectronNET.Host/api/browserView.ts b/ElectronNET.Host/api/browserView.ts index 5d7a314b..6ccf33c6 100644 --- a/ElectronNET.Host/api/browserView.ts +++ b/ElectronNET.Host/api/browserView.ts @@ -31,7 +31,7 @@ const browserViewApi = (socket: Socket) => { socket.on('browserView-getBounds', (id) => { const bounds = getBrowserViewById(id).getBounds(); - electronSocket.emit('browserView-getBounds-reply', bounds); + electronSocket.emit('browserView-getBounds-reply' + id, bounds); }); socket.on('browserView-setBounds', (id, bounds) => { diff --git a/ElectronNET.Host/api/browserWindows.js b/ElectronNET.Host/api/browserWindows.js index e2513868..af3f7e61 100644 --- a/ElectronNET.Host/api/browserWindows.js +++ b/ElectronNET.Host/api/browserWindows.js @@ -25,153 +25,153 @@ module.exports = (socket, app) => { readyToShowWindowsIds = readyToShowWindowsIds.filter(value => value !== id); electronSocket.emit('browserWindow-ready-to-show' + id); } - getWindowById(id).on('ready-to-show', () => { + getWindowById(id)?.on('ready-to-show', () => { readyToShowWindowsIds.push(id); electronSocket.emit('browserWindow-ready-to-show' + id); }); }); socket.on('register-browserWindow-page-title-updated', (id) => { - getWindowById(id).on('page-title-updated', (event, title) => { + getWindowById(id)?.on('page-title-updated', (event, title) => { electronSocket.emit('browserWindow-page-title-updated' + id, title); }); }); socket.on('register-browserWindow-close', (id) => { - getWindowById(id).on('close', () => { + getWindowById(id)?.on('close', () => { electronSocket.emit('browserWindow-close' + id); }); }); socket.on('register-browserWindow-closed', (id) => { - getWindowById(id).on('closed', () => { + getWindowById(id)?.on('closed', () => { electronSocket.emit('browserWindow-closed' + id); }); }); socket.on('register-browserWindow-session-end', (id) => { - getWindowById(id).on('session-end', () => { + getWindowById(id)?.on('session-end', () => { electronSocket.emit('browserWindow-session-end' + id); }); }); socket.on('register-browserWindow-unresponsive', (id) => { - getWindowById(id).on('unresponsive', () => { + getWindowById(id)?.on('unresponsive', () => { electronSocket.emit('browserWindow-unresponsive' + id); }); }); socket.on('register-browserWindow-responsive', (id) => { - getWindowById(id).on('responsive', () => { + getWindowById(id)?.on('responsive', () => { electronSocket.emit('browserWindow-responsive' + id); }); }); socket.on('register-browserWindow-blur', (id) => { - getWindowById(id).on('blur', () => { + getWindowById(id)?.on('blur', () => { electronSocket.emit('browserWindow-blur' + id); }); }); socket.on('register-browserWindow-focus', (id) => { - getWindowById(id).on('focus', () => { + getWindowById(id)?.on('focus', () => { electronSocket.emit('browserWindow-focus' + id); }); }); socket.on('register-browserWindow-show', (id) => { - getWindowById(id).on('show', () => { + getWindowById(id)?.on('show', () => { electronSocket.emit('browserWindow-show' + id); }); }); socket.on('register-browserWindow-hide', (id) => { - getWindowById(id).on('hide', () => { + getWindowById(id)?.on('hide', () => { electronSocket.emit('browserWindow-hide' + id); }); }); socket.on('register-browserWindow-maximize', (id) => { - getWindowById(id).on('maximize', () => { + getWindowById(id)?.on('maximize', () => { electronSocket.emit('browserWindow-maximize' + id); }); }); socket.on('register-browserWindow-unmaximize', (id) => { - getWindowById(id).on('unmaximize', () => { + getWindowById(id)?.on('unmaximize', () => { electronSocket.emit('browserWindow-unmaximize' + id); }); }); socket.on('register-browserWindow-minimize', (id) => { - getWindowById(id).on('minimize', () => { + getWindowById(id)?.on('minimize', () => { electronSocket.emit('browserWindow-minimize' + id); }); }); socket.on('register-browserWindow-restore', (id) => { - getWindowById(id).on('restore', () => { + getWindowById(id)?.on('restore', () => { electronSocket.emit('browserWindow-restore' + id); }); }); socket.on('register-browserWindow-resize', (id) => { - getWindowById(id).on('resize', () => { + getWindowById(id)?.on('resize', () => { electronSocket.emit('browserWindow-resize' + id); }); }); socket.on('register-browserWindow-move', (id) => { - getWindowById(id).on('move', () => { + getWindowById(id)?.on('move', () => { electronSocket.emit('browserWindow-move' + id); }); }); socket.on('register-browserWindow-moved', (id) => { - getWindowById(id).on('moved', () => { + getWindowById(id)?.on('moved', () => { electronSocket.emit('browserWindow-moved' + id); }); }); socket.on('register-browserWindow-enter-full-screen', (id) => { - getWindowById(id).on('enter-full-screen', () => { + getWindowById(id)?.on('enter-full-screen', () => { electronSocket.emit('browserWindow-enter-full-screen' + id); }); }); socket.on('register-browserWindow-leave-full-screen', (id) => { - getWindowById(id).on('leave-full-screen', () => { + getWindowById(id)?.on('leave-full-screen', () => { electronSocket.emit('browserWindow-leave-full-screen' + id); }); }); socket.on('register-browserWindow-enter-html-full-screen', (id) => { - getWindowById(id).on('enter-html-full-screen', () => { + getWindowById(id)?.on('enter-html-full-screen', () => { electronSocket.emit('browserWindow-enter-html-full-screen' + id); }); }); socket.on('register-browserWindow-leave-html-full-screen', (id) => { - getWindowById(id).on('leave-html-full-screen', () => { + getWindowById(id)?.on('leave-html-full-screen', () => { electronSocket.emit('browserWindow-leave-html-full-screen' + id); }); }); socket.on('register-browserWindow-app-command', (id) => { - getWindowById(id).on('app-command', (event, command) => { + getWindowById(id)?.on('app-command', (event, command) => { electronSocket.emit('browserWindow-app-command' + id, command); }); }); socket.on('register-browserWindow-scroll-touch-begin', (id) => { - getWindowById(id).on('scroll-touch-begin', () => { + getWindowById(id)?.on('scroll-touch-begin', () => { electronSocket.emit('browserWindow-scroll-touch-begin' + id); }); }); socket.on('register-browserWindow-scroll-touch-end', (id) => { - getWindowById(id).on('scroll-touch-end', () => { + getWindowById(id)?.on('scroll-touch-end', () => { electronSocket.emit('browserWindow-scroll-touch-end' + id); }); }); socket.on('register-browserWindow-scroll-touch-edge', (id) => { - getWindowById(id).on('scroll-touch-edge', () => { + getWindowById(id)?.on('scroll-touch-edge', () => { electronSocket.emit('browserWindow-scroll-touch-edge' + id); }); }); socket.on('register-browserWindow-swipe', (id) => { - getWindowById(id).on('swipe', (event, direction) => { + getWindowById(id)?.on('swipe', (event, direction) => { electronSocket.emit('browserWindow-swipe' + id, direction); }); }); socket.on('register-browserWindow-sheet-begin', (id) => { - getWindowById(id).on('sheet-begin', () => { + getWindowById(id)?.on('sheet-begin', () => { electronSocket.emit('browserWindow-sheet-begin' + id); }); }); socket.on('register-browserWindow-sheet-end', (id) => { - getWindowById(id).on('sheet-end', () => { + getWindowById(id)?.on('sheet-end', () => { electronSocket.emit('browserWindow-sheet-end' + id); }); }); socket.on('register-browserWindow-new-window-for-tab', (id) => { - getWindowById(id).on('new-window-for-tab', () => { + getWindowById(id)?.on('new-window-for-tab', () => { electronSocket.emit('browserWindow-new-window-for-tab' + id); }); }); @@ -202,6 +202,15 @@ module.exports = (socket, app) => { proxyToCredentialsMap[options.proxy] = options.proxyCredentials; } window.on('ready-to-show', () => { + try { + window.id; + } + catch (error) { + if (error.message === 'Object has been destroyed') { + return; + } + } + if (readyToShowWindowsIds.includes(window.id)) { readyToShowWindowsIds = readyToShowWindowsIds.filter(value => value !== window.id); } @@ -250,239 +259,244 @@ module.exports = (socket, app) => { electronSocket.emit('BrowserWindowCreated', window.id); }); socket.on('browserWindowDestroy', (id) => { - getWindowById(id).destroy(); + getWindowById(id)?.destroy(); }); socket.on('browserWindowClose', (id) => { - getWindowById(id).close(); + getWindowById(id)?.close(); }); socket.on('browserWindowFocus', (id) => { - getWindowById(id).focus(); + getWindowById(id)?.focus(); }); socket.on('browserWindowBlur', (id) => { - getWindowById(id).blur(); + getWindowById(id)?.blur(); }); socket.on('browserWindowIsFocused', (id) => { - const isFocused = getWindowById(id).isFocused(); - electronSocket.emit('browserWindow-isFocused-completed', isFocused); + const isFocused = getWindowById(id)?.isFocused() ?? null; + electronSocket.emit('browserWindow-isFocused-completed' + id, isFocused); }); socket.on('browserWindowIsDestroyed', (id) => { - const isDestroyed = getWindowById(id).isDestroyed(); - electronSocket.emit('browserWindow-isDestroyed-completed', isDestroyed); + const w = getWindowById(id); + if (w) { + const isDestroyed = w.isDestroyed(); + electronSocket.emit('browserWindow-isDestroyed-completed' + id, isDestroyed); + } else { + electronSocket.emit('browserWindow-isDestroyed-completed' + id, true); + } }); socket.on('browserWindowShow', (id) => { - getWindowById(id).show(); + getWindowById(id)?.show(); }); socket.on('browserWindowShowInactive', (id) => { - getWindowById(id).showInactive(); + getWindowById(id)?.showInactive(); }); socket.on('browserWindowHide', (id) => { - getWindowById(id).hide(); + getWindowById(id)?.hide(); }); socket.on('browserWindowIsVisible', (id) => { - const isVisible = getWindowById(id).isVisible(); - electronSocket.emit('browserWindow-isVisible-completed', isVisible); + const isVisible = getWindowById(id)?.isVisible() ?? null; + electronSocket.emit('browserWindow-isVisible-completed' + id, isVisible); }); socket.on('browserWindowIsModal', (id) => { - const isModal = getWindowById(id).isModal(); - electronSocket.emit('browserWindow-isModal-completed', isModal); + const isModal = getWindowById(id)?.isModal() ?? null; + electronSocket.emit('browserWindow-isModal-completed' + id, isModal); }); socket.on('browserWindowMaximize', (id) => { - getWindowById(id).maximize(); + getWindowById(id)?.maximize(); }); socket.on('browserWindowUnmaximize', (id) => { - getWindowById(id).unmaximize(); + getWindowById(id)?.unmaximize(); }); socket.on('browserWindowIsMaximized', (id) => { - const isMaximized = getWindowById(id).isMaximized(); - electronSocket.emit('browserWindow-isMaximized-completed', isMaximized); + const isMaximized = getWindowById(id)?.isMaximized() ?? null; + electronSocket.emit('browserWindow-isMaximized-completed' + id, isMaximized); }); socket.on('browserWindowMinimize', (id) => { - getWindowById(id).minimize(); + getWindowById(id)?.minimize(); }); socket.on('browserWindowRestore', (id) => { - getWindowById(id).restore(); + getWindowById(id)?.restore(); }); socket.on('browserWindowIsMinimized', (id) => { - const isMinimized = getWindowById(id).isMinimized(); - electronSocket.emit('browserWindow-isMinimized-completed', isMinimized); + const isMinimized = getWindowById(id)?.isMinimized() ?? null; + electronSocket.emit('browserWindow-isMinimized-completed' + id, isMinimized); }); socket.on('browserWindowSetFullScreen', (id, fullscreen) => { - getWindowById(id).setFullScreen(fullscreen); + getWindowById(id)?.setFullScreen(fullscreen); }); socket.on('browserWindowIsFullScreen', (id) => { - const isFullScreen = getWindowById(id).isFullScreen(); - electronSocket.emit('browserWindow-isFullScreen-completed', isFullScreen); + const isFullScreen = getWindowById(id)?.isFullScreen() ?? null; + electronSocket.emit('browserWindow-isFullScreen-completed' + id, isFullScreen); }); socket.on('browserWindowSetAspectRatio', (id, aspectRatio, extraSize) => { - getWindowById(id).setAspectRatio(aspectRatio, extraSize); + getWindowById(id)?.setAspectRatio(aspectRatio, extraSize); }); socket.on('browserWindowPreviewFile', (id, path, displayname) => { - getWindowById(id).previewFile(path, displayname); + getWindowById(id)?.previewFile(path, displayname); }); socket.on('browserWindowCloseFilePreview', (id) => { - getWindowById(id).closeFilePreview(); + getWindowById(id)?.closeFilePreview(); }); socket.on('browserWindowSetBounds', (id, bounds, animate) => { - getWindowById(id).setBounds(bounds, animate); + getWindowById(id)?.setBounds(bounds, animate); }); socket.on('browserWindowGetBounds', (id) => { - const rectangle = getWindowById(id).getBounds(); - electronSocket.emit('browserWindow-getBounds-completed', rectangle); + const rectangle = getWindowById(id)?.getBounds() ?? null; + electronSocket.emit('browserWindow-getBounds-completed' + id, rectangle); }); socket.on('browserWindowSetContentBounds', (id, bounds, animate) => { - getWindowById(id).setContentBounds(bounds, animate); + getWindowById(id)?.setContentBounds(bounds, animate); }); socket.on('browserWindowGetContentBounds', (id) => { - const rectangle = getWindowById(id).getContentBounds(); - electronSocket.emit('browserWindow-getContentBounds-completed', rectangle); + const rectangle = getWindowById(id)?.getContentBounds() ?? null; + electronSocket.emit('browserWindow-getContentBounds-completed' + id, rectangle); }); socket.on('browserWindowSetSize', (id, width, height, animate) => { - getWindowById(id).setSize(width, height, animate); + getWindowById(id)?.setSize(width, height, animate); }); socket.on('browserWindowGetSize', (id) => { - const size = getWindowById(id).getSize(); - electronSocket.emit('browserWindow-getSize-completed', size); + const size = getWindowById(id)?.getSize() ?? null; + electronSocket.emit('browserWindow-getSize-completed' + id, size); }); socket.on('browserWindowSetContentSize', (id, width, height, animate) => { - getWindowById(id).setContentSize(width, height, animate); + getWindowById(id)?.setContentSize(width, height, animate); }); socket.on('browserWindowGetContentSize', (id) => { - const size = getWindowById(id).getContentSize(); - electronSocket.emit('browserWindow-getContentSize-completed', size); + const size = getWindowById(id)?.getContentSize() ?? null; + electronSocket.emit('browserWindow-getContentSize-completed' + id, size); }); socket.on('browserWindowSetMinimumSize', (id, width, height) => { - getWindowById(id).setMinimumSize(width, height); + getWindowById(id)?.setMinimumSize(width, height); }); socket.on('browserWindowGetMinimumSize', (id) => { - const size = getWindowById(id).getMinimumSize(); - electronSocket.emit('browserWindow-getMinimumSize-completed', size); + const size = getWindowById(id)?.getMinimumSize() ?? null; + electronSocket.emit('browserWindow-getMinimumSize-completed' + id, size); }); socket.on('browserWindowSetMaximumSize', (id, width, height) => { - getWindowById(id).setMaximumSize(width, height); + getWindowById(id)?.setMaximumSize(width, height); }); socket.on('browserWindowGetMaximumSize', (id) => { - const size = getWindowById(id).getMaximumSize(); - electronSocket.emit('browserWindow-getMaximumSize-completed', size); + const size = getWindowById(id)?.getMaximumSize() ?? null; + electronSocket.emit('browserWindow-getMaximumSize-completed' + id, size); }); socket.on('browserWindowSetResizable', (id, resizable) => { - getWindowById(id).setResizable(resizable); + getWindowById(id)?.setResizable(resizable); }); socket.on('browserWindowIsResizable', (id) => { - const resizable = getWindowById(id).isResizable(); - electronSocket.emit('browserWindow-isResizable-completed', resizable); + const resizable = getWindowById(id)?.isResizable() ?? null; + electronSocket.emit('browserWindow-isResizable-completed' + id, resizable); }); socket.on('browserWindowSetMovable', (id, movable) => { - getWindowById(id).setMovable(movable); + getWindowById(id)?.setMovable(movable); }); socket.on('browserWindowIsMovable', (id) => { - const movable = getWindowById(id).isMovable(); - electronSocket.emit('browserWindow-isMovable-completed', movable); + const movable = getWindowById(id)?.isMovable() ?? null; + electronSocket.emit('browserWindow-isMovable-completed' + id, movable); }); socket.on('browserWindowSetMinimizable', (id, minimizable) => { - getWindowById(id).setMinimizable(minimizable); + getWindowById(id)?.setMinimizable(minimizable); }); socket.on('browserWindowIsMinimizable', (id) => { - const minimizable = getWindowById(id).isMinimizable(); - electronSocket.emit('browserWindow-isMinimizable-completed', minimizable); + const minimizable = getWindowById(id)?.isMinimizable() ?? null; + electronSocket.emit('browserWindow-isMinimizable-completed' + id, minimizable); }); socket.on('browserWindowSetMaximizable', (id, maximizable) => { - getWindowById(id).setMaximizable(maximizable); + getWindowById(id)?.setMaximizable(maximizable); }); socket.on('browserWindowIsMaximizable', (id) => { - const maximizable = getWindowById(id).isMaximizable(); - electronSocket.emit('browserWindow-isMaximizable-completed', maximizable); + const maximizable = getWindowById(id)?.isMaximizable() ?? null; + electronSocket.emit('browserWindow-isMaximizable-completed' + id, maximizable); }); socket.on('browserWindowSetFullScreenable', (id, fullscreenable) => { - getWindowById(id).setFullScreenable(fullscreenable); + getWindowById(id)?.setFullScreenable(fullscreenable); }); socket.on('browserWindowIsFullScreenable', (id) => { - const fullscreenable = getWindowById(id).isFullScreenable(); - electronSocket.emit('browserWindow-isFullScreenable-completed', fullscreenable); + const fullscreenable = getWindowById(id)?.isFullScreenable() ?? null; + electronSocket.emit('browserWindow-isFullScreenable-completed' + id, fullscreenable); }); socket.on('browserWindowSetClosable', (id, closable) => { - getWindowById(id).setClosable(closable); + getWindowById(id)?.setClosable(closable); }); socket.on('browserWindowIsClosable', (id) => { - const closable = getWindowById(id).isClosable(); - electronSocket.emit('browserWindow-isClosable-completed', closable); + const closable = getWindowById(id)?.isClosable() ?? null; + electronSocket.emit('browserWindow-isClosable-completed' + id, closable); }); socket.on('browserWindowSetAlwaysOnTop', (id, flag, level, relativeLevel) => { - getWindowById(id).setAlwaysOnTop(flag, level, relativeLevel); + getWindowById(id)?.setAlwaysOnTop(flag, level, relativeLevel); }); socket.on('browserWindowIsAlwaysOnTop', (id) => { - const isAlwaysOnTop = getWindowById(id).isAlwaysOnTop(); - electronSocket.emit('browserWindow-isAlwaysOnTop-completed', isAlwaysOnTop); + const isAlwaysOnTop = getWindowById(id)?.isAlwaysOnTop() ?? null; + electronSocket.emit('browserWindow-isAlwaysOnTop-completed' + id, isAlwaysOnTop); }); socket.on('browserWindowCenter', (id) => { - getWindowById(id).center(); + getWindowById(id)?.center(); }); socket.on('browserWindowSetPosition', (id, x, y, animate) => { - getWindowById(id).setPosition(x, y, animate); + getWindowById(id)?.setPosition(x, y, animate); }); socket.on('browserWindowGetPosition', (id) => { - const position = getWindowById(id).getPosition(); - electronSocket.emit('browserWindow-getPosition-completed', position); + const position = getWindowById(id)?.getPosition() ?? null; + electronSocket.emit('browserWindow-getPosition-completed' + id, position); }); socket.on('browserWindowSetTitle', (id, title) => { - getWindowById(id).setTitle(title); + getWindowById(id)?.setTitle(title); }); socket.on('browserWindowGetTitle', (id) => { - const title = getWindowById(id).getTitle(); - electronSocket.emit('browserWindow-getTitle-completed', title); + const title = getWindowById(id)?.getTitle() ?? null; + electronSocket.emit('browserWindow-getTitle-completed' + id, title); }); socket.on('browserWindowSetTitle', (id, title) => { - getWindowById(id).setTitle(title); + getWindowById(id)?.setTitle(title); }); socket.on('browserWindowSetSheetOffset', (id, offsetY, offsetX) => { if (offsetX) { - getWindowById(id).setSheetOffset(offsetY, offsetX); + getWindowById(id)?.setSheetOffset(offsetY, offsetX); } else { - getWindowById(id).setSheetOffset(offsetY); + getWindowById(id)?.setSheetOffset(offsetY); } }); socket.on('browserWindowFlashFrame', (id, flag) => { - getWindowById(id).flashFrame(flag); + getWindowById(id)?.flashFrame(flag); }); socket.on('browserWindowSetSkipTaskbar', (id, skip) => { - getWindowById(id).setSkipTaskbar(skip); + getWindowById(id)?.setSkipTaskbar(skip); }); socket.on('browserWindowSetKiosk', (id, flag) => { - getWindowById(id).setKiosk(flag); + getWindowById(id)?.setKiosk(flag); }); socket.on('browserWindowIsKiosk', (id) => { - const isKiosk = getWindowById(id).isKiosk(); - electronSocket.emit('browserWindow-isKiosk-completed', isKiosk); + const isKiosk = getWindowById(id)?.isKiosk() ?? null; + electronSocket.emit('browserWindow-isKiosk-completed' + id, isKiosk); }); socket.on('browserWindowGetNativeWindowHandle', (id) => { - const nativeWindowHandle = getWindowById(id).getNativeWindowHandle().readInt32LE(0).toString(16); - electronSocket.emit('browserWindow-getNativeWindowHandle-completed', nativeWindowHandle); + const nativeWindowHandle = getWindowById(id)?.getNativeWindowHandle()?.readInt32LE(0)?.toString(16) ?? null; + electronSocket.emit('browserWindow-getNativeWindowHandle-completed' + id, nativeWindowHandle); }); socket.on('browserWindowSetRepresentedFilename', (id, filename) => { - getWindowById(id).setRepresentedFilename(filename); + getWindowById(id)?.setRepresentedFilename(filename); }); socket.on('browserWindowGetRepresentedFilename', (id) => { - const pathname = getWindowById(id).getRepresentedFilename(); - electronSocket.emit('browserWindow-getRepresentedFilename-completed', pathname); + const pathname = getWindowById(id)?.getRepresentedFilename() ?? null; + electronSocket.emit('browserWindow-getRepresentedFilename-completed' + id, pathname); }); socket.on('browserWindowSetDocumentEdited', (id, edited) => { - getWindowById(id).setDocumentEdited(edited); + getWindowById(id)?.setDocumentEdited(edited); }); socket.on('browserWindowIsDocumentEdited', (id) => { - const edited = getWindowById(id).isDocumentEdited(); - electronSocket.emit('browserWindow-isDocumentEdited-completed', edited); + const edited = getWindowById(id)?.isDocumentEdited() ?? null; + electronSocket.emit('browserWindow-isDocumentEdited-completed' + id, edited); }); socket.on('browserWindowFocusOnWebView', (id) => { - getWindowById(id).focusOnWebView(); + getWindowById(id)?.focusOnWebView(); }); socket.on('browserWindowBlurWebView', (id) => { - getWindowById(id).blurWebView(); + getWindowById(id)?.blurWebView(); }); socket.on('browserWindowLoadURL', (id, url, options) => { - getWindowById(id).loadURL(url, options); + getWindowById(id)?.loadURL(url, options); }); socket.on('browserWindowReload', (id) => { - getWindowById(id).reload(); + getWindowById(id)?.reload(); }); socket.on('browserWindowSetMenu', (id, menuItems) => { let menu = null; @@ -492,10 +506,10 @@ module.exports = (socket, app) => { electronSocket.emit('windowMenuItemClicked', id); }); } - getWindowById(id).setMenu(menu); + getWindowById(id)?.setMenu(menu); }); socket.on('browserWindowRemoveMenu', (id) => { - getWindowById(id).removeMenu(); + getWindowById(id)?.removeMenu(); }); function addMenuItemClickConnector(menuItems, callback) { menuItems.forEach((item) => { @@ -508,17 +522,17 @@ module.exports = (socket, app) => { }); } socket.on('browserWindowSetProgressBar', (id, progress) => { - getWindowById(id).setProgressBar(progress); + getWindowById(id)?.setProgressBar(progress); }); socket.on('browserWindowSetProgressBar', (id, progress, options) => { - getWindowById(id).setProgressBar(progress, options); + getWindowById(id)?.setProgressBar(progress, options); }); socket.on('browserWindowSetHasShadow', (id, hasShadow) => { - getWindowById(id).setHasShadow(hasShadow); + getWindowById(id)?.setHasShadow(hasShadow); }); socket.on('browserWindowHasShadow', (id) => { - const hasShadow = getWindowById(id).hasShadow(); - electronSocket.emit('browserWindow-hasShadow-completed', hasShadow); + const hasShadow = getWindowById(id)?.hasShadow() ?? null; + electronSocket.emit('browserWindow-hasShadow-completed' + id, hasShadow); }); socket.on('browserWindowSetThumbarButtons', (id, thumbarButtons) => { thumbarButtons.forEach(thumbarButton => { @@ -528,75 +542,75 @@ module.exports = (socket, app) => { electronSocket.emit('thumbarButtonClicked', thumbarButton['id']); }; }); - const success = getWindowById(id).setThumbarButtons(thumbarButtons); - electronSocket.emit('browserWindowSetThumbarButtons-completed', success); + const success = getWindowById(id)?.setThumbarButtons(thumbarButtons) ?? null; + electronSocket.emit('browserWindowSetThumbarButtons-completed' + id, success); }); socket.on('browserWindowSetThumbnailClip', (id, rectangle) => { - getWindowById(id).setThumbnailClip(rectangle); + getWindowById(id)?.setThumbnailClip(rectangle); }); socket.on('browserWindowSetThumbnailToolTip', (id, toolTip) => { - getWindowById(id).setThumbnailToolTip(toolTip); + getWindowById(id)?.setThumbnailToolTip(toolTip); }); socket.on('browserWindowSetAppDetails', (id, options) => { - getWindowById(id).setAppDetails(options); + getWindowById(id)?.setAppDetails(options); }); socket.on('browserWindowShowDefinitionForSelection', (id) => { - getWindowById(id).showDefinitionForSelection(); + getWindowById(id)?.showDefinitionForSelection(); }); socket.on('browserWindowSetAutoHideMenuBar', (id, hide) => { - getWindowById(id).setAutoHideMenuBar(hide); + getWindowById(id)?.setAutoHideMenuBar(hide); }); socket.on('browserWindowIsMenuBarAutoHide', (id) => { - const isMenuBarAutoHide = getWindowById(id).isMenuBarAutoHide(); - electronSocket.emit('browserWindow-isMenuBarAutoHide-completed', isMenuBarAutoHide); + const isMenuBarAutoHide = getWindowById(id)?.isMenuBarAutoHide() ?? null; + electronSocket.emit('browserWindow-isMenuBarAutoHide-completed' + id, isMenuBarAutoHide); }); socket.on('browserWindowSetMenuBarVisibility', (id, visible) => { - getWindowById(id).setMenuBarVisibility(visible); + getWindowById(id)?.setMenuBarVisibility(visible); }); socket.on('browserWindowIsMenuBarVisible', (id) => { - const isMenuBarVisible = getWindowById(id).isMenuBarVisible(); - electronSocket.emit('browserWindow-isMenuBarVisible-completed', isMenuBarVisible); + const isMenuBarVisible = getWindowById(id)?.isMenuBarVisible() ?? null; + electronSocket.emit('browserWindow-isMenuBarVisible-completed' + id, isMenuBarVisible); }); socket.on('browserWindowSetVisibleOnAllWorkspaces', (id, visible) => { - getWindowById(id).setVisibleOnAllWorkspaces(visible); + getWindowById(id)?.setVisibleOnAllWorkspaces(visible); }); socket.on('browserWindowIsVisibleOnAllWorkspaces', (id) => { - const isVisibleOnAllWorkspaces = getWindowById(id).isVisibleOnAllWorkspaces(); - electronSocket.emit('browserWindow-isVisibleOnAllWorkspaces-completed', isVisibleOnAllWorkspaces); + const isVisibleOnAllWorkspaces = getWindowById(id)?.isVisibleOnAllWorkspaces() ?? null; + electronSocket.emit('browserWindow-isVisibleOnAllWorkspaces-completed' + id, isVisibleOnAllWorkspaces); }); socket.on('browserWindowSetIgnoreMouseEvents', (id, ignore) => { - getWindowById(id).setIgnoreMouseEvents(ignore); + getWindowById(id)?.setIgnoreMouseEvents(ignore); }); socket.on('browserWindowSetContentProtection', (id, enable) => { - getWindowById(id).setContentProtection(enable); + getWindowById(id)?.setContentProtection(enable); }); socket.on('browserWindowSetFocusable', (id, focusable) => { - getWindowById(id).setFocusable(focusable); + getWindowById(id)?.setFocusable(focusable); }); socket.on('browserWindowSetParentWindow', (id, parent) => { const browserWindow = electron_1.BrowserWindow.fromId(parent.id); - getWindowById(id).setParentWindow(browserWindow); + getWindowById(id)?.setParentWindow(browserWindow); }); socket.on('browserWindowGetParentWindow', (id) => { - const browserWindow = getWindowById(id).getParentWindow(); - electronSocket.emit('browserWindow-getParentWindow-completed', browserWindow.id); + const browserWindow = getWindowById(id)?.getParentWindow() ?? null; + electronSocket.emit('browserWindow-getParentWindow-completed' + id, browserWindow.id); }); socket.on('browserWindowGetChildWindows', (id) => { - const browserWindows = getWindowById(id).getChildWindows(); + const browserWindows = getWindowById(id)?.getChildWindows() ?? null; const ids = []; browserWindows.forEach(x => { ids.push(x.id); }); - electronSocket.emit('browserWindow-getChildWindows-completed', ids); + electronSocket.emit('browserWindow-getChildWindows-completed' + id, ids); }); socket.on('browserWindowSetAutoHideCursor', (id, autoHide) => { - getWindowById(id).setAutoHideCursor(autoHide); + getWindowById(id)?.setAutoHideCursor(autoHide); }); socket.on('browserWindowSetVibrancy', (id, type) => { - getWindowById(id).setVibrancy(type); + getWindowById(id)?.setVibrancy(type); }); socket.on('browserWindow-setBrowserView', (id, browserViewId) => { - getWindowById(id).setBrowserView(browserView_1.browserViewMediateService(browserViewId)); + getWindowById(id)?.setBrowserView(browserView_1.browserViewMediateService(browserViewId)); }); function getWindowById(id) { for (let index = 0; index < windows.length; index++) { @@ -605,6 +619,7 @@ module.exports = (socket, app) => { return element; } } + return null; } }; //# sourceMappingURL=browserWindows.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/browserWindows.ts b/ElectronNET.Host/api/browserWindows.ts index 6f086e2f..76f7ffbd 100644 --- a/ElectronNET.Host/api/browserWindows.ts +++ b/ElectronNET.Host/api/browserWindows.ts @@ -29,182 +29,182 @@ export = (socket: Socket, app: Electron.App) => { electronSocket.emit('browserWindow-ready-to-show' + id); } - getWindowById(id).on('ready-to-show', () => { + getWindowById(id)?.on('ready-to-show', () => { readyToShowWindowsIds.push(id); electronSocket.emit('browserWindow-ready-to-show' + id); }); }); socket.on('register-browserWindow-page-title-updated', (id) => { - getWindowById(id).on('page-title-updated', (event, title) => { + getWindowById(id)?.on('page-title-updated', (event, title) => { electronSocket.emit('browserWindow-page-title-updated' + id, title); }); }); socket.on('register-browserWindow-close', (id) => { - getWindowById(id).on('close', () => { + getWindowById(id)?.on('close', () => { electronSocket.emit('browserWindow-close' + id); }); }); socket.on('register-browserWindow-closed', (id) => { - getWindowById(id).on('closed', () => { + getWindowById(id)?.on('closed', () => { electronSocket.emit('browserWindow-closed' + id); }); }); socket.on('register-browserWindow-session-end', (id) => { - getWindowById(id).on('session-end', () => { + getWindowById(id)?.on('session-end', () => { electronSocket.emit('browserWindow-session-end' + id); }); }); socket.on('register-browserWindow-unresponsive', (id) => { - getWindowById(id).on('unresponsive', () => { + getWindowById(id)?.on('unresponsive', () => { electronSocket.emit('browserWindow-unresponsive' + id); }); }); socket.on('register-browserWindow-responsive', (id) => { - getWindowById(id).on('responsive', () => { + getWindowById(id)?.on('responsive', () => { electronSocket.emit('browserWindow-responsive' + id); }); }); socket.on('register-browserWindow-blur', (id) => { - getWindowById(id).on('blur', () => { + getWindowById(id)?.on('blur', () => { electronSocket.emit('browserWindow-blur' + id); }); }); socket.on('register-browserWindow-focus', (id) => { - getWindowById(id).on('focus', () => { + getWindowById(id)?.on('focus', () => { electronSocket.emit('browserWindow-focus' + id); }); }); socket.on('register-browserWindow-show', (id) => { - getWindowById(id).on('show', () => { + getWindowById(id)?.on('show', () => { electronSocket.emit('browserWindow-show' + id); }); }); socket.on('register-browserWindow-hide', (id) => { - getWindowById(id).on('hide', () => { + getWindowById(id)?.on('hide', () => { electronSocket.emit('browserWindow-hide' + id); }); }); socket.on('register-browserWindow-maximize', (id) => { - getWindowById(id).on('maximize', () => { + getWindowById(id)?.on('maximize', () => { electronSocket.emit('browserWindow-maximize' + id); }); }); socket.on('register-browserWindow-unmaximize', (id) => { - getWindowById(id).on('unmaximize', () => { + getWindowById(id)?.on('unmaximize', () => { electronSocket.emit('browserWindow-unmaximize' + id); }); }); socket.on('register-browserWindow-minimize', (id) => { - getWindowById(id).on('minimize', () => { + getWindowById(id)?.on('minimize', () => { electronSocket.emit('browserWindow-minimize' + id); }); }); socket.on('register-browserWindow-restore', (id) => { - getWindowById(id).on('restore', () => { + getWindowById(id)?.on('restore', () => { electronSocket.emit('browserWindow-restore' + id); }); }); socket.on('register-browserWindow-resize', (id) => { - getWindowById(id).on('resize', () => { + getWindowById(id)?.on('resize', () => { electronSocket.emit('browserWindow-resize' + id); }); }); socket.on('register-browserWindow-move', (id) => { - getWindowById(id).on('move', () => { + getWindowById(id)?.on('move', () => { electronSocket.emit('browserWindow-move' + id); }); }); socket.on('register-browserWindow-moved', (id) => { - getWindowById(id).on('moved', () => { + getWindowById(id)?.on('moved', () => { electronSocket.emit('browserWindow-moved' + id); }); }); socket.on('register-browserWindow-enter-full-screen', (id) => { - getWindowById(id).on('enter-full-screen', () => { + getWindowById(id)?.on('enter-full-screen', () => { electronSocket.emit('browserWindow-enter-full-screen' + id); }); }); socket.on('register-browserWindow-leave-full-screen', (id) => { - getWindowById(id).on('leave-full-screen', () => { + getWindowById(id)?.on('leave-full-screen', () => { electronSocket.emit('browserWindow-leave-full-screen' + id); }); }); socket.on('register-browserWindow-enter-html-full-screen', (id) => { - getWindowById(id).on('enter-html-full-screen', () => { + getWindowById(id)?.on('enter-html-full-screen', () => { electronSocket.emit('browserWindow-enter-html-full-screen' + id); }); }); socket.on('register-browserWindow-leave-html-full-screen', (id) => { - getWindowById(id).on('leave-html-full-screen', () => { + getWindowById(id)?.on('leave-html-full-screen', () => { electronSocket.emit('browserWindow-leave-html-full-screen' + id); }); }); socket.on('register-browserWindow-app-command', (id) => { - getWindowById(id).on('app-command', (event, command) => { + getWindowById(id)?.on('app-command', (event, command) => { electronSocket.emit('browserWindow-app-command' + id, command); }); }); socket.on('register-browserWindow-scroll-touch-begin', (id) => { - getWindowById(id).on('scroll-touch-begin', () => { + getWindowById(id)?.on('scroll-touch-begin', () => { electronSocket.emit('browserWindow-scroll-touch-begin' + id); }); }); socket.on('register-browserWindow-scroll-touch-end', (id) => { - getWindowById(id).on('scroll-touch-end', () => { + getWindowById(id)?.on('scroll-touch-end', () => { electronSocket.emit('browserWindow-scroll-touch-end' + id); }); }); socket.on('register-browserWindow-scroll-touch-edge', (id) => { - getWindowById(id).on('scroll-touch-edge', () => { + getWindowById(id)?.on('scroll-touch-edge', () => { electronSocket.emit('browserWindow-scroll-touch-edge' + id); }); }); socket.on('register-browserWindow-swipe', (id) => { - getWindowById(id).on('swipe', (event, direction) => { + getWindowById(id)?.on('swipe', (event, direction) => { electronSocket.emit('browserWindow-swipe' + id, direction); }); }); socket.on('register-browserWindow-sheet-begin', (id) => { - getWindowById(id).on('sheet-begin', () => { + getWindowById(id)?.on('sheet-begin', () => { electronSocket.emit('browserWindow-sheet-begin' + id); }); }); socket.on('register-browserWindow-sheet-end', (id) => { - getWindowById(id).on('sheet-end', () => { + getWindowById(id)?.on('sheet-end', () => { electronSocket.emit('browserWindow-sheet-end' + id); }); }); socket.on('register-browserWindow-new-window-for-tab', (id) => { - getWindowById(id).on('new-window-for-tab', () => { + getWindowById(id)?.on('new-window-for-tab', () => { electronSocket.emit('browserWindow-new-window-for-tab' + id); }); }); @@ -293,330 +293,334 @@ export = (socket: Socket, app: Electron.App) => { }); socket.on('browserWindowDestroy', (id) => { - getWindowById(id).destroy(); + getWindowById(id)?.destroy(); }); socket.on('browserWindowClose', (id) => { - getWindowById(id).close(); + getWindowById(id)?.close(); }); socket.on('browserWindowFocus', (id) => { - getWindowById(id).focus(); + getWindowById(id)?.focus(); }); socket.on('browserWindowBlur', (id) => { - getWindowById(id).blur(); + getWindowById(id)?.blur(); }); socket.on('browserWindowIsFocused', (id) => { - const isFocused = getWindowById(id).isFocused(); + const isFocused = getWindowById(id)?.isFocused() ?? null; - electronSocket.emit('browserWindow-isFocused-completed', isFocused); + electronSocket.emit('browserWindow-isFocused-completed' + id, isFocused); }); socket.on('browserWindowIsDestroyed', (id) => { - const isDestroyed = getWindowById(id).isDestroyed(); - - electronSocket.emit('browserWindow-isDestroyed-completed', isDestroyed); + const w = getWindowById(id); + if (w) { + const isDestroyed = w.isDestroyed(); + electronSocket.emit('browserWindow-isDestroyed-completed' + id, isDestroyed); + } else { + electronSocket.emit('browserWindow-isDestroyed-completed' + id, true); + } }); socket.on('browserWindowShow', (id) => { - getWindowById(id).show(); + getWindowById(id)?.show(); }); socket.on('browserWindowShowInactive', (id) => { - getWindowById(id).showInactive(); + getWindowById(id)?.showInactive(); }); socket.on('browserWindowHide', (id) => { - getWindowById(id).hide(); + getWindowById(id)?.hide(); }); socket.on('browserWindowIsVisible', (id) => { - const isVisible = getWindowById(id).isVisible(); + const isVisible = getWindowById(id)?.isVisible() ?? null; - electronSocket.emit('browserWindow-isVisible-completed', isVisible); + electronSocket.emit('browserWindow-isVisible-completed' + id, isVisible); }); socket.on('browserWindowIsModal', (id) => { - const isModal = getWindowById(id).isModal(); + const isModal = getWindowById(id)?.isModal() ?? null; - electronSocket.emit('browserWindow-isModal-completed', isModal); + electronSocket.emit('browserWindow-isModal-completed' + id, isModal); }); socket.on('browserWindowMaximize', (id) => { - getWindowById(id).maximize(); + getWindowById(id)?.maximize(); }); socket.on('browserWindowUnmaximize', (id) => { - getWindowById(id).unmaximize(); + getWindowById(id)?.unmaximize(); }); socket.on('browserWindowIsMaximized', (id) => { - const isMaximized = getWindowById(id).isMaximized(); + const isMaximized = getWindowById(id)?.isMaximized() ?? null; - electronSocket.emit('browserWindow-isMaximized-completed', isMaximized); + electronSocket.emit('browserWindow-isMaximized-completed' + id, isMaximized); }); socket.on('browserWindowMinimize', (id) => { - getWindowById(id).minimize(); + getWindowById(id)?.minimize(); }); socket.on('browserWindowRestore', (id) => { - getWindowById(id).restore(); + getWindowById(id)?.restore(); }); socket.on('browserWindowIsMinimized', (id) => { - const isMinimized = getWindowById(id).isMinimized(); + const isMinimized = getWindowById(id)?.isMinimized() ?? null; - electronSocket.emit('browserWindow-isMinimized-completed', isMinimized); + electronSocket.emit('browserWindow-isMinimized-completed' + id, isMinimized); }); socket.on('browserWindowSetFullScreen', (id, fullscreen) => { - getWindowById(id).setFullScreen(fullscreen); + getWindowById(id)?.setFullScreen(fullscreen); }); socket.on('browserWindowIsFullScreen', (id) => { - const isFullScreen = getWindowById(id).isFullScreen(); + const isFullScreen = getWindowById(id)?.isFullScreen() ?? null; - electronSocket.emit('browserWindow-isFullScreen-completed', isFullScreen); + electronSocket.emit('browserWindow-isFullScreen-completed' + id, isFullScreen); }); socket.on('browserWindowSetAspectRatio', (id, aspectRatio, extraSize) => { - getWindowById(id).setAspectRatio(aspectRatio, extraSize); + getWindowById(id)?.setAspectRatio(aspectRatio, extraSize); }); socket.on('browserWindowPreviewFile', (id, path, displayname) => { - getWindowById(id).previewFile(path, displayname); + getWindowById(id)?.previewFile(path, displayname); }); socket.on('browserWindowCloseFilePreview', (id) => { - getWindowById(id).closeFilePreview(); + getWindowById(id)?.closeFilePreview(); }); socket.on('browserWindowSetBounds', (id, bounds, animate) => { - getWindowById(id).setBounds(bounds, animate); + getWindowById(id)?.setBounds(bounds, animate); }); socket.on('browserWindowGetBounds', (id) => { - const rectangle = getWindowById(id).getBounds(); + const rectangle = getWindowById(id)?.getBounds() ?? null; - electronSocket.emit('browserWindow-getBounds-completed', rectangle); + electronSocket.emit('browserWindow-getBounds-completed' + id, rectangle); }); socket.on('browserWindowSetContentBounds', (id, bounds, animate) => { - getWindowById(id).setContentBounds(bounds, animate); + getWindowById(id)?.setContentBounds(bounds, animate); }); socket.on('browserWindowGetContentBounds', (id) => { - const rectangle = getWindowById(id).getContentBounds(); + const rectangle = getWindowById(id)?.getContentBounds() ?? null; - electronSocket.emit('browserWindow-getContentBounds-completed', rectangle); + electronSocket.emit('browserWindow-getContentBounds-completed' + id, rectangle); }); socket.on('browserWindowSetSize', (id, width, height, animate) => { - getWindowById(id).setSize(width, height, animate); + getWindowById(id)?.setSize(width, height, animate); }); socket.on('browserWindowGetSize', (id) => { - const size = getWindowById(id).getSize(); + const size = getWindowById(id)?.getSize() ?? null; - electronSocket.emit('browserWindow-getSize-completed', size); + electronSocket.emit('browserWindow-getSize-completed' + id, size); }); socket.on('browserWindowSetContentSize', (id, width, height, animate) => { - getWindowById(id).setContentSize(width, height, animate); + getWindowById(id)?.setContentSize(width, height, animate); }); socket.on('browserWindowGetContentSize', (id) => { - const size = getWindowById(id).getContentSize(); + const size = getWindowById(id)?.getContentSize() ?? null; - electronSocket.emit('browserWindow-getContentSize-completed', size); + electronSocket.emit('browserWindow-getContentSize-completed' + id, size); }); socket.on('browserWindowSetMinimumSize', (id, width, height) => { - getWindowById(id).setMinimumSize(width, height); + getWindowById(id)?.setMinimumSize(width, height); }); socket.on('browserWindowGetMinimumSize', (id) => { - const size = getWindowById(id).getMinimumSize(); + const size = getWindowById(id)?.getMinimumSize() ?? null; - electronSocket.emit('browserWindow-getMinimumSize-completed', size); + electronSocket.emit('browserWindow-getMinimumSize-completed' + id, size); }); socket.on('browserWindowSetMaximumSize', (id, width, height) => { - getWindowById(id).setMaximumSize(width, height); + getWindowById(id)?.setMaximumSize(width, height); }); socket.on('browserWindowGetMaximumSize', (id) => { - const size = getWindowById(id).getMaximumSize(); + const size = getWindowById(id)?.getMaximumSize() ?? null; - electronSocket.emit('browserWindow-getMaximumSize-completed', size); + electronSocket.emit('browserWindow-getMaximumSize-completed' + id, size); }); socket.on('browserWindowSetResizable', (id, resizable) => { - getWindowById(id).setResizable(resizable); + getWindowById(id)?.setResizable(resizable); }); socket.on('browserWindowIsResizable', (id) => { - const resizable = getWindowById(id).isResizable(); + const resizable = getWindowById(id)?.isResizable() ?? null; - electronSocket.emit('browserWindow-isResizable-completed', resizable); + electronSocket.emit('browserWindow-isResizable-completed' + id, resizable); }); socket.on('browserWindowSetMovable', (id, movable) => { - getWindowById(id).setMovable(movable); + getWindowById(id)?.setMovable(movable); }); socket.on('browserWindowIsMovable', (id) => { - const movable = getWindowById(id).isMovable(); + const movable = getWindowById(id)?.isMovable() ?? null; - electronSocket.emit('browserWindow-isMovable-completed', movable); + electronSocket.emit('browserWindow-isMovable-completed' + id, movable); }); socket.on('browserWindowSetMinimizable', (id, minimizable) => { - getWindowById(id).setMinimizable(minimizable); + getWindowById(id)?.setMinimizable(minimizable); }); socket.on('browserWindowIsMinimizable', (id) => { - const minimizable = getWindowById(id).isMinimizable(); + const minimizable = getWindowById(id)?.isMinimizable() ?? null; - electronSocket.emit('browserWindow-isMinimizable-completed', minimizable); + electronSocket.emit('browserWindow-isMinimizable-completed' + id, minimizable); }); socket.on('browserWindowSetMaximizable', (id, maximizable) => { - getWindowById(id).setMaximizable(maximizable); + getWindowById(id)?.setMaximizable(maximizable); }); socket.on('browserWindowIsMaximizable', (id) => { - const maximizable = getWindowById(id).isMaximizable(); + const maximizable = getWindowById(id)?.isMaximizable() ?? null; - electronSocket.emit('browserWindow-isMaximizable-completed', maximizable); + electronSocket.emit('browserWindow-isMaximizable-completed' + id, maximizable); }); socket.on('browserWindowSetFullScreenable', (id, fullscreenable) => { - getWindowById(id).setFullScreenable(fullscreenable); + getWindowById(id)?.setFullScreenable(fullscreenable); }); socket.on('browserWindowIsFullScreenable', (id) => { - const fullscreenable = getWindowById(id).isFullScreenable(); + const fullscreenable = getWindowById(id)?.isFullScreenable() ?? null; - electronSocket.emit('browserWindow-isFullScreenable-completed', fullscreenable); + electronSocket.emit('browserWindow-isFullScreenable-completed' + id, fullscreenable); }); socket.on('browserWindowSetClosable', (id, closable) => { - getWindowById(id).setClosable(closable); + getWindowById(id)?.setClosable(closable); }); socket.on('browserWindowIsClosable', (id) => { - const closable = getWindowById(id).isClosable(); + const closable = getWindowById(id)?.isClosable() ?? null; - electronSocket.emit('browserWindow-isClosable-completed', closable); + electronSocket.emit('browserWindow-isClosable-completed' + id, closable); }); socket.on('browserWindowSetAlwaysOnTop', (id, flag, level, relativeLevel) => { - getWindowById(id).setAlwaysOnTop(flag, level, relativeLevel); + getWindowById(id)?.setAlwaysOnTop(flag, level, relativeLevel); }); socket.on('browserWindowIsAlwaysOnTop', (id) => { - const isAlwaysOnTop = getWindowById(id).isAlwaysOnTop(); + const isAlwaysOnTop = getWindowById(id)?.isAlwaysOnTop() ?? null; - electronSocket.emit('browserWindow-isAlwaysOnTop-completed', isAlwaysOnTop); + electronSocket.emit('browserWindow-isAlwaysOnTop-completed' + id, isAlwaysOnTop); }); socket.on('browserWindowCenter', (id) => { - getWindowById(id).center(); + getWindowById(id)?.center(); }); socket.on('browserWindowSetPosition', (id, x, y, animate) => { - getWindowById(id).setPosition(x, y, animate); + getWindowById(id)?.setPosition(x, y, animate); }); socket.on('browserWindowGetPosition', (id) => { - const position = getWindowById(id).getPosition(); + const position = getWindowById(id)?.getPosition() ?? null; - electronSocket.emit('browserWindow-getPosition-completed', position); + electronSocket.emit('browserWindow-getPosition-completed' + id, position); }); socket.on('browserWindowSetTitle', (id, title) => { - getWindowById(id).setTitle(title); + getWindowById(id)?.setTitle(title); }); socket.on('browserWindowGetTitle', (id) => { - const title = getWindowById(id).getTitle(); + const title = getWindowById(id)?.getTitle() ?? null; - electronSocket.emit('browserWindow-getTitle-completed', title); + electronSocket.emit('browserWindow-getTitle-completed' + id, title); }); socket.on('browserWindowSetTitle', (id, title) => { - getWindowById(id).setTitle(title); + getWindowById(id)?.setTitle(title); }); socket.on('browserWindowSetSheetOffset', (id, offsetY, offsetX) => { if (offsetX) { - getWindowById(id).setSheetOffset(offsetY, offsetX); + getWindowById(id)?.setSheetOffset(offsetY, offsetX); } else { - getWindowById(id).setSheetOffset(offsetY); + getWindowById(id)?.setSheetOffset(offsetY); } }); socket.on('browserWindowFlashFrame', (id, flag) => { - getWindowById(id).flashFrame(flag); + getWindowById(id)?.flashFrame(flag); }); socket.on('browserWindowSetSkipTaskbar', (id, skip) => { - getWindowById(id).setSkipTaskbar(skip); + getWindowById(id)?.setSkipTaskbar(skip); }); socket.on('browserWindowSetKiosk', (id, flag) => { - getWindowById(id).setKiosk(flag); + getWindowById(id)?.setKiosk(flag); }); socket.on('browserWindowIsKiosk', (id) => { - const isKiosk = getWindowById(id).isKiosk(); + const isKiosk = getWindowById(id)?.isKiosk() ?? null; - electronSocket.emit('browserWindow-isKiosk-completed', isKiosk); + electronSocket.emit('browserWindow-isKiosk-completed' + id, isKiosk); }); socket.on('browserWindowGetNativeWindowHandle', (id) => { - const nativeWindowHandle = getWindowById(id).getNativeWindowHandle().readInt32LE(0).toString(16); - electronSocket.emit('browserWindow-getNativeWindowHandle-completed', nativeWindowHandle); + const nativeWindowHandle = getWindowById(id)?.getNativeWindowHandle()?.readInt32LE(0)?.toString(16) ?? null; + electronSocket.emit('browserWindow-getNativeWindowHandle-completed' + id, nativeWindowHandle); }); socket.on('browserWindowSetRepresentedFilename', (id, filename) => { - getWindowById(id).setRepresentedFilename(filename); + getWindowById(id)?.setRepresentedFilename(filename); }); socket.on('browserWindowGetRepresentedFilename', (id) => { - const pathname = getWindowById(id).getRepresentedFilename(); + const pathname = getWindowById(id)?.getRepresentedFilename() ?? null; - electronSocket.emit('browserWindow-getRepresentedFilename-completed', pathname); + electronSocket.emit('browserWindow-getRepresentedFilename-completed' + id, pathname); }); socket.on('browserWindowSetDocumentEdited', (id, edited) => { - getWindowById(id).setDocumentEdited(edited); + getWindowById(id)?.setDocumentEdited(edited); }); socket.on('browserWindowIsDocumentEdited', (id) => { - const edited = getWindowById(id).isDocumentEdited(); + const edited = getWindowById(id)?.isDocumentEdited() ?? null; - electronSocket.emit('browserWindow-isDocumentEdited-completed', edited); + electronSocket.emit('browserWindow-isDocumentEdited-completed' + id, edited); }); socket.on('browserWindowFocusOnWebView', (id) => { - getWindowById(id).focusOnWebView(); + getWindowById(id)?.focusOnWebView(); }); socket.on('browserWindowBlurWebView', (id) => { - getWindowById(id).blurWebView(); + getWindowById(id)?.blurWebView(); }); socket.on('browserWindowLoadURL', (id, url, options) => { - getWindowById(id).loadURL(url, options); + getWindowById(id)?.loadURL(url, options); }); socket.on('browserWindowReload', (id) => { - getWindowById(id).reload(); + getWindowById(id)?.reload(); }); socket.on('browserWindowSetMenu', (id, menuItems) => { @@ -630,11 +634,11 @@ export = (socket: Socket, app: Electron.App) => { }); } - getWindowById(id).setMenu(menu); + getWindowById(id)?.setMenu(menu); }); socket.on('browserWindowRemoveMenu', (id) => { - getWindowById(id).removeMenu(); + getWindowById(id)?.removeMenu(); }); function addMenuItemClickConnector(menuItems, callback) { @@ -650,21 +654,21 @@ export = (socket: Socket, app: Electron.App) => { } socket.on('browserWindowSetProgressBar', (id, progress) => { - getWindowById(id).setProgressBar(progress); + getWindowById(id)?.setProgressBar(progress); }); socket.on('browserWindowSetProgressBar', (id, progress, options) => { - getWindowById(id).setProgressBar(progress, options); + getWindowById(id)?.setProgressBar(progress, options); }); socket.on('browserWindowSetHasShadow', (id, hasShadow) => { - getWindowById(id).setHasShadow(hasShadow); + getWindowById(id)?.setHasShadow(hasShadow); }); socket.on('browserWindowHasShadow', (id) => { - const hasShadow = getWindowById(id).hasShadow(); + const hasShadow = getWindowById(id)?.hasShadow() ?? null; - electronSocket.emit('browserWindow-hasShadow-completed', hasShadow); + electronSocket.emit('browserWindow-hasShadow-completed' + id, hasShadow); }); socket.on('browserWindowSetThumbarButtons', (id, thumbarButtons: Electron.ThumbarButton[]) => { @@ -676,82 +680,82 @@ export = (socket: Socket, app: Electron.App) => { }; }); - const success = getWindowById(id).setThumbarButtons(thumbarButtons); - electronSocket.emit('browserWindowSetThumbarButtons-completed', success); + const success = getWindowById(id)?.setThumbarButtons(thumbarButtons) ?? null; + electronSocket.emit('browserWindowSetThumbarButtons-completed' + id, success); }); socket.on('browserWindowSetThumbnailClip', (id, rectangle) => { - getWindowById(id).setThumbnailClip(rectangle); + getWindowById(id)?.setThumbnailClip(rectangle); }); socket.on('browserWindowSetThumbnailToolTip', (id, toolTip) => { - getWindowById(id).setThumbnailToolTip(toolTip); + getWindowById(id)?.setThumbnailToolTip(toolTip); }); socket.on('browserWindowSetAppDetails', (id, options) => { - getWindowById(id).setAppDetails(options); + getWindowById(id)?.setAppDetails(options); }); socket.on('browserWindowShowDefinitionForSelection', (id) => { - getWindowById(id).showDefinitionForSelection(); + getWindowById(id)?.showDefinitionForSelection(); }); socket.on('browserWindowSetAutoHideMenuBar', (id, hide) => { - getWindowById(id).setAutoHideMenuBar(hide); + getWindowById(id)?.setAutoHideMenuBar(hide); }); socket.on('browserWindowIsMenuBarAutoHide', (id) => { - const isMenuBarAutoHide = getWindowById(id).isMenuBarAutoHide(); + const isMenuBarAutoHide = getWindowById(id)?.isMenuBarAutoHide() ?? null; - electronSocket.emit('browserWindow-isMenuBarAutoHide-completed', isMenuBarAutoHide); + electronSocket.emit('browserWindow-isMenuBarAutoHide-completed' + id, isMenuBarAutoHide); }); socket.on('browserWindowSetMenuBarVisibility', (id, visible) => { - getWindowById(id).setMenuBarVisibility(visible); + getWindowById(id)?.setMenuBarVisibility(visible); }); socket.on('browserWindowIsMenuBarVisible', (id) => { - const isMenuBarVisible = getWindowById(id).isMenuBarVisible(); + const isMenuBarVisible = getWindowById(id)?.isMenuBarVisible() ?? null; - electronSocket.emit('browserWindow-isMenuBarVisible-completed', isMenuBarVisible); + electronSocket.emit('browserWindow-isMenuBarVisible-completed' + id, isMenuBarVisible); }); socket.on('browserWindowSetVisibleOnAllWorkspaces', (id, visible) => { - getWindowById(id).setVisibleOnAllWorkspaces(visible); + getWindowById(id)?.setVisibleOnAllWorkspaces(visible); }); socket.on('browserWindowIsVisibleOnAllWorkspaces', (id) => { - const isVisibleOnAllWorkspaces = getWindowById(id).isVisibleOnAllWorkspaces(); + const isVisibleOnAllWorkspaces = getWindowById(id)?.isVisibleOnAllWorkspaces() ?? null; - electronSocket.emit('browserWindow-isVisibleOnAllWorkspaces-completed', isVisibleOnAllWorkspaces); + electronSocket.emit('browserWindow-isVisibleOnAllWorkspaces-completed' + id, isVisibleOnAllWorkspaces); }); socket.on('browserWindowSetIgnoreMouseEvents', (id, ignore) => { - getWindowById(id).setIgnoreMouseEvents(ignore); + getWindowById(id)?.setIgnoreMouseEvents(ignore); }); socket.on('browserWindowSetContentProtection', (id, enable) => { - getWindowById(id).setContentProtection(enable); + getWindowById(id)?.setContentProtection(enable); }); socket.on('browserWindowSetFocusable', (id, focusable) => { - getWindowById(id).setFocusable(focusable); + getWindowById(id)?.setFocusable(focusable); }); socket.on('browserWindowSetParentWindow', (id, parent) => { const browserWindow = BrowserWindow.fromId(parent.id); - getWindowById(id).setParentWindow(browserWindow); + getWindowById(id)?.setParentWindow(browserWindow); }); socket.on('browserWindowGetParentWindow', (id) => { - const browserWindow = getWindowById(id).getParentWindow(); + const browserWindow = getWindowById(id)?.getParentWindow() ?? null; - electronSocket.emit('browserWindow-getParentWindow-completed', browserWindow.id); + electronSocket.emit('browserWindow-getParentWindow-completed' + id, browserWindow.id); }); socket.on('browserWindowGetChildWindows', (id) => { - const browserWindows = getWindowById(id).getChildWindows(); + const browserWindows = getWindowById(id)?.getChildWindows() ?? null; const ids = []; @@ -759,19 +763,19 @@ export = (socket: Socket, app: Electron.App) => { ids.push(x.id); }); - electronSocket.emit('browserWindow-getChildWindows-completed', ids); + electronSocket.emit('browserWindow-getChildWindows-completed' + id, ids); }); socket.on('browserWindowSetAutoHideCursor', (id, autoHide) => { - getWindowById(id).setAutoHideCursor(autoHide); + getWindowById(id)?.setAutoHideCursor(autoHide); }); socket.on('browserWindowSetVibrancy', (id, type) => { - getWindowById(id).setVibrancy(type); + getWindowById(id)?.setVibrancy(type); }); socket.on('browserWindow-setBrowserView', (id, browserViewId) => { - getWindowById(id).setBrowserView(browserViewMediateService(browserViewId)); + getWindowById(id)?.setBrowserView(browserViewMediateService(browserViewId)); }); function getWindowById(id: number): Electron.BrowserWindow { @@ -781,5 +785,6 @@ export = (socket: Socket, app: Electron.App) => { return element; } } + return null; } }; diff --git a/ElectronNET.Host/api/dialog.js b/ElectronNET.Host/api/dialog.js index 20f9572f..5234bcb1 100644 --- a/ElectronNET.Host/api/dialog.js +++ b/ElectronNET.Host/api/dialog.js @@ -7,12 +7,12 @@ module.exports = (socket) => { if ('id' in browserWindow) { const window = electron_1.BrowserWindow.fromId(browserWindow.id); const messageBoxReturnValue = await electron_1.dialog.showMessageBox(window, options); - electronSocket.emit('showMessageBoxComplete' + guid, [messageBoxReturnValue.response, messageBoxReturnValue.checkboxChecked]); + electronSocket.emit('showMessageBoxComplete' + guid, { response: messageBoxReturnValue.response, checked: messageBoxReturnValue.checkboxChecked }); } else { const id = guid || options; const messageBoxReturnValue = await electron_1.dialog.showMessageBox(browserWindow); - electronSocket.emit('showMessageBoxComplete' + id, [messageBoxReturnValue.response, messageBoxReturnValue.checkboxChecked]); + electronSocket.emit('showMessageBoxComplete' + id, { response: messageBoxReturnValue.response, checked: messageBoxReturnValue.checkboxChecked }); } }); socket.on('showOpenDialog', async (browserWindow, options, guid) => { diff --git a/ElectronNET.Host/api/dialog.ts b/ElectronNET.Host/api/dialog.ts index 932c5fdc..095f7b49 100644 --- a/ElectronNET.Host/api/dialog.ts +++ b/ElectronNET.Host/api/dialog.ts @@ -9,12 +9,12 @@ export = (socket: Socket) => { const window = BrowserWindow.fromId(browserWindow.id); const messageBoxReturnValue = await dialog.showMessageBox(window, options); - electronSocket.emit('showMessageBoxComplete' + guid, [messageBoxReturnValue.response, messageBoxReturnValue.checkboxChecked]); + electronSocket.emit('showMessageBoxComplete' + guid, { response: messageBoxReturnValue.response, checked: messageBoxReturnValue.checkboxChecked }); } else { const id = guid || options; const messageBoxReturnValue = await dialog.showMessageBox(browserWindow); - electronSocket.emit('showMessageBoxComplete' + id, [messageBoxReturnValue.response, messageBoxReturnValue.checkboxChecked]); + electronSocket.emit('showMessageBoxComplete' + id, { response: messageBoxReturnValue.response, checked: messageBoxReturnValue.checkboxChecked }); } }); diff --git a/ElectronNET.Host/api/menu.js b/ElectronNET.Host/api/menu.js index 2500036f..28fac07e 100644 --- a/ElectronNET.Host/api/menu.js +++ b/ElectronNET.Host/api/menu.js @@ -7,7 +7,7 @@ module.exports = (socket) => { socket.on('menu-setContextMenu', (browserWindowId, menuItems) => { const menu = electron_1.Menu.buildFromTemplate(menuItems); addContextMenuItemClickConnector(menu.items, browserWindowId, (id, windowId) => { - electronSocket.emit('contextMenuItemClicked', [id, windowId]); + electronSocket.emit('contextMenuItemClicked', { id: id, windowId: windowId }); }); const index = contextMenuItems.findIndex(contextMenu => contextMenu.browserWindowId === browserWindowId); const contextMenuItem = { diff --git a/ElectronNET.Host/api/menu.ts b/ElectronNET.Host/api/menu.ts index efadf31d..4385ab0c 100644 --- a/ElectronNET.Host/api/menu.ts +++ b/ElectronNET.Host/api/menu.ts @@ -9,7 +9,7 @@ export = (socket: Socket) => { const menu = Menu.buildFromTemplate(menuItems); addContextMenuItemClickConnector(menu.items, browserWindowId, (id, windowId) => { - electronSocket.emit('contextMenuItemClicked', [id, windowId]); + electronSocket.emit('contextMenuItemClicked', { id: id, windowId: windowId }); }); const index = contextMenuItems.findIndex(contextMenu => contextMenu.browserWindowId === browserWindowId); diff --git a/ElectronNET.Host/api/screen.js b/ElectronNET.Host/api/screen.js index cfd025a3..37a6f2a3 100644 --- a/ElectronNET.Host/api/screen.js +++ b/ElectronNET.Host/api/screen.js @@ -15,7 +15,7 @@ module.exports = (socket) => { }); socket.on('register-screen-display-metrics-changed', (id) => { electron_1.screen.on('display-metrics-changed', (event, display, changedMetrics) => { - electronSocket.emit('screen-display-metrics-changed-event' + id, [display, changedMetrics]); + electronSocket.emit('screen-display-metrics-changed-event' + id, {display: display, changedMetrics: changedMetrics}); }); }); socket.on('screen-getCursorScreenPoint', () => { diff --git a/ElectronNET.Host/api/screen.ts b/ElectronNET.Host/api/screen.ts index 3a8b91cc..4ee61499 100644 --- a/ElectronNET.Host/api/screen.ts +++ b/ElectronNET.Host/api/screen.ts @@ -18,7 +18,7 @@ export = (socket: Socket) => { socket.on('register-screen-display-metrics-changed', (id) => { screen.on('display-metrics-changed', (event, display, changedMetrics) => { - electronSocket.emit('screen-display-metrics-changed-event' + id, [display, changedMetrics]); + electronSocket.emit('screen-display-metrics-changed-event' + id, { display: display, changedMetrics: changedMetrics }); }); }); diff --git a/ElectronNET.Host/api/tray.js b/ElectronNET.Host/api/tray.js index 98fb740c..0f3a9c97 100644 --- a/ElectronNET.Host/api/tray.js +++ b/ElectronNET.Host/api/tray.js @@ -7,21 +7,21 @@ module.exports = (socket) => { socket.on('register-tray-click', (id) => { if (tray.value) { tray.value.on('click', (event, bounds) => { - electronSocket.emit('tray-click-event' + id, [event.__proto__, bounds]); + electronSocket.emit('tray-click-event' + id, { eventArgs: event.__proto__, bounds: bounds }); }); } }); socket.on('register-tray-right-click', (id) => { if (tray.value) { tray.value.on('right-click', (event, bounds) => { - electronSocket.emit('tray-right-click-event' + id, [event.__proto__, bounds]); + electronSocket.emit('tray-right-click-event' + id, { eventArgs: event.__proto__, bounds: bounds }); }); } }); socket.on('register-tray-double-click', (id) => { if (tray.value) { tray.value.on('double-click', (event, bounds) => { - electronSocket.emit('tray-double-click-event' + id, [event.__proto__, bounds]); + electronSocket.emit('tray-double-click-event' + id, { eventArgs: event.__proto__, bounds: bounds }); }); } }); diff --git a/ElectronNET.Host/api/tray.ts b/ElectronNET.Host/api/tray.ts index af9f6cf2..0c113d28 100644 --- a/ElectronNET.Host/api/tray.ts +++ b/ElectronNET.Host/api/tray.ts @@ -8,7 +8,7 @@ export = (socket: Socket) => { socket.on('register-tray-click', (id) => { if (tray.value) { tray.value.on('click', (event, bounds) => { - electronSocket.emit('tray-click-event' + id, [(event).__proto__, bounds]); + electronSocket.emit('tray-click-event' + id, {eventArgs: (event).__proto__, bounds: bounds }); }); } }); @@ -16,7 +16,7 @@ export = (socket: Socket) => { socket.on('register-tray-right-click', (id) => { if (tray.value) { tray.value.on('right-click', (event, bounds) => { - electronSocket.emit('tray-right-click-event' + id, [(event).__proto__, bounds]); + electronSocket.emit('tray-right-click-event' + id, { eventArgs: (event).__proto__, bounds: bounds }); }); } }); @@ -24,7 +24,7 @@ export = (socket: Socket) => { socket.on('register-tray-double-click', (id) => { if (tray.value) { tray.value.on('double-click', (event, bounds) => { - electronSocket.emit('tray-double-click-event' + id, [(event).__proto__, bounds]); + electronSocket.emit('tray-double-click-event' + id, { eventArgs: (event).__proto__, bounds: bounds }); }); } }); diff --git a/ElectronNET.Host/api/webContents.js b/ElectronNET.Host/api/webContents.js index 71829a81..334e7739 100644 --- a/ElectronNET.Host/api/webContents.js +++ b/ElectronNET.Host/api/webContents.js @@ -29,20 +29,20 @@ module.exports = (socket) => { }); socket.on('webContents-getPrinters', async (id) => { const printers = await getWindowById(id).webContents.getPrinters(); - electronSocket.emit('webContents-getPrinters-completed', printers); + electronSocket.emit('webContents-getPrinters-completed' + Id, printers); }); socket.on('webContents-print', async (id, options = {}) => { await getWindowById(id).webContents.print(options); - electronSocket.emit('webContents-print-completed', true); + electronSocket.emit('webContents-print-completed' + Id, true); }); socket.on('webContents-printToPDF', async (id, options = {}, path) => { const buffer = await getWindowById(id).webContents.printToPDF(options); fs.writeFile(path, buffer, (error) => { if (error) { - electronSocket.emit('webContents-printToPDF-completed', false); + electronSocket.emit('webContents-printToPDF-completed' + Id, false); } else { - electronSocket.emit('webContents-printToPDF-completed', true); + electronSocket.emit('webContents-printToPDF-completed' + Id, true); } }); }); @@ -141,7 +141,7 @@ module.exports = (socket) => { const browserWindow = getWindowById(id); browserWindow.webContents.session.cookies.removeAllListeners('changed'); browserWindow.webContents.session.cookies.on('changed', (event, cookie, cause, removed) => { - electronSocket.emit('webContents-session-cookies-changed' + id, [cookie, cause, removed]); + electronSocket.emit('webContents-session-cookies-changed' + id, { cookie: cookie, cause: cause, removed: removed }); }); }); socket.on('webContents-session-cookies-get', async (id, filter, guid) => { @@ -201,7 +201,7 @@ module.exports = (socket) => { Object.keys(extensionsList).forEach(key => { chromeExtensionInfo.push(extensionsList[key]); }); - electronSocket.emit('webContents-session-getAllExtensions-completed', chromeExtensionInfo); + electronSocket.emit('webContents-session-getAllExtensions-completed' + Id, chromeExtensionInfo); }); socket.on('webContents-session-removeExtension', (id, name) => { const browserWindow = getWindowById(id); @@ -210,7 +210,7 @@ module.exports = (socket) => { socket.on('webContents-session-loadExtension', async (id, path, allowFileAccess = false) => { const browserWindow = getWindowById(id); const extension = await browserWindow.webContents.session.loadExtension(path, { allowFileAccess: allowFileAccess }); - electronSocket.emit('webContents-session-loadExtension-completed', extension); + electronSocket.emit('webContents-session-loadExtension-completed' + Id, extension); }); function getWindowById(id) { if (id >= 1000) { diff --git a/ElectronNET.Host/api/webContents.ts b/ElectronNET.Host/api/webContents.ts index dfb4df30..516e235a 100644 --- a/ElectronNET.Host/api/webContents.ts +++ b/ElectronNET.Host/api/webContents.ts @@ -34,12 +34,12 @@ export = (socket: Socket) => { socket.on('webContents-getPrinters', async (id) => { const printers = await getWindowById(id).webContents.getPrinters(); - electronSocket.emit('webContents-getPrinters-completed', printers); + electronSocket.emit('webContents-getPrinters-completed' + Id, printers); }); socket.on('webContents-print', async (id, options = {}) => { await getWindowById(id).webContents.print(options); - electronSocket.emit('webContents-print-completed', true); + electronSocket.emit('webContents-print-completed' + Id, true); }); socket.on('webContents-printToPDF', async (id, options = {}, path) => { @@ -47,9 +47,9 @@ export = (socket: Socket) => { fs.writeFile(path, buffer, (error) => { if (error) { - electronSocket.emit('webContents-printToPDF-completed', false); + electronSocket.emit('webContents-printToPDF-completed' + Id, false); } else { - electronSocket.emit('webContents-printToPDF-completed', true); + electronSocket.emit('webContents-printToPDF-completed' + Id, true); } }); }); @@ -181,7 +181,7 @@ export = (socket: Socket) => { browserWindow.webContents.session.cookies.removeAllListeners('changed'); browserWindow.webContents.session.cookies.on('changed', (event, cookie, cause, removed) => { - electronSocket.emit('webContents-session-cookies-changed' + id, [cookie, cause, removed]); + electronSocket.emit('webContents-session-cookies-changed' + id, { cookie: cookie, cause: cause, removed: removed }); }); }); @@ -253,7 +253,7 @@ export = (socket: Socket) => { chromeExtensionInfo.push(extensionsList[key]); }); - electronSocket.emit('webContents-session-getAllExtensions-completed', chromeExtensionInfo); + electronSocket.emit('webContents-session-getAllExtensions-completed' + Id, chromeExtensionInfo); }); socket.on('webContents-session-removeExtension', (id, name) => { @@ -265,7 +265,7 @@ export = (socket: Socket) => { const browserWindow = getWindowById(id); const extension = await browserWindow.webContents.session.loadExtension(path, { allowFileAccess: allowFileAccess }); - electronSocket.emit('webContents-session-loadExtension-completed', extension); + electronSocket.emit('webContents-session-loadExtension-completed' + Id, extension); }); function getWindowById(id: number): Electron.BrowserWindow | Electron.BrowserView { diff --git a/ElectronNET.Host/main.js b/ElectronNET.Host/main.js index e22097df..12297d1f 100644 --- a/ElectronNET.Host/main.js +++ b/ElectronNET.Host/main.js @@ -5,6 +5,7 @@ const path = require('path'); const cProcess = require('child_process').spawn; const portscanner = require('portscanner'); const { imageSize } = require('image-size'); + let io, server, browserWindows, ipc, apiProcess, loadURL; let appApi, menu, dialogApi, notification, tray, webContents; let globalShortcut, shellApi, screen, clipboard, autoUpdater; @@ -101,7 +102,16 @@ app.on('ready', () => { app.on('quit', async (event, exitCode) => { await server.close(); - apiProcess.kill(); + + var detachedProcess = false; + + if (manifestJsonFile.hasOwnProperty('detachedProcess')) { + detachedProcess = manifestJsonFile.detachedProcess; + } + + if (!detachedProcess) { + apiProcess.kill(); + } }); function isSplashScreenEnabled() { @@ -118,7 +128,7 @@ function startSplashScreen() { let imageFile = path.join(currentBinPath, manifestJsonFile.splashscreen.imageFile); imageSize(imageFile, (error, dimensions) => { if (error) { - console.log(`load splashscreen error:`); + console.log('load splashscreen error:'); console.error(error); throw new Error(error.message); @@ -136,13 +146,28 @@ function startSplashScreen() { alwaysOnTop: true, show: true }); + + if (manifestJsonFile.hasOwnProperty('splashscreen')) { + if (manifestJsonFile.splashscreen.hasOwnProperty('timeout')) { + var timeout = manifestJsonFile.splashscreen.timeout; + setTimeout((t) => { + if (splashScreen) { + splashScreen.hide(); + } + }, timeout); + } + } + + splashScreen.setIgnoreMouseEvents(true); app.once('browser-window-created', () => { splashScreen.destroy(); + splashScreen = null; }); const loadSplashscreenUrl = path.join(__dirname, 'splashscreen', 'index.html') + '?imgPath=' + imageFile; + splashScreen.loadURL('file://' + loadSplashscreenUrl); splashScreen.once('closed', () => { @@ -246,6 +271,14 @@ function startSocketApiBridge(port) { } }); + socket.on('console-stdout', (data) => { + console.log(`stdout: ${data.toString()}`); + }); + + socket.on('console-stderr', (data) => { + console.log(`stderr: ${data.toString()}`); + }); + try { const hostHookScriptFilePath = path.join(__dirname, 'ElectronHostHook', 'index.js'); @@ -281,7 +314,7 @@ function startAspCoreBackend(electronPort) { function startBackend(aspCoreBackendPort) { console.log('ASP.NET Core Port: ' + aspCoreBackendPort); loadURL = `http://localhost:${aspCoreBackendPort}`; - const parameters = [getEnvironmentParameter(), `/electronPort=${electronPort}`, `/electronWebPort=${aspCoreBackendPort}`]; + const parameters = [getEnvironmentParameter(), `/electronPort=${electronPort}`, `/electronWebPort=${aspCoreBackendPort}`, `/electronPID=${process.pid}`]; let binaryFile = manifestJsonFile.executable; const os = require('os'); @@ -289,13 +322,45 @@ function startAspCoreBackend(electronPort) { binaryFile = binaryFile + '.exe'; } + var detachedProcess = false; + var stdioopt = 'pipe'; + + if (manifestJsonFile.hasOwnProperty('detachedProcess')) { + detachedProcess = manifestJsonFile.detachedProcess; + if (detachedProcess) { + stdioopt = 'ignore'; + } + } + let binFilePath = path.join(currentBinPath, binaryFile); - var options = { cwd: currentBinPath }; + + var options = { cwd: currentBinPath, detached: detachedProcess, stdio: stdioopt }; + apiProcess = cProcess(binFilePath, parameters, options); - apiProcess.stdout.on('data', (data) => { - console.log(`stdout: ${data.toString()}`); + if (!detachedProcess) { + apiProcess.stdout.on('data', (data) => { + console.log(`stdout: ${data.toString()}`); + }); + + apiProcess.stderr.on('data', (data) => { + console.log(`stderr: ${data.toString()}`); + }); + } + + apiProcess.on('close', (code) => { + console.log(`ASP.NET Process exited with code ${code}`); + if (code != 0) { + console.log(`Will quit Electron, as exit code != 0 (got ${code})`); + app.exit(code); + } }); + + if (detachedProcess) { + console.log('Detached from ASP.NET process'); + apiProcess.unref(); + } + apiProcess.stderr.on('data', (data) => { console.log(`stderr: ${data.toString()}`); }); @@ -315,17 +380,45 @@ function startAspCoreBackendWithWatch(electronPort) { function startBackend(aspCoreBackendPort) { console.log('ASP.NET Core Watch Port: ' + aspCoreBackendPort); loadURL = `http://localhost:${aspCoreBackendPort}`; - const parameters = ['watch', 'run', getEnvironmentParameter(), `/electronPort=${electronPort}`, `/electronWebPort=${aspCoreBackendPort}`]; + const parameters = ['watch', 'run', getEnvironmentParameter(), `/electronPort=${electronPort}`, `/electronWebPort=${aspCoreBackendPort}`, `/electronPID=${process.pid}`]; + + var detachedProcess = false; + var stdioopt = 'pipe'; + + if (manifestJsonFile.hasOwnProperty('detachedProcess')) { + detachedProcess = manifestJsonFile.detachedProcess; + if (detachedProcess) { + stdioopt = 'ignore'; + } + } + + var options = { cwd: currentBinPath, env: process.env, detached: detachedProcess, stdio: stdioopt }; - var options = { - cwd: currentBinPath, - env: process.env, - }; apiProcess = cProcess('dotnet', parameters, options); - apiProcess.stdout.on('data', (data) => { - console.log(`stdout: ${data.toString()}`); + if (!detachedProcess) { + apiProcess.stdout.on('data', (data) => { + console.log(`stdout: ${data.toString()}`); + }); + + apiProcess.stderr.on('data', (data) => { + console.log(`stderr: ${data.toString()}`); + }); + } + + apiProcess.on('close', (code) => { + console.log(`ASP.NET Process exited with code ${code}`); + if (code != 0) { + console.log(`Will quit Electron, as exit code != 0 (got ${code})`); + app.exit(code); + } }); + + if (detachedProcess) { + console.log('Detached from ASP.NET process'); + apiProcess.unref(); + } + apiProcess.stderr.on('data', (data) => { console.log(`stderr: ${data.toString()}`); }); diff --git a/ElectronNET.WebApp/ElectronNET.WebApp.csproj b/ElectronNET.WebApp/ElectronNET.WebApp.csproj index 4b7e2319..e9fe1c20 100644 --- a/ElectronNET.WebApp/ElectronNET.WebApp.csproj +++ b/ElectronNET.WebApp/ElectronNET.WebApp.csproj @@ -1,8 +1,6 @@  net5.0 - OutOfProcess - AspNetCoreModule win-x64 4.2 @@ -17,6 +15,7 @@ + diff --git a/ElectronNET.WebApp/Program.cs b/ElectronNET.WebApp/Program.cs index 6a32e60d..56ad267d 100644 --- a/ElectronNET.WebApp/Program.cs +++ b/ElectronNET.WebApp/Program.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; +using System.Diagnostics; namespace ElectronNET.WebApp { @@ -9,6 +10,12 @@ public class Program { public static void Main(string[] args) { + +#if DEBUG + //Uncomment this line to automatically attach the Debugger on launch. This should only be used in development + //Debugger.Launch(); +#endif + CreateWebHostBuilder(args).Build().Run(); } diff --git a/ElectronNET.WebApp/Properties/launchSettings.json b/ElectronNET.WebApp/Properties/launchSettings.json index 7ea18a5d..d5111d5d 100644 --- a/ElectronNET.WebApp/Properties/launchSettings.json +++ b/ElectronNET.WebApp/Properties/launchSettings.json @@ -1,32 +1,10 @@ { - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:50394/", - "sslPort": 0 - } - }, "profiles": { "Electron.NET App": { "commandName": "Executable", - "executablePath": "$(SolutionDir)ElectronNET.CLI\\bin\\Debug\\netcoreapp3.1\\dotnet-electronize.exe", + "executablePath": "$(SolutionDir)ElectronNET.CLI\\bin\\Debug\\net5.0\\dotnet-electronize.exe", "commandLineArgs": "start", "workingDirectory": "$(SolutionDir)ElectronNET.WebApp" - }, - "IIS Express": { - "commandName": "IISExpress", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "ElectronNET.WebApp": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:50395/" } } } \ No newline at end of file diff --git a/ElectronNET.sln b/ElectronNET.sln index eb37b676..08a1a850 100644 --- a/ElectronNET.sln +++ b/ElectronNET.sln @@ -1,9 +1,11 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2027 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31112.23 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElectronNET.WebApp", "ElectronNET.WebApp\ElectronNET.WebApp.csproj", "{7C048379-401C-4345-B5E7-BE232DEA8157}" + ProjectSection(ProjectDependencies) = postProject + {CE3EB0F2-DA39-427A-85D2-E00D660EBFDE} = {CE3EB0F2-DA39-427A-85D2-E00D660EBFDE} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElectronNET.API", "ElectronNET.API\ElectronNET.API.csproj", "{A78157BA-B754-45F1-969F-D6A513CA0E72}" EndProject @@ -32,6 +34,7 @@ Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "ElectronNET.Host", "Electro EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2914CCF7-27C2-42AE-849A-2F0C1BC7CDFA}" ProjectSection(SolutionItems) = preProject + .devops\build-nuget.yaml = .devops\build-nuget.yaml buildAll.cmd = buildAll.cmd buildAll.sh = buildAll.sh buildReleaseNuGetPackages.cmd = buildReleaseNuGetPackages.cmd