private Status ExecuteGet(ref KeyEnvelope keyEnvelope, ref ValueEnvelope inputEnvelope, ref ValueEnvelope outputEnvelope)
        {
            Status status = KVSession.Read(ref keyEnvelope, ref inputEnvelope, ref outputEnvelope, UnsafeContext, GetSerialNum());

            if (status == Status.PENDING)
            {
                KVSession.CompletePending(true, true);
                status = UnsafeContext.Consume(out outputEnvelope);
            }

            return(status);
        }
        private void ServeUpsert(Job job)
        {
            KeyEnvelope   keyEnvelope   = new KeyEnvelope(job.Key);
            ValueEnvelope valueEnvelope = new ValueEnvelope(job.Input);

            try
            {
                KVSession.Upsert(ref keyEnvelope, ref valueEnvelope, Context.Empty, GetSerialNum());
            }
            catch (Exception e)
            {
                job.Complete(e);
            }
            finally
            {
                job.Complete(true, job.Input);
            }
        }
        private void ServeGetContent(Job job)
        {
            KeyEnvelope keyEnvelope = new KeyEnvelope(job.Key);

            ValueEnvelope inputEnvelope  = default;
            ValueEnvelope outputEnvelope = default;

            Status status = Status.ERROR;

            try
            {
                status = ExecuteGet(ref keyEnvelope, ref inputEnvelope, ref outputEnvelope);

                switch (status)
                {
                case Status.ERROR:
                    job.Complete(new Exception($"read error => {JsonSerializer.Serialize(job.Key)}"));
                    break;

                case Status.NOTFOUND:
                    job.Complete(false);
                    break;

                case Status.OK:
                    job.Complete(true, outputEnvelope.Content);
                    break;

                default:
                    job.Complete(new Exception($"Read WTF => {status} - {JsonSerializer.Serialize(job.Key)}"));
                    break;
                }
            }
            catch (Exception e)
            {
                job.Complete(e);
            }
        }
        private void ServeRemove(Job job)
        {
            KeyEnvelope   keyEnvelope    = new KeyEnvelope(job.Key);
            ValueEnvelope outputEnvelope = default;

            Status status = Status.ERROR;

            try
            {
                status = KVSession.Delete(ref keyEnvelope, UnsafeContext, GetSerialNum());
                if (status == Status.PENDING)
                {
                    KVSession.CompletePending(true, true);
                    status = UnsafeContext.Consume(out outputEnvelope);
                }
            }
            catch (Exception e)
            {
                job.Complete(e);
            }

            switch (status)
            {
            case Status.ERROR:
                job.Complete(new Exception($"read error => {JsonSerializer.Serialize(job.Key)}"));
                break;

            case Status.NOTFOUND:
                job.Complete(false);
                break;

            case Status.OK:
                job.Complete(true, default);
                break;
            }
        }
 private static bool AreEqual(KeyEnvelope left, KeyEnvelope right)
 => left.KeyId.Equals(right.KeyId, StringComparison.InvariantCulture) &&
 left.EncryptedKey.SequenceEqual(right.EncryptedKey) &&
 left.Algorithm.Equals(right.Algorithm, StringComparison.InvariantCulture);