using System; using System.Globalization; using System.Threading.Tasks; namespace ElectronNET.API { /// /// Generic Event Consumers for Electron Modules /// internal class Events { private static Events _events; private static readonly object SyncRoot = new(); private readonly TextInfo _textInfo = new CultureInfo("en-US", false).TextInfo; private Events() {} public static Events Instance { get { if (_events == null) { lock (SyncRoot) { if (_events == null) { _events = new Events(); } } } return _events; } } /// /// 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 action) => On(moduleName, eventName, action); /// /// 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 async Task On(string moduleName, string eventName, Action action) { var listener = $"{moduleName}{_textInfo.ToTitleCase(eventName)}Completed"; var subscriber = $"register-{moduleName}-on-event"; BridgeConnector.Socket.On(listener, action); await BridgeConnector.Socket.Emit(subscriber, eventName, listener); } /// /// 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 Once(string moduleName, string eventName, Action action) => Once(moduleName, eventName, action); /// /// 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 async Task Once(string moduleName, string eventName, Action action) { var listener = $"{moduleName}{_textInfo.ToTitleCase(eventName)}Completed"; var subscriber = $"register-{moduleName}-once-event"; BridgeConnector.Socket.Once(listener, action); await BridgeConnector.Socket.Emit(subscriber, eventName, listener); } } }