Skip to content

Commit 4800f8a

Browse files
authored
feat: Simplify SSE formatting (#18)
1 parent 1794d64 commit 4800f8a

File tree

3 files changed

+16
-27
lines changed

3 files changed

+16
-27
lines changed

Directory.Packages.props

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
<!-- Enable central package management, https://learn.microsoft.com/en-us/nuget/consume-packages/Central-Package-Management -->
44
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
55
</PropertyGroup>
6+
67
<ItemGroup>
7-
88
<!-- Product dependencies netstandard -->
99
<PackageVersion Include="System.Text.Json" Version="8.0.5" />
1010

1111
<!-- Product dependencies shared -->
12-
<PackageVersion Include="System.Net.ServerSentEvents" Version="9.0.6" />
12+
<PackageVersion Include="System.Net.ServerSentEvents" Version="10.0.0-preview.5.25277.114" />
13+
<PackageVersion Include="System.Linq.AsyncEnumerable" Version="10.0.0-preview.5.25277.114" />
1314

1415
<!-- Testing / samples dependencies -->
1516
<PackageVersion Include="JsonSchema.Net" Version="7.3.4" />

src/A2A.AspNetCore/A2AJsonRpcProcessor.cs

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using Microsoft.AspNetCore.Http;
22
using System.Diagnostics;
3-
using System.IO.Pipelines;
4-
using System.Text;
3+
using System.Net.ServerSentEvents;
4+
using System.Text.Encodings.Web;
55
using System.Text.Json;
66

77
namespace A2A.AspNetCore;
@@ -192,28 +192,15 @@ public async Task ExecuteAsync(HttpContext httpContext)
192192
httpContext.Response.ContentType = "text/event-stream";
193193
httpContext.Response.Headers.Append("Cache-Control", "no-cache");
194194

195-
await foreach (var taskEvent in _events)
196-
{
197-
var sseItem = new A2ASseItem()
198-
{
199-
Data = JsonRpcResponse.CreateJsonRpcResponse(requestId, taskEvent),
200-
};
201-
await sseItem.WriteAsync(httpContext.Response.BodyWriter);
202-
}
203-
}
204-
}
205-
206-
public class A2ASseItem
207-
{
208-
public JsonRpcResponse? Data { get; set; }
209-
210-
public async Task WriteAsync(PipeWriter writer)
211-
{
212-
if (Data != null)
213-
{
214-
string json = JsonSerializer.Serialize(Data, A2AJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonRpcResponse)));
215-
await writer.WriteAsync(Encoding.UTF8.GetBytes($"data: {json}\n\n"));
216-
await writer.FlushAsync();
217-
}
195+
var responseTypeInfo = A2AJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonRpcResponse));
196+
await SseFormatter.WriteAsync(
197+
_events.Select(e => new SseItem<JsonRpcResponse>(JsonRpcResponse.CreateJsonRpcResponse(requestId, e))),
198+
httpContext.Response.Body,
199+
(item, writer) =>
200+
{
201+
using Utf8JsonWriter json = new(writer, new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
202+
JsonSerializer.Serialize(json, item.Data, responseTypeInfo);
203+
},
204+
httpContext.RequestAborted);
218205
}
219206
}

src/A2A/A2A.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<!-- Dependencies needed by all -->
2424
<ItemGroup>
2525
<PackageReference Include="Microsoft.Extensions.Logging" />
26+
<PackageReference Include="System.Linq.AsyncEnumerable" />
2627
<PackageReference Include="System.Net.ServerSentEvents" />
2728
</ItemGroup>
2829

0 commit comments

Comments
 (0)