Skip to content

Commit a224240

Browse files
committed
avoid json deserialise when possible
1 parent b487561 commit a224240

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

source/Halibut/Transport/Protocol/MessageSerializer.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public async Task<IReadOnlyList<DataStream>> WriteMessageAsync<T>(Stream stream,
102102
}
103103
}
104104

105+
public static bool DontJsonDeserialise = true;
105106
async Task<(T Message, IReadOnlyList<DataStream> DataStreams, byte[]? messageBytes)> ReadCompressedMessageAsync<T>(ErrorRecordingStream errorRecordingStream,
106107
IRewindableBuffer rewindableBuffer,
107108
bool captureData,
@@ -138,6 +139,33 @@ public async Task<IReadOnlyList<DataStream>> WriteMessageAsync<T>(Stream stream,
138139
return (new MessageEnvelope<T>().Message, Array.Empty<DataStream>(), null); // And hack around we can't return null
139140
}
140141

142+
if (copyToMemoryBufferStream != null && DontJsonDeserialise)
143+
{
144+
byte[] buf = new byte[4096];
145+
while (true)
146+
{
147+
var read = await deflatedInMemoryStream.ReadAsync(buf, cancellationToken);
148+
if (read == 0) break;
149+
}
150+
// Find the unused bytes in the DeflateStream input buffer
151+
if (deflateReflector.TryGetAvailableInputBufferSize(zip, out var unusedBytesCount))
152+
{
153+
rewindableBuffer.FinishAndRewind(unusedBytesCount);
154+
}
155+
else
156+
{
157+
rewindableBuffer.CancelBuffer();
158+
}
159+
160+
var compressedMessageSize = compressedByteCountingStream.BytesRead - unusedBytesCount;
161+
observer.MessageRead(compressedMessageSize, decompressedByteCountingStream.BytesRead, deflatedInMemoryStream.BytesReadIntoMemory);
162+
if (copyToMemoryBufferStream != null)
163+
{
164+
copyToMemoryBufferStream.memoryBuffer.SetLength(compressedMessageSize);
165+
return (new MessageEnvelope<T>().Message, new List<DataStream>().ToArray(), copyToMemoryBufferStream.memoryBuffer.ToArray());
166+
}
167+
}
168+
141169
using (var bson = new BsonDataReader(deflatedInMemoryStream) { CloseInput = false })
142170
{
143171
var (messageEnvelope, dataStreams) = DeserializeMessageAndDataStreams<T>(bson);

0 commit comments

Comments
 (0)