/// <summary>
            /// Create session
            /// </summary>
            /// <param name="manager"></param>
            /// <param name="context"></param>
            /// <param name="id"></param>
            /// <param name="endpoint"></param>
            /// <param name="serverCertificate"></param>
            /// <param name="clientNonce"></param>
            /// <param name="timeout"></param>
            /// <param name="serverNonce"></param>
            /// <param name="clientCertificate"></param>
            /// <param name="maxRequestAge"></param>
            /// <param name="validator"></param>
            public GatewaySession(SessionServices manager,
                                  RequestContextModel context, NodeId id, EndpointDescription endpoint,
                                  X509Certificate2 clientCertificate, byte[] clientNonce,
                                  X509Certificate2 serverCertificate, byte[] serverNonce,
                                  TimeSpan timeout, TimeSpan maxRequestAge, UserIdentityHandler validator)
            {
                if (context == null)
                {
                    throw new ArgumentNullException(nameof(context));
                }
                if (context.ChannelContext == null)
                {
                    throw new ServiceResultException(StatusCodes.BadSecureChannelIdInvalid);
                }
                _validator         = validator;
                _secureChannelId   = context.ChannelContext.SecureChannelId;
                _serverNonce       = serverNonce;
                _serverCertificate = serverCertificate;
                _clientCertificate = clientCertificate;
                _maxRequestAge     = maxRequestAge;
                Endpoint           = endpoint;
                Identities         = new List <IUserIdentity>();

                Id             = id;
                ClientNonce    = clientNonce;
                MessageContext = new ServiceMessageContext();

                _cts          = new CancellationTokenSource();
                _timeout      = timeout;
                _timeoutTimer = new Timer(o => OnTimeout(manager), null,
                                          timeout, Timeout.InfiniteTimeSpan);
            }
 /// <summary>
 /// Timer expired, cleanup session
 /// </summary>
 /// <param name="manager"></param>
 private void OnTimeout(SessionServices manager)
 {
     manager._sessionTimeout?.Invoke(this, null);
     manager.CloseSession(Id); // This calls dispose
 }