From a36cc1502a6c43feb0e149216aefc0f449916a10 Mon Sep 17 00:00:00 2001 From: Mohit Tejani Date: Mon, 3 Mar 2025 11:47:42 +0530 Subject: [PATCH 01/11] refactor: Added new standard logger. --- src/Api/PubnubApi/Builder/ResponseBuilder.cs | 2 +- .../EndPoint/Access/GrantTokenOperation.cs | 13 +- .../EndPoint/Access/RevokeTokenOperation.cs | 25 +- .../AddChannelsToChannelGroupOperation.cs | 7 + .../DeleteChannelGroupOperation.cs | 10 +- .../ListAllChannelGroupOperation.cs | 28 +- .../ListChannelsForChannelGroupOperation.cs | 7 + ...RemoveChannelsFromChannelGroupOperation.cs | 41 +- .../EndPoint/Files/DeleteFileOperation.cs | 21 +- .../EndPoint/Files/DownloadFileOperation.cs | 34 +- .../Files/GenerateFileUploadUrlOperation.cs | 25 +- .../EndPoint/Files/GetFileUrlOperation.cs | 6 +- .../EndPoint/Files/ListFilesOperation.cs | 34 +- .../EndPoint/Files/PublishFileMessage.cs | 35 +- .../EndPoint/Files/SendFileOperation.cs | 46 +- .../EndPoint/Presence/GetStateOperation.cs | 48 +- .../EndPoint/Presence/HeartbeatOperation.cs | 2 +- .../EndPoint/Presence/HereNowOperation.cs | 8 +- .../EndPoint/Presence/LeaveOperation.cs | 7 +- .../EndPoint/Presence/PresenceOperation.cs | 12 +- .../EndPoint/Presence/SetStateOperation.cs | 25 +- .../EndPoint/Presence/WhereNowOperation.cs | 36 +- .../PubSub/AddMessageActionOperation.cs | 47 +- .../EndPoint/PubSub/FireOperation.cs | 39 +- .../PubSub/GetMessageActionsOperation.cs | 68 +- .../EndPoint/PubSub/ListenerManager.cs | 7 +- .../EndPoint/PubSub/PublishOperation.cs | 45 +- .../PubSub/RemoveMessageActionOperation.cs | 88 ++- .../EndPoint/PubSub/SignalOperation.cs | 36 +- .../EndPoint/PubSub/SubscribeEndpoint.cs | 9 +- .../EndPoint/PubSub/SubscribeManager.cs | 106 +-- .../EndPoint/PubSub/SubscribeManager2.cs | 36 +- .../EndPoint/PubSub/SubscribeOperation.cs | 2 +- .../EndPoint/PubSub/UnsubscribeAllEndpoint.cs | 2 + .../PubSub/UnsubscribeAllOperation.cs | 1 + .../EndPoint/PubSub/UnsubscribeEndpoint.cs | 5 +- .../EndPoint/PubSub/UnsubscribeOperation.cs | 3 +- .../EndPoint/Push/AddPushChannelOperation.cs | 55 +- .../Push/AuditPushChannelOperation.cs | 55 +- .../Push/RemoveAllPushChannelsOperation.cs | 24 +- .../Push/RemovePushChannelOperation.cs | 36 +- .../StoragePlayback/DeleteMessageOperation.cs | 20 +- .../StoragePlayback/FetchHistoryOperation.cs | 35 +- .../StoragePlayback/HistoryOperation.cs | 19 +- .../StoragePlayback/MessageCountsOperation.cs | 24 +- .../EventEngine/Common/EventEmitter.cs | 2 +- src/Api/PubnubApi/EventEngine/Core/Engine.cs | 8 +- .../EventEngine/Core/EventEngineInterfaces.cs | 23 + .../CancelDelayedHeartbeatInvocation.cs | 4 + .../Invocations/CancelWaitInvocation.cs | 4 + .../Invocations/DelayedHeartbeatInvocation.cs | 5 + .../Invocations/HearbeatInvocation.cs | 4 + .../Presence/Invocations/LeaveInvocation.cs | 4 + .../Presence/Invocations/WaitInvocation.cs | 4 + .../Subscribe/Common/CommonSubscribeTypes.cs | 1 + .../Subscribe/Events/SubscriptionEvents.cs | 64 ++ .../Invocations/SubscriptionInvocations.cs | 41 ++ .../Subscribe/States/HandshakeFailedState.cs | 1 + .../Subscribe/SubscribeEventEngine.cs | 1 + .../Subscribe/SubscribeEventEngineFactory.cs | 11 +- src/Api/PubnubApi/Log/IPubnubLogger.cs | 12 + src/Api/PubnubApi/Log/LoggingMethod.cs | 4 - src/Api/PubnubApi/Log/PubnubDefaultLogger.cs | 54 ++ src/Api/PubnubApi/Log/PubnubLogModule.cs | 70 ++ src/Api/PubnubApi/NewtonsoftJsonDotNet.cs | 26 +- src/Api/PubnubApi/PNConfiguration.cs | 6 + src/Api/PubnubApi/Pubnub.cs | 693 ++++++++++++------ src/Api/PubnubApi/PubnubCoreBase.cs | 11 +- src/Api/PubnubApi/RetryConfiguration.cs | 15 +- .../PubnubApi/Security/Crypto/CryptoModule.cs | 6 +- .../Security/Crypto/Cryptors/AesCbcCryptor.cs | 58 +- .../Security/Crypto/Cryptors/CryptorBase.cs | 15 +- .../Security/Crypto/Cryptors/LegacyCryptor.cs | 64 +- src/Api/PubnubApi/Security/SecureMessage.cs | 22 +- .../PubnubApi/Transport/HttpClientService.cs | 86 +-- src/Api/PubnubApiPCL/PubnubApiPCL.csproj | 3 + src/Api/PubnubApiUWP/PubnubApiUWP.csproj | 3 + src/Api/PubnubApiUnity/PubnubApiUnity.csproj | 3 + 78 files changed, 1764 insertions(+), 798 deletions(-) create mode 100644 src/Api/PubnubApi/Log/IPubnubLogger.cs create mode 100644 src/Api/PubnubApi/Log/PubnubDefaultLogger.cs create mode 100644 src/Api/PubnubApi/Log/PubnubLogModule.cs diff --git a/src/Api/PubnubApi/Builder/ResponseBuilder.cs b/src/Api/PubnubApi/Builder/ResponseBuilder.cs index 2948528f4..c00338fd1 100644 --- a/src/Api/PubnubApi/Builder/ResponseBuilder.cs +++ b/src/Api/PubnubApi/Builder/ResponseBuilder.cs @@ -27,7 +27,7 @@ public T JsonToObject(List result, bool internalObject) } else { - NewtonsoftJsonDotNet jsonNewtonLib = new NewtonsoftJsonDotNet(config, pubnubLog); + NewtonsoftJsonDotNet jsonNewtonLib = new NewtonsoftJsonDotNet(config); ret = jsonNewtonLib.DeserializeToObject(result); } diff --git a/src/Api/PubnubApi/EndPoint/Access/GrantTokenOperation.cs b/src/Api/PubnubApi/EndPoint/Access/GrantTokenOperation.cs index e6f179d0d..e5e3bc11c 100644 --- a/src/Api/PubnubApi/EndPoint/Access/GrantTokenOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Access/GrantTokenOperation.cs @@ -13,7 +13,7 @@ public class GrantTokenOperation : PubnubCoreBase private readonly IJsonPluggableLibrary jsonLibrary; private readonly IPubnubUnitTest unit; private readonly IPubnubLog pubnubLog; - + private PNTokenResources pubnubResources = new PNTokenResources { Channels = new Dictionary(), Spaces = new Dictionary(), @@ -35,7 +35,7 @@ public class GrantTokenOperation : PubnubCoreBase private Dictionary grantMeta; private string pubnubAuthorizedUuid = string.Empty; private string pubnubAuthorizedUserId = string.Empty; - + public GrantTokenOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, EndPoint.TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) { config = pubnubConfig; @@ -43,7 +43,6 @@ public GrantTokenOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary j unit = pubnubUnit; pubnubLog = log; PubnubInstance = instance; - InitializeDefaultVariableObjectStates(); } @@ -149,11 +148,13 @@ public GrantTokenOperation QueryParam(Dictionary customQueryPara public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); GrantAccess(callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await GrantAccess().ConfigureAwait(false); } @@ -171,7 +172,7 @@ internal void GrantAccess(PNCallback callback) if (this.grantTTL <= 0) { throw new MissingMemberException("Invalid TTL value"); } - + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState(); requestState.Channels = pubnubResources.Channels.Keys.ToArray(); requestState.ChannelGroups = pubnubResources.ChannelGroups.Keys.ToArray(); @@ -190,12 +191,14 @@ internal void GrantAccess(PNCallback callback) requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerGrantToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNAccessManagerTokenResult), status); } }); @@ -226,6 +229,7 @@ internal async Task> GrantAccess() if (this.grantTTL <= 0) { throw new MissingMemberException("Invalid TTL value"); } + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState(); requestState.Channels = pubnubResources.Channels.Keys.ToArray(); requestState.ChannelGroups = pubnubResources.ChannelGroups.Keys.ToArray(); @@ -268,6 +272,7 @@ internal async Task> GrantAccess() PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerGrantToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Access/RevokeTokenOperation.cs b/src/Api/PubnubApi/EndPoint/Access/RevokeTokenOperation.cs index 3a58b59d2..4466afcda 100644 --- a/src/Api/PubnubApi/EndPoint/Access/RevokeTokenOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Access/RevokeTokenOperation.cs @@ -42,11 +42,13 @@ public RevokeTokenOperation QueryParam(Dictionary customQueryPar public void Execute(PNCallback callback) { this.savedCallbackRevokeToken = callback; + logger.Trace($"{GetType().Name} Execute invoked"); RevokeAccess(callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await RevokeAccess().ConfigureAwait(false); } @@ -61,11 +63,14 @@ internal void RevokeAccess(PNCallback callback throw new MissingMemberException("Invalid secret key"); } - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNAccessManagerRevokeToken; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNAccessManagerRevokeToken, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNAccessManagerRevokeToken); @@ -76,12 +81,14 @@ internal void RevokeAccess(PNCallback callback requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNAccessManagerRevokeTokenResult), status); } }); @@ -92,6 +99,7 @@ internal async Task> RevokeAccess() if (string.IsNullOrEmpty(config.SecretKey) || string.IsNullOrEmpty(config.SecretKey.Trim()) || config.SecretKey.Length <= 0) { throw new MissingMemberException("Invalid secret key"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNAccessManagerRevokeToken; @@ -127,9 +135,10 @@ internal async Task> RevokeAccess() } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); - PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));logger.Debug($"{GetType().Name} request finished with status code {statusCode}"); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -152,9 +161,7 @@ private RequestParameter CreateRequestParameter() } } } - - string queryString = UriUtil.BuildQueryString(requestQueryStringParams); - + var requestParameter = new RequestParameter() { RequestType = Constants.DELETE, PathSegment = pathSegments, diff --git a/src/Api/PubnubApi/EndPoint/ChannelGroup/AddChannelsToChannelGroupOperation.cs b/src/Api/PubnubApi/EndPoint/ChannelGroup/AddChannelsToChannelGroupOperation.cs index beb1bc0a2..47357be85 100644 --- a/src/Api/PubnubApi/EndPoint/ChannelGroup/AddChannelsToChannelGroupOperation.cs +++ b/src/Api/PubnubApi/EndPoint/ChannelGroup/AddChannelsToChannelGroupOperation.cs @@ -54,11 +54,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); AddChannelsToChannelGroup(this.channelNames, "", this.channelGroupName, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await AddChannelsToChannelGroup(this.channelNames, "", this.channelGroupName, this.queryParam).ConfigureAwait(false); } @@ -80,6 +82,7 @@ internal void AddChannelsToChannelGroup(string[] channels, string nameSpace, str if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNAddChannelsToGroupOperation; requestState.Channels = new string[] { }; @@ -97,12 +100,14 @@ internal void AddChannelsToChannelGroup(string[] channels, string nameSpace, str requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAddChannelsToGroupOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNChannelGroupsAddChannelResult), status); } }); @@ -121,6 +126,7 @@ internal async Task> AddChannelsToChan if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNAddChannelsToGroupOperation; @@ -159,6 +165,7 @@ internal async Task> AddChannelsToChan PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/ChannelGroup/DeleteChannelGroupOperation.cs b/src/Api/PubnubApi/EndPoint/ChannelGroup/DeleteChannelGroupOperation.cs index f372a22fb..776622243 100644 --- a/src/Api/PubnubApi/EndPoint/ChannelGroup/DeleteChannelGroupOperation.cs +++ b/src/Api/PubnubApi/EndPoint/ChannelGroup/DeleteChannelGroupOperation.cs @@ -3,7 +3,6 @@ using System.Threading.Tasks; using System.Net; using System.Text; -using System.Collections.Concurrent; namespace PubnubApi.EndPoint { @@ -47,11 +46,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); DeleteChannelGroup(this.channelGroupName, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await DeleteChannelGroup(this.channelGroupName, this.queryParam).ConfigureAwait(false); } @@ -65,7 +66,7 @@ internal void DeleteChannelGroup(string groupName, Dictionary ex if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } - + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNRemoveGroupOperation; requestState.Channels = new string[] { }; @@ -83,12 +84,14 @@ internal void DeleteChannelGroup(string groupName, Dictionary ex requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveGroupOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNChannelGroupsDeleteGroupResult), status); } }); @@ -99,6 +102,8 @@ internal async Task> DeleteChannelGro if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } + + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNRemoveGroupOperation; @@ -137,6 +142,7 @@ internal async Task> DeleteChannelGro PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveGroupOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/ChannelGroup/ListAllChannelGroupOperation.cs b/src/Api/PubnubApi/EndPoint/ChannelGroup/ListAllChannelGroupOperation.cs index f764efd9e..6a1d7842b 100644 --- a/src/Api/PubnubApi/EndPoint/ChannelGroup/ListAllChannelGroupOperation.cs +++ b/src/Api/PubnubApi/EndPoint/ChannelGroup/ListAllChannelGroupOperation.cs @@ -41,11 +41,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); GetAllChannelGroup(this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await GetAllChannelGroup(this.queryParam).ConfigureAwait(false); } @@ -56,11 +58,13 @@ internal void Retry() internal void GetAllChannelGroup(Dictionary externalQueryParam, PNCallback callback) { - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.ChannelGroupAllGet; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.ChannelGroupAllGet, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.ChannelGroupAllGet); PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ContinueWith(t => { @@ -70,12 +74,14 @@ internal void GetAllChannelGroup(Dictionary externalQueryParam, requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Debug($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.ChannelGroupAllGet, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Debug($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNChannelGroupsListAllResult), status); } }); @@ -84,10 +90,12 @@ internal void GetAllChannelGroup(Dictionary externalQueryParam, internal async Task> GetAllChannelGroup(Dictionary externalQueryParam) { PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.ChannelGroupAllGet; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.ChannelGroupAllGet, + Reconnect = false, + EndPointOperation = this + }; Tuple JsonAndStatusTuple; @@ -120,7 +128,7 @@ internal async Task> GetAllChannelGroup(D PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.ChannelGroupAllGet, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/ChannelGroup/ListChannelsForChannelGroupOperation.cs b/src/Api/PubnubApi/EndPoint/ChannelGroup/ListChannelsForChannelGroupOperation.cs index daf1f3417..5459a1ccb 100644 --- a/src/Api/PubnubApi/EndPoint/ChannelGroup/ListChannelsForChannelGroupOperation.cs +++ b/src/Api/PubnubApi/EndPoint/ChannelGroup/ListChannelsForChannelGroupOperation.cs @@ -49,11 +49,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); GetChannelsForChannelGroup(this.channelGroupName, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await GetChannelsForChannelGroup(this.channelGroupName, this.queryParam).ConfigureAwait(false); } @@ -67,6 +69,7 @@ internal void GetChannelsForChannelGroup(string groupName, Dictionary requestState = new RequestState(); requestState.ResponseType = PNOperationType.ChannelGroupGet; @@ -83,12 +86,14 @@ internal void GetChannelsForChannelGroup(string groupName, Dictionary result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.ChannelGroupGet, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNChannelGroupsAllChannelsResult), status); } }); @@ -99,6 +104,7 @@ internal async Task> GetChannelsForCh if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.ChannelGroupGet; @@ -135,6 +141,7 @@ internal async Task> GetChannelsForCh PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.ChannelGroupGet, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/ChannelGroup/RemoveChannelsFromChannelGroupOperation.cs b/src/Api/PubnubApi/EndPoint/ChannelGroup/RemoveChannelsFromChannelGroupOperation.cs index 41474e3b3..bda274f1c 100644 --- a/src/Api/PubnubApi/EndPoint/ChannelGroup/RemoveChannelsFromChannelGroupOperation.cs +++ b/src/Api/PubnubApi/EndPoint/ChannelGroup/RemoveChannelsFromChannelGroupOperation.cs @@ -56,11 +56,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); RemoveChannelsFromChannelGroup(this.channelNames, "", this.channelGroupName, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await RemoveChannelsFromChannelGroup(this.channelNames, "", this.channelGroupName, this.queryParam).ConfigureAwait(false); } @@ -82,14 +84,16 @@ internal void RemoveChannelsFromChannelGroup(string[] channels, string nameSpace if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } - - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNRemoveChannelsFromGroupOperation; - requestState.Channels = new string[] { }; - requestState.ChannelGroups = new[] { groupName }; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNRemoveChannelsFromGroupOperation, + Channels = new string[] { }, + ChannelGroups = new[] { groupName }, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNRemoveChannelsFromGroupOperation); @@ -100,12 +104,14 @@ internal void RemoveChannelsFromChannelGroup(string[] channels, string nameSpace requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveChannelsFromGroupOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNChannelGroupsRemoveChannelResult), status); } }); @@ -124,20 +130,24 @@ internal async Task> RemoveChannels if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) { throw new ArgumentException("Missing groupName"); } + + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNRemoveChannelsFromGroupOperation; - requestState.Channels = new string[] { }; - requestState.ChannelGroups = new[] { groupName }; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - Tuple JsonAndStatusTuple; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNRemoveChannelsFromGroupOperation, + Channels = new string[] { }, + ChannelGroups = new[] { groupName }, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNRemoveChannelsFromGroupOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); if (transportResponse.Error == null) { var responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple JsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); @@ -161,6 +171,7 @@ internal async Task> RemoveChannels PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveChannelsFromGroupOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Files/DeleteFileOperation.cs b/src/Api/PubnubApi/EndPoint/Files/DeleteFileOperation.cs index 121270439..482aa988a 100644 --- a/src/Api/PubnubApi/EndPoint/Files/DeleteFileOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Files/DeleteFileOperation.cs @@ -65,13 +65,15 @@ public void Execute(PNCallback callback) if (string.IsNullOrEmpty(this.fileName)) { throw new ArgumentException("Missing File Name"); } - + logger.Debug($"{GetType().Name} parameter validated."); this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); ProcessDeleteFileRequest(this.queryParam, savedCallback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await ProcessDeleteFileRequest(this.queryParam).ConfigureAwait(false); } @@ -82,12 +84,14 @@ internal void Retry() private void ProcessDeleteFileRequest(Dictionary externalQueryParam, PNCallback callback) { - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNDeleteFileOperation; - requestState.PubnubCallback = callback; - requestState.UsePostMethod = false; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNDeleteFileOperation, + PubnubCallback = callback, + UsePostMethod = false, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNDeleteFileOperation); PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ContinueWith(t => { @@ -97,15 +101,18 @@ private void ProcessDeleteFileRequest(Dictionary externalQueryPa var responseString = Encoding.UTF8.GetString(transportResponse.Content); if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNDeleteFileOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); diff --git a/src/Api/PubnubApi/EndPoint/Files/DownloadFileOperation.cs b/src/Api/PubnubApi/EndPoint/Files/DownloadFileOperation.cs index d9fb45c3e..cbbffdfb0 100644 --- a/src/Api/PubnubApi/EndPoint/Files/DownloadFileOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Files/DownloadFileOperation.cs @@ -68,13 +68,15 @@ public void Execute(PNCallback callback) if (string.IsNullOrEmpty(currentFileName)) { throw new ArgumentException("Missing File Name"); } - + logger.Debug($"{GetType().Name} parameter validated."); savedCallback = callback ?? throw new ArgumentException("Missing callback"); + logger.Trace($"{GetType().Name} Execute invoked"); ProcessFileDownloadRequest(savedCallback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await ProcessFileDownloadRequest().ConfigureAwait(false); } @@ -85,11 +87,13 @@ internal void Retry() private void ProcessFileDownloadRequest(PNCallback callback) { - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNDownloadFileOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNDownloadFileOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNDownloadFileOperation); @@ -104,12 +108,12 @@ private void ProcessFileDownloadRequest(PNCallback callbac if (string.IsNullOrEmpty(currentFileCipherKey) && string.IsNullOrEmpty(config.CipherKey) && config.CryptoModule == null) { outputBytes = fileContentBytes; } else { - CryptoModule currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true, pubnubLog), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true, pubnubLog), null)); + CryptoModule currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true, config.Logger), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true), null)); try { outputBytes = currentCryptoModule.Decrypt(fileContentBytes); - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}], Stream length (after Decrypt)= {fileContentBytes.Length}", config.LogVerbosity); + logger.Debug($"Stream length (after Decrypt)= {fileContentBytes.Length}"); } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog,$"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] {ex}\nMessage might be not encrypted, returning message content", config.LogVerbosity); + logger.Error($" Error while decrypting file content.File might be not encrypted, returning as it is. exception: {ex}"); outputBytes = fileContentBytes; } } @@ -119,15 +123,18 @@ private void ProcessFileDownloadRequest(PNCallback callbac FileName = currentFileName }; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, 200, null); + logger.Info($"{GetType().Name} request finished with status code {status.StatusCode}"); callback.OnResponse(result, status); } else { PNStatus errorStatus = GetStatusIfError(requestState, null); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNDownloadFileOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -147,7 +154,7 @@ private async Task> ProcessFileDownloadRequest() returnValue.Status = errStatus; return returnValue; } - + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState { ResponseType = PNOperationType.PNDownloadFileOperation, @@ -166,12 +173,12 @@ private async Task> ProcessFileDownloadRequest() if (string.IsNullOrEmpty(currentFileCipherKey) && string.IsNullOrEmpty(config.CipherKey) && config.CryptoModule == null) { outputBytes = fileContentBytes; } else { - CryptoModule currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true, pubnubLog), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true, pubnubLog), null)); + CryptoModule currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true), null)); try { outputBytes = currentCryptoModule.Decrypt(fileContentBytes); - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}], Stream length (after Decrypt)= {fileContentBytes.Length}", config.LogVerbosity); + logger.Debug($"Stream length (after Decrypt)= {fileContentBytes.Length}"); } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog,$"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] {ex}\nFile content might be not encrypted, returning content" ,config.LogVerbosity); + logger.Error($" Error while decrypting file content.File might be not encrypted, returning as it is. exception: {ex}"); outputBytes = fileContentBytes; returnValue.Status = new PNStatus { Error = true, ErrorData = new PNErrorData("Decryption error", ex) }; } @@ -194,6 +201,7 @@ private async Task> ProcessFileDownloadRequest() PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNDownloadFileOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Files/GenerateFileUploadUrlOperation.cs b/src/Api/PubnubApi/EndPoint/Files/GenerateFileUploadUrlOperation.cs index 618b8fd8b..922127e53 100644 --- a/src/Api/PubnubApi/EndPoint/Files/GenerateFileUploadUrlOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Files/GenerateFileUploadUrlOperation.cs @@ -46,6 +46,7 @@ public GenerateFileUploadUrlOperation QueryParam(Dictionary cust public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (callback == null) { throw new ArgumentException("Missing callback"); } @@ -53,23 +54,26 @@ public void Execute(PNCallback callback) if (string.IsNullOrEmpty(this.sendFileName)) { throw new ArgumentException("Missing File Name"); } - + logger.Debug($"{GetType().Name} parameter validated."); GenerateFileUploadUrl(callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await GenerateFileUploadUrl().ConfigureAwait(false); } private void GenerateFileUploadUrl(PNCallback callback) { - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNGenerateFileUploadUrlOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.UsePostMethod = true; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNGenerateFileUploadUrlOperation, + PubnubCallback = callback, + Reconnect = false, + UsePostMethod = true, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNGenerateFileUploadUrlOperation); @@ -80,15 +84,18 @@ private void GenerateFileUploadUrl(PNCallback cal requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNGenerateFileUploadUrlOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -103,7 +110,7 @@ private async Task> GenerateFileUploadUr return returnValue; } - + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNGenerateFileUploadUrlOperation; requestState.Reconnect = false; @@ -140,7 +147,7 @@ private async Task> GenerateFileUploadUr PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNGenerateFileUploadUrlOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Files/GetFileUrlOperation.cs b/src/Api/PubnubApi/EndPoint/Files/GetFileUrlOperation.cs index baced70dd..ec07a5d08 100644 --- a/src/Api/PubnubApi/EndPoint/Files/GetFileUrlOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Files/GetFileUrlOperation.cs @@ -53,6 +53,7 @@ public GetFileUrlOperation QueryParam(Dictionary customQueryPara public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (callback == null) { throw new ArgumentException("Missing callback"); @@ -66,11 +67,13 @@ public void Execute(PNCallback callback) throw new ArgumentException("Missing File Name"); } this.savedCallback = callback; + logger.Debug($"{GetType().Name} parameter validated."); ProcessGetFileUrl(this.queryParam, savedCallback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await ProcessGetFileUrl(this.queryParam).ConfigureAwait(false); } @@ -86,6 +89,7 @@ private void ProcessGetFileUrl(Dictionary externalQueryParam, PN var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNFileUrlOperation); result.Url = transportRequest.RequestUrl; PNStatus status = new PNStatus { Error = false, StatusCode = 200 }; + logger.Info($"{GetType().Name} request finished with status code {status.StatusCode}"); callback.OnResponse(result, status); } @@ -116,7 +120,7 @@ private Task> ProcessGetFileUrl(Dictionary customQueryParam public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (callback == null) { throw new ArgumentException("Missing callback"); } @@ -61,11 +62,13 @@ public void Execute(PNCallback callback) throw new ArgumentException("Missing Channel Name"); } this.savedCallback = callback; + logger.Debug($"{GetType().Name} parameter validated."); ProcessListFilesRequest(savedCallback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await ProcessListFilesRequest().ConfigureAwait(false); } @@ -76,12 +79,14 @@ internal void Retry() private void ProcessListFilesRequest(PNCallback callback) { - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNListFilesOperation; - requestState.PubnubCallback = callback; - requestState.UsePostMethod = false; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNListFilesOperation, + PubnubCallback = callback, + UsePostMethod = false, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNListFilesOperation); @@ -92,15 +97,18 @@ private void ProcessListFilesRequest(PNCallback callback) requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNListFilesOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -115,11 +123,14 @@ private async Task> ProcessListFilesRequest() returnValue.Status = errStatus; return returnValue; } - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNListFilesOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - requestState.UsePostMethod = false; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNListFilesOperation, + Reconnect = false, + EndPointOperation = this, + UsePostMethod = false + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNListFilesOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); @@ -150,6 +161,7 @@ private async Task> ProcessListFilesRequest() PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNListFilesOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Files/PublishFileMessage.cs b/src/Api/PubnubApi/EndPoint/Files/PublishFileMessage.cs index e8ac69b68..072273ef3 100644 --- a/src/Api/PubnubApi/EndPoint/Files/PublishFileMessage.cs +++ b/src/Api/PubnubApi/EndPoint/Files/PublishFileMessage.cs @@ -91,6 +91,7 @@ public PublishFileMessageOperation QueryParam(Dictionary customQ public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (callback == null) { throw new ArgumentException("Missing callback"); } @@ -104,6 +105,7 @@ public void Execute(PNCallback callback) public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await ProcessFileMessagePublish(this.queryParam).ConfigureAwait(false); } @@ -121,11 +123,14 @@ private void ProcessFileMessagePublish(Dictionary externalQueryP callback.OnResponse(null, status); return; } - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNPublishFileMessageOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNPublishFileMessageOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNPublishOperation); @@ -139,14 +144,17 @@ private void ProcessFileMessagePublish(Dictionary externalQueryP int publishStatus; var _ = int.TryParse(result[0].ToString(), out publishStatus); if (publishStatus == 1) { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString()); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishFileMessageOperation, category, requestState, 400, new PNException(responseString)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } } else { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } @@ -154,6 +162,7 @@ private void ProcessFileMessagePublish(Dictionary externalQueryP int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishFileMessageOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -172,12 +181,14 @@ private async Task> ProcessFileMessagePubli returnValue.Status = errStatus; return returnValue; } - + logger.Debug($"{GetType().Name} parameter validated."); var requestParameter = CreateRequestParameter(); - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PNPublishFileMessageOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PNPublishFileMessageOperation, + Reconnect = false, + EndPointOperation = this + }; Tuple JsonAndStatusTuple; var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNPublishFileMessageOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest).ConfigureAwait(false); @@ -216,7 +227,7 @@ private async Task> ProcessFileMessagePubli PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishFileMessageOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -280,7 +291,7 @@ private string PrepareContent(object originalMessage) { string message = jsonLibrary.SerializeToJsonString(originalMessage); if (config.CryptoModule != null || config.CipherKey.Length > 0) { - config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, config.UseRandomInitializationVector, pubnubLog), null); + config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, config.UseRandomInitializationVector, config.Logger), null); string encryptMessage = config.CryptoModule.Encrypt(message); message = jsonLibrary.SerializeToJsonString(encryptMessage); } diff --git a/src/Api/PubnubApi/EndPoint/Files/SendFileOperation.cs b/src/Api/PubnubApi/EndPoint/Files/SendFileOperation.cs index 12bb18236..b1a2fe634 100644 --- a/src/Api/PubnubApi/EndPoint/Files/SendFileOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Files/SendFileOperation.cs @@ -119,6 +119,7 @@ public SendFileOperation QueryParam(Dictionary customQueryParam) public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (callback == null) { throw new ArgumentException("Missing callback"); } @@ -126,11 +127,13 @@ public void Execute(PNCallback callback) if (string.IsNullOrEmpty(sendFileName)) { throw new ArgumentException("Missing File"); } + logger.Debug($"{GetType().Name} parameter validated."); ProcessFileUpload(callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await ProcessFileUpload().ConfigureAwait(false); } @@ -147,7 +150,7 @@ private void ProcessFileUpload(PNCallback callback) } return; } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] GenerateFileUploadUrl executed.", config.LogVerbosity); + logger.Debug($"GenerateFileUploadUrl executed."); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PNFileUploadOperation; requestState.PubnubCallback = callback; @@ -159,7 +162,7 @@ private void ProcessFileUpload(PNCallback callback) string contentType = "multipart/form-data; boundary=" + dataBoundary; CryptoModule currentCryptoModule = null; if (!string.IsNullOrEmpty(currentFileCipherKey) || !string.IsNullOrEmpty(config.CipherKey) || config.CryptoModule != null) { - currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true, pubnubLog), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true, pubnubLog), null)); + currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true), null)); } byte[] postData = GetMultipartFormData(sendFileByteArray, generateFileUploadUrlResult.FileName, generateFileUploadUrlResult.FileUploadRequest.FormFields, dataBoundary, currentCryptoModule, config, pubnubLog); CancellationTokenSource cts = new CancellationTokenSource(); @@ -204,13 +207,14 @@ private void ProcessFileUpload(PNCallback callback) result.FileName = generateFileUploadUrlResult.FileName; LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Publish file message executed successfully.", config.LogVerbosity); var status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, 200, null); + logger.Info($"{GetType().Name} request executed with status code {requestState.Response.StatusCode}"); callback.OnResponse(result, status); } else { publishFailed = true; if (currentFileRetryCount == publishFileRetryLimit) { callback.OnResponse(null, publishFileMessageStatus); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] PublishFileMessage Failed rety count ={currentFileRetryCount}", config.LogVerbosity); + logger.Debug($"PublishFileMessage Failed rety count ={currentFileRetryCount}"); } } while (publishFailed && currentFileRetryCount <= publishFileRetryLimit && !(publishFileMessageStatus?.StatusCode != 400 || publishFileMessageStatus.StatusCode != 403)); @@ -218,6 +222,7 @@ private void ProcessFileUpload(PNCallback callback) int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse?.Error?.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse?.Error?.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNFileUploadOperation, category, requestState, statusCode, new PNException(transportResponse?.Error?.Message, transportResponse?.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } } @@ -232,6 +237,7 @@ private async Task> ProcessFileUpload() returnValue.Status = errStatus; return returnValue; } + logger.Debug($"{GetType().Name} parameter validated."); PNResult generateFileUploadUrl = await GenerateFileUploadUrl().ConfigureAwait(false); PNGenerateFileUploadUrlResult generateFileUploadUrlResult = generateFileUploadUrl.Result; PNStatus generateFileUploadUrlStatus = generateFileUploadUrl.Status; @@ -239,7 +245,7 @@ private async Task> ProcessFileUpload() returnValue.Status = generateFileUploadUrlStatus; return returnValue; } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] GenerateFileUploadUrl executed.", config.LogVerbosity); + logger.Debug($"GenerateFileUploadUrl executed."); RequestState requestState = new RequestState { ResponseType = PNOperationType.PNFileUploadOperation, @@ -252,7 +258,7 @@ private async Task> ProcessFileUpload() string contentType = "multipart/form-data; boundary=" + dataBoundary; CryptoModule currentCryptoModule = null; if (!string.IsNullOrEmpty(currentFileCipherKey) || !string.IsNullOrEmpty(config.CipherKey) || config.CryptoModule != null) { - currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true, pubnubLog), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true, pubnubLog), null)); + currentCryptoModule = !string.IsNullOrEmpty(currentFileCipherKey) ? new CryptoModule(new LegacyCryptor(currentFileCipherKey, true), null) : (config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, true), null)); } byte[] postData = GetMultipartFormData(sendFileByteArray, generateFileUploadUrlResult.FileName, generateFileUploadUrlResult.FileUploadRequest.FormFields, dataBoundary, currentCryptoModule, config, pubnubLog); CancellationTokenSource cts = new CancellationTokenSource(); @@ -301,8 +307,7 @@ private async Task> ProcessFileUpload() returnValue.Status = jsonAndStatusTuple.Item2; string json = jsonAndStatusTuple.Item1; if (!string.IsNullOrEmpty(json)) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] File upload successfully", config.LogVerbosity); - + logger.Debug($"File content uploaded successfully"); Dictionary publishPayload = new Dictionary(); if (publishFileMessageContent != null && !string.IsNullOrEmpty(publishFileMessageContent.ToString())) { publishPayload.Add("message", publishFileMessageContent); @@ -332,17 +337,17 @@ private async Task> ProcessFileUpload() }; returnValue.Result = result; if (returnValue.Status != null) returnValue.Status.Error = false; - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] File message published successfully", config.LogVerbosity); + logger.Debug($"File message published successfully"); } else { publishFailed = true; returnValue.Status = publishFileMessageStatus; - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] PublishFileMessage Failed. retry count={1}", config.LogVerbosity); + logger.Debug($"PublishFileMessage Failed. retry count={currentFileRetryCount}"); await Task.Delay(1000); } } while (publishFailed && currentFileRetryCount <= publishFileRetryLimit && !(publishFileMessageStatus?.StatusCode != 400 || publishFileMessageStatus.StatusCode != 403)); } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -391,21 +396,24 @@ private async Task> GenerateFileUploadUr PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNGenerateFileUploadUrlOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"Generate file upload url request executed with status code {returnValue.Status.StatusCode}"); return returnValue; } private async Task> PublishFileMessage(object message, Dictionary externalQueryParam) { + logger.Trace("PublishFileMessage executing."); PNResult returnValue = new PNResult(); var requestParameter = CreatePublishFileMessageRequestParameter(); - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channelName }; - requestState.ResponseType = PNOperationType.PNPublishFileMessageOperation; - requestState.PubnubCallback = null; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = new[] { channelName }, + ResponseType = PNOperationType.PNPublishFileMessageOperation, + PubnubCallback = null, + Reconnect = false, + EndPointOperation = this + }; var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNPublishFileMessageOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest).ConfigureAwait(false); @@ -443,7 +451,7 @@ private async Task> PublishFileMessage(obje PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishFileMessageOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"PublishFileMessage request executed with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -606,7 +614,7 @@ private string PrepareContent(object originalMessage) { string message = jsonLibrary.SerializeToJsonString(originalMessage); if (config.CryptoModule != null || config.CipherKey.Length > 0 || currentFileCipherKey != null) { - config.CryptoModule ??= new CryptoModule(new LegacyCryptor(currentFileCipherKey ?? config.CipherKey, config.UseRandomInitializationVector, pubnubLog), null); + config.CryptoModule ??= new CryptoModule(new LegacyCryptor(currentFileCipherKey ?? config.CipherKey, config.UseRandomInitializationVector), null); string encryptMessage = config.CryptoModule.Encrypt(message); message = jsonLibrary.SerializeToJsonString(encryptMessage); } diff --git a/src/Api/PubnubApi/EndPoint/Presence/GetStateOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/GetStateOperation.cs index d0d4771d9..b7903624e 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/GetStateOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/GetStateOperation.cs @@ -63,11 +63,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); GetUserState(this.channelNames, this.channelGroupNames, this.channelUUID, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await GetUserState(this.channelNames, this.channelGroupNames, this.channelUUID, this.queryParam).ConfigureAwait(false); } @@ -88,13 +90,16 @@ internal void GetUserState(string[] channels, string[] channelGroups, string uui } else { internalUuid = uuid; } - RequestState requestState = new RequestState(); - requestState.Channels = channels; - requestState.ChannelGroups = channelGroups; - requestState.ResponseType = PNOperationType.PNGetStateOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = channels, + ChannelGroups = channelGroups, + ResponseType = PNOperationType.PNGetStateOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNGetStateOperation); PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ContinueWith(t => { @@ -104,15 +109,18 @@ internal void GetUserState(string[] channels, string[] channelGroups, string uui requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNGetStateOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -124,6 +132,7 @@ internal async Task> GetUserState(string[] channels, || (channels != null && channelGroups != null && channels.Length == 0 && channelGroups.Length == 0)) { throw new ArgumentException("Either Channel Or Channel Group or Both should be provided"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); string internalUuid; @@ -132,28 +141,30 @@ internal async Task> GetUserState(string[] channels, } else { internalUuid = uuid; } - RequestState requestState = new RequestState(); - requestState.Channels = channels; - requestState.ChannelGroups = channelGroups; - requestState.ResponseType = PNOperationType.PNGetStateOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = channels, + ChannelGroups = channelGroups, + ResponseType = PNOperationType.PNGetStateOperation, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); - Tuple JsonAndStatusTuple; var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNGetStateOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); if (transportResponse.Error == null) { var responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple jsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); - JsonAndStatusTuple = new Tuple(responseString, status); + jsonAndStatusTuple = new Tuple(responseString, status); } else { - JsonAndStatusTuple = new Tuple(string.Empty, errorStatus); + jsonAndStatusTuple = new Tuple(string.Empty, errorStatus); } - returnValue.Status = JsonAndStatusTuple.Item2; - string json = JsonAndStatusTuple.Item1; + returnValue.Status = jsonAndStatusTuple.Item2; + string json = jsonAndStatusTuple.Item1; if (!string.IsNullOrEmpty(json)) { List resultList = ProcessJsonResponse(requestState, json); ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog); @@ -168,6 +179,7 @@ internal async Task> GetUserState(string[] channels, PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNGetStateOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Presence/HeartbeatOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/HeartbeatOperation.cs index 611d32715..3955cd9e0 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/HeartbeatOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/HeartbeatOperation.cs @@ -56,7 +56,7 @@ internal async Task HeartbeatRequest(string[] channels, string[] ch responseStatus = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNHeartbeatOperation, category, pubnubRequestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); } } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Heartbeat request for channel(s)={string.Join(", ", channels.OrderBy(x => x))} \n channelGroup(s)={string.Join(", ", channelGroups.OrderBy(x => x))} \n Exception Details={ex}", config.LogVerbosity); + logger.Error($"Heartbeat request for channel(s)={string.Join(", ", channels.OrderBy(x => x))} \n channelGroup(s)={string.Join(", ", channelGroups.OrderBy(x => x))} \n Exception Details={ex}"); return new PNStatus(ex, PNOperationType.PNHeartbeatOperation, PNStatusCategory.PNUnknownCategory, channels, channelGroups); } return responseStatus; diff --git a/src/Api/PubnubApi/EndPoint/Presence/HereNowOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/HereNowOperation.cs index 76eb16a45..58d228947 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/HereNowOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/HereNowOperation.cs @@ -68,11 +68,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); HereNow(this.channelNames, this.channelGroupNames, this.includeChannelUUIDs, this.includeUserState, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await HereNow(this.channelNames, this.channelGroupNames, this.includeChannelUUIDs, this.includeUserState, this.queryParam).ConfigureAwait(false); } @@ -102,15 +104,18 @@ internal void HereNow(string[] channels, string[] channelGroups, bool showUUIDLi if (!string.IsNullOrEmpty(responseString)) { requestState.GotJsonResponse = true; List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNHereNowOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -157,7 +162,7 @@ internal async Task> HereNow(string[] channels, string PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNHereNowOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -193,7 +198,6 @@ private RequestParameter CreateRequestParameter() } } } - var queryString = UriUtil.BuildQueryString(requestQueryStringParams); var requestParameter = new RequestParameter { RequestType = Constants.GET, PathSegment = pathSegments, diff --git a/src/Api/PubnubApi/EndPoint/Presence/LeaveOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/LeaveOperation.cs index 76950e589..f8b5c0441 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/LeaveOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/LeaveOperation.cs @@ -52,10 +52,13 @@ internal async Task LeaveRequest(string[] channels, string[] channe PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); responseStatus = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.Leave, category, pubnubRequestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); } - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Presence Leave request for channel(s)={string.Join(", ", channels.OrderBy(x => x))} \n channelGroup(s)={string.Join(", ", channelGroups.OrderBy(x => x))} \n Exception Details={ex}", config.LogVerbosity); + } catch (Exception ex) + { + logger.Error( + $"Presence Leave request for channel(s)={string.Join(", ", channels.OrderBy(x => x))} \n channelGroup(s)={string.Join(", ", channelGroups.OrderBy(x => x))} \n Exception Details={ex}"); return new PNStatus(ex, PNOperationType.Leave, PNStatusCategory.PNUnknownCategory, channels, channelGroups); } + logger.Info($"{GetType().Name} request finished with status code {responseStatus.StatusCode}"); return responseStatus; } private RequestParameter CreateRequestParameter(string[] channels, string[] channelGroups) diff --git a/src/Api/PubnubApi/EndPoint/Presence/PresenceOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/PresenceOperation.cs index 5502d61a9..f3b9ad777 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/PresenceOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/PresenceOperation.cs @@ -36,8 +36,10 @@ private void OnEventQueued(IEvent e) { try { unit?.PresenceActivityList.Add(new KeyValuePair("event", e?.Name)); - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: presence event engine OnEventQueued : CurrentState = {presenceEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}", configuration.LogVerbosity); + } catch (Exception ex) + { + configuration.Logger.Error( + $"presence event engine OnEventQueued : CurrentState = {presenceEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}"); } } @@ -45,8 +47,10 @@ private void OnEffectDispatch(IEffectInvocation invocation) { try { unit?.PresenceActivityList.Add(new KeyValuePair("invocation", invocation?.Name)); - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: presence event engine OnEffectDispatch : CurrentState = {presenceEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}", configuration.LogVerbosity); + } catch (Exception ex) + { + configuration.Logger.Error( + $"presence event engine OnEffectDispatch : CurrentState = {presenceEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}"); } } diff --git a/src/Api/PubnubApi/EndPoint/Presence/SetStateOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/SetStateOperation.cs index 23325be5b..c0dc941e5 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/SetStateOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/SetStateOperation.cs @@ -96,12 +96,14 @@ public void Execute(PNCallback callback) { this.savedCallback = callback; string serializedState = jsonLibrary.SerializeToJsonString(this.userState); + logger.Trace($"{GetType().Name} Execute invoked"); SetUserState(this.channelNames, this.channelGroupNames, this.channelUUID, serializedState, this.queryParam, callback); } public async Task> ExecuteAsync() { string serializedState = jsonLibrary.SerializeToJsonString(this.userState); + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await SetUserState(this.channelNames, this.channelGroupNames, this.channelUUID, serializedState, this.queryParam).ConfigureAwait(false); } @@ -121,7 +123,7 @@ internal void SetUserState(string[] channels, string[] channelGroups, string uui if (string.IsNullOrEmpty(jsonUserState) || string.IsNullOrEmpty(jsonUserState.Trim())) { throw new ArgumentException("Missing User State"); } - + logger.Debug($"{GetType().Name} parameter validated."); List channelList = new List(); List channelGroupList = new List(); string[] filteredChannels = channels; @@ -196,7 +198,7 @@ internal async Task> SetUserState(string[] channels, if (string.IsNullOrEmpty(jsonUserState) || string.IsNullOrEmpty(jsonUserState.Trim())) { throw new ArgumentException("Missing User State"); } - + logger.Debug($"{GetType().Name} parameter validated."); List channelList = new List(); List channelGroupList = new List(); string[] filteredChannels = channels; @@ -280,15 +282,18 @@ private void SharedSetUserState(string[] channels, string[] channelGroups, strin requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNSetStateOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -297,12 +302,14 @@ private void SharedSetUserState(string[] channels, string[] channelGroups, strin private async Task> SharedSetUserState(string[] channels, string[] channelGroups, string uuid, string jsonChannelUserState, string jsonChannelGroupUserState, Dictionary externalQueryParam) { PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.Channels = channelNames; - requestState.ChannelGroups = channelGroupNames; - requestState.ResponseType = PNOperationType.PNSetStateOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = channelNames, + ChannelGroups = channelGroupNames, + ResponseType = PNOperationType.PNSetStateOperation, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); Tuple JsonAndStatusTuple; var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNSetStateOperation); @@ -334,7 +341,7 @@ private async Task> SharedSetUserState(string[] chann PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNSetStateOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Presence/WhereNowOperation.cs b/src/Api/PubnubApi/EndPoint/Presence/WhereNowOperation.cs index e3060bf87..7d8d86f0e 100644 --- a/src/Api/PubnubApi/EndPoint/Presence/WhereNowOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Presence/WhereNowOperation.cs @@ -46,11 +46,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); WhereNow(this.whereNowUUID, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await WhereNow(this.whereNowUUID, this.queryParam).ConfigureAwait(false); } @@ -64,12 +66,15 @@ internal void WhereNow(string uuid, Dictionary externalQueryPara if (jsonLibrary == null) { throw new MissingMemberException("Missing Json Pluggable Library for Pubnub Instance"); } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { whereNowUUID ?? config.UserId }; - requestState.ResponseType = PNOperationType.PNWhereNowOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { whereNowUUID ?? config.UserId }, + ResponseType = PNOperationType.PNWhereNowOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNWhereNowOperation); PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ContinueWith(t => { @@ -79,15 +84,18 @@ internal void WhereNow(string uuid, Dictionary externalQueryPara if (!string.IsNullOrEmpty(responseString)) { requestState.GotJsonResponse = true; List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNWhereNowOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -98,13 +106,15 @@ internal async Task> WhereNow(string uuid, Dictionary if (jsonLibrary == null) { throw new MissingMemberException("Missing Json Pluggable Library for Pubnub Instance"); } - + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.Channels = new[] { whereNowUUID ?? config.UserId }; - requestState.ResponseType = PNOperationType.PNWhereNowOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = new[] { whereNowUUID ?? config.UserId }, + ResponseType = PNOperationType.PNWhereNowOperation, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); Tuple JsonAndStatusTuple; var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNWhereNowOperation); @@ -136,7 +146,7 @@ internal async Task> WhereNow(string uuid, Dictionary PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNWhereNowOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/AddMessageActionOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/AddMessageActionOperation.cs index d60f3e771..c46fac6f0 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/AddMessageActionOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/AddMessageActionOperation.cs @@ -71,6 +71,7 @@ public void Execute(PNCallback callback) } savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); Publish(channelName, messageTimetoken, messageAction, queryParam, callback); } @@ -79,7 +80,7 @@ public async Task> ExecuteAsync() if (config == null || string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length <= 0) { throw new MissingMemberException("subscribe key is required"); } - + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await Publish(this.channelName, this.messageTimetoken, this.messageAction, this.queryParam).ConfigureAwait(false); } @@ -106,15 +107,17 @@ private void Publish(string channel, long messageTimetoken, PNMessageAction mess callback.OnResponse(null, status); return; } - - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channelName }; - requestState.ResponseType = PNOperationType.PNAddMessageActionOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - requestState.UsePostMethod = true; - Tuple JsonAndStatusTuple; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channelName }, + ResponseType = PNOperationType.PNAddMessageActionOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this, + UsePostMethod = true + }; + Tuple jsonAndStatusTuple; var requestParameters = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameters, PNOperationType.PNPublishOperation); @@ -126,14 +129,15 @@ private void Publish(string channel, long messageTimetoken, PNMessageAction mess if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); - JsonAndStatusTuple = new Tuple(responseString, status); + jsonAndStatusTuple = new Tuple(responseString, status); } else { - JsonAndStatusTuple = new Tuple("", errorStatus); + jsonAndStatusTuple = new Tuple("", errorStatus); } - string json = JsonAndStatusTuple.Item1; + string json = jsonAndStatusTuple.Item1; if (!string.IsNullOrEmpty(json)) { List result = ProcessJsonResponse(requestState, json); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { requestState.PubnubCallback.OnResponse(default, errorStatus); @@ -142,6 +146,7 @@ private void Publish(string channel, long messageTimetoken, PNMessageAction mess int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNAddMessageActionResult), status); } CleanUp(); @@ -166,12 +171,15 @@ private async Task> Publish(string channel, l returnValue.Status = status; return returnValue; } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNAddMessageActionOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - requestState.UsePostMethod = true; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNAddMessageActionOperation, + Reconnect = false, + EndPointOperation = this, + UsePostMethod = true + }; Tuple JsonAndStatusTuple; @@ -207,6 +215,7 @@ private async Task> Publish(string channel, l PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAddMessageActionOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/FireOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/FireOperation.cs index 1a98f1ba1..e1cd80d8f 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/FireOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/FireOperation.cs @@ -83,12 +83,14 @@ public void Execute(PNCallback callback) if (callback == null) { throw new ArgumentException("Missing userCallback"); } + logger.Trace($"{GetType().Name} Execute invoked"); Fire(this.channelName, this.publishContent, false, this.ttl, this.userMetadata, this.queryParam, callback); } public async Task> ExecuteAsync() { syncRequest = false; + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await Fire(this.channelName, this.publishContent, false, this.ttl, this.userMetadata, this.queryParam).ConfigureAwait(false); } @@ -126,13 +128,15 @@ private void Fire(string channel, object message, bool storeInHistory, int ttl, if (callback == null) { return; } - - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNFireOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNFireOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNFireOperation); @@ -148,15 +152,18 @@ private void Fire(string channel, object message, bool storeInHistory, int ttl, int publishStatus; var _ = Int32.TryParse(result[0].ToString(), out publishStatus); if (publishStatus == 1) { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString()); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNFireOperation, category, requestState, 400, new PNException(responseString)); if (requestState.PubnubCallback != null) { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNPublishResult), status); } } } else { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } @@ -164,6 +171,7 @@ private void Fire(string channel, object message, bool storeInHistory, int ttl, int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNFireOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNPublishResult), status); } }); @@ -184,12 +192,14 @@ private async Task> Fire(string channel, object messag returnValue.Status = errStatus; return returnValue; } - - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNFireOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNFireOperation, + Reconnect = false, + EndPointOperation = this + }; Tuple JsonAndStatusTuple; var requestParameter = CreateRequestParameter(); @@ -231,6 +241,7 @@ private async Task> Fire(string channel, object messag PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNFireOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -293,7 +304,7 @@ private string PrepareContent(object originalMessage) { string message = jsonLibrary.SerializeToJsonString(originalMessage); if (config.CryptoModule != null || config.CipherKey.Length > 0) { - config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, config.UseRandomInitializationVector, pubnubLog), null); + config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, config.UseRandomInitializationVector), null); string encryptMessage = config.CryptoModule.Encrypt(message); message = jsonLibrary.SerializeToJsonString(encryptMessage); } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/GetMessageActionsOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/GetMessageActionsOperation.cs index aa4a9a460..d81f22d08 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/GetMessageActionsOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/GetMessageActionsOperation.cs @@ -82,7 +82,7 @@ public void Execute(PNCallback callback) if (callback == null) { throw new ArgumentException("Missing userCallback"); } - + logger.Trace($"{GetType().Name} Execute invoked"); GetMessageActions(this.messageActionChannelName, this.startTimetoken, this.endTimetoken, this.limit, this.queryParam, callback); } @@ -91,7 +91,7 @@ public async Task> ExecuteAsync() if (config == null || string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length <= 0) { throw new MissingMemberException("subscribe key is required"); } - + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await GetMessageActions(this.messageActionChannelName, this.startTimetoken, this.endTimetoken, this.limit, this.queryParam).ConfigureAwait(false); } @@ -103,17 +103,21 @@ internal void Retry() private void GetMessageActions(string channel, long start, long end, int limit, Dictionary externalQueryParam, PNCallback callback) { if (string.IsNullOrEmpty(messageActionChannelName) || string.IsNullOrEmpty(messageActionChannelName.Trim())) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")) + }; callback.OnResponse(null, status); return; } if (string.IsNullOrEmpty(config.SubscribeKey) || string.IsNullOrEmpty(config.SubscribeKey.Trim()) || config.SubscribeKey.Length <= 0) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")) + }; callback.OnResponse(null, status); return; } @@ -121,12 +125,15 @@ private void GetMessageActions(string channel, long start, long end, int limit, if (callback == null) { return; } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { messageActionChannelName }; - requestState.ResponseType = PNOperationType.PNGetMessageActionsOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { messageActionChannelName }, + ResponseType = PNOperationType.PNGetMessageActionsOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; string responseString; var requestParameter = CreateRequestParameter(); @@ -137,14 +144,17 @@ private void GetMessageActions(string channel, long start, long end, int limit, if (!string.IsNullOrEmpty(responseString)) { requestState.GotJsonResponse = true; List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(null, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNGetMessageActionsResult), status); } }); @@ -156,25 +166,32 @@ private async Task> GetMessageActions(string PNResult returnValue = new PNResult(); if (string.IsNullOrEmpty(channel) || string.IsNullOrEmpty(channel.Trim())) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")) + }; returnValue.Status = status; return returnValue; } if (string.IsNullOrEmpty(config.SubscribeKey) || string.IsNullOrEmpty(config.SubscribeKey.Trim()) || config.SubscribeKey.Length <= 0) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")) + }; returnValue.Status = status; return returnValue; } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNGetMessageActionsOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNGetMessageActionsOperation, + Reconnect = false, + EndPointOperation = this + }; Tuple JsonAndStatusTuple; var requestParameter = CreateRequestParameter(); @@ -207,6 +224,7 @@ private async Task> GetMessageActions(string PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNGetMessageActionsOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/ListenerManager.cs b/src/Api/PubnubApi/EndPoint/PubSub/ListenerManager.cs index 7c53f7a37..7cc822482 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/ListenerManager.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/ListenerManager.cs @@ -42,18 +42,20 @@ public bool AddListener(SubscribeCallback listener) List callbackList = SubscribeCallbackListenerList[PubnubInstance.InstanceId]; callbackList.Add(listener); SubscribeCallbackListenerList[PubnubInstance.InstanceId] = callbackList; + pubnubConfig.Logger.Debug($"AddListener: Listener added"); } else { List callbackList = new List(); callbackList.Add(listener); SubscribeCallbackListenerList.GetOrAdd(PubnubInstance.InstanceId, callbackList); + pubnubConfig.Logger.Debug($"AddListener: Listener added"); } ret = true; } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: AddListener exception {ex}" ,pubnubConfig.LogVerbosity); + pubnubConfig.Logger.Error($"AddListener exception {ex.Message} stack trace: {ex.StackTrace}"); } } } @@ -78,11 +80,12 @@ public bool RemoveListener(SubscribeCallback listener) ret = true; } SubscribeCallbackListenerList[PubnubInstance.InstanceId] = callbackList; + pubnubConfig.Logger.Debug($"RemoveListener: Listener removed"); } } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: removeListener Exception {ex}", pubnubConfig.LogVerbosity); + pubnubConfig.Logger.Error($"RemoveListener exception {ex.Message} stack trace: {ex.StackTrace}"); } } } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/PublishOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/PublishOperation.cs index 03218a523..3846355f8 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/PublishOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/PublishOperation.cs @@ -28,7 +28,7 @@ public class PublishOperation : PubnubCoreBase private bool syncRequest; private Dictionary queryParam; - public PublishOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, EndPoint.TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) + public PublishOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) { config = pubnubConfig; jsonLibrary = jsonPluggableLibrary; @@ -38,7 +38,7 @@ public PublishOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary json public PublishOperation Message(object message) { - this.publishContent = message; + publishContent = message; return this; } @@ -50,19 +50,19 @@ public PublishOperation Channel(string channelName) public PublishOperation ShouldStore(bool store) { - this.storeInHistory = store; + storeInHistory = store; return this; } public PublishOperation Meta(Dictionary metadata) { - this.userMetadata = metadata; + userMetadata = metadata; return this; } public PublishOperation UsePOST(bool post) { - this.httpPost = post; + httpPost = post; return this; } @@ -85,7 +85,7 @@ public PublishOperation CustomMessageType(string customMessageType) public PublishOperation QueryParam(Dictionary customQueryParam) { - this.queryParam = customQueryParam; + queryParam = customQueryParam; return this; } @@ -97,7 +97,7 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { - if (string.IsNullOrEmpty(this.channelName) || string.IsNullOrEmpty(channelName.Trim()) || this.publishContent == null) { + if (string.IsNullOrEmpty(channelName) || string.IsNullOrEmpty(channelName.Trim()) || publishContent == null) { throw new ArgumentException("Missing Channel or Message"); } @@ -108,31 +108,33 @@ public void Execute(PNCallback callback) if (callback == null) { throw new ArgumentException("Missing userCallback"); } - this.savedCallback = callback; - Publish(channelName, this.publishContent, this.storeInHistory, this.ttl, this.userMetadata, this.queryParam, callback); + savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); + Publish(channelName, publishContent, storeInHistory, ttl, userMetadata, queryParam, callback); } public async Task> ExecuteAsync() { syncRequest = false; - return await Publish(this.channelName, this.publishContent, this.storeInHistory, this.ttl, this.userMetadata, this.queryParam).ConfigureAwait(false); + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); + return await Publish(channelName, publishContent, storeInHistory, ttl, userMetadata, queryParam).ConfigureAwait(false); } public PNPublishResult Sync() { - if (this.publishContent == null) { + if (publishContent == null) { throw new ArgumentException("message cannot be null"); } if (config == null || string.IsNullOrEmpty(config.PublishKey) || config.PublishKey.Trim().Length <= 0) { throw new MissingMemberException("publish key is required"); } - - ManualResetEvent syncEvent = new System.Threading.ManualResetEvent(false); + logger.Debug($"{GetType().Name} parameter validated."); + ManualResetEvent syncEvent = new ManualResetEvent(false); Task task = Task.Factory.StartNew(() => { syncRequest = true; - syncEvent = new System.Threading.ManualResetEvent(false); - Publish(this.channelName, this.publishContent, this.storeInHistory, this.ttl, this.userMetadata, this.queryParam, new PNPublishResultExt((r, s) => { SyncResult = r; syncEvent.Set(); })); + syncEvent = new ManualResetEvent(false); + Publish(channelName, publishContent, storeInHistory, ttl, userMetadata, queryParam, new PNPublishResultExt((r, s) => { SyncResult = r; syncEvent.Set(); })); syncEvent.WaitOne(config.NonSubscribeRequestTimeout * 1000); return SyncResult; @@ -144,7 +146,7 @@ public PNPublishResult Sync() internal void Retry() { - Publish(this.channelName, this.publishContent, this.storeInHistory, this.ttl, this.userMetadata, this.queryParam, savedCallback); + Publish(channelName, publishContent, storeInHistory, ttl, userMetadata, queryParam, savedCallback); } internal void Publish(string channel, object message, bool storeInHistory, int ttl, Dictionary userMetadata, Dictionary externalQueryParam, PNCallback callback) @@ -164,6 +166,7 @@ internal void Publish(string channel, object message, bool storeInHistory, int t callback.OnResponse(null, status); return; } + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState { Channels = [channel], @@ -186,15 +189,18 @@ internal void Publish(string channel, object message, bool storeInHistory, int t if (result != null && result.Count >= 3) { _ = int.TryParse(result[0].ToString(), out var publishStatus); if (publishStatus == 1) { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString()); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, 400, new PNException(responseString)); if (requestState.PubnubCallback != null) { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } } } else { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } @@ -202,6 +208,7 @@ internal void Publish(string channel, object message, bool storeInHistory, int t int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -236,6 +243,7 @@ internal async Task> Publish(string channel, object me Reconnect = false, EndPointOperation = this }; + logger.Debug($"{GetType().Name} parameter validated."); var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNPublishOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest).ConfigureAwait(false); @@ -287,6 +295,7 @@ internal async Task> Publish(string channel, object me PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } @@ -309,7 +318,7 @@ private string PrepareContent(object originalMessage) { string message = jsonLibrary.SerializeToJsonString(originalMessage); if (config.CryptoModule != null || config.CipherKey.Length > 0) { - config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, config.UseRandomInitializationVector, pubnubLog), null); + config.CryptoModule ??= new CryptoModule(new LegacyCryptor(config.CipherKey, config.UseRandomInitializationVector), null); string encryptMessage = config.CryptoModule.Encrypt(message); message = jsonLibrary.SerializeToJsonString(encryptMessage); } @@ -328,7 +337,7 @@ private RequestParameter CreateRequestParameter() "0" ]; if (!httpPost) { - urlSegments.Add(PrepareContent(this.publishContent)); + urlSegments.Add(PrepareContent(publishContent)); } Dictionary requestQueryStringParams = new Dictionary(); diff --git a/src/Api/PubnubApi/EndPoint/PubSub/RemoveMessageActionOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/RemoveMessageActionOperation.cs index 24e7b9626..1405c6df7 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/RemoveMessageActionOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/RemoveMessageActionOperation.cs @@ -21,7 +21,7 @@ public class RemoveMessageActionOperation : PubnubCoreBase private PNCallback savedCallback; private Dictionary queryParam; - public RemoveMessageActionOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, EndPoint.TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) + public RemoveMessageActionOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) { config = pubnubConfig; jsonLibrary = jsonPluggableLibrary; @@ -80,7 +80,8 @@ public void Execute(PNCallback callback) if (callback == null) { throw new ArgumentException("Missing userCallback"); } - RemoveMessageAction(this.channelName, this.messageTimetoken, this.actionTimetoken, this.actionUuid, this.queryParam, callback); + logger.Trace($"{GetType().Name} Execute invoked"); + RemoveMessageAction(channelName, messageTimetoken, actionTimetoken, actionUuid, queryParam, callback); } public async Task> ExecuteAsync() @@ -88,29 +89,33 @@ public async Task> ExecuteAsync() if (config == null || string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length <= 0) { throw new MissingMemberException("subscribe key is required"); } - - return await RemoveMessageAction(this.channelName, this.messageTimetoken, this.actionTimetoken, this.actionUuid, this.queryParam).ConfigureAwait(false); + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); + return await RemoveMessageAction(channelName, messageTimetoken, actionTimetoken, actionUuid, queryParam).ConfigureAwait(false); } internal void Retry() { - RemoveMessageAction(this.channelName, this.messageTimetoken, this.actionTimetoken, this.actionUuid, this.queryParam, savedCallback); + RemoveMessageAction(channelName, messageTimetoken, actionTimetoken, actionUuid, queryParam, savedCallback); } private void RemoveMessageAction(string channel, long messageTimetoken, long actionTimetoken, string messageActionUuid, Dictionary externalQueryParam, PNCallback callback) { if (string.IsNullOrEmpty(channel) || string.IsNullOrEmpty(channel.Trim())) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")) + }; callback.OnResponse(null, status); return; } if (string.IsNullOrEmpty(config.SubscribeKey) || string.IsNullOrEmpty(config.SubscribeKey.Trim()) || config.SubscribeKey.Length <= 0) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")) + }; callback.OnResponse(null, status); return; } @@ -118,12 +123,15 @@ private void RemoveMessageAction(string channel, long messageTimetoken, long act if (callback == null) { return; } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNRemoveMessageActionOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNRemoveMessageActionOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNRemoveMessageActionOperation); @@ -133,12 +141,14 @@ private void RemoveMessageAction(string channel, long messageTimetoken, long act if (!string.IsNullOrEmpty(responseString)) { requestState.GotJsonResponse = true; List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveMessageActionOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNRemoveMessageActionResult), status); } CleanUp(); @@ -150,44 +160,49 @@ private async Task> RemoveMessageAction(st PNResult returnValue = new PNResult(); if (string.IsNullOrEmpty(channel) || string.IsNullOrEmpty(channel.Trim())) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Missing Channel or MessageAction", new ArgumentException("Missing Channel or MessageAction")) + }; returnValue.Status = status; return returnValue; } if (string.IsNullOrEmpty(config.SubscribeKey) || string.IsNullOrEmpty(config.SubscribeKey.Trim()) || config.SubscribeKey.Length <= 0) { - PNStatus status = new PNStatus(); - status.Error = true; - status.ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")); + PNStatus status = new PNStatus + { + Error = true, + ErrorData = new PNErrorData("Invalid subscribe key", new MissingMemberException("Invalid subscribe key")) + }; returnValue.Status = status; return returnValue; } - - RequestState requestState = new RequestState(); - Tuple JsonAndStatusTuple; - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNRemoveMessageActionOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNRemoveMessageActionOperation, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNRemoveMessageActionOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); - if (transportResponse.Error == null) { string responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple jsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); - JsonAndStatusTuple = new Tuple(responseString, status); + jsonAndStatusTuple = new Tuple(responseString, status); } else { - JsonAndStatusTuple = new Tuple("", errorStatus); + jsonAndStatusTuple = new Tuple("", errorStatus); } - returnValue.Status = JsonAndStatusTuple.Item2; - string json = JsonAndStatusTuple.Item1; + returnValue.Status = jsonAndStatusTuple.Item2; + string json = jsonAndStatusTuple.Item1; if (!string.IsNullOrEmpty(json)) { List resultList = ProcessJsonResponse(requestState, json); ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog); @@ -202,12 +217,13 @@ private async Task> RemoveMessageAction(st PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveMessageActionOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } private void CleanUp() { - this.savedCallback = null; + savedCallback = null; } private RequestParameter CreateRequestParameter() diff --git a/src/Api/PubnubApi/EndPoint/PubSub/SignalOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/SignalOperation.cs index 3f7223f99..91b373cc2 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/SignalOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/SignalOperation.cs @@ -52,6 +52,7 @@ public SignalOperation QueryParam(Dictionary customQueryParam) public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (string.IsNullOrEmpty(this.channelName) || string.IsNullOrEmpty(channelName.Trim()) || this.signalMessage == null) { throw new ArgumentException("Missing Channel or Message"); } @@ -72,6 +73,7 @@ public void Execute(PNCallback callback) public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await Signal(this.channelName, this.signalMessage, null, this.queryParam).ConfigureAwait(false); } @@ -99,12 +101,15 @@ private void Signal(string channel, object message, Dictionary m callback.OnResponse(null, status); return; } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNSignalOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNSignalOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameters = CreateRequestParameter(); @@ -115,15 +120,16 @@ private void Signal(string channel, object message, Dictionary m if (!string.IsNullOrEmpty(responseString)) { requestState.GotJsonResponse = true; List result = ProcessJsonResponse(requestState, responseString); - if (result != null && result.Count >= 3) { _ = Int32.TryParse(result[0].ToString(), out var signalStatus); if (signalStatus == 1) { + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(400, result[1].ToString()); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNSignalOperation, category, requestState, 400, new PNException(responseString)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } } else { @@ -134,6 +140,7 @@ private void Signal(string channel, object message, Dictionary m int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNSignalOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -160,12 +167,14 @@ private async Task> Signal(string channel, object mess returnValue.Status = errStatus; return returnValue; } - - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNSignalOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNSignalOperation, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNPublishOperation); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest).ConfigureAwait(false); @@ -217,6 +226,7 @@ private async Task> Signal(string channel, object mess PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNPublishOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeEndpoint.cs b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeEndpoint.cs index ac2b6093e..d0550eee1 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeEndpoint.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeEndpoint.cs @@ -163,11 +163,11 @@ private void SubscribeEventEngine_OnEventQueued(IEvent @event) { attempts = receiveReconnectingState.AttemptedRetries; } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] event engine OnEventQueued : CurrentState: {subscribeEventEngine.CurrentState.GetType().Name}; Event = {@event.GetType().Name}; Attempt = {attempts}", config.LogVerbosity); + config.Logger.Trace($"event engine OnEventQueued : CurrentState: {subscribeEventEngine.CurrentState.GetType().Name}; Event = {@event.GetType().Name}; Attempt = {attempts}"); } catch(Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: event engine OnEventQueued : CurrentState = {subscribeEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}", config.LogVerbosity); + config.Logger.Error($"event engine OnEventQueued : CurrentState = {subscribeEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}"); } } @@ -175,11 +175,12 @@ private void SubscribeEventEngine_OnStateTransition(EventEngine.Core.TransitionR { try { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] event engine OnStateTransition : CurrentState = {subscribeEventEngine.CurrentState.GetType().Name} => Transition State = {obj?.State.GetType().Name}", config.LogVerbosity); + config.Logger.Trace($"event engine OnStateTransition : CurrentState = {subscribeEventEngine.CurrentState.GetType().Name} => Transition State = {obj?.State.GetType().Name}"); } catch(Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: event engine OnStateTransition : CurrentState = {subscribeEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}", config.LogVerbosity); + config.Logger.Error( + $"event engine OnStateTransition : CurrentState = {subscribeEventEngine.CurrentState.GetType().Name} => EXCEPTION = {ex}"); } } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager.cs b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager.cs index ed46ffb8a..8c5b223fd 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager.cs @@ -182,11 +182,13 @@ internal void MultiChannelUnSubscribeInit(PNOperationType type, string channe PresenceHeartbeatTimer.Dispose(); PresenceHeartbeatTimer = null; } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] All channels are Unsubscribed. Further subscription was stopped", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Debug($"All channels are Unsubscribed. Further subscription was stopped"); } } - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: At SubscribeManager.MultiChannelUnSubscribeInit() \n channel(s)={string.Join(",", validChannels.OrderBy(x => x).ToArray())} \n cg(s)={string.Join(",", validChannelGroups.OrderBy(x => x).ToArray())} \n Exception Details={ex}", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + } catch (Exception ex) + { + logger.Error( + $"At SubscribeManager.MultiChannelUnSubscribeInit() \n channel(s)={string.Join(",", validChannels.OrderBy(x => x).ToArray())} \n cg(s)={string.Join(",", validChannelGroups.OrderBy(x => x).ToArray())} \n Exception Details={ex}"); } } @@ -217,7 +219,7 @@ internal void MultiChannelSubscribeInit(PNOperationType responseType, string[ if (channelGroups != null && channelGroups.Length > 0 && (channels == null || channels.Length == 0)) { channelGroupSubscribeOnly = true; } - LoggingMethod.WriteToLog(pubnubLog,$"MultiChannelSubscribeRequest with tt=0", PNLogVerbosity.BODY); + logger.Debug($"MultiChannelSubscribeRequest with tt=0"); MultiChannelSubscribeRequest(responseType, channels, channelGroups, 0, 0, false, initialSubscribeUrlParams, externalQueryParam); if (SubscribeHeartbeatCheckTimer != null) { @@ -226,24 +228,27 @@ internal void MultiChannelSubscribeInit(PNOperationType responseType, string[ } catch { /* ignore */ } } } - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"subscribe initialisation opeartion encountered error {ex.Message}", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + } catch (Exception ex) + { + logger.Error($"subscribe initialisation opeartion encountered error {ex.Message}"); } } private void MultiChannelSubscribeRequest(PNOperationType type, string[] channels, string[] channelGroups, object timetoken, int region, bool reconnect, Dictionary initialSubscribeUrlParams, Dictionary externalQueryParam) { - if (!config.ContainsKey(PubnubInstance.InstanceId)) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] InstanceId Not Available. Exiting MultiChannelSubscribeRequest", PNLogVerbosity.BODY); + if (!config.ContainsKey(PubnubInstance.InstanceId)) + { + logger.Trace($"InstanceId Not Available. Exiting MultiChannelSubscribeRequest"); return; } if (SubscribeDisconnected[PubnubInstance.InstanceId]) { - LoggingMethod.WriteToLog(pubnubLog,$"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeDisconnected. Exiting MultiChannelSubscribeRequest", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Trace($"SubscribeDisconnected. Exiting MultiChannelSubscribeRequest"); return; } //Exit if the channel is unsubscribed - if (SubscriptionChannels[PubnubInstance.InstanceId].Count <= 0 && SubscriptionChannelGroups[PubnubInstance.InstanceId].Count <= 0) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Zero channels/channelGroups. Further subscription was stopped", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + if (SubscriptionChannels[PubnubInstance.InstanceId].Count <= 0 && SubscriptionChannelGroups[PubnubInstance.InstanceId].Count <= 0) + { + logger.Trace($"Zero channels/channelGroups. Further subscription was stopped"); return; } TerminateCurrentSubscriberRequest(); @@ -275,7 +280,8 @@ private void MultiChannelSubscribeRequest(PNOperationType type, string[] chan this.customQueryParam = externalQueryParam; RegisterPresenceHeartbeatTimer(channels, channelGroups); long lastTimetoken = LastSubscribeTimetoken.ContainsKey(PubnubInstance.InstanceId)? LastSubscribeTimetoken[PubnubInstance.InstanceId] : 0; - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Building request for channel(s)={multiChannel}, channelgroup(s)={multiChannelGroup} with timetoken={lastTimetoken}", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace( + $"Building request for channel(s)={multiChannel}, channelgroup(s)={multiChannelGroup} with timetoken={lastTimetoken}"); string channelsJsonState = BuildJsonUserState(channels, channelGroups, false); config[PubnubInstance.InstanceId].UserId = CurrentUserId[PubnubInstance.InstanceId]; // to make sure we capture if UUID is changed pubnubRequestState = new RequestState @@ -324,7 +330,7 @@ private void MultiChannelSubscribeRequest(PNOperationType type, string[] chan } }); } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] method:_subscribe \n channel={string.Join(",", channels.OrderBy(x => x).ToArray())} \n timetoken={timetoken} \n Exception Details={ex}", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Error($"method:_subscribe \n channel={string.Join(",", channels.OrderBy(x => x).ToArray())} \n timetoken={timetoken} \n Exception Details={ex}"); PNStatusCategory errorCategory = PNStatusCategoryHelper.GetPNStatusCategory(ex); PNStatus status = new StatusBuilder(config[PubnubInstance.InstanceId], jsonLibrary).CreateStatusResponse(type, errorCategory, pubnubRequestState, Constants.ResourceNotFoundStatusCode, new PNException(ex)); if (channels != null && channels.Length > 0) { @@ -340,7 +346,7 @@ private void MultiChannelSubscribeRequest(PNOperationType type, string[] chan private void MultiplexExceptionHandlerTimerCallback(object state) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] MultiplexExceptionHandlerTimerCallback", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($" MultiplexExceptionHandlerTimerCallback"); RequestState currentState = state as RequestState; if (currentState != null) { MultiplexExceptionHandler(currentState.ResponseType, currentState.Channels, currentState.ChannelGroups, false); @@ -399,11 +405,12 @@ private void MultiplexInternalCallback(PNOperationType type, object multiplex long timetoken = GetTimetokenFromMultiplexResult(message); int region = GetRegionFromMultiplexResult(message); - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] MultiplexInternalCallback timetoken = {timetoken}; region = {region}", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Calling MultiChannelSubscribeRequest tt {timetoken}",PNLogVerbosity.BODY); + logger.Trace($"MultiplexInternalCallback timetoken = {timetoken}; region = {region}"); + logger.Trace($"Calling MultiChannelSubscribeRequest tt {timetoken}"); MultiChannelSubscribeRequest(type, channels, channelGroups, timetoken, region, false, null, this.customQueryParam); - } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Lost Channel Name for resubscribe", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + } else + { + logger.Error($"Lost Channel Name for resubscribe"); } } @@ -416,18 +423,19 @@ private bool ReconnectNetworkIfOverrideTcpKeepAlive(PNOperationType type, str netState.ResponseType = type; netState.Timetoken = timetoken; netState.Region = region; - if (!config.ContainsKey(PubnubInstance.InstanceId)) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}], InstanceId Not Available. So no reconnect", PNLogVerbosity.BODY); + if (!config.ContainsKey(PubnubInstance.InstanceId)) + { + logger.Trace($" InstanceId Not Available. So no reconnect"); } if (SubscribeDisconnected[PubnubInstance.InstanceId]) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Subscribe is still Disconnected. So no reconnect", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Trace($"Subscribe is still Disconnected. So no reconnect"); } else if (config[PubnubInstance.InstanceId].ReconnectionPolicy != PNReconnectionPolicy.NONE) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Subscribe - No internet connection for channel={string.Join(",", channels.OrderBy(x => x).ToArray())} and channelgroup={(channelGroups != null ? string.Join(",", channelGroups) : "")}; networkAvailable={networkAvailable}", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Trace($"Subscribe - No internet connection for channel={string.Join(",", channels.OrderBy(x => x).ToArray())} and channelgroup={(channelGroups != null ? string.Join(",", channelGroups) : "")}; networkAvailable={networkAvailable}"); TerminateReconnectTimer(); ReconnectNetwork(netState); } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] reconnection policy is DISABLED, please handle reconnection manually.", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Warn($"reconnection policy is DISABLED, please handle reconnection manually."); if (!networkAvailable) { PNStatusCategory errorCategory = PNStatusCategory.PNNetworkIssuesCategory; PNStatus status = new StatusBuilder(config[PubnubInstance.InstanceId], jsonLibrary).CreateStatusResponse(type, errorCategory, null, Constants.ResourceNotFoundStatusCode, new PNException("SDK Network related error")); @@ -450,7 +458,7 @@ private bool ReconnectNetworkIfOverrideTcpKeepAlive(PNOperationType type, str private void ReconnectNetwork(ReconnectState netState) { if (netState != null && ((netState.Channels != null && netState.Channels.Length > 0) || (netState.ChannelGroups != null && netState.ChannelGroups.Length > 0))) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager ReconnectNetwork interval = {PubnubNetworkTcpCheckIntervalInSeconds} sec", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($"SubscribeManager ReconnectNetwork interval = {PubnubNetworkTcpCheckIntervalInSeconds} sec"); System.Threading.Timer timer; @@ -490,7 +498,7 @@ internal bool Reconnect(bool resetSubscribeTimetoken) networkConnection = CheckInternetConnectionStatus(PubnetSystemActive, PNOperationType.PNSubscribeOperation, null, channels, channelGroups); } if (!networkConnection) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] No network for SubscribeManager Manual Reconnect", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Warn($" No network for SubscribeManager Manual Reconnect"); PNStatusCategory errorCategory = PNStatusCategory.PNNetworkIssuesCategory; PNStatus status = new StatusBuilder(config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId] : null, jsonLibrary).CreateStatusResponse(PNOperationType.PNSubscribeOperation, errorCategory, null, Constants.ResourceNotFoundStatusCode, new PNException("SDK Network related error")); @@ -505,12 +513,12 @@ internal bool Reconnect(bool resetSubscribeTimetoken) return false; } } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] No channels/channelgroups for SubscribeManager Manual Reconnect", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Debug($"No channels/channelgroups for SubscribeManager Manual Reconnect"); return false; } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager Manual Reconnect", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($"SubscribeManager Manual Reconnect"); SubscribeDisconnected[PubnubInstance.InstanceId] = false; Task.Factory.StartNew(() => { @@ -529,7 +537,7 @@ internal bool Disconnect() if (SubscribeDisconnected[PubnubInstance.InstanceId]) { return false; } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager Manual Disconnect", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($"SubscribeManager Manual Disconnect"); SubscribeDisconnected[PubnubInstance.InstanceId] = true; TerminateCurrentSubscriberRequest(); TerminatePresenceHeartbeatTimer(); @@ -542,11 +550,11 @@ internal void StartSubscribeHeartbeatCheckCallback(object state) { try { if (SubscribeDisconnected[PubnubInstance.InstanceId]) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager - SubscribeDisconnected. No heartbeat check.", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($"SubscribeManager - SubscribeDisconnected. No heartbeat check."); return; } if (!config.ContainsKey(PubnubInstance.InstanceId)) { - LoggingMethod.WriteToLog(pubnubLog,$"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] InstanceId Not Available. So No heartbeat check.", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($"InstanceId Not Available. So No heartbeat check."); return; } @@ -558,9 +566,9 @@ internal void StartSubscribeHeartbeatCheckCallback(object state) if (networkConnection && PubnubInstance != null && SubscribeRequestTracker.ContainsKey(PubnubInstance.InstanceId)) { DateTime lastSubscribeRequestTime = SubscribeRequestTracker[PubnubInstance.InstanceId]; if ((DateTime.Now - lastSubscribeRequestTime).TotalSeconds < config[PubnubInstance.InstanceId].SubscribeTimeout) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager: expected subscribe within threshold limit of SubscribeTimeout", config[PubnubInstance.InstanceId].LogVerbosity); - } else if ((DateTime.Now - lastSubscribeRequestTime).TotalSeconds > 2 * (config[PubnubInstance.InstanceId].SubscribeTimeout - config[PubnubInstance.InstanceId].SubscribeTimeout / 2)) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager - **No auto subscribe within threshold limit of SubscribeTimeout**. Calling MultiChannelSubscribeRequest", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Trace($"SubscribeManager: expected subscribe within threshold limit of SubscribeTimeout"); + } else if (config != null && (DateTime.Now - lastSubscribeRequestTime).TotalSeconds > 2 * (config[PubnubInstance.InstanceId].SubscribeTimeout - config[PubnubInstance.InstanceId].SubscribeTimeout / 2)) { + logger.Trace($"SubscribeManager - **No auto subscribe within threshold limit of SubscribeTimeout. Calling MultiChannelSubscribeRequest"); Task.Factory.StartNew(() => { TerminateCurrentSubscriberRequest(); MultiChannelSubscribeRequest(PNOperationType.PNSubscribeOperation, channels, chananelGroups, LastSubscribeTimetoken[PubnubInstance.InstanceId], LastSubscribeRegion[PubnubInstance.InstanceId], false, null, this.customQueryParam); @@ -589,14 +597,14 @@ internal void StartSubscribeHeartbeatCheckCallback(object state) } } } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager - StartSubscribeHeartbeatCheckCallback - No channels/cgs avaialable", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Trace($"SubscribeManager - StartSubscribeHeartbeatCheckCallback - No channels/cgs avaialable"); try { SubscribeHeartbeatCheckTimer.Change(Timeout.Infinite, Timeout.Infinite); TerminateCurrentSubscriberRequest(); } catch { /* ignore */ } } } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager - StartSubscribeHeartbeatCheckCallback - EXCEPTION: {ex}", config[PubnubInstance.InstanceId].LogVerbosity); + logger.Error($" SubscribeManager - StartSubscribeHeartbeatCheckCallback - EXCEPTION: {ex}"); } } @@ -636,7 +644,8 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) if(!networkConnection){ ConnectionErrors++; UpdatePubnubNetworkTcpCheckIntervalInSeconds(); - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] channel={channel} {netState.ResponseType} reconnectNetworkCallback. Retry", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace( + $"channel={channel} {netState.ResponseType} reconnectNetworkCallback. Retry"); if (netState.Channels != null && netState.Channels.Length > 0) { PNStatus status = new StatusBuilder(config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId] : null, jsonLibrary).CreateStatusResponse(netState.ResponseType, PNStatusCategory.PNNetworkIssuesCategory, null, (int)System.Net.HttpStatusCode.NotFound, new PNException("Internet connection problem. Retrying connection")); if (netState.Channels != null && netState.Channels.Length > 0) { @@ -651,8 +660,9 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) } if (ChannelInternetStatus[PubnubInstance.InstanceId].ContainsKey(channel) && ChannelInternetStatus[PubnubInstance.InstanceId].TryGetValue(channel, out channelInternetFlag) && channelInternetFlag) { - if (ChannelReconnectTimer[PubnubInstance.InstanceId].ContainsKey(channel)) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}], {channel} {netState.ResponseType} terminating ch reconnectimer", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + if (ChannelReconnectTimer[PubnubInstance.InstanceId].ContainsKey(channel)) + { + logger.Trace($"{channel} {netState.ResponseType} terminating channel reconnect timer"); TerminateReconnectTimer(); } @@ -665,7 +675,8 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) } Announce(status); - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] channel={channel} {netState.ResponseType} reconnectNetworkCallback. Internet Available : {channelInternetFlag}", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace( + $"channel={channel} {netState.ResponseType} reconnectNetworkCallback. Internet Available : {channelInternetFlag}"); switch (netState.ResponseType) { case PNOperationType.PNSubscribeOperation: case PNOperationType.Presence: @@ -695,7 +706,8 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) ChannelInternetStatus[PubnubInstance.InstanceId].AddOrUpdate(channel, networkConnection, (key, oldValue) => networkConnection); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] channelgroup={channelGroup} {netState.ResponseType} reconnectNetworkCallback. Retrying",config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace( + $"channelgroup={channelGroup} {netState.ResponseType} reconnectNetworkCallback. Retrying"); if (netState.ChannelGroups != null && netState.ChannelGroups.Length > 0) { PNStatus status = new StatusBuilder(config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId] : null, jsonLibrary).CreateStatusResponse(netState.ResponseType, PNStatusCategory.PNReconnectedCategory, null, (int)System.Net.HttpStatusCode.NotFound, new PNException("Internet connection problem. Retrying connection")); @@ -711,8 +723,9 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) } if (ChannelGroupInternetStatus[PubnubInstance.InstanceId].TryGetValue(channelGroup, out channelGroupInternetFlag) && channelGroupInternetFlag) { - if (ChannelGroupReconnectTimer[PubnubInstance.InstanceId].ContainsKey(channelGroup)) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] {channelGroup} {netState.ResponseType} terminating cg reconnectimer", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + if (ChannelGroupReconnectTimer[PubnubInstance.InstanceId].ContainsKey(channelGroup)) + { + logger.Trace($"{channelGroup} {netState.ResponseType} terminating channel group reconnect timer"); TerminateReconnectTimer(); } @@ -728,7 +741,7 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) Announce(status); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] channelgroup={channelGroup} {netState.ResponseType} reconnectNetworkCallback. Internet Available", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Trace($" channelgroup={channelGroup} {netState.ResponseType} reconnectNetworkCallback. Internet Available"); switch (netState.ResponseType) { case PNOperationType.PNSubscribeOperation: case PNOperationType.Presence: @@ -739,8 +752,9 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) } } } - } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Unknown request state in reconnectNetworkCallback", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + } else + { + logger.Trace($"Unknown request state in reconnectNetworkCallback"); } } catch (Exception ex) { if (netState != null) { @@ -755,7 +769,7 @@ protected void ReconnectNetworkCallback(System.Object reconnectState) Announce(status); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] method:reconnectNetworkCallback \n Exception Details={1}", config.ContainsKey(PubnubInstance.InstanceId) ? config[PubnubInstance.InstanceId].LogVerbosity : PNLogVerbosity.NONE); + logger.Error($" method:reconnectNetworkCallback \n Exception message = {ex.Message} Details={ex.StackTrace}"); } } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager2.cs b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager2.cs index fb9c57159..f11f7e01b 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager2.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeManager2.cs @@ -18,6 +18,7 @@ internal class SubscribeManager2 : IDisposable private Pubnub pubnubInstance; private CancellationTokenSource cancellationTokenSource; private Timer SubscribeHeartbeatCheckTimer; + private PubnubLogModule logger; public SubscribeManager2(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, EndPoint.TokenManager tokenManager, Pubnub instance) { config = pubnubConfig; @@ -25,6 +26,7 @@ public SubscribeManager2(PNConfiguration pubnubConfig, IJsonPluggableLibrary jso unit = pubnubUnit; pubnubLog = log; pubnubInstance = instance; + logger = pubnubConfig.Logger; } public async Task> HandshakeRequest(PNOperationType responseType, string[] channels, string[] channelGroups, long? timetoken, int? region, Dictionary initialSubscribeUrlParams, Dictionary externalQueryParam) @@ -70,12 +72,15 @@ internal void HandshakeRequestCancellation() if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); - } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => HandshakeRequestCancellation. No request to cancel.", config.LogVerbosity); + } else + { + logger.Trace($" SubscribeManager HandshakeRequestCancellation. No request to cancel."); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => HandshakeRequestCancellation. Done.", config.LogVerbosity); - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => HandshakeRequestCancellation Exception: {ex}", config.LogVerbosity); + + logger.Trace($"SubscribeManager HandshakeRequestCancellation. Done."); + } catch (Exception ex) + { + logger.Trace($" SubscribeManager HandshakeRequestCancellation Exception: {ex}"); } } internal async Task, PNStatus>> ReceiveRequest(PNOperationType responseType, string[] channels, string[] channelGroups, long? timetoken, int? region, Dictionary initialSubscribeUrlParams, Dictionary externalQueryParam) @@ -113,8 +118,10 @@ internal async Task, PNStatus>> ReceiveRequest, PNStatus>(null, errStatus); - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager=> MultiChannelSubscribeInit \n channel(s)={string.Join(",", channels.OrderBy(x => x).ToArray())} \n cg(s)={string.Join(",", channelGroups.OrderBy(x => x).ToArray())} \n Exception Details={ex}", config.LogVerbosity); + } catch (Exception ex) + { + logger.Error( + $" SubscribeManager=> MultiChannelSubscribeInit \n channel(s)={string.Join(",", channels.OrderBy(x => x).ToArray())} \n cg(s)={string.Join(",", channelGroups.OrderBy(x => x).ToArray())} \n Exception Details={ex}"); } return resp; } @@ -126,11 +133,12 @@ internal void ReceiveRequestCancellation() cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => RequestCancellation. No request to cancel.", config.LogVerbosity); + logger.Trace($"SubscribeManager RequestCancellation. No request to cancel."); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => ReceiveRequestCancellation. Done.", config.LogVerbosity); - } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: SubscribeManager => ReceiveRequestCancellation Exception: {ex}", config.LogVerbosity); + logger.Trace($"SubscribeManager ReceiveRequestCancellation. Done."); + } catch (Exception ex) + { + logger.Trace($"SubscribeManager ReceiveRequestCancellation Exception: {ex}"); } } @@ -141,11 +149,11 @@ internal void ReceiveReconnectRequestCancellation() cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); } else { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => ReceiveReconnectRequestCancellation. No request to cancel.", config.LogVerbosity); + logger.Trace($"SubscribeManager ReceiveReconnectRequestCancellation. No request to cancel."); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] SubscribeManager => ReceiveReconnectRequestCancellation. Done.", config.LogVerbosity); + logger.Trace($"SubscribeManager ReceiveReconnectRequestCancellation. Done."); } catch (Exception ex) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: SubscribeManager => ReceiveReconnectRequestCancellation Exception: {ex}", config.LogVerbosity); + logger.Trace($"SubscribeManager ReceiveReconnectRequestCancellation Exception: {ex}"); } } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation.cs index c68018acc..4f5a911c0 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation.cs @@ -195,7 +195,7 @@ private void Subscribe(string[] channels, string[] channelGroups, Dictionary x).ToArray()) : ""; string channelGroup = (channelGroups != null) ? string.Join(",", channelGroups.OrderBy(x => x).ToArray()) : ""; - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] requested subscribe for channel(s)={channel} and channel group(s)={channelGroup}", config.LogVerbosity); + config.Logger.Debug($"requested subscribe for channel(s)={channel} and channel group(s)={channelGroup}"); Dictionary initialSubscribeUrlParams = new Dictionary(); if (this.subscribeTimetoken >= 0) diff --git a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllEndpoint.cs b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllEndpoint.cs index 7014f6861..0e4cf6997 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllEndpoint.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllEndpoint.cs @@ -28,7 +28,9 @@ public UnsubscribeAllEndpoint(PNConfiguration pubnubConfig, IJsonPluggableLibrar private void UnsubscribeAll() { + logger.Trace($"{GetType().Name} Execute invoked"); if (subscribeEventEngineFactory.HasEventEngine(instanceId)) { + logger.Trace($"EventEngine instance found."); SubscribeEventEngine subscribeEventEngine = subscribeEventEngineFactory.GetEventEngine(instanceId); subscribeEventEngine.UnsubscribeAll(); } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllOperation.cs index 6b7d088a3..f87c0e0e2 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeAllOperation.cs @@ -33,6 +33,7 @@ public UnsubscribeAllOperation QueryParam(Dictionary customQu private void UnsubscribeAll() { + logger.Trace($"{GetType().Name} execution started."); SubscribeManager manager = new SubscribeManager(config, jsonLibrary, unit, pubnubLog, pubnubTokenMgr, PubnubInstance); manager.CurrentPubnubInstance(PubnubInstance); manager.MultiChannelUnSubscribeAll(PNOperationType.PNUnsubscribeOperation, this.queryParam); diff --git a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeEndpoint.cs b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeEndpoint.cs index 83a4dcce9..5aebba8a1 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeEndpoint.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeEndpoint.cs @@ -58,6 +58,7 @@ public IUnsubscribeOperation QueryParam(Dictionary customQuer public void Execute() { + logger.Trace($"{GetType().Name} Execute invoked"); Unsubscribe(subscribeChannelNames, subscribeChannelGroupNames); } @@ -67,7 +68,7 @@ private void Unsubscribe(string[] channels, string[] channelGroups) throw new ArgumentException("Either Channel Or Channel Group or Both should be provided."); } - LoggingMethod.WriteToLog(pubnubLog,$"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Unsubscribe request for channels: {string.Join(",", channels ?? [])}, channelGroups: {string.Join(",", channelGroups ?? [])} ", config.LogVerbosity); + logger.Trace($" Unsubscribe request for channels: {string.Join(",", channels ?? [])}, channelGroups: {string.Join(",", channelGroups ?? [])} "); if (subscribeEventEngineFactory.HasEventEngine(instanceId)) { subscribeEventEngine = subscribeEventEngineFactory.GetEventEngine(instanceId); @@ -135,7 +136,7 @@ private void Unsubscribe(string[] channels, string[] channelGroups) } } } else { - LoggingMethod.WriteToLog(pubnubLog,$"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Attempted unsubscribe without event engine" , config.LogVerbosity); + logger.Error($"Attempted unsubscribe without event engine"); } } diff --git a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeOperation.cs b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeOperation.cs index 9238a6be9..3cf6dc5b7 100644 --- a/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeOperation.cs +++ b/src/Api/PubnubApi/EndPoint/PubSub/UnsubscribeOperation.cs @@ -47,6 +47,7 @@ public IUnsubscribeOperation QueryParam(Dictionary customQuer public void Execute() { + logger.Trace($"{GetType().Name} Execute invoked"); Unsubscribe(subscribeChannelNames, subscribeChannelGroupNames); } @@ -60,7 +61,7 @@ private void Unsubscribe(string[] channels, string[] channelGroups) string channel = (channels != null) ? string.Join(",", channels.OrderBy(x => x).ToArray()) : ""; string channelGroup = (channelGroups != null) ? string.Join(",", channelGroups.OrderBy(x => x).ToArray()) : ""; - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] requested unsubscribe for channel(s)={channel}, cg(s)={channelGroup}", config.LogVerbosity); + logger.Debug($"requested unsubscribe for channel(s)={channel}, cg(s)={channelGroup}"); SubscribeManager manager = new SubscribeManager(config, jsonLibrary, unit, pubnubLog, pubnubTokenMgr, PubnubInstance); manager.CurrentPubnubInstance(PubnubInstance); diff --git a/src/Api/PubnubApi/EndPoint/Push/AddPushChannelOperation.cs b/src/Api/PubnubApi/EndPoint/Push/AddPushChannelOperation.cs index c78bda761..0a86b2af4 100644 --- a/src/Api/PubnubApi/EndPoint/Push/AddPushChannelOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Push/AddPushChannelOperation.cs @@ -22,7 +22,7 @@ public class AddPushChannelOperation : PubnubCoreBase private PNCallback savedCallback; private Dictionary queryParam; - public AddPushChannelOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, EndPoint.TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) + public AddPushChannelOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) { config = pubnubConfig; jsonLibrary = jsonPluggableLibrary; @@ -34,19 +34,19 @@ public AddPushChannelOperation(PNConfiguration pubnubConfig, IJsonPluggableLibra public AddPushChannelOperation PushType(PNPushType pushType) { - this.pubnubPushType = pushType; + pubnubPushType = pushType; return this; } public AddPushChannelOperation DeviceId(string deviceId) { - this.deviceTokenId = deviceId; + deviceTokenId = deviceId; return this; } public AddPushChannelOperation Channels(string[] channels) { - this.channelNames = channels; + channelNames = channels; return this; } @@ -57,7 +57,7 @@ public AddPushChannelOperation Channels(string[] channels) /// public AddPushChannelOperation Environment(PushEnvironment environment) { - this.pushEnvironment = environment; + pushEnvironment = environment; return this; } @@ -74,7 +74,7 @@ public AddPushChannelOperation Topic(string deviceTopic) public AddPushChannelOperation QueryParam(Dictionary customQueryParam) { - this.queryParam = customQueryParam; + queryParam = customQueryParam; return this; } @@ -86,18 +86,20 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { - this.savedCallback = callback; - RegisterDevice(this.channelNames, this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam, callback); + savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); + RegisterDevice(channelNames, pubnubPushType, deviceTokenId, pushEnvironment, deviceTopic, queryParam, callback); } public async Task> ExecuteAsync() { - return await RegisterDevice(this.channelNames, this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam).ConfigureAwait(false); + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); + return await RegisterDevice(channelNames, pubnubPushType, deviceTokenId, pushEnvironment, deviceTopic, queryParam).ConfigureAwait(false); } internal void Retry() { - RegisterDevice(this.channelNames, this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam, savedCallback); + RegisterDevice(channelNames, pubnubPushType, deviceTokenId, pushEnvironment, deviceTopic, queryParam, savedCallback); } internal void RegisterDevice(string[] channels, PNPushType pushType, string pushToken, PushEnvironment environment, string deviceTopic, Dictionary externalQueryParam, PNCallback callback) @@ -113,13 +115,16 @@ internal void RegisterDevice(string[] channels, PNPushType pushType, string push if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } + logger.Debug($"{GetType().Name} parameter validated."); string channel = string.Join(",", channels.OrderBy(x => x).ToArray()); - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PushRegister; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PushRegister, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushRegister); @@ -130,12 +135,14 @@ internal void RegisterDevice(string[] channels, PNPushType pushType, string push requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushRegister, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNPushAddChannelResult), status); } }); @@ -154,14 +161,16 @@ internal async Task> RegisterDevice(string[] ch if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } + logger.Debug($"{GetType().Name} parameter validated."); string channel = string.Join(",", channels.OrderBy(x => x).ToArray()); PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PushRegister; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - Tuple JsonAndStatusTuple; + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PushRegister, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); @@ -170,6 +179,7 @@ internal async Task> RegisterDevice(string[] ch if (transportResponse.Error == null) { var responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple JsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); @@ -193,6 +203,7 @@ internal async Task> RegisterDevice(string[] ch PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushRegister, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Push/AuditPushChannelOperation.cs b/src/Api/PubnubApi/EndPoint/Push/AuditPushChannelOperation.cs index ed06838eb..d2e4ec919 100644 --- a/src/Api/PubnubApi/EndPoint/Push/AuditPushChannelOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Push/AuditPushChannelOperation.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using System.Threading.Tasks; using System.Net; using System.Text; +using System.Threading.Tasks; namespace PubnubApi.EndPoint { @@ -20,7 +20,7 @@ public class AuditPushChannelOperation : PubnubCoreBase private PNCallback savedCallback; private Dictionary queryParam; - public AuditPushChannelOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, EndPoint.TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) + public AuditPushChannelOperation(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubUnitTest pubnubUnit, IPubnubLog log, TokenManager tokenManager, Pubnub instance) : base(pubnubConfig, jsonPluggableLibrary, pubnubUnit, log, tokenManager, instance) { config = pubnubConfig; jsonLibrary = jsonPluggableLibrary; @@ -30,13 +30,13 @@ public AuditPushChannelOperation(PNConfiguration pubnubConfig, IJsonPluggableLib public AuditPushChannelOperation PushType(PNPushType pushType) { - this.pubnubPushType = pushType; + pubnubPushType = pushType; return this; } public AuditPushChannelOperation DeviceId(string deviceId) { - this.deviceTokenId = deviceId; + deviceTokenId = deviceId; return this; } @@ -47,7 +47,7 @@ public AuditPushChannelOperation DeviceId(string deviceId) /// public AuditPushChannelOperation Environment(PushEnvironment environment) { - this.pushEnvironment = environment; + pushEnvironment = environment; return this; } @@ -64,7 +64,7 @@ public AuditPushChannelOperation Topic(string deviceTopic) public AuditPushChannelOperation QueryParam(Dictionary customQueryParam) { - this.queryParam = customQueryParam; + queryParam = customQueryParam; return this; } @@ -76,18 +76,20 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { - this.savedCallback = callback; - GetChannelsForDevice(this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam, callback); + savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); + GetChannelsForDevice(pubnubPushType, deviceTokenId, pushEnvironment, deviceTopic, queryParam, callback); } public async Task> ExecuteAsync() { - return await GetChannelsForDevice(this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam).ConfigureAwait(false); + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); + return await GetChannelsForDevice(pubnubPushType, deviceTokenId, pushEnvironment, deviceTopic, queryParam).ConfigureAwait(false); } internal void Retry() { - GetChannelsForDevice(this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam, savedCallback); + GetChannelsForDevice(pubnubPushType, deviceTokenId, pushEnvironment, deviceTopic, queryParam, savedCallback); } internal void GetChannelsForDevice(PNPushType pushType, string pushToken, PushEnvironment environment, string deviceTopic, Dictionary externalQueryParam, PNCallback callback) @@ -99,12 +101,14 @@ internal void GetChannelsForDevice(PNPushType pushType, string pushToken, PushEn if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PushGet; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PushGet, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushGet); PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ContinueWith(t => { @@ -114,12 +118,14 @@ internal void GetChannelsForDevice(PNPushType pushType, string pushToken, PushEn requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushGet, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNPushListProvisionsResult), status); } }); @@ -134,19 +140,21 @@ internal async Task> GetChannelsForDevice(P if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PushGet; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - Tuple JsonAndStatusTuple; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PushGet, + Reconnect = false, + EndPointOperation = this + }; PNResult returnValue = new PNResult(); - var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushGet); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); if (transportResponse.Error == null) { var responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple JsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); @@ -170,6 +178,7 @@ internal async Task> GetChannelsForDevice(P PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushGet, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status?.StatusCode}"); return returnValue; } @@ -217,7 +226,7 @@ private RequestParameter CreateRequestParameter() } } - var requestParameter = new RequestParameter() { + var requestParameter = new RequestParameter { RequestType = Constants.GET, PathSegment = pathSegments, Query = requestQueryStringParams diff --git a/src/Api/PubnubApi/EndPoint/Push/RemoveAllPushChannelsOperation.cs b/src/Api/PubnubApi/EndPoint/Push/RemoveAllPushChannelsOperation.cs index e0983981b..35a559b61 100644 --- a/src/Api/PubnubApi/EndPoint/Push/RemoveAllPushChannelsOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Push/RemoveAllPushChannelsOperation.cs @@ -75,12 +75,14 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { - this.savedCallback = callback; + savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); RemoveAllChannelsForDevice(this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await RemoveAllChannelsForDevice(this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam).ConfigureAwait(false); } @@ -98,11 +100,14 @@ internal void RemoveAllChannelsForDevice(PNPushType pushType, string pushToken, if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } - RequestState requestState = new RequestState(); - requestState.ResponseType = PNOperationType.PushUnregister; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + ResponseType = PNOperationType.PushUnregister, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushUnregister); PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ContinueWith(t => { @@ -112,15 +117,18 @@ internal void RemoveAllChannelsForDevice(PNPushType pushType, string pushToken, requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } else { PNStatus errorStatus = GetStatusIfError(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); callback.OnResponse(default, errorStatus); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushUnregister, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -135,18 +143,19 @@ internal async Task> RemoveAllChannelsFo if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); RequestState requestState = new RequestState(); requestState.ResponseType = PNOperationType.PushUnregister; requestState.Reconnect = false; requestState.EndPointOperation = this; var requestParameter = CreateRequestParameter(); - Tuple JsonAndStatusTuple; var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushUnregister); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); if (transportResponse.Error == null) { var responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple JsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, transportResponse.StatusCode, null); @@ -170,6 +179,7 @@ internal async Task> RemoveAllChannelsFo PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushUnregister, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/Push/RemovePushChannelOperation.cs b/src/Api/PubnubApi/EndPoint/Push/RemovePushChannelOperation.cs index 6b28dc3d7..783a45005 100644 --- a/src/Api/PubnubApi/EndPoint/Push/RemovePushChannelOperation.cs +++ b/src/Api/PubnubApi/EndPoint/Push/RemovePushChannelOperation.cs @@ -99,11 +99,13 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { this.savedCallback = callback; + logger.Trace($"{GetType().Name} Execute invoked"); RemoveChannelForDevice(this.channelNames, this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam, callback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); return await RemoveChannelForDevice(this.channelNames, this.pubnubPushType, this.deviceTokenId, this.pushEnvironment, this.deviceTopic, this.queryParam).ConfigureAwait(false); } @@ -125,12 +127,15 @@ internal void RemoveChannelForDevice(string[] channels, PNPushType pushType, str if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } - RequestState requestState = new RequestState(); - requestState.Channels = channels.Select(c => c).ToArray(); - requestState.ResponseType = PNOperationType.PushRemove; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = channels.Select(c => c).ToArray(), + ResponseType = PNOperationType.PushRemove, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushRemove); @@ -141,12 +146,14 @@ internal void RemoveChannelForDevice(string[] channels, PNPushType pushType, str requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushRemove, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNPushRemoveChannelResult), status); } }); @@ -165,20 +172,22 @@ internal async Task> RemoveChannelForDevice( if (pushType == PNPushType.APNS2 && string.IsNullOrEmpty(deviceTopic)) { throw new ArgumentException("Missing Topic"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.Channels = channels.Select(c => c).ToArray(); - requestState.ResponseType = PNOperationType.PushRemove; - requestState.Reconnect = false; - requestState.EndPointOperation = this; - Tuple JsonAndStatusTuple; - + RequestState requestState = new RequestState + { + Channels = channels.Select(c => c).ToArray(), + ResponseType = PNOperationType.PushRemove, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PushRemove); var transportResponse = await PubnubInstance.transportMiddleware.Send(transportRequest: transportRequest).ConfigureAwait(false); if (transportResponse.Error == null) { var responseString = Encoding.UTF8.GetString(transportResponse.Content); PNStatus errorStatus = GetStatusIfError(requestState, responseString); + Tuple JsonAndStatusTuple; if (errorStatus == null) { requestState.GotJsonResponse = true; PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); @@ -202,6 +211,7 @@ internal async Task> RemoveChannelForDevice( PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PushRemove, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/StoragePlayback/DeleteMessageOperation.cs b/src/Api/PubnubApi/EndPoint/StoragePlayback/DeleteMessageOperation.cs index 6b2fca0d6..3878bebde 100644 --- a/src/Api/PubnubApi/EndPoint/StoragePlayback/DeleteMessageOperation.cs +++ b/src/Api/PubnubApi/EndPoint/StoragePlayback/DeleteMessageOperation.cs @@ -76,6 +76,7 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } @@ -85,10 +86,10 @@ public void Execute(PNCallback callback) public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } - return await DeleteMessage(this.channelName, this.startTimetoken, this.endTimetoken, this.queryParam).ConfigureAwait(false); } @@ -102,6 +103,7 @@ internal void DeleteMessage(string channel, long start, long end, Dictionary requestState = new RequestState(); requestState.Channels = new[] { channel }; requestState.ResponseType = PNOperationType.PNDeleteMessageOperation; @@ -118,12 +120,14 @@ internal void DeleteMessage(string channel, long start, long end, Dictionary result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNDeleteMessageOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNDeleteMessageResult), status); } }); @@ -134,12 +138,15 @@ internal async Task> DeleteMessage(string channe if (string.IsNullOrEmpty(channel) || string.IsNullOrEmpty(channel.Trim())) { throw new ArgumentException("Missing Channel"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNDeleteMessageOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNDeleteMessageOperation, + Reconnect = false, + EndPointOperation = this + }; Tuple JsonAndStatusTuple; var requestParameter = CreateRequestParameter(); @@ -171,6 +178,7 @@ internal async Task> DeleteMessage(string channe PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNDeleteMessageOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/StoragePlayback/FetchHistoryOperation.cs b/src/Api/PubnubApi/EndPoint/StoragePlayback/FetchHistoryOperation.cs index 13c931e21..2f6f78b57 100644 --- a/src/Api/PubnubApi/EndPoint/StoragePlayback/FetchHistoryOperation.cs +++ b/src/Api/PubnubApi/EndPoint/StoragePlayback/FetchHistoryOperation.cs @@ -120,6 +120,7 @@ public FetchHistoryOperation QueryParam(Dictionary customQueryPa public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } @@ -137,6 +138,7 @@ public void Execute(PNCallback callback) public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } @@ -163,13 +165,15 @@ internal void History(PNCallback callback) throw new ArgumentException("Missing Channel(s)"); } string channel = string.Join(",", this.channelNames); - - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNFetchHistoryOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNFetchHistoryOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNFetchHistoryOperation); @@ -180,12 +184,14 @@ internal void History(PNCallback callback) requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNFetchHistoryOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default, status); } }); @@ -196,13 +202,16 @@ internal async Task> History() if (this.channelNames == null || this.channelNames.Length == 0 || string.IsNullOrEmpty(this.channelNames[0]) || string.IsNullOrEmpty(this.channelNames[0].Trim())) { throw new ArgumentException("Missing Channel(s)"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); string channel = string.Join(",", this.channelNames); - RequestState requestState = new RequestState(); - requestState.Channels = new[] { channel }; - requestState.ResponseType = PNOperationType.PNFetchHistoryOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + RequestState requestState = new RequestState + { + Channels = new[] { channel }, + ResponseType = PNOperationType.PNFetchHistoryOperation, + Reconnect = false, + EndPointOperation = this + }; Tuple JsonAndStatusTuple; var requestParameter = CreateRequestParameter(); @@ -234,7 +243,7 @@ internal async Task> History() PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNFetchHistoryOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } - + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/StoragePlayback/HistoryOperation.cs b/src/Api/PubnubApi/EndPoint/StoragePlayback/HistoryOperation.cs index 9c083aa04..2f630ed7d 100644 --- a/src/Api/PubnubApi/EndPoint/StoragePlayback/HistoryOperation.cs +++ b/src/Api/PubnubApi/EndPoint/StoragePlayback/HistoryOperation.cs @@ -104,6 +104,7 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } @@ -113,6 +114,7 @@ public void Execute(PNCallback callback) public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } @@ -130,6 +132,7 @@ internal void History(PNCallback callback) if (string.IsNullOrEmpty(this.channelName) || string.IsNullOrEmpty(this.channelName.Trim())) { throw new ArgumentException("Missing Channel"); } + logger.Debug($"{GetType().Name} parameter validated."); RequestState requestState = new RequestState(); requestState.Channels = new[] { this.channelName }; requestState.ResponseType = PNOperationType.PNHistoryOperation; @@ -146,12 +149,14 @@ internal void History(PNCallback callback) requestState.GotJsonResponse = true; if (!string.IsNullOrEmpty(responseString)) { List result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNHistoryOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNHistoryResult), status); } }); @@ -162,11 +167,14 @@ internal async Task> History() if (string.IsNullOrEmpty(this.channelName) || string.IsNullOrEmpty(this.channelName.Trim())) { throw new ArgumentException("Missing Channel"); } - RequestState requestState = new RequestState(); - requestState.Channels = new[] { this.channelName }; - requestState.ResponseType = PNOperationType.PNHistoryOperation; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = new[] { this.channelName }, + ResponseType = PNOperationType.PNHistoryOperation, + Reconnect = false, + EndPointOperation = this + }; PNResult returnValue = new PNResult(); Tuple JsonAndStatusTuple; @@ -199,6 +207,7 @@ internal async Task> History() PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNHistoryOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EndPoint/StoragePlayback/MessageCountsOperation.cs b/src/Api/PubnubApi/EndPoint/StoragePlayback/MessageCountsOperation.cs index 05ee689a7..057a85c01 100644 --- a/src/Api/PubnubApi/EndPoint/StoragePlayback/MessageCountsOperation.cs +++ b/src/Api/PubnubApi/EndPoint/StoragePlayback/MessageCountsOperation.cs @@ -57,19 +57,22 @@ public void Async(PNCallback callback) public void Execute(PNCallback callback) { + logger.Trace($"{GetType().Name} Execute invoked"); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } this.savedCallback = callback; + MessageCounts(this.channelNames, this.timetokens, this.queryParam, savedCallback); } public async Task> ExecuteAsync() { + logger.Trace($"{GetType().Name} ExecuteAsync invoked."); if (string.IsNullOrEmpty(config.SubscribeKey) || config.SubscribeKey.Trim().Length == 0) { throw new MissingMemberException("Invalid Subscribe Key"); } - + return await MessageCounts(this.channelNames, this.timetokens, this.queryParam); } @@ -83,12 +86,15 @@ internal void MessageCounts(string[] channels, long[] timetokens, Dictionary requestState = new RequestState(); - requestState.Channels = channels; - requestState.ResponseType = PNOperationType.PNMessageCountsOperation; - requestState.PubnubCallback = callback; - requestState.Reconnect = false; - requestState.EndPointOperation = this; + logger.Debug($"{GetType().Name} parameter validated."); + RequestState requestState = new RequestState + { + Channels = channels, + ResponseType = PNOperationType.PNMessageCountsOperation, + PubnubCallback = callback, + Reconnect = false, + EndPointOperation = this + }; var requestParameter = CreateRequestParameter(); var transportRequest = PubnubInstance.transportMiddleware.PreapareTransportRequest(requestParameter: requestParameter, operationType: PNOperationType.PNMessageCountsOperation); @@ -99,12 +105,14 @@ internal void MessageCounts(string[] channels, long[] timetokens, Dictionary result = ProcessJsonResponse(requestState, responseString); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); ProcessResponseCallbacks(result, requestState); } } else { int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message); PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message); PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNMessageCountsOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); + logger.Info($"{GetType().Name} request finished with status code {requestState.Response.StatusCode}"); requestState.PubnubCallback.OnResponse(default(PNMessageCountResult), status); } }); @@ -115,6 +123,7 @@ internal async Task> MessageCounts(string[] chann if (channels == null || channels.Length == 0) { throw new ArgumentException("Missing Channel"); } + logger.Debug($"{GetType().Name} parameter validated."); PNResult returnValue = new PNResult(); RequestState requestState = new RequestState(); requestState.Channels = channels; @@ -152,6 +161,7 @@ internal async Task> MessageCounts(string[] chann PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNMessageCountsOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error)); returnValue.Status = status; } + logger.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}"); return returnValue; } diff --git a/src/Api/PubnubApi/EventEngine/Common/EventEmitter.cs b/src/Api/PubnubApi/EventEngine/Common/EventEmitter.cs index 3372eaaa6..0c69d7630 100644 --- a/src/Api/PubnubApi/EventEngine/Common/EventEmitter.cs +++ b/src/Api/PubnubApi/EventEngine/Common/EventEmitter.cs @@ -162,7 +162,7 @@ public void EmitEvent(object e) if ((configuration.CryptoModule != null || configuration.CipherKey.Length > 0) && (eventData.MessageType == 0 || eventData.MessageType == 4)) //decrypt the subscriber message if cipherkey is available { string decryptMessage = ""; - configuration.CryptoModule ??= new CryptoModule(new AesCbcCryptor(configuration.CipherKey, log), new List() { new LegacyCryptor(configuration.CipherKey, configuration.UseRandomInitializationVector) }); + configuration.CryptoModule ??= new CryptoModule(new AesCbcCryptor(configuration.CipherKey), new List() { new LegacyCryptor(configuration.CipherKey, configuration.UseRandomInitializationVector) }); try { decryptMessage = configuration.CryptoModule.Decrypt(payload.ToString()); diff --git a/src/Api/PubnubApi/EventEngine/Core/Engine.cs b/src/Api/PubnubApi/EventEngine/Core/Engine.cs index 91422d11f..5eac0097e 100644 --- a/src/Api/PubnubApi/EventEngine/Core/Engine.cs +++ b/src/Api/PubnubApi/EventEngine/Core/Engine.cs @@ -5,7 +5,6 @@ namespace PubnubApi.EventEngine.Core { public abstract class Engine { public readonly EventQueue EventQueue = new EventQueue(); - protected EffectDispatcher dispatcher = new EffectDispatcher(); protected State currentState; public State CurrentState => currentState; @@ -15,6 +14,8 @@ public abstract class Engine { private readonly IEffectInvocation[] emptyInvocationList = new IEffectInvocation[0]; + protected PubnubLogModule logger; + /// /// Subscribe to receive notification on effect dispatch /// @@ -74,13 +75,18 @@ private async Task Transition(IEvent e) /// Launch the invocations associated with transitioning between states /// private async Task ExecuteStateChange(State sourceState, State targetState, IEnumerable invocations) { + logger.Debug($"Exiting state {sourceState}"); foreach (var effectInvocation in sourceState.OnExit ?? emptyInvocationList) { + logger.Debug($"Dispatching effect: {effectInvocation}"); await dispatcher.Dispatch(effectInvocation); } foreach (var effectInvocation in invocations ?? emptyInvocationList) { + logger.Debug($"Dispatching effect: {effectInvocation}"); await dispatcher.Dispatch(effectInvocation); } + logger.Debug($"Entering state {targetState}"); foreach (var effectInvocation in targetState.OnEntry ?? emptyInvocationList) { + logger.Debug($"Dispatching effect: {effectInvocation}"); await dispatcher.Dispatch(effectInvocation); } } diff --git a/src/Api/PubnubApi/EventEngine/Core/EventEngineInterfaces.cs b/src/Api/PubnubApi/EventEngine/Core/EventEngineInterfaces.cs index e96d3bf18..964e582ca 100644 --- a/src/Api/PubnubApi/EventEngine/Core/EventEngineInterfaces.cs +++ b/src/Api/PubnubApi/EventEngine/Core/EventEngineInterfaces.cs @@ -36,6 +36,11 @@ public abstract class EffectHandler : IEffectHandler public abstract Task Run(T invocation); public abstract bool IsBackground(T invocation); + + public override string ToString() + { + return GetType().Name; + } } /// @@ -54,6 +59,11 @@ public Task Run(T2 invocation) } public bool IsBackground(T2 invocation) => false; + + public override string ToString() + { + return GetType().Name; + } } @@ -76,6 +86,10 @@ public abstract class EffectDoubleHandler : EffectHandler, IEffectHa public abstract Task Run(T2 invocation); public abstract bool IsBackground(T2 invocation); + public override string ToString() + { + return GetType().Name; + } } @@ -97,6 +111,10 @@ public Task Run(T3 invocation) } public bool IsBackground(T3 invocation) => false; + public override string ToString() + { + return GetType().Name; + } } /// @@ -163,5 +181,10 @@ public static implicit operator TransitionResult(State s) { return new TransitionResult(s); } + + public override string ToString() + { + return GetType().Name; + } } } \ No newline at end of file diff --git a/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelDelayedHeartbeatInvocation.cs b/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelDelayedHeartbeatInvocation.cs index efb1b896f..1d310c3d8 100644 --- a/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelDelayedHeartbeatInvocation.cs +++ b/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelDelayedHeartbeatInvocation.cs @@ -2,5 +2,9 @@ namespace PubnubApi.EventEngine.Presence.Invocations { public class CancelDelayedHeartbeatInvocation : DelayedHeartbeatInvocation, Core.IEffectCancelInvocation { public override string Name { get; set; } = "CANCEL_DELAYED_HEARTBEAT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } } diff --git a/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelWaitInvocation.cs b/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelWaitInvocation.cs index 458ac465d..f88474c76 100644 --- a/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelWaitInvocation.cs +++ b/src/Api/PubnubApi/EventEngine/Presence/Invocations/CancelWaitInvocation.cs @@ -4,5 +4,9 @@ namespace PubnubApi.EventEngine.Presence.Invocations { public class CancelWaitInvocation : WaitInvocation, Core.IEffectCancelInvocation { public override string Name { get; set; } = "CANCEL_WAIT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } } diff --git a/src/Api/PubnubApi/EventEngine/Presence/Invocations/DelayedHeartbeatInvocation.cs b/src/Api/PubnubApi/EventEngine/Presence/Invocations/DelayedHeartbeatInvocation.cs index e98d4e4bc..6091a0ccb 100644 --- a/src/Api/PubnubApi/EventEngine/Presence/Invocations/DelayedHeartbeatInvocation.cs +++ b/src/Api/PubnubApi/EventEngine/Presence/Invocations/DelayedHeartbeatInvocation.cs @@ -8,5 +8,10 @@ public class DelayedHeartbeatInvocation : Core.IEffectInvocation public int RetryCount { get; set; } public PNStatus Reason { get; set; } public virtual string Name { get; set; } = "DELAYED_HEARTBEAT"; + + public override string ToString() + { + return $"Invocation : {Name}"; + } } } diff --git a/src/Api/PubnubApi/EventEngine/Presence/Invocations/HearbeatInvocation.cs b/src/Api/PubnubApi/EventEngine/Presence/Invocations/HearbeatInvocation.cs index b8d416b2c..1e54f8399 100644 --- a/src/Api/PubnubApi/EventEngine/Presence/Invocations/HearbeatInvocation.cs +++ b/src/Api/PubnubApi/EventEngine/Presence/Invocations/HearbeatInvocation.cs @@ -6,5 +6,9 @@ public class HeartbeatInvocation : Core.IEffectInvocation { public PresenceInput Input { get; set; } public virtual string Name { get; set; } = "HEARTBEAT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } } diff --git a/src/Api/PubnubApi/EventEngine/Presence/Invocations/LeaveInvocation.cs b/src/Api/PubnubApi/EventEngine/Presence/Invocations/LeaveInvocation.cs index 81380b0e0..64fdcf286 100644 --- a/src/Api/PubnubApi/EventEngine/Presence/Invocations/LeaveInvocation.cs +++ b/src/Api/PubnubApi/EventEngine/Presence/Invocations/LeaveInvocation.cs @@ -6,5 +6,9 @@ public class LeaveInvocation : Core.IEffectInvocation { public PresenceInput Input { get; set; } public virtual string Name { get; set; } = "LEAVE"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } } diff --git a/src/Api/PubnubApi/EventEngine/Presence/Invocations/WaitInvocation.cs b/src/Api/PubnubApi/EventEngine/Presence/Invocations/WaitInvocation.cs index ea0821d1f..95f25bf28 100644 --- a/src/Api/PubnubApi/EventEngine/Presence/Invocations/WaitInvocation.cs +++ b/src/Api/PubnubApi/EventEngine/Presence/Invocations/WaitInvocation.cs @@ -6,5 +6,9 @@ public class WaitInvocation : Core.IEffectInvocation { public PresenceInput Input { get; set; } public virtual string Name { get; set; } = "WAIT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } } diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/Common/CommonSubscribeTypes.cs b/src/Api/PubnubApi/EventEngine/Subscribe/Common/CommonSubscribeTypes.cs index a2deff507..fda70e98b 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/Common/CommonSubscribeTypes.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/Common/CommonSubscribeTypes.cs @@ -14,6 +14,7 @@ public SubscriptionCursor(long? timetoken, int? region = null) this.Region = region; } + public override string ToString() => $"tt= {Timetoken}, region={Region}"; } } diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs b/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs index a9776544a..c80775ebd 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs @@ -4,6 +4,9 @@ namespace PubnubApi.EventEngine.Subscribe.Events { public class UnsubscribeAllEvent : Core.IEvent { public string Name { get; set; } = "UNSUBSCRIBE_ALL"; + + public override string ToString() => $"Event : {Name}"; + } public class SubscriptionChangedEvent : Core.IEvent { @@ -11,6 +14,11 @@ public class SubscriptionChangedEvent : Core.IEvent { public IEnumerable ChannelGroups; public SubscriptionCursor Cursor; public string Name { get; set; } = "SUBSCRIPTION_CHANGED"; + + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)},Cursor= {Cursor}"; + } } public class SubscriptionRestoredEvent : Core.IEvent { @@ -18,12 +26,21 @@ public class SubscriptionRestoredEvent : Core.IEvent { public IEnumerable ChannelGroups; public SubscriptionCursor Cursor; public string Name { get; set; } = "SUBSCRIPTION_RESTORED"; + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)},Cursor= {Cursor}"; + } } public class HandshakeSuccessEvent : Core.IEvent { public SubscriptionCursor Cursor; public PNStatus Status; public virtual string Name { get; set; } = "HANDSHAKE_SUCCESS"; + + public override string ToString() + { + return $"Event : {Name},Cursor= {Cursor}"; + } } public class HandshakeFailureEvent : Core.IEvent { @@ -33,12 +50,22 @@ public class HandshakeFailureEvent : Core.IEvent { public PNStatus Status; public int AttemptedRetries; public virtual string Name { get; set; } = "HANDSHAKE_FAILURE"; + + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)},Cursor= {Cursor},retries= {AttemptedRetries}"; + } } public class HandshakeReconnectSuccessEvent : HandshakeSuccessEvent { public PNStatus Status; public SubscriptionCursor Cursor; public override string Name { get; set; } = "HANDSHAKE_RECONNECT_SUCCESS"; + + public override string ToString() + { + return $"Event : {Name},Cursor= {Cursor}"; + } } public class HandshakeReconnectFailureEvent : HandshakeFailureEvent @@ -46,11 +73,19 @@ public class HandshakeReconnectFailureEvent : HandshakeFailureEvent public IEnumerable Channels; public IEnumerable ChannelGroups; public override string Name { get; set; } = "HANDSHAKE_RECONNECT_FAILURE"; + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)}"; + } } public class HandshakeReconnectGiveUpEvent : Core.IEvent { public PNStatus Status; public string Name { get; set; } = "HANDSHAKE_RECONNECT_GIVEUP"; + public override string ToString() + { + return $"Event : {Name}"; + } } public class ReceiveSuccessEvent : Core.IEvent { @@ -60,6 +95,10 @@ public class ReceiveSuccessEvent : Core.IEvent { public SubscriptionCursor Cursor; public PNStatus Status; public virtual string Name { get; set; } = "RECEIVE_SUCCESS"; + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)} Cursor= {Cursor}"; + } } public class ReceiveFailureEvent : Core.IEvent { @@ -67,14 +106,27 @@ public class ReceiveFailureEvent : Core.IEvent { public int AttemptedRetries; public SubscriptionCursor Cursor; public virtual string Name { get; set; } = "RECEIVE_FAILURE"; + public override string ToString() + { + return $"Event : {Name}, Cursor= {Cursor}"; + } } public class ReceiveReconnectSuccessEvent : ReceiveSuccessEvent { public override string Name { get; set; } = "RECEIVE_RECONNECT_SUCCESS"; + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)}"; + } } public class ReceiveReconnectFailureEvent : ReceiveFailureEvent { public override string Name { get; set; } = "RECEIVE_RECONNECT_FAILURE"; + + public override string ToString() + { + return $"Event : {Name}"; + } } public class ReceiveReconnectGiveUpEvent : Core.IEvent { @@ -83,6 +135,10 @@ public class ReceiveReconnectGiveUpEvent : Core.IEvent { public SubscriptionCursor Cursor; public PNStatus Status; public string Name { get; set; } = "RECEIVE_RECONNECT_GIVEUP"; + public override string ToString() + { + return $"Event : {Name},Cursor= {Cursor}, StatusCode= {Status.StatusCode}"; + } } public class DisconnectEvent : Core.IEvent { @@ -90,6 +146,10 @@ public class DisconnectEvent : Core.IEvent { public IEnumerable ChannelGroups; public SubscriptionCursor Cursor; public string Name { get; set; } = "DISCONNECT"; + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)}, Cursor= {Cursor}"; + } } public class ReconnectEvent : Core.IEvent { @@ -97,5 +157,9 @@ public class ReconnectEvent : Core.IEvent { public IEnumerable ChannelGroups; public SubscriptionCursor Cursor; public string Name { get; set; } = "RECONNECT"; + public override string ToString() + { + return $"Event : {Name},Channels= {string.Join(", ", Channels)},Groups = {string.Join(", ", ChannelGroups)}, Cursor= {Cursor}"; + } } } \ No newline at end of file diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs b/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs index 582e33331..1d0d1715e 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs @@ -11,6 +11,10 @@ public EmitMessagesInvocation(SubscriptionCursor cursor, ReceivingResponse InitialSubscribeQueryParams = new Dictionary(); public Dictionary ExternalQueryParams = new Dictionary(); public virtual string Name { get; set; } = "HANDSHAKE"; + + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class ReceiveMessagesInvocation : Core.IEffectInvocation @@ -58,16 +71,28 @@ public class ReceiveMessagesInvocation : Core.IEffectInvocation public Dictionary InitialSubscribeQueryParams = new Dictionary(); public Dictionary ExternalQueryParams = new Dictionary(); public virtual string Name { get; set; } = "RECEIVE_MESSAGES"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class CancelReceiveMessagesInvocation : ReceiveMessagesInvocation, Core.IEffectCancelInvocation { public override string Name { get; set; } = "CANCEL_RECEIVE_MESSAGES"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class CancelHandshakeInvocation : HandshakeInvocation, Core.IEffectCancelInvocation { public override string Name { get; set; } = "CANCEL_HANDSHAKE"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class HandshakeReconnectInvocation: HandshakeInvocation @@ -75,11 +100,19 @@ public class HandshakeReconnectInvocation: HandshakeInvocation public int AttemptedRetries; public PNStatus Reason { get; set; } public override string Name { get; set; } = "HANDSHAKE_RECONNECT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class CancelHandshakeReconnectInvocation: HandshakeReconnectInvocation, Core.IEffectCancelInvocation { public override string Name { get; set; } = "CANCEL_HANDSHAKE_RECONNECT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class ReceiveReconnectInvocation: ReceiveMessagesInvocation @@ -87,10 +120,18 @@ public class ReceiveReconnectInvocation: ReceiveMessagesInvocation public int AttemptedRetries; public PNStatus Reason { get; set; } public override string Name { get; set; } = "RECEIVE_RECONNECT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } public class CancelReceiveReconnectInvocation: ReceiveReconnectInvocation, Core.IEffectCancelInvocation { public override string Name { get; set; } = "CANCEL_RECEIVE_RECONNECT"; + public override string ToString() + { + return $"Invocation : {Name}"; + } } } \ No newline at end of file diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs index dcc3fbd5b..3b9b54182 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Runtime.CompilerServices; using PubnubApi.EventEngine.Core; using PubnubApi.EventEngine.Subscribe.Common; using PubnubApi.EventEngine.Subscribe.Invocations; diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngine.cs b/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngine.cs index 1a137342e..857a121a1 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngine.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngine.cs @@ -51,6 +51,7 @@ internal SubscribeEventEngine(Pubnub pubnubInstance, dispatcher.Register(emitStatusHandler); currentState = new UnsubscribedState(); + logger = pubnubConfiguration.Logger; } public void Subscribe(string[] channels, string[] channelGroups, SubscriptionCursor cursor) { diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngineFactory.cs b/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngineFactory.cs index 7c51dd158..742a753c6 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngineFactory.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/SubscribeEventEngineFactory.cs @@ -10,7 +10,7 @@ public class SubscribeEventEngineFactory private ConcurrentDictionary engineInstances { get; set;} internal SubscribeEventEngineFactory() { - this.engineInstances = new ConcurrentDictionary(); + engineInstances = new ConcurrentDictionary(); } internal bool HasEventEngine(string instanceId) { @@ -31,12 +31,15 @@ internal SubscribeEventEngine InitializeEventEngine(string instanceId, IJsonPluggableLibrary jsonPluggableLibrary, Action statusListener = null) { - var subscribeEventEngine = new SubscribeEventEngine(pubnubInstance, pubnubConfiguration: pubnubConfiguration, subscribeManager,eventEmitter, jsonPluggableLibrary, statusListener); - if (engineInstances.TryAdd(instanceId, subscribeEventEngine)) { + try + { + engineInstances.TryAdd(instanceId, subscribeEventEngine); return subscribeEventEngine; } - else { + catch (Exception e) + { + pubnubConfiguration.Logger.Error($"Subscribe Event engine initialisation failed due to exception {e.Message} \n {e.StackTrace}"); throw new Exception("Subscribe event engine initialisation failed!"); } } diff --git a/src/Api/PubnubApi/Log/IPubnubLogger.cs b/src/Api/PubnubApi/Log/IPubnubLogger.cs new file mode 100644 index 000000000..a5b1f9abf --- /dev/null +++ b/src/Api/PubnubApi/Log/IPubnubLogger.cs @@ -0,0 +1,12 @@ +namespace PubnubApi; + +public interface IPubnubLogger +{ + void Trace(string logMessage); + void Debug(string logMessage); + void Info(string logMessage); + void Warn(string logMessage); + void Error(string logMessage); +} + +public enum PubnubLogLevel {Trace, Debug, Info, Warn, Error, None }; \ No newline at end of file diff --git a/src/Api/PubnubApi/Log/LoggingMethod.cs b/src/Api/PubnubApi/Log/LoggingMethod.cs index 04b7ae2b0..317dc72ef 100644 --- a/src/Api/PubnubApi/Log/LoggingMethod.cs +++ b/src/Api/PubnubApi/Log/LoggingMethod.cs @@ -1,8 +1,4 @@ using System; -using System.Diagnostics; -using System.Text; -using System.Net; -using System.Collections.Generic; namespace PubnubApi { diff --git a/src/Api/PubnubApi/Log/PubnubDefaultLogger.cs b/src/Api/PubnubApi/Log/PubnubDefaultLogger.cs new file mode 100644 index 000000000..bd3b75c04 --- /dev/null +++ b/src/Api/PubnubApi/Log/PubnubDefaultLogger.cs @@ -0,0 +1,54 @@ +using System; +using System.Globalization; + +namespace PubnubApi; + +public class PubnubDefaultLogger : IPubnubLogger +{ + public delegate void LogDelegate(string message); + + private LogDelegate logFunction; + + private IPubnubLog legacyLogger; + private string Id { get; set; } + + public PubnubDefaultLogger(string id, LogDelegate logFunction, IPubnubLog legacyLogger = null) + { + Id = id; + this.logFunction = logFunction; + this.legacyLogger = legacyLogger; + } + public void Trace(string logMessage) + { + logFunction($"{DateTime.Now.ToString(CultureInfo.InvariantCulture)} PubNub-{Id} Trace {logMessage}"); + } + + public void Debug(string logMessage) + { + logFunction($"{DateTime.Now.ToString(CultureInfo.InvariantCulture)} PubNub-{Id} Debug {logMessage}"); + // Note: This code is temporary to keep backward compatibility till the legacy logger is removed. + try + { + legacyLogger?.WriteToLog(logMessage); + } + catch (Exception e) + { + Error($"Legacy logger exception {e.Message} \n {e.StackTrace}"); + } + } + + public void Info(string logMessage) + { + logFunction($"{DateTime.Now.ToString(CultureInfo.InvariantCulture)} PubNub-{Id} Info {logMessage}"); + } + + public void Warn(string logMessage) + { + logFunction($"{DateTime.Now.ToString(CultureInfo.InvariantCulture)} PubNub-{Id} Warn {logMessage}"); + } + + public void Error(string logMessage) + { + logFunction($"{DateTime.Now.ToString(CultureInfo.InvariantCulture)} PubNub-{Id} Error {logMessage}"); + } +} \ No newline at end of file diff --git a/src/Api/PubnubApi/Log/PubnubLogModule.cs b/src/Api/PubnubApi/Log/PubnubLogModule.cs new file mode 100644 index 000000000..a899ef010 --- /dev/null +++ b/src/Api/PubnubApi/Log/PubnubLogModule.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace PubnubApi; + +public class PubnubLogModule +{ + public PubnubLogLevel MinLogLevel { get; set; } + public List Loggers { get; set; } + + public PubnubLogModule(PubnubLogLevel logLevel, List loggers = null) + { + MinLogLevel = logLevel; + Loggers = loggers ?? []; + } + + public void AddLogger(IPubnubLogger logger) + { + Loggers.Add(logger); + } + + public void RemoveLogger(IPubnubLogger logger) + { + Loggers.Remove(logger); + } + + private void Log(PubnubLogLevel logLevel, string message) + { + if (Loggers == null || Loggers.Count == 0) return; + + if (logLevel >= MinLogLevel) + { + try + { + foreach (var logger in Loggers) + { + switch (logLevel) + { + case PubnubLogLevel.Info: + logger.Info(message); + break; + case PubnubLogLevel.Debug: + logger.Debug(message); + break; + case PubnubLogLevel.Error: + logger.Error(message); + break; + case PubnubLogLevel.Trace: + logger.Trace(message); + break; + case PubnubLogLevel.Warn: + logger.Warn(message); + break; + } + } + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine($"{DateTime.Now.ToString(CultureInfo.InvariantCulture)} Error while logging {e.Message} \n {e.StackTrace}" ); + } + } + } + + public void Debug(string logMessage) => Log(PubnubLogLevel.Debug, logMessage); + public void Trace(string logMessage) => Log(PubnubLogLevel.Trace, logMessage); + public void Error(string logMessage) => Log(PubnubLogLevel.Error, logMessage); + public void Info(string logMessage) => Log(PubnubLogLevel.Info, logMessage); + public void Warn(string logMessage) => Log(PubnubLogLevel.Warn, logMessage); +} \ No newline at end of file diff --git a/src/Api/PubnubApi/NewtonsoftJsonDotNet.cs b/src/Api/PubnubApi/NewtonsoftJsonDotNet.cs index 4cfe84c1c..22145852c 100644 --- a/src/Api/PubnubApi/NewtonsoftJsonDotNet.cs +++ b/src/Api/PubnubApi/NewtonsoftJsonDotNet.cs @@ -12,8 +12,8 @@ namespace PubnubApi public class NewtonsoftJsonDotNet : IJsonPluggableLibrary { private readonly PNConfiguration config; - private readonly IPubnubLog pubnubLog; private readonly JsonSerializerSettings defaultJsonSerializerSettings; + private readonly PubnubLogModule logger; #region "IL2CPP workarounds" @@ -43,11 +43,11 @@ public class NewtonsoftJsonDotNet : IJsonPluggableLibrary #endregion - public NewtonsoftJsonDotNet(PNConfiguration pubnubConfig, IPubnubLog log) + public NewtonsoftJsonDotNet(PNConfiguration pubnubConfig) { this.config = pubnubConfig; - this.pubnubLog = log; defaultJsonSerializerSettings = new JsonSerializerSettings { MaxDepth = 64 }; + logger = pubnubConfig.Logger; } #region IJsonPlugableLibrary methods implementation @@ -168,6 +168,7 @@ public object DeserializeToObject(object rawObject, Type type) { try { + logger.Debug("JsonNet Deserializing object data."); if (rawObject is JObject jObject) { return jObject.ToObject(type); @@ -179,13 +180,14 @@ public object DeserializeToObject(object rawObject, Type type) } catch (Exception e) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: DeserializeToObject exception {e}", config.LogVerbosity); + logger.Error($"Deserialize To Object failed with exception {e.Message}, stack trace {e.StackTrace}"); return rawObject; } } public object DeserializeToObject(string jsonString) { + logger.Debug("JsonNet Deserializing json string data."); object result = JsonConvert.DeserializeObject(jsonString, new JsonSerializerSettings { DateParseHandling = DateParseHandling.None, MaxDepth = 64 }); if (result.GetType().ToString() == "Newtonsoft.Json.Linq.JArray") @@ -206,7 +208,7 @@ public object DeserializeToObject(string jsonString) result = objectContainer; } } - + logger.Debug("JsonNet Deserialsed json string data successfully."); return result; } @@ -236,21 +238,13 @@ private bool IsGenericTypeForMessage() { bool ret = typeof(T).GetTypeInfo().IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(PNMessageResult<>); - - LoggingMethod.WriteToLog(pubnubLog, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] typeof(T).GetTypeInfo().IsGenericType = {typeof(T).GetTypeInfo().IsGenericType}", config.LogVerbosity); - if (typeof(T).GetTypeInfo().IsGenericType) - { - LoggingMethod.WriteToLog(pubnubLog, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] typeof(T).GetGenericTypeDefinition() = {typeof(T).GetGenericTypeDefinition()}", config.LogVerbosity); - } - LoggingMethod.WriteToLog(pubnubLog, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] IsGenericTypeForMessage = {ret}", config.LogVerbosity); + logger.Trace($"typeof(T).GetGenericTypeDefinition() = {typeof(T).GetGenericTypeDefinition()}"); return ret; } private T DeserializeMessageToObjectBasedOnPlatform(List listObject) { + logger.Debug("JsonNet Deserializing Messages data."); T ret = default(T); Type dataType = typeof(T).GetTypeInfo().GenericTypeArguments[0]; Type generic = typeof(PNMessageResult<>); @@ -325,7 +319,7 @@ private T DeserializeMessageToObjectBasedOnPlatform(List listObject) ret = (T)Convert.ChangeType(message, specific, CultureInfo.InvariantCulture); } - + logger.Debug("JsonNet Deserialized Messages successfully."); return ret; } diff --git a/src/Api/PubnubApi/PNConfiguration.cs b/src/Api/PubnubApi/PNConfiguration.cs index 4296d5265..710c60edb 100644 --- a/src/Api/PubnubApi/PNConfiguration.cs +++ b/src/Api/PubnubApi/PNConfiguration.cs @@ -44,6 +44,8 @@ public int PresenceTimeout public bool UseRandomInitializationVector { get; set; } public CryptoModule CryptoModule { get; set; } + internal PubnubLogModule Logger { get; set; } + public string AuthKey { get; set; } [Obsolete("Uuid is deprecated, please use UserId instead.")] @@ -92,6 +94,8 @@ public UserId UserId public PNLogVerbosity LogVerbosity { get; set; } + public PubnubLogLevel LogLevel { get; set; } + public IPubnubLog PubnubLog { get; set; } public Proxy Proxy { get; set; } @@ -140,6 +144,7 @@ public PNConfiguration(string uuid) throw new ArgumentException("Missing or Incorrect uuid value"); } uuidSetFromConstructor = true; + Logger = new PubnubLogModule(logLevel: PubnubLogLevel.None); ConstructorInit(new UserId(uuid)); } @@ -175,6 +180,7 @@ private void ConstructorInit(UserId currentUserId) UseRandomInitializationVector = true; FileMessagePublishRetryLimit = 5; userId = currentUserId; + LogLevel = PubnubLogLevel.None; EnableEventEngine = true; } diff --git a/src/Api/PubnubApi/Pubnub.cs b/src/Api/PubnubApi/Pubnub.cs index 4b0a02387..1232d9870 100644 --- a/src/Api/PubnubApi/Pubnub.cs +++ b/src/Api/PubnubApi/Pubnub.cs @@ -17,8 +17,10 @@ namespace PubnubApi { public class Pubnub - { - private ConcurrentDictionary pubnubConfig { get; } = new ConcurrentDictionary(); + { + private ConcurrentDictionary pubnubConfig { get; } = + new ConcurrentDictionary(); + private IPubnubUnitTest pubnubUnitTest; private IPubnubLog pubnubLog; private ListenerManager listenerManager; @@ -28,17 +30,14 @@ public class Pubnub private SubscribeEventEngineFactory subscribeEventEngineFactory; private PresenceEventEngineFactory presenceEventengineFactory; private EventEmitter eventEmitter; - private List subscribeCallbackListenerList - { - get; - set; - } = new List(); - - #if UNITY + private PubnubLogModule logger; + private List subscribeCallbackListenerList { get; set; } = new List(); + +#if UNITY private static System.Func> OnCleanupCall; - #endif - - #if UNITY +#endif + +#if UNITY /// /// Call this function to globally clean up all background threads running in the SDK. Note that this will unsubscribe all channels. /// @@ -46,19 +45,26 @@ public static void CleanUp() { OnCleanupCall?.Invoke(); } - #endif +#endif #region "PubNub API Channel Methods" public ISubscribeOperation Subscribe() - { + { PresenceOperation presenceOperation = null; if (pubnubConfig[InstanceId].EnableEventEngine) { - if (pubnubConfig[InstanceId].PresenceInterval > 0) { - presenceOperation = new PresenceOperation(this, InstanceId, pubnubLog, pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null , tokenManager, pubnubUnitTest ,presenceEventengineFactory); + if (pubnubConfig[InstanceId].PresenceInterval > 0) + { + presenceOperation = new PresenceOperation(this, InstanceId, pubnubLog, + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, tokenManager, + pubnubUnitTest, presenceEventengineFactory); } - SubscribeEndpoint subscribeOperation = new SubscribeEndpoint(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, subscribeEventEngineFactory, presenceOperation, InstanceId ,this); + + SubscribeEndpoint subscribeOperation = new SubscribeEndpoint( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, subscribeEventEngineFactory, presenceOperation, InstanceId, + this); subscribeOperation.EventEmitter = eventEmitter; subscribeOperation.SubscribeListenerList = subscribeCallbackListenerList; savedSubscribeOperation = subscribeOperation; @@ -66,7 +72,9 @@ public ISubscribeOperation Subscribe() } else { - SubscribeOperation subscribeOperation = new SubscribeOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SubscribeOperation subscribeOperation = new SubscribeOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); savedSubscribeOperation = subscribeOperation; return subscribeOperation; } @@ -76,12 +84,17 @@ public IUnsubscribeOperation Unsubscribe() { if (pubnubConfig[InstanceId].EnableEventEngine) { - UnsubscribeEndpoint unsubscribeOperation = new UnsubscribeEndpoint(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, subscribeEventEngineFactory, presenceEventengineFactory, this); + UnsubscribeEndpoint unsubscribeOperation = new UnsubscribeEndpoint( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, subscribeEventEngineFactory, presenceEventengineFactory, + this); return unsubscribeOperation; } else { - UnsubscribeOperation unsubscribeOperation = new UnsubscribeOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + UnsubscribeOperation unsubscribeOperation = new UnsubscribeOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); unsubscribeOperation.CurrentPubnubInstance(this); return unsubscribeOperation; } @@ -91,294 +104,398 @@ public UnsubscribeAllOperation UnsubscribeAll() { if (pubnubConfig[InstanceId].EnableEventEngine) { - UnsubscribeAllEndpoint unsubscribeAllEndpoint = new UnsubscribeAllEndpoint(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, subscribeEventEngineFactory, presenceEventengineFactory, this); + UnsubscribeAllEndpoint unsubscribeAllEndpoint = new UnsubscribeAllEndpoint( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, subscribeEventEngineFactory, presenceEventengineFactory, + this); return unsubscribeAllEndpoint; } else - { - UnsubscribeAllOperation unSubscribeAllOperation = new UnsubscribeAllOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + UnsubscribeAllOperation unSubscribeAllOperation = + new UnsubscribeAllOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return unSubscribeAllOperation; } } public PublishOperation Publish() { - PublishOperation publishOperation = new PublishOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + PublishOperation publishOperation = new PublishOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); publishOperation.CurrentPubnubInstance(this); return publishOperation; } public FireOperation Fire() { - FireOperation fireOperation = new FireOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + FireOperation fireOperation = + new FireOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); fireOperation.CurrentPubnubInstance(this); return fireOperation; } public SignalOperation Signal() { - SignalOperation signalOperation = new SignalOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SignalOperation signalOperation = new SignalOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return signalOperation; } public HistoryOperation History() - { - HistoryOperation historyOperaton = new HistoryOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + HistoryOperation historyOperaton = new HistoryOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return historyOperaton; } public FetchHistoryOperation FetchHistory() { - FetchHistoryOperation historyOperaton = new FetchHistoryOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + FetchHistoryOperation historyOperaton = new FetchHistoryOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return historyOperaton; } public DeleteMessageOperation DeleteMessages() { - DeleteMessageOperation deleteMessageOperaton = new DeleteMessageOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + DeleteMessageOperation deleteMessageOperaton = new DeleteMessageOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return deleteMessageOperaton; } public MessageCountsOperation MessageCounts() { - MessageCountsOperation messageCount = new MessageCountsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + MessageCountsOperation messageCount = new MessageCountsOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); messageCount.CurrentPubnubInstance(this); return messageCount; } public HereNowOperation HereNow() - { - HereNowOperation hereNowOperation = new HereNowOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + HereNowOperation hereNowOperation = new HereNowOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); hereNowOperation.CurrentPubnubInstance(this); return hereNowOperation; } - public WhereNowOperation WhereNow() - { - WhereNowOperation whereNowOperation = new WhereNowOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public WhereNowOperation WhereNow() + { + WhereNowOperation whereNowOperation = new WhereNowOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); whereNowOperation.CurrentPubnubInstance(this); return whereNowOperation; } - public TimeOperation Time() - { - TimeOperation timeOperation = new TimeOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, this); + public TimeOperation Time() + { + TimeOperation timeOperation = + new TimeOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, this); timeOperation.CurrentPubnubInstance(this); return timeOperation; } - public AuditOperation Audit() - { - AuditOperation auditOperation = new AuditOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, this); + public AuditOperation Audit() + { + AuditOperation auditOperation = + new AuditOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, this); auditOperation.CurrentPubnubInstance(this); return auditOperation; } public GrantTokenOperation GrantToken() { - GrantTokenOperation grantOperation = new GrantTokenOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GrantTokenOperation grantOperation = new GrantTokenOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return grantOperation; } public RevokeTokenOperation RevokeToken() { - RevokeTokenOperation revokeTokenOperation = new RevokeTokenOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RevokeTokenOperation revokeTokenOperation = new RevokeTokenOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return revokeTokenOperation; } public GrantOperation Grant() { - GrantOperation grantOperation = new GrantOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, this); + GrantOperation grantOperation = + new GrantOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, this); grantOperation.CurrentPubnubInstance(this); return grantOperation; } public SetStateOperation SetPresenceState() - { - SetStateOperation setStateOperation = new SetStateOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + SetStateOperation setStateOperation = new SetStateOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return setStateOperation; } - public GetStateOperation GetPresenceState() - { - GetStateOperation getStateOperation = new GetStateOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public GetStateOperation GetPresenceState() + { + GetStateOperation getStateOperation = new GetStateOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); getStateOperation.CurrentPubnubInstance(this); return getStateOperation; } - public AddPushChannelOperation AddPushNotificationsOnChannels() - { - AddPushChannelOperation addPushChannelOperation = new AddPushChannelOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public AddPushChannelOperation AddPushNotificationsOnChannels() + { + AddPushChannelOperation addPushChannelOperation = new AddPushChannelOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return addPushChannelOperation; } - public RemovePushChannelOperation RemovePushNotificationsFromChannels() - { - RemovePushChannelOperation removePushChannelOperation = new RemovePushChannelOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public RemovePushChannelOperation RemovePushNotificationsFromChannels() + { + RemovePushChannelOperation removePushChannelOperation = + new RemovePushChannelOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return removePushChannelOperation; } public RemoveAllPushChannelsOperation RemoveAllPushNotificationsFromDeviceWithPushToken() { - RemoveAllPushChannelsOperation removeAllPushChannelsOperation = new RemoveAllPushChannelsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RemoveAllPushChannelsOperation removeAllPushChannelsOperation = + new RemoveAllPushChannelsOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); removeAllPushChannelsOperation.CurrentPubnubInstance(this); return removeAllPushChannelsOperation; } public AuditPushChannelOperation AuditPushChannelProvisions() - { - AuditPushChannelOperation auditPushChannelOperation = new AuditPushChannelOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + AuditPushChannelOperation auditPushChannelOperation = new AuditPushChannelOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); auditPushChannelOperation.CurrentPubnubInstance(this); return auditPushChannelOperation; } public SetUuidMetadataOperation SetUuidMetadata() { - SetUuidMetadataOperation setUuidMetadataOperation = new SetUuidMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SetUuidMetadataOperation setUuidMetadataOperation = new SetUuidMetadataOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return setUuidMetadataOperation; } public RemoveUuidMetadataOperation RemoveUuidMetadata() { - RemoveUuidMetadataOperation removeUuidMetadataOperation = new RemoveUuidMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RemoveUuidMetadataOperation removeUuidMetadataOperation = + new RemoveUuidMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return removeUuidMetadataOperation; } public GetAllUuidMetadataOperation GetAllUuidMetadata() { - GetAllUuidMetadataOperation getAllUuidMetadataOperation = new GetAllUuidMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetAllUuidMetadataOperation getAllUuidMetadataOperation = + new GetAllUuidMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return getAllUuidMetadataOperation; } public GetUuidMetadataOperation GetUuidMetadata() { - GetUuidMetadataOperation getUuidMetadataOperation = new GetUuidMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetUuidMetadataOperation getUuidMetadataOperation = new GetUuidMetadataOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return getUuidMetadataOperation; } public SetChannelMetadataOperation SetChannelMetadata() { - SetChannelMetadataOperation setChannelMetadataOperation = new SetChannelMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SetChannelMetadataOperation setChannelMetadataOperation = + new SetChannelMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return setChannelMetadataOperation; } public RemoveChannelMetadataOperation RemoveChannelMetadata() { - RemoveChannelMetadataOperation removeChannelMetadataOperation = new RemoveChannelMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RemoveChannelMetadataOperation removeChannelMetadataOperation = + new RemoveChannelMetadataOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return removeChannelMetadataOperation; } public GetAllChannelMetadataOperation GetAllChannelMetadata() { - GetAllChannelMetadataOperation getAllChannelMetadataOperation = new GetAllChannelMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetAllChannelMetadataOperation getAllChannelMetadataOperation = + new GetAllChannelMetadataOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return getAllChannelMetadataOperation; } public GetChannelMetadataOperation GetChannelMetadata() { - GetChannelMetadataOperation getSingleSpaceOperation = new GetChannelMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetChannelMetadataOperation getSingleSpaceOperation = + new GetChannelMetadataOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return getSingleSpaceOperation; } public GetMembershipsOperation GetMemberships() { - GetMembershipsOperation getMembershipOperation = new GetMembershipsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetMembershipsOperation getMembershipOperation = new GetMembershipsOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return getMembershipOperation; } public SetMembershipsOperation SetMemberships() { - SetMembershipsOperation setMembershipsOperation = new SetMembershipsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SetMembershipsOperation setMembershipsOperation = new SetMembershipsOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return setMembershipsOperation; } + public RemoveMembershipsOperation RemoveMemberships() { - RemoveMembershipsOperation removeMembershipsOperation = new RemoveMembershipsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RemoveMembershipsOperation removeMembershipsOperation = + new RemoveMembershipsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return removeMembershipsOperation; } + public ManageMembershipsOperation ManageMemberships() { - ManageMembershipsOperation manageMembershipsOperation = new ManageMembershipsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + ManageMembershipsOperation manageMembershipsOperation = + new ManageMembershipsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return manageMembershipsOperation; } public GetChannelMembersOperation GetChannelMembers() { - GetChannelMembersOperation getChannelMembersOperation = new GetChannelMembersOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetChannelMembersOperation getChannelMembersOperation = + new GetChannelMembersOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return getChannelMembersOperation; } public SetChannelMembersOperation SetChannelMembers() { - SetChannelMembersOperation setChannelMembersOperation = new SetChannelMembersOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SetChannelMembersOperation setChannelMembersOperation = + new SetChannelMembersOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return setChannelMembersOperation; } public RemoveChannelMembersOperation RemoveChannelMembers() { - RemoveChannelMembersOperation removeChannelMembersOperation = new RemoveChannelMembersOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RemoveChannelMembersOperation removeChannelMembersOperation = + new RemoveChannelMembersOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return removeChannelMembersOperation; } public ManageChannelMembersOperation ManageChannelMembers() { - ManageChannelMembersOperation channelMembersOperation = new ManageChannelMembersOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + ManageChannelMembersOperation channelMembersOperation = + new ManageChannelMembersOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return channelMembersOperation; } public AddMessageActionOperation AddMessageAction() { - AddMessageActionOperation addMessageActionOperation = new AddMessageActionOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + AddMessageActionOperation addMessageActionOperation = new AddMessageActionOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return addMessageActionOperation; } public RemoveMessageActionOperation RemoveMessageAction() { - RemoveMessageActionOperation removeMessageActionOperation = new RemoveMessageActionOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + RemoveMessageActionOperation removeMessageActionOperation = + new RemoveMessageActionOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return removeMessageActionOperation; } public GetMessageActionsOperation GetMessageActions() { - GetMessageActionsOperation getMessageActionsOperation = new GetMessageActionsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetMessageActionsOperation getMessageActionsOperation = + new GetMessageActionsOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return getMessageActionsOperation; } -#endregion + #endregion #region "PubNub API Channel Group Methods" public AddChannelsToChannelGroupOperation AddChannelsToChannelGroup() - { - AddChannelsToChannelGroupOperation addChannelToChannelGroupOperation = new AddChannelsToChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + AddChannelsToChannelGroupOperation addChannelToChannelGroupOperation = + new AddChannelsToChannelGroupOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); addChannelToChannelGroupOperation.CurrentPubnubInstance(this); return addChannelToChannelGroupOperation; } - public RemoveChannelsFromChannelGroupOperation RemoveChannelsFromChannelGroup() - { - RemoveChannelsFromChannelGroupOperation removeChannelsFromChannelGroupOperation = new RemoveChannelsFromChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public RemoveChannelsFromChannelGroupOperation RemoveChannelsFromChannelGroup() + { + RemoveChannelsFromChannelGroupOperation removeChannelsFromChannelGroupOperation = + new RemoveChannelsFromChannelGroupOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); removeChannelsFromChannelGroupOperation.CurrentPubnubInstance(this); return removeChannelsFromChannelGroupOperation; } - public DeleteChannelGroupOperation DeleteChannelGroup() - { - DeleteChannelGroupOperation deleteChannelGroupOperation = new DeleteChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public DeleteChannelGroupOperation DeleteChannelGroup() + { + DeleteChannelGroupOperation deleteChannelGroupOperation = + new DeleteChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); deleteChannelGroupOperation.CurrentPubnubInstance(this); return deleteChannelGroupOperation; } - public ListChannelsForChannelGroupOperation ListChannelsForChannelGroup() - { - ListChannelsForChannelGroupOperation listChannelsForChannelGroupOperation = new ListChannelsForChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + public ListChannelsForChannelGroupOperation ListChannelsForChannelGroup() + { + ListChannelsForChannelGroupOperation listChannelsForChannelGroupOperation = + new ListChannelsForChannelGroupOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); listChannelsForChannelGroupOperation.CurrentPubnubInstance(this); return listChannelsForChannelGroupOperation; } public ListAllChannelGroupOperation ListChannelGroups() - { - ListAllChannelGroupOperation listAllChannelGroupOperation = new ListAllChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + ListAllChannelGroupOperation listAllChannelGroupOperation = + new ListAllChannelGroupOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); listAllChannelGroupOperation.CurrentPubnubInstance(this); return listAllChannelGroupOperation; } @@ -394,84 +511,107 @@ public bool AddListener(SubscribeCallback listener) { if (listenerManager == null) { - listenerManager = new ListenerManager(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + listenerManager = + new ListenerManager(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); } + return listenerManager.AddListener(listener); } } - public bool RemoveListener(SubscribeCallback listener) - { - bool ret = false; - if (subscribeCallbackListenerList != null) { - ret = subscribeCallbackListenerList.Remove(listener); - } - if (listenerManager != null) { - var removeFromListenerManager = listenerManager.RemoveListener(listener); - if (!ret) ret = ret || removeFromListenerManager; - } - return ret; - } + public bool RemoveListener(SubscribeCallback listener) + { + bool ret = false; + if (subscribeCallbackListenerList != null) + { + ret = subscribeCallbackListenerList.Remove(listener); + } + + if (listenerManager != null) + { + var removeFromListenerManager = listenerManager.RemoveListener(listener); + if (!ret) ret = ret || removeFromListenerManager; + } + + return ret; + } + #endregion public SendFileOperation SendFile() { - SendFileOperation uploadFileOperation = new SendFileOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + SendFileOperation uploadFileOperation = new SendFileOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return uploadFileOperation; } public GetFileUrlOperation GetFileUrl() { - GetFileUrlOperation getFileUrlOperation = new GetFileUrlOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + GetFileUrlOperation getFileUrlOperation = new GetFileUrlOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return getFileUrlOperation; } public DownloadFileOperation DownloadFile() { - DownloadFileOperation downloadFileOperation = new DownloadFileOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + DownloadFileOperation downloadFileOperation = new DownloadFileOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return downloadFileOperation; } public ListFilesOperation ListFiles() { - ListFilesOperation listFilesOperation = new ListFilesOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + ListFilesOperation listFilesOperation = new ListFilesOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return listFilesOperation; } public DeleteFileOperation DeleteFile() { - DeleteFileOperation deleteFileOperation = new DeleteFileOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + DeleteFileOperation deleteFileOperation = new DeleteFileOperation( + pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, + pubnubUnitTest, pubnubLog, tokenManager, this); return deleteFileOperation; } public PublishFileMessageOperation PublishFileMessage() { - PublishFileMessageOperation publshFileMessageOperation = new PublishFileMessageOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + PublishFileMessageOperation publshFileMessageOperation = + new PublishFileMessageOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); return publshFileMessageOperation; } #region "PubNub API Other Methods" + public void TerminateCurrentSubscriberRequest() - { - OtherOperation endpoint = new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + { + OtherOperation endpoint = + new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); endpoint.CurrentPubnubInstance(this); endpoint.TerminateCurrentSubscriberRequest(); - } + } - public void EnableMachineSleepModeForTestingOnly() - { + public void EnableMachineSleepModeForTestingOnly() + { PubnubCoreBase.EnableMachineSleepModeForTestingOnly(); - } + } - public void DisableMachineSleepModeForTestingOnly() - { + public void DisableMachineSleepModeForTestingOnly() + { PubnubCoreBase.DisableMachineSleepModeForTestingOnly(); - } + } public Guid GenerateGuid() - { - return Guid.NewGuid(); - } + { + return Guid.NewGuid(); + } [Obsolete("ChangeUUID is deprecated, please use ChangeUserId instead.")] public void ChangeUUID(string newUUID) @@ -485,12 +625,20 @@ public void ChangeUserId(UserId newUserId) { if (pubnubLog != null && pubnubConfig != null) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: UserId cannot be null/empty.", pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId].LogVerbosity : PNLogVerbosity.NONE); + LoggingMethod.WriteToLog(pubnubLog, + $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: UserId cannot be null/empty.", + pubnubConfig.ContainsKey(InstanceId) + ? pubnubConfig[InstanceId].LogVerbosity + : PNLogVerbosity.NONE); } + throw new MissingMemberException("UserId cannot be null/empty"); } + PNConfig.UserId = newUserId; - OtherOperation endPoint = new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + OtherOperation endPoint = + new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); endPoint.CurrentPubnubInstance(this); } @@ -511,18 +659,23 @@ public static DateTime TranslatePubnubUnixNanoSecondsToDateTime(string unixNanoS public UserId GetCurrentUserId() { - OtherOperation endPoint = new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + OtherOperation endPoint = + new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); endPoint.CurrentPubnubInstance(this); return endPoint.GetCurrentUserId(); - } + public List GetSubscribedChannels() { if (pubnubConfig[InstanceId].EnableEventEngine) { return this.subscribeEventEngineFactory.GetEventEngine(InstanceId).Channels; } - OtherOperation endpoint = new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + + OtherOperation endpoint = + new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); endpoint.CurrentPubnubInstance(this); return endpoint.GetSubscribedChannels(); } @@ -533,7 +686,10 @@ public List GetSubscribedChannelGroups() { return this.subscribeEventEngineFactory.GetEventEngine(InstanceId).ChannelGroups; } - OtherOperation endpoint = new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + + OtherOperation endpoint = + new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); endpoint.CurrentPubnubInstance(this); return endpoint.GetSubscribedChannelGroups(); } @@ -541,7 +697,9 @@ public List GetSubscribedChannelGroups() public void Destroy() { savedSubscribeOperation = null; - OtherOperation endpoint = new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); + OtherOperation endpoint = + new OtherOperation(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + JsonPluggableLibrary, pubnubUnitTest, pubnubLog, tokenManager, this); endpoint.CurrentPubnubInstance(this); endpoint.EndPendingRequests(); } @@ -558,6 +716,7 @@ public PNTokenContent ParseToken(string token) { result = tokenManager.ParseToken(token); } + return result; } @@ -576,35 +735,50 @@ public void SetAuthToken(string token) public bool Reconnect() { bool ret = false; - if (pubnubConfig[InstanceId].EnableEventEngine) { - if (subscribeEventEngineFactory.HasEventEngine(InstanceId)) { - var subscribeEventEngine = subscribeEventEngineFactory.GetEventEngine(InstanceId); - - subscribeEventEngine.EventQueue.Enqueue(new ReconnectEvent() { - Channels = (subscribeEventEngine.CurrentState as SubscriptionState).Channels, - ChannelGroups = (subscribeEventEngine.CurrentState as SubscriptionState).ChannelGroups, - Cursor = (subscribeEventEngine.CurrentState as SubscriptionState).Cursor - }); - } - if (presenceEventengineFactory.HasEventEngine(InstanceId)) { - var presenceEventEngine = presenceEventengineFactory.GetEventEngine(InstanceId); - - presenceEventEngine.EventQueue.Enqueue(new EventEngine.Presence.Events.ReconnectEvent() { - Input = new EventEngine.Presence.Common.PresenceInput() { - Channels = (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState).Input.Channels, - ChannelGroups = (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState).Input.ChannelGroups - } - }); - } - } else { - if (savedSubscribeOperation is SubscribeOperation) { - SubscribeOperation subscibeOperationInstance = savedSubscribeOperation as SubscribeOperation; - if (subscibeOperationInstance != null) { - ret = subscibeOperationInstance.Retry(true, false); - } - } - } - return ret; + if (pubnubConfig[InstanceId].EnableEventEngine) + { + if (subscribeEventEngineFactory.HasEventEngine(InstanceId)) + { + var subscribeEventEngine = subscribeEventEngineFactory.GetEventEngine(InstanceId); + + subscribeEventEngine.EventQueue.Enqueue(new ReconnectEvent() + { + Channels = (subscribeEventEngine.CurrentState as SubscriptionState).Channels, + ChannelGroups = (subscribeEventEngine.CurrentState as SubscriptionState).ChannelGroups, + Cursor = (subscribeEventEngine.CurrentState as SubscriptionState).Cursor + }); + } + + if (presenceEventengineFactory.HasEventEngine(InstanceId)) + { + var presenceEventEngine = presenceEventengineFactory.GetEventEngine(InstanceId); + + presenceEventEngine.EventQueue.Enqueue(new EventEngine.Presence.Events.ReconnectEvent() + { + Input = new EventEngine.Presence.Common.PresenceInput() + { + Channels = (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState) + .Input.Channels, + ChannelGroups = + (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState).Input + .ChannelGroups + } + }); + } + } + else + { + if (savedSubscribeOperation is SubscribeOperation) + { + SubscribeOperation subscibeOperationInstance = savedSubscribeOperation as SubscribeOperation; + if (subscibeOperationInstance != null) + { + ret = subscibeOperationInstance.Retry(true, false); + } + } + } + + return ret; } public bool Reconnect(bool resetSubscribeTimetoken) @@ -615,19 +789,29 @@ public bool Reconnect(bool resetSubscribeTimetoken) if (subscribeEventEngineFactory.HasEventEngine(InstanceId)) { var subscribeEventEngine = subscribeEventEngineFactory.GetEventEngine(InstanceId); - subscribeEventEngine.EventQueue.Enqueue(new ReconnectEvent() { + subscribeEventEngine.EventQueue.Enqueue(new ReconnectEvent() + { Channels = (subscribeEventEngine.CurrentState as SubscriptionState).Channels, ChannelGroups = (subscribeEventEngine.CurrentState as SubscriptionState).ChannelGroups, - Cursor = resetSubscribeTimetoken ? null : (subscribeEventEngine.CurrentState as SubscriptionState).Cursor - }); + Cursor = resetSubscribeTimetoken + ? null + : (subscribeEventEngine.CurrentState as SubscriptionState).Cursor + }); } - if (presenceEventengineFactory.HasEventEngine(InstanceId)) { + + if (presenceEventengineFactory.HasEventEngine(InstanceId)) + { var presenceEventEngine = presenceEventengineFactory.GetEventEngine(InstanceId); - presenceEventEngine.EventQueue.Enqueue(new EventEngine.Presence.Events.ReconnectEvent() { - Input = new EventEngine.Presence.Common.PresenceInput() { - Channels = (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState).Input.Channels, - ChannelGroups = (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState).Input.ChannelGroups + presenceEventEngine.EventQueue.Enqueue(new EventEngine.Presence.Events.ReconnectEvent() + { + Input = new EventEngine.Presence.Common.PresenceInput() + { + Channels = (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState) + .Input.Channels, + ChannelGroups = + (presenceEventEngine.CurrentState as EventEngine.Presence.States.APresenceState).Input + .ChannelGroups } }); } @@ -643,6 +827,7 @@ public bool Reconnect(bool resetSubscribeTimetoken) } } } + return ret; } @@ -654,9 +839,15 @@ public bool Disconnect() if (subscribeEventEngineFactory.HasEventEngine(InstanceId)) { var subscribeEventEngine = subscribeEventEngineFactory.GetEventEngine(InstanceId); - subscribeEventEngine.EventQueue.Enqueue(new DisconnectEvent() { Channels = (subscribeEventEngine.CurrentState as SubscriptionState).Channels, ChannelGroups = (subscribeEventEngine.CurrentState as SubscriptionState).ChannelGroups }); + subscribeEventEngine.EventQueue.Enqueue(new DisconnectEvent() + { + Channels = (subscribeEventEngine.CurrentState as SubscriptionState).Channels, + ChannelGroups = (subscribeEventEngine.CurrentState as SubscriptionState).ChannelGroups + }); } - if (presenceEventengineFactory.HasEventEngine(InstanceId)) { + + if (presenceEventengineFactory.HasEventEngine(InstanceId)) + { var presenceEventEngine = presenceEventengineFactory.GetEventEngine(InstanceId); presenceEventEngine.EventQueue.Enqueue(new EventEngine.Presence.Events.DisconnectEvent()); @@ -673,6 +864,7 @@ public bool Disconnect() } } } + return ret; } @@ -685,11 +877,15 @@ public string Decrypt(string inputString) if (pubnubConfig.ContainsKey(InstanceId)) { - if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && pubnubConfig[InstanceId].CryptoModule == null)) + if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && + pubnubConfig[InstanceId].CryptoModule == null)) { throw new ArgumentException("CryptoModule missing"); } - pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule(new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, pubnubConfig[InstanceId].UseRandomInitializationVector, pubnubLog), null); + + pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule( + new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, + pubnubConfig[InstanceId].UseRandomInitializationVector), null); return pubnubConfig[InstanceId].CryptoModule.Decrypt(inputString); } else @@ -704,7 +900,8 @@ public string Decrypt(string inputString, string cipherKey) { throw new ArgumentException("inputString is not valid"); } - return new CryptoModule(new LegacyCryptor(cipherKey, true, pubnubLog), null).Decrypt(inputString); + + return new CryptoModule(new LegacyCryptor(cipherKey, true), null).Decrypt(inputString); } public string Encrypt(string inputString) @@ -713,14 +910,18 @@ public string Encrypt(string inputString) { throw new ArgumentException("inputString is not valid"); } + if (pubnubConfig.ContainsKey(InstanceId)) { - if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && pubnubConfig[InstanceId].CryptoModule == null)) + if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && + pubnubConfig[InstanceId].CryptoModule == null)) { throw new MissingMemberException("CryptoModule missing"); } - pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule(new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, pubnubConfig[InstanceId].UseRandomInitializationVector, pubnubLog), null); + pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule( + new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, + pubnubConfig[InstanceId].UseRandomInitializationVector), null); return pubnubConfig[InstanceId].CryptoModule.Encrypt(inputString); } else @@ -735,7 +936,8 @@ public string Encrypt(string inputString, string cipherKey) { throw new ArgumentException("inputString is not valid"); } - return new CryptoModule(new LegacyCryptor(cipherKey, true, pubnubLog), null).Encrypt(inputString); + + return new CryptoModule(new LegacyCryptor(cipherKey, true), null).Encrypt(inputString); } public byte[] EncryptFile(byte[] inputBytes) @@ -744,13 +946,17 @@ public byte[] EncryptFile(byte[] inputBytes) { throw new ArgumentException("inputBytes is not valid"); } + if (pubnubConfig.ContainsKey(InstanceId)) { - if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && pubnubConfig[InstanceId].CryptoModule == null)) + if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && + pubnubConfig[InstanceId].CryptoModule == null)) { throw new MissingMemberException("CryptoModule missing"); } - pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule(new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, true, pubnubLog), null); + + pubnubConfig[InstanceId].CryptoModule ??= + new CryptoModule(new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, true), null); return pubnubConfig[InstanceId].CryptoModule.Encrypt(inputBytes); } else @@ -758,44 +964,51 @@ public byte[] EncryptFile(byte[] inputBytes) throw new ArgumentException("CryptoModule missing"); } } + public byte[] EncryptFile(byte[] inputBytes, string cipherKey) { if (inputBytes == null) { throw new ArgumentException("inputBytes is not valid"); } - return new CryptoModule(new LegacyCryptor(cipherKey, true, pubnubLog), null).Encrypt(inputBytes); + + return new CryptoModule(new LegacyCryptor(cipherKey, true), null).Encrypt(inputBytes); } + public void EncryptFile(string sourceFile, string destinationFile) { if (string.IsNullOrEmpty(sourceFile) || sourceFile.Length < 1) { throw new ArgumentException("sourceFile is not valid"); } + if (pubnubConfig.ContainsKey(InstanceId)) { - if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && pubnubConfig[InstanceId].CryptoModule == null)) + if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && + pubnubConfig[InstanceId].CryptoModule == null)) { throw new MissingMemberException("CryptoModule missing"); } - #if !NETSTANDARD10 && !NETSTANDARD11 +#if !NETSTANDARD10 && !NETSTANDARD11 bool validSource = System.IO.File.Exists(sourceFile); if (!validSource) { throw new ArgumentException("sourceFile is not valid"); } + string destDirectory = System.IO.Path.GetDirectoryName(destinationFile); bool validDest = System.IO.Directory.Exists(destDirectory); if (!string.IsNullOrEmpty(destDirectory) && !validDest) { throw new ArgumentException("destination path is not valid"); } + byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); byte[] outputBytes = EncryptFile(inputBytes); System.IO.File.WriteAllBytes(destinationFile, outputBytes); - #else +#else throw new NotSupportedException("FileSystem not supported in NetStandard 1.0/1.1. Consider higher version of .NetStandard."); - #endif +#endif } else { @@ -809,18 +1022,20 @@ public void EncryptFile(string sourceFile, string destinationFile, string cipher { throw new ArgumentException("sourceFile is not valid"); } - + bool validSource = System.IO.File.Exists(sourceFile); if (!validSource) { throw new ArgumentException("sourceFile is not valid"); } + string destDirectory = System.IO.Path.GetDirectoryName(destinationFile); bool validDest = System.IO.Directory.Exists(destDirectory); if (!string.IsNullOrEmpty(destDirectory) && !validDest) { throw new ArgumentException("destination path is not valid"); } + byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); byte[] outputBytes = EncryptFile(inputBytes, cipherKey); System.IO.File.WriteAllBytes(destinationFile, outputBytes); @@ -835,11 +1050,15 @@ public byte[] DecryptFile(byte[] inputBytes) if (pubnubConfig.ContainsKey(InstanceId)) { - if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && pubnubConfig[InstanceId].CryptoModule == null)) + if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && + pubnubConfig[InstanceId].CryptoModule == null)) { throw new ArgumentException("CryptoModule missing"); } - pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule(new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, pubnubConfig[InstanceId].UseRandomInitializationVector, pubnubLog), null); + + pubnubConfig[InstanceId].CryptoModule ??= new CryptoModule( + new LegacyCryptor(pubnubConfig[InstanceId].CipherKey, + pubnubConfig[InstanceId].UseRandomInitializationVector), null); return pubnubConfig[InstanceId].CryptoModule.Decrypt(inputBytes); } else @@ -847,6 +1066,7 @@ public byte[] DecryptFile(byte[] inputBytes) throw new ArgumentException("CryptoModule missing"); } } + public void DecryptFile(string sourceFile, string destinationFile) { if (string.IsNullOrEmpty(sourceFile) || sourceFile.Length < 1) @@ -856,21 +1076,25 @@ public void DecryptFile(string sourceFile, string destinationFile) if (pubnubConfig.ContainsKey(InstanceId)) { - if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && pubnubConfig[InstanceId].CryptoModule == null)) + if (pubnubConfig[InstanceId] == null || (string.IsNullOrEmpty(pubnubConfig[InstanceId].CipherKey) && + pubnubConfig[InstanceId].CryptoModule == null)) { throw new ArgumentException("CryptoModule missing"); } + bool validSource = System.IO.File.Exists(sourceFile); if (!validSource) { throw new ArgumentException("sourceFile is not valid"); } + string destDirectory = System.IO.Path.GetDirectoryName(destinationFile); bool validDest = System.IO.Directory.Exists(destDirectory); if (!string.IsNullOrEmpty(destDirectory) && !validDest) { throw new ArgumentException("destination path is not valid"); } + byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); byte[] outputBytes = DecryptFile(inputBytes); System.IO.File.WriteAllBytes(destinationFile, outputBytes); @@ -880,14 +1104,15 @@ public void DecryptFile(string sourceFile, string destinationFile) throw new ArgumentException("CryptoModule missing"); } } - + public byte[] DecryptFile(byte[] inputBytes, string cipherKey) { if (inputBytes == null) { throw new ArgumentException("inputBytes is not valid"); } - return new CryptoModule(new LegacyCryptor(cipherKey, true, pubnubLog), null).Decrypt(inputBytes); + + return new CryptoModule(new LegacyCryptor(cipherKey, true), null).Decrypt(inputBytes); } public void DecryptFile(string sourceFile, string destinationFile, string cipherKey) @@ -896,24 +1121,33 @@ public void DecryptFile(string sourceFile, string destinationFile, string cipher { throw new ArgumentException("inputFile is not valid"); } + bool validSource = System.IO.File.Exists(sourceFile); if (!validSource) { throw new ArgumentException("sourceFile is not valid"); } + string destDirectory = System.IO.Path.GetDirectoryName(destinationFile); bool validDest = System.IO.Directory.Exists(destDirectory); if (!string.IsNullOrEmpty(destDirectory) && !validDest) { throw new ArgumentException("destination path is not valid"); } + byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); byte[] outputBytes = DecryptFile(inputBytes, cipherKey); System.IO.File.WriteAllBytes(destinationFile, outputBytes); } + + public void SetLogger(IPubnubLogger logger) => this.logger?.AddLogger(logger); + + public void RemoveLogger(IPubnubLogger logger) => this.logger?.RemoveLogger(logger); + #endregion #region "Properties" + public IPubnubUnitTest PubnubUnitTest { get => pubnubUnitTest; @@ -943,21 +1177,25 @@ public void SetJsonPluggableLibrary(IJsonPluggableLibrary customJson) public ChannelGroup ChannelGroup(string name) => new ChannelGroup(name, this, eventEmitter); public ChannelMetadata ChannelMetadata(string id) => new ChannelMetadata(id, this, eventEmitter); public UserMetadata UserMetadata(string id) => new UserMetadata(id, this, eventEmitter); - - public SubscriptionSet SubscriptionSet(string[] channels, string[] channelGroups = null, SubscriptionOptions? options = null) => new SubscriptionSet(channels, channelGroups?? new string[] {}, options, this, eventEmitter); + + public SubscriptionSet SubscriptionSet(string[] channels, string[] channelGroups = null, + SubscriptionOptions? options = null) => new SubscriptionSet(channels, channelGroups ?? new string[] { }, + options, this, eventEmitter); #endregion #region "Constructors" - public Pubnub(PNConfiguration config, IHttpClientService httpTransportService = default, ITransportMiddleware middleware = default, IPNSDKSource ipnsdkSource = default) + + public Pubnub(PNConfiguration config, IHttpClientService httpTransportService = default, + ITransportMiddleware middleware = default, IPNSDKSource ipnsdkSource = default) { if (config == null) { throw new ArgumentNullException(nameof(config)); } - #if UNITY +#if UNITY OnCleanupCall += this.UnsubscribeAll; - #endif +#endif pubnubLog = config.PubnubLog; savedSdkVerion = Version; InstanceId = Guid.NewGuid().ToString(); @@ -967,32 +1205,61 @@ public Pubnub(PNConfiguration config, IHttpClientService httpTransportService = CheckAndInitializeEmptyStringValues(config); tokenManager = new TokenManager(pubnubConfig[InstanceId], JsonPluggableLibrary, pubnubLog, InstanceId); - - JsonPluggableLibrary = new NewtonsoftJsonDotNet(config, pubnubLog); - + + JsonPluggableLibrary = new NewtonsoftJsonDotNet(config); + if (config.PresenceTimeout < 20) { config.PresenceTimeout = 20; - if (pubnubLog != null) - { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] WARNING: The PresenceTimeout cannot be less than 20, defaulting the value to 20. Please update the settings in your code.", config.LogVerbosity); - } + + config.Logger.Warn( + $"The PresenceTimeout cannot be less than 20, defaulting the value to 20. Please update the settings in your code."); } CheckRequiredUserId(config); - eventEmitter = new EventEmitter(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, subscribeCallbackListenerList, JsonPluggableLibrary, tokenManager, pubnubLog, this); + eventEmitter = new EventEmitter(pubnubConfig.ContainsKey(InstanceId) ? pubnubConfig[InstanceId] : null, + subscribeCallbackListenerList, JsonPluggableLibrary, tokenManager, pubnubLog, this); CheckCryptoModuleUsageForLogging(config); //Defaulting to DotNet PNSDK source if no custom one is specified Version = (ipnsdkSource == default) ? new DotNetPNSDKSource().GetPNSDK() : ipnsdkSource.GetPNSDK(); - IHttpClientService httpClientService = httpTransportService ?? new HttpClientService(proxy:config.Proxy, pubnubLog: config.PubnubLog, verbosity: config.LogVerbosity); - transportMiddleware = middleware ?? new Middleware(httpClientService,config, this, tokenManager); + logger = InitializeLogger(config); + pubnubConfig[InstanceId].Logger = logger; + IHttpClientService httpClientService = + httpTransportService ?? new HttpClientService(proxy: config.Proxy, configuration: config); + transportMiddleware = middleware ?? new Middleware(httpClientService, config, this, tokenManager); + logger.Debug(GetConfigurationLogString(config)); } - - #if UNITY + +#if UNITY ~Pubnub() { OnCleanupCall -= this.UnsubscribeAll; } - #endif +#endif + private string GetConfigurationLogString(PNConfiguration config) => + $"Pubnub instance initialised with\n" + + $"UserId {config.UserId}" + + $"SubscribeKey {config.SubscribeKey}\n" + + $"PublishKey {config.PublishKey}\n" + + $"LogLevel {config.LogLevel}\n" + + $"ReconnectionPolicy {config.RetryConfiguration.RetryPolicy}" + + $"PresenceTimeout {config.PresenceTimeout}\n" + + $"SubscribeTimeout {config.SubscribeTimeout}\n" + + $"Origin {config?.Origin}\n" + + $"Is CryptoModule initialised {(config?.CryptoModule == null ? bool.FalseString : bool.TrueString)}\n" + + $"Is secretKey provided {(string.IsNullOrEmpty(config?.SecretKey) ? bool.FalseString : bool.TrueString)}\n" + + $"Proxy {config.Proxy}\n" + + $"FilterExpression {config.FilterExpression}\n" + + $"EnableEventEngine {config.EnableEventEngine}\n" + + $"MaintainPresenceState {config.MaintainPresenceState}\n"; + + private PubnubLogModule InitializeLogger(PNConfiguration configuration) + { + var defaultLogger = new PubnubDefaultLogger($"{GetHashCode()}", Console.WriteLine, + (configuration.LogVerbosity == PNLogVerbosity.BODY && configuration.PubnubLog != null + ? configuration.PubnubLog + : null)); + return new PubnubLogModule(configuration.LogLevel, [defaultLogger]); + } private void CheckRequiredUserId(PNConfiguration config) { @@ -1000,21 +1267,20 @@ private void CheckRequiredUserId(PNConfiguration config) { if (pubnubLog != null) { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: PNConfiguration.Uuid or PNConfiguration.UserId is required to use the SDK.", config.LogVerbosity); + config.Logger.Warn($"PNConfiguration.Uuid or PNConfiguration.UserId is required to use the SDK."); } + throw new MissingMemberException("PNConfiguration.UserId is required to use the SDK"); } - + config.ResetUuidSetFromConstructor(); } + private void CheckCryptoModuleUsageForLogging(PNConfiguration config) { if (config.CryptoModule != null && !string.IsNullOrEmpty(config.CipherKey) && config.CipherKey.Length > 0) { - if (pubnubLog != null) - { - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] WARNING: CryptoModule takes precedence over CipherKey.", config.LogVerbosity); - } + config.Logger.Debug($"CryptoModule takes precedence over CipherKey."); } } @@ -1025,6 +1291,7 @@ private void CheckAndInitializeEmptyStringValues(PNConfiguration config) config.SecretKey = string.IsNullOrEmpty(config.SecretKey) ? string.Empty : config.SecretKey; config.CipherKey = string.IsNullOrEmpty(config.CipherKey) ? string.Empty : config.CipherKey; } + #endregion - } + } } \ No newline at end of file diff --git a/src/Api/PubnubApi/PubnubCoreBase.cs b/src/Api/PubnubApi/PubnubCoreBase.cs index aae0702a4..58e723a7d 100644 --- a/src/Api/PubnubApi/PubnubCoreBase.cs +++ b/src/Api/PubnubApi/PubnubCoreBase.cs @@ -44,6 +44,7 @@ public abstract class PubnubCoreBase protected Pubnub PubnubInstance { get; set; } + protected PubnubLogModule logger; protected static ConcurrentDictionary> SubscriptionChannels { get; @@ -150,7 +151,7 @@ protected PubnubCoreBase(PNConfiguration pubnubConfiguation, IJsonPluggableLibra if (jsonPluggableLibrary == null) { - InternalConstructor(pubnubConfiguation, new NewtonsoftJsonDotNet(pubnubConfiguation,log), pubnubUnitTest, log, tokenManager, instance); + InternalConstructor(pubnubConfiguation, new NewtonsoftJsonDotNet(pubnubConfiguation), pubnubUnitTest, log, tokenManager, instance); } else { @@ -167,7 +168,6 @@ private void InternalConstructor(PNConfiguration pubnubConfiguation, IJsonPlugga pubnubLog.AddOrUpdate(instance.InstanceId, log, (k, o) => log); PubnubTokenMgrCollection.AddOrUpdate(instance.InstanceId, tokenManager, (k,o)=> tokenManager); pubnubSubscribeDuplicationManager = new EndPoint.DuplicationManager(pubnubConfiguation, jsonPluggableLibrary, log); - CurrentUserId.AddOrUpdate(instance.InstanceId, pubnubConfiguation.UserId, (k,o) => pubnubConfiguation.UserId); UpdatePubnubNetworkTcpCheckIntervalInSeconds(); if (pubnubConfiguation.PresenceInterval > 10) @@ -175,6 +175,7 @@ private void InternalConstructor(PNConfiguration pubnubConfiguation, IJsonPlugga PubnubLocalHeartbeatCheckIntervalInSeconds = pubnubConfiguation.PresenceInterval; } enableResumeOnReconnect = pubnubConfiguation.ReconnectionPolicy != PNReconnectionPolicy.NONE; + logger = pubnubConfiguation.Logger; } @@ -623,7 +624,7 @@ private void ResponseToUserCallback(List result, PNOperationType type if ((currentConfig.CryptoModule != null || currentConfig.CipherKey.Length > 0) && currentMessage.MessageType != 1) //decrypt the subscriber message if cipherkey is available { string decryptMessage = ""; - currentConfig.CryptoModule ??= new CryptoModule(new LegacyCryptor(currentConfig.CipherKey, currentConfig.UseRandomInitializationVector, currentLog), null); + currentConfig.CryptoModule ??= new CryptoModule(new LegacyCryptor(currentConfig.CipherKey, currentConfig.UseRandomInitializationVector), null); try { decryptMessage = currentConfig.CryptoModule.Decrypt(payload.ToString()); @@ -1157,7 +1158,7 @@ protected List WrapResultBasedOnResponseType(PNOperationType type, st Dictionary channelDic = jsonLib.ConvertToDictionaryObject(channelMessageContainer); if (channelDic != null && channelDic.Count > 0) { - result[index] = SecureMessage.Instance(currentConfig, jsonLib, currentLog).FetchHistoryDecodeDecryptLoop(type, channelDic, channels, channelGroups, callback); + result[index] = SecureMessage.Instance(currentConfig, jsonLib, currentConfig.Logger).FetchHistoryDecodeDecryptLoop(type, channelDic, channels, channelGroups, callback); } } else @@ -1169,7 +1170,7 @@ protected List WrapResultBasedOnResponseType(PNOperationType type, st } else { - result = SecureMessage.Instance(currentConfig, jsonLib, currentLog).HistoryDecodeDecryptLoop(type, result, channels, channelGroups, callback); + result = SecureMessage.Instance(currentConfig, jsonLib, currentConfig.Logger).HistoryDecodeDecryptLoop(type, result, channels, channelGroups, callback); } } result.Add(multiChannel); diff --git a/src/Api/PubnubApi/RetryConfiguration.cs b/src/Api/PubnubApi/RetryConfiguration.cs index 924a24f3e..65284effd 100644 --- a/src/Api/PubnubApi/RetryConfiguration.cs +++ b/src/Api/PubnubApi/RetryConfiguration.cs @@ -47,6 +47,11 @@ public bool ShouldRetry(int attemptedRetries, PNStatus status) { return status.StatusCode != 403 && attemptedRetries < this.maxRetry; } + + public override string ToString() + { + return $"Policy: Linear Delay: {this.delay}, MaxRetry: {this.maxRetry}"; + } } internal class ExponentialRetryPolicy : IRetryPolicy @@ -66,13 +71,17 @@ public ExponentialRetryPolicy(int minDelay, int maxDelay, int maxRetry) public int GetDelay(int attemptedRetries, PNStatus status, int? retryAfter) { if (status.StatusCode == 429 && retryAfter.HasValue && retryAfter > 0) return (int)retryAfter; - if (attemptedRetries == 0) return this.minDelay * 1000 + numGenerator.Next(1000); - return Math.Min((int)(Math.Pow(2, attemptedRetries) * 1000 + numGenerator.Next(1000)), this.maxDelay * 1000); + if (attemptedRetries == 0) return minDelay * 1000 + numGenerator.Next(1000); + return Math.Min((int)(Math.Pow(2, attemptedRetries) * 1000 + numGenerator.Next(1000)), maxDelay * 1000); } public bool ShouldRetry(int attemptedRetries, PNStatus status) { - return status.StatusCode != 403 && attemptedRetries < this.maxRetry; + return status.StatusCode != 403 && attemptedRetries < maxRetry; + } + public override string ToString() + { + return $"Policy: Exponential MinDelay: {minDelay} MaxRetry: {maxRetry}"; } } } diff --git a/src/Api/PubnubApi/Security/Crypto/CryptoModule.cs b/src/Api/PubnubApi/Security/Crypto/CryptoModule.cs index fcc43c0af..3f5b297d4 100644 --- a/src/Api/PubnubApi/Security/Crypto/CryptoModule.cs +++ b/src/Api/PubnubApi/Security/Crypto/CryptoModule.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using PubnubApi.Security.Crypto.Cryptors; namespace PubnubApi.Security.Crypto @@ -32,7 +30,7 @@ private void AddDecryptor(ICryptor decryptor) _decryptors[decryptor.Identifier] = decryptor; } } - public static LegacyCryptor CreateLegacyCryptor(string cipherKey, bool useDynamicIV, IPubnubLog log) + public static LegacyCryptor CreateLegacyCryptor(string cipherKey, bool useDynamicIV, PubnubLogModule log) { return new LegacyCryptor(cipherKey, useDynamicIV, log); } @@ -44,7 +42,7 @@ public static LegacyCryptor CreateLegacyCryptor(string cipherKey) { return new LegacyCryptor(cipherKey, true); } - public static AesCbcCryptor CreateAesCbcCryptor(string cipherKey, IPubnubLog log) + public static AesCbcCryptor CreateAesCbcCryptor(string cipherKey, PubnubLogModule log) { return new AesCbcCryptor(cipherKey, log); } diff --git a/src/Api/PubnubApi/Security/Crypto/Cryptors/AesCbcCryptor.cs b/src/Api/PubnubApi/Security/Crypto/Cryptors/AesCbcCryptor.cs index ba6ad2f4e..6b7f4f7f0 100644 --- a/src/Api/PubnubApi/Security/Crypto/Cryptors/AesCbcCryptor.cs +++ b/src/Api/PubnubApi/Security/Crypto/Cryptors/AesCbcCryptor.cs @@ -14,7 +14,7 @@ public class AesCbcCryptor : CryptorBase { private const string IDENTIFIER = "ACRH"; - public AesCbcCryptor(string cipherKey, IPubnubLog log): base(cipherKey, true, log) + public AesCbcCryptor(string cipherKey, PubnubLogModule logger): base(cipherKey, true, logger) { } public AesCbcCryptor(string cipherKey): this(cipherKey, null) { } @@ -22,20 +22,31 @@ public AesCbcCryptor(string cipherKey): this(cipherKey, null) { } public override string Identifier => IDENTIFIER; public override string Encrypt(string data) { - if (data == null) { throw new ArgumentException("Invalid input","data"); } - if (data.Length == 0) { throw new PNException("encryption error"); } + if (data == null) + { + logger.Debug("AesCbcCryptor encrypt data input is null"); + throw new ArgumentException("Invalid input", data); + } + + if (data.Length == 0) + { + logger.Debug("AesCbcCryptor encrypt data input is of zero length"); + throw new PNException($"encryption error empty input"); + } try { + logger.Debug($"AesCbcCryptor Encrypting string data: {data}"); string input = Util.EncodeNonAsciiCharacters(data); byte[] dataBytes = Encoding.UTF8.GetBytes(input); byte[] ivBytes = GenerateRandomIV(true); - Log(string.Format(CultureInfo.InvariantCulture, "DateTime {0} IV = {1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), ivBytes.ToDisplayFormat())); byte[] keyBytes = Util.GetEncryptionKeyBytes(CipherKey); byte[] encryptedBytes = InternalEncrypt(true, dataBytes, ivBytes, keyBytes); + logger.Debug($"AesCbcCryptor Data encrypted successfully"); return Convert.ToBase64String(encryptedBytes); } catch (Exception ex) { + logger.Error($"AesCbcCryptor Error while encrypting data. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Encrypt Error", ex); } } @@ -45,19 +56,31 @@ public override byte[] Encrypt(byte[] data) if (data.Length == 0) { throw new PNException("encryption error"); } try { + logger.Debug($"AesCbcCryptor Encrypting bytes data. Length {data.Length}"); byte[] ivBytes = GenerateRandomIV(true); byte[] keyBytes = Util.GetEncryptionKeyBytes(CipherKey); + logger.Debug($"AesCbcCryptor Bytes Data encrypted successfully"); return InternalEncrypt(true, data, ivBytes, keyBytes); } catch (Exception ex) { + logger.Error($"AesCbcCryptor Error while encrypting data bytes. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Encrypt Error", ex); } } public override string Decrypt(string encryptedData) { - if (encryptedData == null) { throw new ArgumentException("Invalid input","encryptedData"); } - if (encryptedData.Length == 0) { throw new PNException("decryption error"); } + if (encryptedData == null) + { + logger.Debug("AesCbcCryptor decrypt data string input is null"); + throw new ArgumentException("Invalid input","encryptedData"); + } + + if (encryptedData.Length == 0) + { + logger.Debug("AesCbcCryptor decrypt data string input is of zero length"); + throw new PNException("decryption error"); + } try { CryptorHeader header = CryptorHeader.FromBytes(Convert.FromBase64String(encryptedData)); @@ -65,12 +88,14 @@ public override string Decrypt(string encryptedData) { throw new PNException("unknown cryptor error"); } + logger.Debug($"AesCbcCryptor Decrypting string data: {encryptedData}"); string actualData = Convert.ToBase64String(Convert.FromBase64String(encryptedData).Skip(5 + header.Identifier.Length + ((header.DataSize < 255) ? 1 : 3)).ToArray()); byte[] dataBytes = Convert.FromBase64String(actualData); byte[] ivBytes = dataBytes.Take(16).ToArray(); dataBytes = dataBytes.Skip(16).ToArray(); byte[] keyBytes = Util.GetEncryptionKeyBytes(CipherKey); byte[] decryptedBytes = InternalDecrypt(dataBytes, ivBytes, keyBytes); + logger.Debug($"AesCbcCryptor String data decrypted successfully"); return Encoding.UTF8.GetString(decryptedBytes, 0, decryptedBytes.Length); } catch(PNException) @@ -79,13 +104,23 @@ public override string Decrypt(string encryptedData) } catch(Exception ex) { + logger.Error($"AesCbcCryptor Error while decrypting string data. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Decrypt Error", ex); } } public override byte[] Decrypt(byte[] encryptedData) { - if (encryptedData == null) { throw new ArgumentException("Invalid input","encryptedData"); } - if (encryptedData.Length == 0) { throw new PNException("decryption error"); } + if (encryptedData == null) + { + logger.Debug("AesCbcCryptor decrypt data bytes input is null"); + throw new ArgumentException("Invalid input","encryptedData"); + } + + if (encryptedData.Length == 0) + { + logger.Debug("AesCbcCryptor decrypt data bytes input is of zero length"); + throw new PNException("decryption error"); + } try { CryptorHeader header = CryptorHeader.FromBytes(encryptedData); @@ -93,11 +128,13 @@ public override byte[] Decrypt(byte[] encryptedData) { throw new PNException("unknown cryptor error"); } + logger.Debug($"AesCbcCryptor Decrypting bytes data. Length {encryptedData.Length}"); byte[] actualBytes = encryptedData.Skip(5 + header.Identifier.Length + ((header.DataSize < 255) ? 1 : 3)).ToArray(); byte[] ivBytes = actualBytes.Take(header.DataSize).ToArray(); byte[] dataBytes = actualBytes.Skip(header.DataSize).ToArray(); if (dataBytes.Length == 0) { throw new PNException("decryption error"); } byte[] keyBytes = Util.GetEncryptionKeyBytes(CipherKey); + logger.Debug($"AesCbcCryptor Bytes Data decrypted successfully"); return InternalDecrypt(dataBytes, ivBytes, keyBytes); } catch(PNException) @@ -106,6 +143,7 @@ public override byte[] Decrypt(byte[] encryptedData) } catch (Exception ex) { + logger.Error($"AesCbcCryptor Error while decrypting bytes. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Decrypt Error", ex); } } @@ -129,7 +167,9 @@ public override void EncryptFile(string sourceFile, string destinationFile) throw new ArgumentException("destination path is not valid"); } byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); + logger.Debug("AesCbcCryptor encrypting file"); byte[] outputBytes = Encrypt(inputBytes); + logger.Debug("AesCbcCryptor file encrypted successfully"); System.IO.File.WriteAllBytes(destinationFile, outputBytes); #else throw new NotSupportedException("FileSystem not supported in NetStandard 1.0/1.1. Consider higher version of .NetStandard."); @@ -155,7 +195,9 @@ public override void DecryptFile(string sourceFile, string destinationFile) throw new ArgumentException("destination path is not valid"); } byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); + logger.Debug("AesCbcCryptor decrypting file"); byte[] outputBytes = Decrypt(inputBytes); + logger.Debug("AesCbcCryptor file decrypted successfully"); System.IO.File.WriteAllBytes(destinationFile, outputBytes); #else throw new NotSupportedException("FileSystem not supported in NetStandard 1.0/1.1. Consider higher version of .NetStandard."); diff --git a/src/Api/PubnubApi/Security/Crypto/Cryptors/CryptorBase.cs b/src/Api/PubnubApi/Security/Crypto/Cryptors/CryptorBase.cs index 70bce650c..84d1d2f94 100644 --- a/src/Api/PubnubApi/Security/Crypto/Cryptors/CryptorBase.cs +++ b/src/Api/PubnubApi/Security/Crypto/Cryptors/CryptorBase.cs @@ -13,7 +13,7 @@ public abstract class CryptorBase : ICryptor protected const int IV_SIZE = 16; private readonly bool _useDynamicRandomIV; - private readonly IPubnubLog _log; + protected readonly PubnubLogModule logger; #if DEBUG private byte[] constantIV; public void SetTestOnlyConstantRandomIV(byte[] iv) @@ -21,10 +21,10 @@ public void SetTestOnlyConstantRandomIV(byte[] iv) constantIV = iv; } #endif - protected CryptorBase(string cipherKey, bool useDynamicRandomIV, IPubnubLog log) + protected CryptorBase(string cipherKey, bool useDynamicRandomIV, PubnubLogModule logger) { _useDynamicRandomIV = useDynamicRandomIV; - _log = log; + this.logger = logger; CipherKey = cipherKey; } public string CipherKey { get; } @@ -39,10 +39,10 @@ protected byte[] GenerateRandomIV(bool useDynamicRandomIV) #endif return Util.InitializationVector(useDynamicRandomIV, dataOffset); } - protected void Log(string message) - { - _log?.WriteToLog(message); - } + // protected void Log(string message) + // { + // _log?.WriteToLog(message); + // } protected byte[] InternalEncrypt(bool cryptoHeader, byte[] dataBytes, byte[] ivBytes, byte[] keyBytes) { using (Aes aesAlg = Aes.Create()) @@ -61,7 +61,6 @@ protected byte[] InternalEncrypt(bool cryptoHeader, byte[] dataBytes, byte[] ivB { CryptorHeader header = new CryptorHeader(Identifier, ivBytes.Length); byte[] headerBytes = header.ToBytes(); - Log(string.Format(CultureInfo.InvariantCulture, "DateTime {0} Header = {1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), headerBytes.ToDisplayFormat())); byte[] buffer = new byte[headerBytes.Length + ivBytes.Length + outputBytes.Length]; Buffer.BlockCopy(headerBytes, 0, buffer, 0, headerBytes.Length); Buffer.BlockCopy(ivBytes , 0, buffer, headerBytes.Length, ivBytes.Length); diff --git a/src/Api/PubnubApi/Security/Crypto/Cryptors/LegacyCryptor.cs b/src/Api/PubnubApi/Security/Crypto/Cryptors/LegacyCryptor.cs index a5da2f1d8..ac7b63637 100644 --- a/src/Api/PubnubApi/Security/Crypto/Cryptors/LegacyCryptor.cs +++ b/src/Api/PubnubApi/Security/Crypto/Cryptors/LegacyCryptor.cs @@ -1,10 +1,6 @@ using PubnubApi.Security.Crypto.Common; using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; using System.Linq; -using System.Security.Cryptography; using System.Text; namespace PubnubApi.Security.Crypto.Cryptors @@ -14,7 +10,7 @@ public class LegacyCryptor : CryptorBase private const string IDENTIFIER = "0000"; private readonly bool _useDynamicRandomIV; - public LegacyCryptor(string cipherKey, bool useDynamicRandomIV, IPubnubLog log): base(cipherKey, useDynamicRandomIV, log) + public LegacyCryptor(string cipherKey, bool useDynamicRandomIV, PubnubLogModule logger): base(cipherKey, useDynamicRandomIV, logger) { _useDynamicRandomIV = useDynamicRandomIV; } @@ -30,16 +26,26 @@ public LegacyCryptor(string cipherKey): this(cipherKey, true) public override string Identifier => IDENTIFIER; public override string Encrypt(string data) { - if (data == null) { throw new ArgumentException("Invalid input","data"); } - if (data.Length == 0) { throw new PNException("encryption error"); } + if (data == null) + { + logger.Debug("LegacyCryptor encrypt data input is null"); + throw new ArgumentException("Invalid input","data"); + } + + if (data.Length == 0) + { + logger.Debug("LegacyCryptor encrypt data input is of zero length"); + throw new PNException("encryption error"); + } try { + logger.Debug($"LegacyCryptor Encrypting string data: {data}"); string input = Util.EncodeNonAsciiCharacters(data); byte[] dataBytes = Encoding.UTF8.GetBytes(input); byte[] ivBytes = GenerateRandomIV(_useDynamicRandomIV); - Log(string.Format(CultureInfo.InvariantCulture, "DateTime {0} IV = {1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), ivBytes.ToDisplayFormat())); byte[] keyBytes = Util.GetLegacyEncryptionKey(CipherKey); byte[] encryptedBytes = InternalEncrypt(false, dataBytes, ivBytes, keyBytes); + logger.Debug($"LegacyCryptor Data encrypted successfully"); return Convert.ToBase64String(encryptedBytes); } catch(PNException) @@ -48,6 +54,7 @@ public override string Encrypt(string data) } catch (Exception ex) { + logger.Error($"LegacyCryptor Error while encrypting data. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Encrypt Error", ex); } } @@ -57,9 +64,10 @@ public override byte[] Encrypt(byte[] data) if (data.Length == 0) { throw new PNException("encryption error"); } try { + logger.Debug($"LegacyCryptor Encrypting bytes data. Length {data.Length}"); byte[] ivBytes = GenerateRandomIV(_useDynamicRandomIV); - Log(string.Format(CultureInfo.InvariantCulture, "DateTime {0} IV = {1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), ivBytes.ToDisplayFormat())); byte[] keyBytes = Util.GetLegacyEncryptionKey(CipherKey); + logger.Debug($"LegacyCryptor Bytes Data encrypted successfully"); return InternalEncrypt(false, data, ivBytes, keyBytes); } catch(PNException) @@ -68,20 +76,32 @@ public override byte[] Encrypt(byte[] data) } catch (Exception ex) { + logger.Error($"LegacyCryptor Error while encrypting data bytes. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Encrypt Error", ex); } } public override string Decrypt(string encryptedData) { - if (encryptedData == null) { throw new ArgumentException("Invalid input","encryptedData"); } - if (encryptedData.Length == 0) { throw new PNException("decryption error"); } + if (encryptedData == null) + { + logger.Debug("LegacyCryptor decrypt data string input is null"); + throw new ArgumentException("Invalid input","encryptedData"); + } + + if (encryptedData.Length == 0) + { + logger.Debug("LegacyCryptor decrypt data string input is of zero length"); + throw new PNException("decryption error"); + } try { + logger.Debug($"LegacyCryptor Decrypting string data: {encryptedData}"); byte[] dataBytes = Convert.FromBase64String(encryptedData); byte[] ivBytes = _useDynamicRandomIV ? dataBytes.Take(16).ToArray() : Encoding.UTF8.GetBytes("0123456789012345"); dataBytes = _useDynamicRandomIV ? dataBytes.Skip(16).ToArray() : dataBytes; byte[] keyBytes = Util.GetLegacyEncryptionKey(CipherKey); byte[] decryptedBytes = InternalDecrypt(dataBytes, ivBytes, keyBytes); + logger.Debug($"LegacyCryptor String data decrypted successfully"); return Encoding.UTF8.GetString(decryptedBytes, 0, decryptedBytes.Length); } catch(PNException) @@ -90,19 +110,31 @@ public override string Decrypt(string encryptedData) } catch(Exception ex) { + logger.Error($"LegacyCryptor Error while decrypting string data. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Decrypt Error", ex); } } public override byte[] Decrypt(byte[] encryptedData) { - if (encryptedData == null) { throw new ArgumentException("Invalid input","encryptedData"); } - if (encryptedData.Length == 0) { throw new PNException("decryption error"); } + if (encryptedData == null) + { + logger.Debug("LegacyCryptor decrypt data bytes input is null"); + throw new ArgumentException("Invalid input","encryptedData"); + } + + if (encryptedData.Length == 0) + { + logger.Debug("LegacyCryptor decrypt data bytes input is of zero length"); + throw new PNException("decryption error"); + } try { + logger.Debug($"LegacyCryptor Decrypting bytes data. Length {encryptedData.Length}"); byte[] ivBytes = _useDynamicRandomIV ? encryptedData.Take(16).ToArray() : Encoding.UTF8.GetBytes("0123456789012345"); byte[] dataBytes = _useDynamicRandomIV ? encryptedData.Skip(16).ToArray() : encryptedData; if (dataBytes.Length == 0) { throw new PNException("decryption error"); } byte[] keyBytes = Util.GetLegacyEncryptionKey(CipherKey); + logger.Debug($"LegacyCryptor Bytes Data decrypted successfully"); return InternalDecrypt(dataBytes, ivBytes, keyBytes); } catch(PNException) @@ -111,6 +143,7 @@ public override byte[] Decrypt(byte[] encryptedData) } catch(Exception ex) { + logger.Error($"LegacyCryptor Error while decrypting bytes. ErrorMessage {ex.Message}, StackTrace {ex.StackTrace}"); throw new PNException("Decrypt Error", ex); } } @@ -134,7 +167,9 @@ public override void EncryptFile(string sourceFile, string destinationFile) throw new ArgumentException("destination path is not valid"); } byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); + logger.Debug("LegacyCryptor encrypting file"); byte[] outputBytes = Encrypt(inputBytes); + logger.Debug("LegacyCryptor file encrypted successfully"); System.IO.File.WriteAllBytes(destinationFile, outputBytes); #else throw new NotSupportedException("FileSystem not supported in NetStandard 1.0/1.1. Consider higher version of .NetStandard."); @@ -159,8 +194,11 @@ public override void DecryptFile(string sourceFile, string destinationFile) { throw new ArgumentException("destination path is not valid"); } + byte[] inputBytes = System.IO.File.ReadAllBytes(sourceFile); + logger.Debug("LegacyCryptor decrypting file"); byte[] outputBytes = Decrypt(inputBytes); + logger.Debug("LegacyCryptor file decrypted successfully"); System.IO.File.WriteAllBytes(destinationFile, outputBytes); #else throw new NotSupportedException("FileSystem not supported in NetStandard 1.0/1.1. Consider higher version of .NetStandard."); diff --git a/src/Api/PubnubApi/Security/SecureMessage.cs b/src/Api/PubnubApi/Security/SecureMessage.cs index e5bdb5570..abf3f0db8 100644 --- a/src/Api/PubnubApi/Security/SecureMessage.cs +++ b/src/Api/PubnubApi/Security/SecureMessage.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Collections; -using System.Diagnostics; -using System.Globalization; using System.Net; using PubnubApi.Security.Crypto; using PubnubApi.Security.Crypto.Cryptors; @@ -15,14 +12,16 @@ internal class SecureMessage { private PNConfiguration config; private IJsonPluggableLibrary jsonLib; - private IPubnubLog pubnubLog; + private PubnubLogModule pubnubLog; - public static SecureMessage Instance(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, IPubnubLog log) + public static SecureMessage Instance(PNConfiguration pubnubConfig, IJsonPluggableLibrary jsonPluggableLibrary, PubnubLogModule log) { - SecureMessage secureMessage = new SecureMessage(); - secureMessage.config = pubnubConfig; - secureMessage.jsonLib = jsonPluggableLibrary; - secureMessage.pubnubLog = log; + SecureMessage secureMessage = new SecureMessage + { + config = pubnubConfig, + jsonLib = jsonPluggableLibrary, + pubnubLog = log + }; return secureMessage; } @@ -72,8 +71,7 @@ public List HistoryDecodeDecryptLoop(PNOperationType type, List FetchHistoryDecodeDecryptLoop(PNOperationType type, Dicti { status.AffectedChannelGroups.AddRange(channelGroups); } - LoggingMethod.WriteToLog(pubnubLog, $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Failed to decrypt message!\nMessage might be not encrypted, returning as is...",config.LogVerbosity); + pubnubLog.Debug("Failed to decrypt message!\nMessage might be not encrypted, returning as it is"); #endregion } object decodedMessage = jsonLib.DeserializeToObject((decryptMessage == "**DECRYPT ERROR**") ? jsonLib.SerializeToJsonString(kvpValue.Value) : decryptMessage); diff --git a/src/Api/PubnubApi/Transport/HttpClientService.cs b/src/Api/PubnubApi/Transport/HttpClientService.cs index b5396751c..b08e39309 100644 --- a/src/Api/PubnubApi/Transport/HttpClientService.cs +++ b/src/Api/PubnubApi/Transport/HttpClientService.cs @@ -1,5 +1,4 @@ using System; -using System.Globalization; using System.Net.Http; using System.Threading.Tasks; using System.Linq; @@ -12,12 +11,11 @@ namespace PubnubApi public class HttpClientService : IHttpClientService { private readonly HttpClient httpClient; - private IPubnubLog Log { get; set; } - private PNLogVerbosity LogVerbosity { get; set; } + private readonly PubnubLogModule logger; - public HttpClientService(IWebProxy proxy = default, IPubnubLog pubnubLog = default, - PNLogVerbosity verbosity = default) + public HttpClientService(IWebProxy proxy, PNConfiguration configuration ) { + logger = configuration.Logger; httpClient = new HttpClient() { Timeout = Timeout.InfiniteTimeSpan @@ -29,13 +27,11 @@ public HttpClientService(IWebProxy proxy = default, IPubnubLog pubnubLog = defau UseProxy = true }); httpClient.Timeout = Timeout.InfiniteTimeSpan; - Log = pubnubLog; - LogVerbosity = verbosity; } public async Task GetRequest(TransportRequest transportRequest) { - TransportResponse response; + TransportResponse transportResponse; try { HttpRequestMessage requestMessage = @@ -47,38 +43,35 @@ public async Task GetRequest(TransportRequest transportReques requestMessage.Headers.Add(kvp.Key, kvp.Value); } } - + logger.Debug($"Sending http request {transportRequest.RequestType} to {transportRequest.RequestUrl} \n Header {string.Join(", ", requestMessage.Headers.Select(kv => $"{kv.Key}: {kv.Value}"))}"); var httpResult = await httpClient.SendAsync(request: requestMessage, cancellationToken: transportRequest.CancellationTokenSource.Token); var responseContent = await httpResult.Content.ReadAsByteArrayAsync(); - response = new TransportResponse() + transportResponse = new TransportResponse() { StatusCode = (int)httpResult.StatusCode, Content = responseContent, Headers = httpResult.Headers.ToDictionary(h => h.Key, h => h.Value), RequestUrl = httpResult.RequestMessage?.RequestUri?.AbsolutePath }; + logger.Debug($"Received http response from server with status code {httpResult.StatusCode}, content-length: {transportResponse.Content.Length} bytes, for url {transportRequest.RequestUrl}"); } catch (TaskCanceledException) { - response = null; - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Http request cancelled", - LogVerbosity); + logger.Error($"Request is cancelled for url {transportRequest.RequestUrl}"); + transportResponse = null; } catch (Exception e) { - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}", - LogVerbosity); - response = new TransportResponse() + logger.Error($"Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}"); + transportResponse = new TransportResponse() { RequestUrl = transportRequest.RequestUrl, Error = e }; } - return response; + return transportResponse; } public async Task PostRequest(TransportRequest transportRequest) @@ -103,7 +96,7 @@ public async Task PostRequest(TransportRequest transportReque HttpRequestMessage requestMessage = new HttpRequestMessage(method: HttpMethod.Post, requestUri: transportRequest.RequestUrl) { Content = postData }; - + logger.Debug($"Sending http request {transportRequest.RequestType} to {transportRequest.RequestUrl} \n Header {string.Join(", ", requestMessage.Headers.Select(kv => $"{kv.Key}: {kv.Value}"))}"); var httpResult = await httpClient.SendAsync(request: requestMessage, cancellationToken: transportRequest.CancellationTokenSource.Token); var responseContent = await httpResult.Content.ReadAsByteArrayAsync(); @@ -114,19 +107,16 @@ public async Task PostRequest(TransportRequest transportReque Headers = httpResult.Headers.ToDictionary(h => h.Key, h => h.Value), RequestUrl = httpResult.RequestMessage?.RequestUri?.AbsolutePath }; + logger.Debug($"Received http response from server with status code {httpResult.StatusCode}, content-length: {transportResponse.Content.Length} bytes, for url {transportRequest.RequestUrl}"); } catch (TaskCanceledException) { + logger.Error($"Request is cancelled for url {transportRequest.RequestUrl}"); transportResponse = null; - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Http request cancelled", - LogVerbosity); } catch (Exception e) { - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}", - LogVerbosity); + logger.Error($"Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}"); transportResponse = new TransportResponse() { RequestUrl = transportRequest.RequestUrl, @@ -167,7 +157,7 @@ public async Task PutRequest(TransportRequest transportReques requestMessage.Headers.Add(kvp.Key, kvp.Value); } } - + logger.Debug($"Sending http request {transportRequest.RequestType} to {transportRequest.RequestUrl} \n Header {string.Join(", ", requestMessage.Headers.Select(kv => $"{kv.Key}: {kv.Value}"))}"); var httpResult = await httpClient.SendAsync(request: requestMessage, cancellationToken: transportRequest.CancellationTokenSource.Token); var responseContent = await httpResult.Content.ReadAsByteArrayAsync(); @@ -178,19 +168,16 @@ public async Task PutRequest(TransportRequest transportReques Headers = httpResult.Headers.ToDictionary(h => h.Key, h => h.Value), RequestUrl = httpResult.RequestMessage?.RequestUri?.AbsolutePath }; + logger.Debug($"Received http response from server with status code {httpResult.StatusCode}, content-length: {transportResponse.Content.Length} bytes, for url {transportRequest.RequestUrl}"); } catch (TaskCanceledException) { + logger.Error($"Request is cancelled for url {transportRequest.RequestUrl}"); transportResponse = null; - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Http request cancelled", - LogVerbosity); } catch (Exception e) { - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}", - LogVerbosity); + logger.Error($"Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}"); transportResponse = new TransportResponse() { RequestUrl = transportRequest.RequestUrl, @@ -203,7 +190,7 @@ public async Task PutRequest(TransportRequest transportReques public async Task DeleteRequest(TransportRequest transportRequest) { - TransportResponse response; + TransportResponse transportResponse; try { if (transportRequest.Timeout.HasValue) httpClient.Timeout = (TimeSpan)transportRequest.Timeout; @@ -216,38 +203,35 @@ public async Task DeleteRequest(TransportRequest transportReq requestMessage.Headers.Add(kvp.Key, kvp.Value); } } - + logger.Debug($"Sending http request {transportRequest.RequestType} to {transportRequest.RequestUrl} \n Header {string.Join(", ", requestMessage.Headers.Select(kv => $"{kv.Key}: {kv.Value}"))}"); var httpResult = await httpClient.SendAsync(request: requestMessage, cancellationToken: transportRequest.CancellationTokenSource.Token); var responseContent = await httpResult.Content.ReadAsByteArrayAsync(); - response = new TransportResponse() + transportResponse = new TransportResponse() { StatusCode = (int)httpResult.StatusCode, Content = responseContent, Headers = httpResult.Headers.ToDictionary(h => h.Key, h => h.Value), RequestUrl = httpResult.RequestMessage?.RequestUri?.AbsolutePath }; + logger.Debug($"Received http response from server with status code {httpResult.StatusCode}, content-length: {transportResponse.Content.Length} bytes, for url {transportRequest.RequestUrl}"); } catch (TaskCanceledException) { - response = null; - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Http request cancelled", - LogVerbosity); + logger.Error($"Request is cancelled for url {transportRequest.RequestUrl}"); + transportResponse = null; } catch (Exception e) { - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}", - LogVerbosity); - response = new TransportResponse() + logger.Error($"Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}"); + transportResponse = new TransportResponse() { RequestUrl = transportRequest.RequestUrl, Error = e }; } - return response; + return transportResponse; } public async Task PatchRequest(TransportRequest transportRequest) @@ -281,7 +265,7 @@ public async Task PatchRequest(TransportRequest transportRequ requestMessage.Headers.Add(kvp.Key, $"\"{kvp.Value}\""); } } - + logger.Debug($"Sending http request {transportRequest.RequestType} to {transportRequest.RequestUrl} \n Header {string.Join(", ", requestMessage.Headers.Select(kv => $"{kv.Key}: {kv.Value}"))}"); var httpResult = await httpClient.SendAsync(request: requestMessage, cancellationToken: transportRequest.CancellationTokenSource.Token); var responseContent = await httpResult.Content.ReadAsByteArrayAsync(); @@ -292,26 +276,22 @@ public async Task PatchRequest(TransportRequest transportRequ Headers = httpResult.Headers.ToDictionary(h => h.Key, h => h.Value), RequestUrl = httpResult.RequestMessage?.RequestUri?.AbsolutePath }; + logger.Debug($"Received http response from server with status code {httpResult.StatusCode}, content-length: {transportResponse.Content.Length} bytes, for url {transportRequest.RequestUrl}"); } catch (TaskCanceledException) { + logger.Error($"Request is cancelled for url {transportRequest.RequestUrl}"); transportResponse = null; - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Http request cancelled", - LogVerbosity); } catch (Exception e) { - LoggingMethod.WriteToLog(Log, - $"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] Error: Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}", - LogVerbosity); + logger.Error($"Exception for http call url {transportRequest.RequestUrl}, exception message: {e.Message}, stacktrace: {e.StackTrace}"); transportResponse = new TransportResponse() { RequestUrl = transportRequest.RequestUrl, Error = e }; } - return transportResponse; } } diff --git a/src/Api/PubnubApiPCL/PubnubApiPCL.csproj b/src/Api/PubnubApiPCL/PubnubApiPCL.csproj index ac7e61915..8eb2278cd 100644 --- a/src/Api/PubnubApiPCL/PubnubApiPCL.csproj +++ b/src/Api/PubnubApiPCL/PubnubApiPCL.csproj @@ -340,6 +340,9 @@ Model\Consumer\AccessManager\PNAccessManagerKeysData.cs + + + diff --git a/src/Api/PubnubApiUWP/PubnubApiUWP.csproj b/src/Api/PubnubApiUWP/PubnubApiUWP.csproj index 8ea4aac2d..1a33c7dce 100644 --- a/src/Api/PubnubApiUWP/PubnubApiUWP.csproj +++ b/src/Api/PubnubApiUWP/PubnubApiUWP.csproj @@ -456,6 +456,9 @@ Model\Consumer\AccessManager\PNAccessManagerKeysData.cs + + + diff --git a/src/Api/PubnubApiUnity/PubnubApiUnity.csproj b/src/Api/PubnubApiUnity/PubnubApiUnity.csproj index 047d0be02..554286404 100644 --- a/src/Api/PubnubApiUnity/PubnubApiUnity.csproj +++ b/src/Api/PubnubApiUnity/PubnubApiUnity.csproj @@ -349,6 +349,9 @@ Model\Consumer\AccessManager\PNAccessManagerKeysData.cs + + + From 85efc37660f1b7ac87c99f418095f8c4b1b61861 Mon Sep 17 00:00:00 2001 From: Mohit Tejani Date: Mon, 3 Mar 2025 12:31:53 +0530 Subject: [PATCH 02/11] Fixed default logger target missing issue. --- src/Api/PubnubApi/Pubnub.cs | 1 - src/Api/PubnubApiPCL/PubnubApiPCL.csproj | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Api/PubnubApi/Pubnub.cs b/src/Api/PubnubApi/Pubnub.cs index 1232d9870..024a5ad4a 100644 --- a/src/Api/PubnubApi/Pubnub.cs +++ b/src/Api/PubnubApi/Pubnub.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.Reflection; using PubnubApi.EndPoint; using PubnubApi.EventEngine.Subscribe; using PubnubApi.EventEngine.Subscribe.Events; diff --git a/src/Api/PubnubApiPCL/PubnubApiPCL.csproj b/src/Api/PubnubApiPCL/PubnubApiPCL.csproj index 8eb2278cd..07110aa29 100644 --- a/src/Api/PubnubApiPCL/PubnubApiPCL.csproj +++ b/src/Api/PubnubApiPCL/PubnubApiPCL.csproj @@ -1006,6 +1006,10 @@ + + + +