wired up the logic to parse the server sent events into a full markdown document

This commit is contained in:
Nils Kruthoff 2026-07-27 19:37:51 +02:00
parent 40cfb77cb3
commit d865ffa503
No known key found for this signature in database
GPG Key ID: A5C0151B4DDB172C

View File

@ -7,6 +7,7 @@ public static class ContentStreamSseHandler
{ {
private static readonly ConcurrentDictionary<string, List<ContentStreamPptxImageData>> CHUNKED_IMAGES = new(); private static readonly ConcurrentDictionary<string, List<ContentStreamPptxImageData>> CHUNKED_IMAGES = new();
private static readonly ConcurrentDictionary<string, SlideManager> SLIDE_MANAGERS = new(); private static readonly ConcurrentDictionary<string, SlideManager> SLIDE_MANAGERS = new();
private static readonly ConcurrentDictionary<string, DocumentManager> DOCUMENT_MANAGERS = new();
public static string? ProcessEvent(ContentStreamSseEvent? sseEvent, bool extractImages = true) public static string? ProcessEvent(ContentStreamSseEvent? sseEvent, bool extractImages = true)
{ {
@ -39,7 +40,12 @@ public static class ContentStreamSseHandler
spreadSheetResult.Append(sseEvent.Content); spreadSheetResult.Append(sseEvent.Content);
return spreadSheetResult.ToString(); return spreadSheetResult.ToString();
case ContentStreamDocumentMetadata: case ContentStreamDocumentMetadata documentMetadata:
if (documentMetadata.Document?.PageNumber is not > 0)
return sseEvent.Content;
var documentManager = DOCUMENT_MANAGERS.GetOrAdd(sseEvent.StreamId!, _ => new());
return documentManager.AddPage(documentMetadata, sseEvent.Content, extractImages);
case ContentStreamImageMetadata: case ContentStreamImageMetadata:
return sseEvent.Content; return sseEvent.Content;
@ -79,6 +85,7 @@ public static class ContentStreamSseHandler
Content = content, Content = content,
Segment = segment, Segment = segment,
IsEnd = isEnd, IsEnd = isEnd,
MediaType = contentStreamPptxImageData.MediaType,
}; };
CHUNKED_IMAGES.AddOrUpdate( CHUNKED_IMAGES.AddOrUpdate(
@ -123,12 +130,20 @@ public static class ContentStreamSseHandler
if (!string.IsNullOrWhiteSpace(result)) if (!string.IsNullOrWhiteSpace(result))
finalContentChunk.Append(result); finalContentChunk.Append(result);
} }
if (DOCUMENT_MANAGERS.TryGetValue(streamId, out var documentManager))
{
var result = documentManager.Flush();
if (!string.IsNullOrWhiteSpace(result))
finalContentChunk.Append(result);
}
SLIDE_MANAGERS.TryRemove(streamId, out _); SLIDE_MANAGERS.TryRemove(streamId, out _);
DOCUMENT_MANAGERS.TryRemove(streamId, out _);
var imageIdPrefix = $"{streamId}-"; var imageIdPrefix = $"{streamId}-";
foreach (var key in CHUNKED_IMAGES.Keys.Where(k => k.StartsWith(imageIdPrefix, StringComparison.InvariantCultureIgnoreCase))) foreach (var key in CHUNKED_IMAGES.Keys.Where(k => k.StartsWith(imageIdPrefix, StringComparison.InvariantCultureIgnoreCase)))
CHUNKED_IMAGES.TryRemove(key, out _); CHUNKED_IMAGES.TryRemove(key, out _);
return finalContentChunk.Length > 0 ? finalContentChunk.ToString() : null; return finalContentChunk.Length > 0 ? finalContentChunk.ToString() : null;
} }
} }