public static async ValueTask AuthorizeAsync(IPacketReader <WrxPacket> requestReader, IPacketWriter <WrxPacket> responseWriter, IAsyncWrxTcpDeviceAuthorizer authorizer, ArrayPool <byte> byteArrayPool, CancellationToken cancellationToken = default)
        {
            using var requestPacket = await requestReader.ReadAsync(cancellationToken).ConfigureAwait(false);

            var(protocol, requestAction, requestCommand, _) = requestPacket;

            if (requestAction != WrxPacketAction.TcpAuthorizationRequest)
            {
                throw new Exception();
            }

            if (requestCommand != 0)
            {
                throw new Exception();
            }

            var byteArray = byteArrayPool.Rent(WrxTcpAuthorizationData.Size);

            try
            {
                var bytes = byteArray.AsMemory();
                (await authorizer.ProvideDataAsync(cancellationToken).ConfigureAwait(false)).Write(bytes.Span);
                using var responsePacket = new WrxPacket(protocol, WrxPacketAction.TcpAuthorizationResponse, 0, bytes[..WrxTcpAuthorizationData.Size]);
 public static ValueTask AuthorizeAsync(IPacketReader <WrxPacket> requestReader, IPacketWriter <WrxPacket> responseWriter, IAsyncWrxTcpDeviceAuthorizer authorizer, CancellationToken cancellationToken = default)
 {
     return(AuthorizeAsync(requestReader, responseWriter, authorizer, ArrayPool <byte> .Shared, cancellationToken));
 }