protected virtual void OnReceive(StratumClient client, PooledArraySegment <byte> data)
        {
            // get off of LibUV event-loop-thread immediately
            Task.Run(async() =>
            {
                using (data)
                {
                    JsonRpcRequest request = null;

                    try
                    {
                        // de-serialize
                        _logger.Verbose($"[{client.ConnectionId}] Received request data:\n {StratumConstants.Encoding.GetString(data.Array, 0, data.Size).FormatJson()}");
                        request = client.DeserializeRequest(data);

                        // dispatch
                        if (request != null)
                        {
                            _logger.Debug($"[{client.ConnectionId}] Dispatching request '{request.Method}' [{request.Id}]");
                            await _pool.OnRequestAsync(client, new Timestamped <JsonRpcRequest>(request, MasterClock.Now));
                        }
                        else
                        {
                            _logger.Verbose($"[{client.ConnectionId}] Unable to deserialize request");
                        }
                    }
                    catch (JsonReaderException jsonEx)
                    {
                        // junk received (no valid json)
                        _logger.Error($"[{client.ConnectionId}] Connection json error state: {jsonEx.Message}");
                    }

                    catch (Exception ex)
                    {
                        if (request != null)
                        {
                            _logger.Error(ex, $"[{client.ConnectionId}] Error processing request {request.Method} [{request.Id}]");
                        }
                    }
                }
            });
        }