private int CalculateSize(IWriteablePacket packet) { var writer = new CountingPacketWriter(); packet.Write(writer); return(writer.Size); }
private void WritePacketToPipe(IWriteablePacket packet) { var dataSize = CalculateSize(packet) + CountingPacketWriter.GetVarIntSize(packet.Id); var packetSize = dataSize + CountingPacketWriter.GetVarIntSize(dataSize); var writer = _writerFactory.CreateWriter(_writer.GetMemory(packetSize)); writer.WriteVarInt(dataSize); writer.WriteVarInt(packet.Id); packet.Write(writer); _writer.Advance(packetSize); _metrics.Measure.Histogram.Update(MetricsRegistry.WritePacketSize, packetSize); }
public void Broadcast(IWriteablePacket packet) { _metrics.Measure.Meter.Mark(MetricsRegistry.BroadcastPackets); for (var index = 0; index < _packetQueues.Count; index++) { var reference = _packetQueues[index]; // TODO: it might be worth caching some of this. // it's not perfectly valid though // I could make a separate IConnectionState // and fallback if any property is accessed. // but I'm not sure the performance impact... if (reference.TryGetTarget(out var queue)) { queue.Write(packet); } else { _packetQueues.Remove(reference); index--; } } }
public void WriteImmediate(IWriteablePacket packet) { WritePacketToPipe(packet); _writer.FlushAsync().GetAwaiter().GetResult(); }
public void Write(IWriteablePacket packet) { _toWrite.Enqueue(packet); }