public static void WriteTo(AmfWriter writer, Snapshot previous, Snapshot next, int chunkLength, Space <byte> message) { Kon.Assert( !previous.Ready || previous.ChunkStreamId == next.ChunkStreamId, "previous and next describe two different chunk streams"); Kon.Assert( next.MessageLength == message.Length, "mismatch between reported message length and actual message length"); // we don't write zero-length packets, and as state for `next` and `previous` won't match what our peer // sees if we pass a zero-length message here. zero-length sends should be filtered out at a higher level. Kon.Assert( next.MessageLength != 0, "message length cannot be zero"); var header = GetInitialHeaderType(); for (var i = 0; i < next.MessageLength; i += chunkLength) { if (i == 0) { BasicHeader.WriteTo(writer, (byte)header, next.ChunkStreamId); MessageHeader.WriteTo(writer, header, next); } else { BasicHeader.WriteTo(writer, (byte)MessageHeader.Type.Type3, next.ChunkStreamId); } var count = Math.Min(chunkLength, next.MessageLength - i); var slice = message.Slice(i, count); writer.WriteBytes(slice); } MessageHeader.Type GetInitialHeaderType() { if (!previous.Ready || next.MessageStreamId != previous.MessageStreamId) { return(MessageHeader.Type.Type0); } if (next.MessageLength != previous.MessageLength || next.ContentType != previous.ContentType) { return(MessageHeader.Type.Type1); } if (next.Timestamp != previous.Timestamp) { return(MessageHeader.Type.Type2); } return(MessageHeader.Type.Type3); } }