/// <summary>
        /// Publishes a list of events to all registered network endpoints after
        /// applying the required event format transforms. Stored events will be
        /// deleted if publishing was successful for all registered endpoints.
        /// This method should NOT be called from the main thread.
        /// </summary>
        /// <param name="events"></param>
        /// <returns></returns>
        public async Task PublishEventsAsync(List <InstrumentationEvent> events)
        {
            if (events == null || events.Count == 0)
            {
                return;
            }
            var eventIds     = new List <string>();
            var success      = true;
            var remoteKeySet = remotes.Keys;

            foreach (var key in remoteKeySet)
            {
                ITransform transformer = key;
                var        eventsArray = new JArray();
                if (transformer != null)
                {
                    foreach (var instrumentationEvent in events)
                    {
                        eventIds.Add(instrumentationEvent.EventId);
                        var eventJson = transformer.Transform(instrumentationEvent);
                        if (eventJson != null)
                        {
                            eventsArray.Add(eventJson);
                        }
                    }
                }
                var networkPublisher = remotes[key];
                if (networkPublisher != null)
                {
                    var networkSuccess = await networkPublisher.PublishAsync(eventsArray);

                    /*
                     * Updates the success flag only if all previous requests have been
                     * successful. This ensures that the operation is marked success only
                     * if all publishers are successful.
                     */
                    if (success)
                    {
                        success = networkSuccess;
                    }
                }
            }

            if (success)
            {
                await eventStoreManager.DeleteEventsAsync(eventIds);
            }
        }