/// <summary>
        /// Constructor using an <see cref="IObjectSerializer"/> for persistence.
        /// </summary>
        public LockedFileDataPersister(
            string fullFilename,
            IObjectSerializer serializer,
            int numberOfRetries = 3,
            int retryDelay      = 100)
        {
            _committedFile   = new FileInfo(fullFilename /*.Validation().NotNull(nameof(fullFilename))*/).FullName;
            _read            = async(ct, stream) => (T)serializer.FromStream(stream, typeof(T));
            _write           = async(ct, entity, stream) => serializer.WriteToStream(entity, typeof(T), stream, canDisposeStream: true);
            _numberOfRetries = numberOfRetries;
            _retryDelay      = retryDelay;

            // Create other working file names
            _oldFile  = _committedFile + ".old";
            _newFile  = _committedFile + ".new";
            _lockFile = _committedFile + ".lck";
        }
        private string CreateJsonWebToken(AuthenticationToken token = null, TimeSpan?timeToLive = null)
        {
            const string header    = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";          // alg=HS256, type=JWT
            const string signature = "QWqnPP8W6ymexz74P6quP-oG-wxr7vMGqrEL8y_tV6M";   // dummy stuff

            var now = DateTimeOffset.Now;

            token = (token ?? AuthenticationToken.Default)
                    .WithExpiration(now + (timeToLive ?? TimeSpan.FromMinutes(10)))
                    .WithIssuedAt(now);

            string payload;

            using (var stream = new MemoryStream())
            {
                _serializer.WriteToStream(token, typeof(AuthenticationToken), stream, canDisposeStream: false);
                payload = Convert.ToBase64String(stream.ToArray());
            }

            return(header + '.' + payload + '.' + signature);
        }