Example #1
0
        public static T1 GetClientProxy <T1>(
            ReliableSamHelper helper,
            string serverDestination,
            out JsonSamServiceInterceptor interceptor,
            JsonSamClientSettings jsonSamClientSettings,
            Action <RpcRethrowableException>
            advancedRpcRethrowableExceptionHandling = null
            )
        {
            if (helper == null)
            {
                throw new ArgumentNullException(
                          MyNameof.GetLocalVarName(() => helper));
            }
            if (string.IsNullOrWhiteSpace(serverDestination))
            {
                throw new ArgumentNullException(
                          MyNameof.GetLocalVarName(() => serverDestination));
            }
            var factory = new ProxyFactory();

            interceptor = new JsonSamServiceInterceptor(
                helper,
                typeof(T1),
                serverDestination,
                jsonSamClientSettings,
                advancedRpcRethrowableExceptionHandling
                );
            return(factory.CreateProxy <T1>(interceptor));
        }
Example #2
0
        private async Task testSendReceiveFunc(
            ReliableSamHelper reliableHelperRecv,
            ReconnectingSamHelper reconnectingSamHelperSend,
            ReliableSamHelper reliableHelperSend,
            byte[] data,
            SamHelper samHelperReceive
            )
        {
            var waitRecvMessage = reliableHelperRecv.ReliableMessageReceived
                                  .Where(x => x.Destination == reconnectingSamHelperSend.Session.Destination)
                                  .FirstAsync()
                                  .ToTask();

            try
            {
                var messageId = await reliableHelperSend.SendReliableMessage(
                    samHelperReceive.Session.Destination,
                    data
                    ).ConfigureAwait(false);

                _logger.Trace("Message sent id {0}", messageId);
            }
            catch (EnumException <ReliableSamHelper.SendReliableMessageExcs> exc)
            {
                _logger.Trace("Send error {0}", exc.ExceptionCode);
                throw;
            }
            try
            {
                var receivedMessage = await waitRecvMessage.ConfigureAwait(false);

                _logger.Trace("Message received {0} bytes", receivedMessage.Data.Length);
                Assert.Equal(data, receivedMessage.Data);
            }
            catch (OperationCanceledException exc)
            {
                _logger.Trace("Recv timeout {0}", exc);
                throw;
            }
            catch (Exception exc)
            {
                _logger.Trace("Recv error {0}", exc);
                throw;
            }
        }
 private async Task testSendReceiveFunc(
     ReliableSamHelper reliableHelperRecv,
     ReconnectingSamHelper reconnectingSamHelperSend,
     ReliableSamHelper reliableHelperSend,
     byte[] data,
     SamHelper samHelperReceive
 )
 {
     var waitRecvMessage = reliableHelperRecv.ReliableMessageReceived
             .Where(x => x.Destination == reconnectingSamHelperSend.Session.Destination)
             .FirstAsync()
             .ToTask();
     try
     {
         var messageId = await reliableHelperSend.SendReliableMessage(
             samHelperReceive.Session.Destination,
             data
             ).ConfigureAwait(false);
         _logger.Trace("Message sent id {0}", messageId);
     }
     catch (EnumException<ReliableSamHelper.SendReliableMessageExcs> exc)
     {
         _logger.Trace("Send error {0}", exc.ExceptionCode);
         throw;
     }
     try
     {
         var receivedMessage = await waitRecvMessage.ConfigureAwait(false);
         _logger.Trace("Message received {0} bytes", receivedMessage.Data.Length);
         Assert.Equal(data, receivedMessage.Data);
     }
     catch (OperationCanceledException exc)
     {
         _logger.Trace("Recv timeout {0}", exc);
         throw;
     }
     catch (Exception exc)
     {
         _logger.Trace("Recv error {0}", exc);
         throw;
     }
 }
Example #4
0
 public JsonSamServiceInterceptor(
     ReliableSamHelper reliableSamHelper,
     Type serviceInterface,
     string serverDestination,
     JsonSamClientSettings samClientSettings,
     Action <RpcRethrowableException>
     advancedRpcRethrowableExceptionHandling = null
     )
 {
     _advancedRpcRethrowableExceptionHandling
         = advancedRpcRethrowableExceptionHandling;
     _samClientSettings = samClientSettings;
     _serverDestination = serverDestination;
     _reliableSamHelper = reliableSamHelper;
     foreach (
         MethodInfo methodInfo
         in JsonRpcClientProcessor.GetPublicMethods(
             serviceInterface
             )
         )
     {
         var attr =
             methodInfo.GetCustomAttribute <
                 JsonSamOperationContractAttribute
                 >()
             ?? new JsonSamOperationContractAttribute();
         _methodsDb.Add(
             methodInfo.Name,
             new ContractMethodInfo()
         {
             CallReliable         = attr.CallReliable,
             ReturnResultReliable = attr.ReturnResultReliable
         }
             );
     }
 }
 public async Task TestMemoryOverhead()
 {
     const string addressSend = "127.0.0.1";
     const int portSend = 7656;
     const string addressRecv = addressSend;
     const int portRecv = 7656;
     const string i2cpOptions = "";
     var samHelperSend = await SamHelper.CreateInstance(
         new SamHelperSettings()
         {
             SamServerAddress = addressSend,
             SamServerPort = portSend
         }, CancellationToken.None
     ).ConfigureAwait(false);
     var samHelperReceive = await SamHelper.CreateInstance(
         new SamHelperSettings()
         {
             SamServerAddress = addressRecv,
             SamServerPort = portRecv
         }, CancellationToken.None
     ).ConfigureAwait(false);
     var reliableHelperSend = new ReliableSamHelper(
         samHelperSend,
         new ReliableSamHelperSettings()
     );
     var reliableHelperRecv = new ReliableSamHelper(
         samHelperReceive,
         new ReliableSamHelperSettings()
     );
     /**/
     var data = new byte[400000];
     MiscFuncs.GetRandomBytes(data);
     _logger.Trace("Begin Total memory - {0} bytes", GC.GetTotalMemory(true));
     for (int i = 0; i < 10; i++)
     {
         var waitRecvMessage = reliableHelperRecv.ReliableMessageReceived
             .Where(x => x.Destination == samHelperSend.Session.Destination)
             .FirstAsync()
             .ToTask();
         try
         {
             var messageId = await reliableHelperSend.SendReliableMessage(
                 samHelperReceive.Session.Destination,
                 data
             ).ConfigureAwait(false);
             _logger.Trace("Message sent id {0}", messageId);
         }
         catch (EnumException<ReliableSamHelper.SendReliableMessageExcs> exc)
         {
             _logger.Trace("Send error {0}", exc.ExceptionCode);
             throw;
         }
         try
         {
             var receivedMessage = await waitRecvMessage.ConfigureAwait(false);
             _logger.Trace(
                 "Message received {0} bytes", 
                 receivedMessage.Data.Length
             );
             Assert.Equal(data, receivedMessage.Data);
         }
         catch (OperationCanceledException exc)
         {
             _logger.Trace("Recv timeout {0}", exc);
             throw;
         }
         catch (Exception exc)
         {
             _logger.Trace("Recv error {0}", exc);
             throw;
         }
     }
     /**/
     long memory = GC.GetTotalMemory(true);
     _logger.Trace("End Total memory - {0} bytes", memory);
     await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("reliableHelperSend disposed");
     await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("reliableHelperRecv disposed");
     await samHelperSend.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("samHelperSend disposed");
     await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("samHelperReceive disposed");
 }
 public async Task TestSendReceiveOneMessageImpl()
 {
     const string addressSend = "192.168.56.102";//"192.168.1.132";
     const int portSend = 7656;
     const string addressRecv = addressSend; //"127.0.0.1";
     const int portRecv = 7656;
     var samHelperSend = await SamHelper.CreateInstance(
         new SamHelperSettings()
         {
             SamServerAddress = addressSend,
             SamServerPort = portSend
         }, CancellationToken.None
     ).ConfigureAwait(false);
     var samHelperReceive = await SamHelper.CreateInstance(
         new SamHelperSettings()
         {
             SamServerAddress = addressRecv,
             SamServerPort = portRecv
         }, CancellationToken.None
     ).ConfigureAwait(false);
     var reliableHelperSend = new ReliableSamHelper(
         samHelperSend, 
         new ReliableSamHelperSettings()
     );
     var reliableHelperRecv = new ReliableSamHelper(
         samHelperReceive, 
         new ReliableSamHelperSettings()
     );
     var data = new byte[1];
     MiscFuncs.GetRandomBytes(data);
     var waitRecvMessage = reliableHelperRecv.ReliableMessageReceived
         .Where(x => x.Destination == samHelperSend.Session.Destination)
         .FirstAsync()
         .ToTask();
     var sendProgress = new Progress<OutMessageProgressInfo>(
         x => _logger.Trace(x.ToString())
     );
     try
     {
         var messageId = await reliableHelperSend.SendReliableMessage(
             samHelperReceive.Session.Destination,
             data,
             sendProgress
         ).ConfigureAwait(false);
         _logger.Trace("Message sent id {0}", messageId);
     }
     catch (EnumException<ReliableSamHelper.SendReliableMessageExcs> exc)
     {
         _logger.Trace("Send error {0}", exc.ExceptionCode);
         throw;
     }
     try
     {
         var receivedMessage = await waitRecvMessage.ConfigureAwait(false);
         _logger.Trace("Message received {0} bytes", receivedMessage.Data.Length);
         Assert.Equal(data,receivedMessage.Data);
     }
     catch (OperationCanceledException exc)
     {
         _logger.Trace("Recv timeout {0}", exc);
         throw;
     }
     catch (Exception exc)
     {
         _logger.Trace("Recv error {0}", exc);
         throw;
     }
     _logger.Trace("End Total memory - {0} bytes", GC.GetTotalMemory(true));
     await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("reliableHelperSend disposed");
     await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("reliableHelperRecv disposed");
     await samHelperSend.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("samHelperSend disposed");
     await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("samHelperReceive disposed");
 }
 public async Task TestReconnectingReliable()
 {
     const string addressSend = "127.0.0.1";
     const int portSend = 7656;
     /**/
     var proxyHostname = "127.0.0.1";
     var proxyPort = 17000;
     var proxyServer = await MyTcpProxyServer.CreateInstance(
         new MyTcpProxyServerSettings()
         {
             DestinationHostname = addressSend,
             DestinationPort = portSend,
             ServerHostname = proxyHostname,
             ServerPort = proxyPort
         }
     ).ConfigureAwait(false);
     /**/
     const string addressRecv = addressSend;
     const int portRecv = portSend;
     string sendPrivKeys;
     /**/
     {
         var samHelperSend = await SamHelper.CreateInstance(
             new SamHelperSettings()
             {
                 SamServerAddress = addressSend,
                 SamServerPort = portSend
             }, CancellationToken.None
             ).ConfigureAwait(false);
         sendPrivKeys = samHelperSend.Session.PrivateKey;
         await samHelperSend.MyDisposeAsync().ConfigureAwait(false);
     }
     /**/
     var reconnectingSamHelperSend = await ReconnectingSamHelper.CreateInstance(
         new ReconnectingSamHelperSettings()
         {
             ImplementationHelperSettings =
                 new SamHelperSettings()
                 {
                     SamServerAddress = proxyHostname,
                     SamServerPort = proxyPort,
                     SessionPrivateKeys = sendPrivKeys
                 }
         }, CancellationToken.None
         ).ConfigureAwait(false);
     var samHelperReceive = await SamHelper.CreateInstance(
         new SamHelperSettings()
         {
             SamServerAddress = addressRecv,
             SamServerPort = portRecv
         }, CancellationToken.None
         ).ConfigureAwait(false);
     var reliableHelperSend = new ReliableSamHelper(
         reconnectingSamHelperSend,
         new ReliableSamHelperSettings()
         );
     var reliableHelperRecv = new ReliableSamHelper(
         samHelperReceive,
         new ReliableSamHelperSettings()
         );
     var data = new byte[200000];
     MiscFuncs.GetRandomBytes(data);
     /**/
     await testSendReceiveFunc(
         reliableHelperRecv,
         reconnectingSamHelperSend,
         reliableHelperSend,
         data,
         samHelperReceive
     ).ConfigureAwait(false);
     await proxyServer.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("###################################");
     await Assert.ThrowsAsync<TimeoutException>(
         async () => await testSendReceiveFunc(
             reliableHelperRecv,
             reconnectingSamHelperSend,
             reliableHelperSend,
             data,
             samHelperReceive
         ).ConfigureAwait(false)
     ).ConfigureAwait(false);
     /**/
     _logger.Trace("###################################");
     proxyServer = await MyTcpProxyServer.CreateInstance(
         new MyTcpProxyServerSettings()
         {
             DestinationHostname = addressSend,
             DestinationPort = portSend,
             ServerHostname = proxyHostname,
             ServerPort = proxyPort
         }
     ).ConfigureAwait(false);
     reconnectingSamHelperSend.TryToReconnect(DateTime.UtcNow);
     await Task.Delay(TimeSpan.FromSeconds(15.0d)).ConfigureAwait(false);
     /**/
     await testSendReceiveFunc(
         reliableHelperRecv,
         reconnectingSamHelperSend,
         reliableHelperSend,
         data,
         samHelperReceive
     ).ConfigureAwait(false);
     /**/
     await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("reliableHelperSend disposed");
     await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("reliableHelperRecv disposed");
     await reconnectingSamHelperSend.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("samHelperSend disposed");
     await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("samHelperReceive disposed");
     await proxyServer.MyDisposeAsync().ConfigureAwait(false);
     _logger.Trace("{0} disposed",MyNameof.GetLocalVarName(() => proxyServer));
 }
Example #8
0
        public async Task TestReconnectingReliable()
        {
            const string addressSend = "127.0.0.1";
            const int    portSend    = 7656;
            /**/
            var proxyHostname = "127.0.0.1";
            var proxyPort     = 17000;
            var proxyServer   = await MyTcpProxyServer.CreateInstance(
                new MyTcpProxyServerSettings()
            {
                DestinationHostname = addressSend,
                DestinationPort     = portSend,
                ServerHostname      = proxyHostname,
                ServerPort          = proxyPort
            }
                ).ConfigureAwait(false);

            /**/
            const string addressRecv = addressSend;
            const int    portRecv    = portSend;
            string       sendPrivKeys;
            /**/
            {
                var samHelperSend = await SamHelper.CreateInstance(
                    new SamHelperSettings()
                {
                    SamServerAddress = addressSend,
                    SamServerPort    = portSend
                }, CancellationToken.None
                    ).ConfigureAwait(false);

                sendPrivKeys = samHelperSend.Session.PrivateKey;
                await samHelperSend.MyDisposeAsync().ConfigureAwait(false);
            }
            /**/
            var reconnectingSamHelperSend = await ReconnectingSamHelper.CreateInstance(
                new ReconnectingSamHelperSettings()
            {
                ImplementationHelperSettings =
                    new SamHelperSettings()
                {
                    SamServerAddress   = proxyHostname,
                    SamServerPort      = proxyPort,
                    SessionPrivateKeys = sendPrivKeys
                }
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var samHelperReceive = await SamHelper.CreateInstance(
                new SamHelperSettings()
            {
                SamServerAddress = addressRecv,
                SamServerPort    = portRecv
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var reliableHelperSend = new ReliableSamHelper(
                reconnectingSamHelperSend,
                new ReliableSamHelperSettings()
                );
            var reliableHelperRecv = new ReliableSamHelper(
                samHelperReceive,
                new ReliableSamHelperSettings()
                );
            var data = new byte[200000];

            MiscFuncs.GetRandomBytes(data);
            /**/
            await testSendReceiveFunc(
                reliableHelperRecv,
                reconnectingSamHelperSend,
                reliableHelperSend,
                data,
                samHelperReceive
                ).ConfigureAwait(false);

            await proxyServer.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("###################################");
            await Assert.ThrowsAsync <TimeoutException>(
                async() => await testSendReceiveFunc(
                    reliableHelperRecv,
                    reconnectingSamHelperSend,
                    reliableHelperSend,
                    data,
                    samHelperReceive
                    ).ConfigureAwait(false)
                ).ConfigureAwait(false);

            /**/
            _logger.Trace("###################################");
            proxyServer = await MyTcpProxyServer.CreateInstance(
                new MyTcpProxyServerSettings()
            {
                DestinationHostname = addressSend,
                DestinationPort     = portSend,
                ServerHostname      = proxyHostname,
                ServerPort          = proxyPort
            }
                ).ConfigureAwait(false);

            reconnectingSamHelperSend.TryToReconnect(DateTime.UtcNow);
            await Task.Delay(TimeSpan.FromSeconds(15.0d)).ConfigureAwait(false);

            /**/
            await testSendReceiveFunc(
                reliableHelperRecv,
                reconnectingSamHelperSend,
                reliableHelperSend,
                data,
                samHelperReceive
                ).ConfigureAwait(false);

            /**/
            await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperSend disposed");
            await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperRecv disposed");
            await reconnectingSamHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperSend disposed");
            await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperReceive disposed");
            await proxyServer.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("{0} disposed", MyNameof.GetLocalVarName(() => proxyServer));
        }
Example #9
0
        public async Task TestMemoryOverhead()
        {
            const string addressSend   = "127.0.0.1";
            const int    portSend      = 7656;
            const string addressRecv   = addressSend;
            const int    portRecv      = 7656;
            const string i2cpOptions   = "";
            var          samHelperSend = await SamHelper.CreateInstance(
                new SamHelperSettings()
            {
                SamServerAddress = addressSend,
                SamServerPort    = portSend
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var samHelperReceive = await SamHelper.CreateInstance(
                new SamHelperSettings()
            {
                SamServerAddress = addressRecv,
                SamServerPort    = portRecv
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var reliableHelperSend = new ReliableSamHelper(
                samHelperSend,
                new ReliableSamHelperSettings()
                );
            var reliableHelperRecv = new ReliableSamHelper(
                samHelperReceive,
                new ReliableSamHelperSettings()
                );
            /**/
            var data = new byte[400000];

            MiscFuncs.GetRandomBytes(data);
            _logger.Trace("Begin Total memory - {0} bytes", GC.GetTotalMemory(true));
            for (int i = 0; i < 10; i++)
            {
                var waitRecvMessage = reliableHelperRecv.ReliableMessageReceived
                                      .Where(x => x.Destination == samHelperSend.Session.Destination)
                                      .FirstAsync()
                                      .ToTask();
                try
                {
                    var messageId = await reliableHelperSend.SendReliableMessage(
                        samHelperReceive.Session.Destination,
                        data
                        ).ConfigureAwait(false);

                    _logger.Trace("Message sent id {0}", messageId);
                }
                catch (EnumException <ReliableSamHelper.SendReliableMessageExcs> exc)
                {
                    _logger.Trace("Send error {0}", exc.ExceptionCode);
                    throw;
                }
                try
                {
                    var receivedMessage = await waitRecvMessage.ConfigureAwait(false);

                    _logger.Trace(
                        "Message received {0} bytes",
                        receivedMessage.Data.Length
                        );
                    Assert.Equal(data, receivedMessage.Data);
                }
                catch (OperationCanceledException exc)
                {
                    _logger.Trace("Recv timeout {0}", exc);
                    throw;
                }
                catch (Exception exc)
                {
                    _logger.Trace("Recv error {0}", exc);
                    throw;
                }
            }
            /**/
            long memory = GC.GetTotalMemory(true);

            _logger.Trace("End Total memory - {0} bytes", memory);
            await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperSend disposed");
            await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperRecv disposed");
            await samHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperSend disposed");
            await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperReceive disposed");
        }
Example #10
0
        public async Task TestSendReceiveOneMessageImpl()
        {
            const string addressSend   = "192.168.56.102"; //"192.168.1.132";
            const int    portSend      = 7656;
            const string addressRecv   = addressSend;      //"127.0.0.1";
            const int    portRecv      = 7656;
            var          samHelperSend = await SamHelper.CreateInstance(
                new SamHelperSettings()
            {
                SamServerAddress = addressSend,
                SamServerPort    = portSend
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var samHelperReceive = await SamHelper.CreateInstance(
                new SamHelperSettings()
            {
                SamServerAddress = addressRecv,
                SamServerPort    = portRecv
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var reliableHelperSend = new ReliableSamHelper(
                samHelperSend,
                new ReliableSamHelperSettings()
                );
            var reliableHelperRecv = new ReliableSamHelper(
                samHelperReceive,
                new ReliableSamHelperSettings()
                );
            var data = new byte[1];

            MiscFuncs.GetRandomBytes(data);
            var waitRecvMessage = reliableHelperRecv.ReliableMessageReceived
                                  .Where(x => x.Destination == samHelperSend.Session.Destination)
                                  .FirstAsync()
                                  .ToTask();
            var sendProgress = new Progress <OutMessageProgressInfo>(
                x => _logger.Trace(x.ToString())
                );

            try
            {
                var messageId = await reliableHelperSend.SendReliableMessage(
                    samHelperReceive.Session.Destination,
                    data,
                    sendProgress
                    ).ConfigureAwait(false);

                _logger.Trace("Message sent id {0}", messageId);
            }
            catch (EnumException <ReliableSamHelper.SendReliableMessageExcs> exc)
            {
                _logger.Trace("Send error {0}", exc.ExceptionCode);
                throw;
            }
            try
            {
                var receivedMessage = await waitRecvMessage.ConfigureAwait(false);

                _logger.Trace("Message received {0} bytes", receivedMessage.Data.Length);
                Assert.Equal(data, receivedMessage.Data);
            }
            catch (OperationCanceledException exc)
            {
                _logger.Trace("Recv timeout {0}", exc);
                throw;
            }
            catch (Exception exc)
            {
                _logger.Trace("Recv error {0}", exc);
                throw;
            }
            _logger.Trace("End Total memory - {0} bytes", GC.GetTotalMemory(true));
            await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperSend disposed");
            await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperRecv disposed");
            await samHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperSend disposed");
            await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperReceive disposed");
        }
Example #11
0
        /**/
        private static readonly Logger _log
            = LogManager.GetCurrentClassLogger();
        /**/
        public static async Task <SamClientInfo <T1> > CreateInstance(
            string samServerAddress,
            int samServerPort,
            string serverDestination,
            CancellationToken cancellationToken,
            JsonSamClientSettings jsonSamClientSettings,
            string clientPrivateKeys = null,
            Action <RpcRethrowableException>
            advancedRpcRethrowableExceptionHandling = null,
            bool useReconnectingSamHelper           = false,
            string i2CpOptions = null
            )
        {
            var        result = new SamClientInfo <T1>();
            ISamHelper samHelperSend;
            var        samHelperSettings = new SamHelperSettings()
            {
                SamServerAddress   = samServerAddress,
                SamServerPort      = samServerPort,
                SessionPrivateKeys = clientPrivateKeys,
                I2CpOptions        = i2CpOptions
            };

            if (!useReconnectingSamHelper)
            {
                samHelperSend = await SamHelper.SamHelper.CreateInstance(
                    samHelperSettings,
                    cancellationToken
                    ).ConfigureAwait(false);
            }
            else
            {
                samHelperSend = await ReconnectingSamHelper.CreateInstance(
                    new ReconnectingSamHelperSettings()
                {
                    ImplementationHelperSettings = samHelperSettings
                },
                    cancellationToken
                    ).ConfigureAwait(false);
            }
            try
            {
                result.SamHelperSend = samHelperSend;
                var reliableHelperSend = new ReliableSamHelper(
                    samHelperSend,
                    new ReliableSamHelperSettings()
                    );
                result.ReliableHelperSend = reliableHelperSend;
                result.JsonClient         =
                    JsonSamServiceInterceptor.GetClientProxy <T1>(
                        reliableHelperSend,
                        serverDestination,
                        out result.SamInterceptor,
                        jsonSamClientSettings,
                        advancedRpcRethrowableExceptionHandling
                        );
            }
            catch (Exception)
            {
                await samHelperSend.MyDisposeAsync().ConfigureAwait(false);

                throw;
            }
            return(result);
        }