Server

Tanka provides server components in Tanka.GraphQL.server NuGet package. It can be used to get up and running or if more control is required then you can implement your own server.

See also

Simple example with HTTP and websockets

using System.Runtime.CompilerServices;

using Microsoft.AspNetCore.Mvc;

using Tanka.GraphQL.Executable;
using Tanka.GraphQL.Server;

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

// add required services
builder.AddTankaGraphQL()
    // add http transport
    .AddHttp()
    // add websocket transport for subscriptions
    .AddWebSockets()
    // add named schema
    .AddSchema("System", schema =>
    {
        // add Query root
        schema.Add(
            "Query",
            new FieldsWithResolvers
            {
                // We will just return new object as resolved value
                { "system: System!", () => new SystemDefinition() }
            });

        // Add system type with version field of type String!
        schema.Add(
            "System",
            new FieldsWithResolvers
            {
                // version is resolved from the objectValue (the parent value of type SystemDefinition)
                { "version: String!", (SystemDefinition objectValue) => objectValue.Version }
            });

        // add Subscription root
        schema.Add(
            "Subscription",
            new FieldsWithResolvers
            {
                // this will resolve the actual resolved value from the produced values
                { "counter: Int!", (int objectValue) => objectValue }
            },
            new FieldsWithSubscribers
            {
                // this is our subscription producer
                { "counter(to: Int!): Int!", Count }
            });
    });

WebApplication app = builder.Build();

// this is required by the websocket transport
app.UseWebSockets();

// this uses the default pipeline
app.MapTankaGraphQL("/graphql", "System");
// you can access GraphiQL at "/graphql/ui"
app.MapGraphiQL("/graphql/ui");

app.Run();

// simple subscription generating numbers from 0 to the given number
static async IAsyncEnumerable<int> Count(int to, [FromServices]ILogger<Program> logger, [EnumeratorCancellation] CancellationToken cancellationToken)
{
    var i = 0;
    while (!cancellationToken.IsCancellationRequested)
    {
        yield return ++i;

        if (i == to)
            break;

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }
}

public record SystemDefinition(string Version = "3.0");