Streaming seq in Giraffe F#

171 views Asked by At

I was wondering what is the easiest way to stream F# seq in Giraffe. Not much, but here's what I have:

  module HttpHandler =
    let handlerGuids : HttpHandler =
      handleContext(
          fun ctx ->
              task {
                  let collection =
                    seq {
                      let mutable i = 0
                      while (not ctx.RequestAborted.IsCancellationRequested) && i <10 do
                        i <- i + 1
                        Async.Sleep(2000) |> Async.RunSynchronously
                        yield Guid.NewGuid()
                      }
                  return! ctx.WriteJsonChunkedAsync collection
              })

    let router: HttpFunc -> HttpContext -> HttpFuncResult =
      choose [ route "/" >=> handlerGuids ]

I laso have this test in C#

    [Fact]
    public async void Test1()
    {
      using var httpClient = new HttpClient();
      httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
      var requestUri = "http://localhost:8080/";
      var stream = await httpClient.GetStreamAsync(requestUri);
      using var reader = new StreamReader(stream);
      while (!reader.EndOfStream) {
        var currentLine = reader.ReadLine();
      }
    }

But it waits until all guids are generated on the server. Can someone give me some hints? Giraffe documentation says sth about streaming but it is related to files.

0

There are 0 answers