File: Hubs\UploadHub.cs
Web Access
Project: src\src\SignalR\samples\SignalRSamples\SignalRSamples.csproj (SignalRSamples)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics;
using System.Text;
using System.Threading.Channels;
using Microsoft.AspNetCore.SignalR;
 
namespace SignalRSamples.Hubs;
 
public class UploadHub : Hub
{
 
    public string Echo(string word)
    {
        return "Echo: " + word;
    }
 
    public async Task<string> UploadWord(ChannelReader<string> source)
    {
        var sb = new StringBuilder();
 
        // receiving a StreamCompleteMessage should cause this WaitToRead to return false
        while (await source.WaitToReadAsync())
        {
            while (source.TryRead(out var item))
            {
                Debug.WriteLine($"received: {item}");
                Console.WriteLine($"received: {item}");
                sb.Append(item);
            }
        }
 
        // method returns, somewhere else returns a CompletionMessage with any errors
        return sb.ToString();
    }
 
    public async Task<string> ScoreTracker(ChannelReader<int> player1, ChannelReader<int> player2)
    {
        var p1score = await Loop(player1);
        var p2score = await Loop(player2);
 
        var winner = p1score > p2score ? "p1" : "p2";
        return $"{winner} wins with a total of {Math.Max(p1score, p2score)} points to {Math.Min(p1score, p2score)}";
 
        async Task<int> Loop(ChannelReader<int> reader)
        {
            var score = 0;
 
            while (await reader.WaitToReadAsync())
            {
                while (reader.TryRead(out var item))
                {
                    Debug.WriteLine($"got score {item}");
                    score += item;
                }
            }
 
            return score;
        }
    }
 
    public ChannelReader<string> StreamEcho(ChannelReader<string> source)
    {
        var output = Channel.CreateUnbounded<string>();
 
        _ = Task.Run(async () =>
        {
            while (await source.WaitToReadAsync())
            {
                while (source.TryRead(out var item))
                {
                    Debug.WriteLine($"Echoing '{item}'.");
                    await output.Writer.WriteAsync("echo:" + item);
                }
            }
            output.Writer.Complete();
 
        });
 
        return output.Reader;
    }
}