Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ public static IResourceBuilder<T> WithGraphQLSchemaComposition<T>(
Settings = settings
});

NitroExtensions.TryAddAutoUpdateCommands(builder);

if (!builder.Resource.Annotations
.OfType<ResourceCommandAnnotation>()
.Any(command => command.Name == "recompose"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<!-- Aspire.Hosting 13.4.x requires Microsoft.Extensions.Logging >= 10.0.8, above the net9.0 central pin. -->
<PackageReference Include="Microsoft.Extensions.Logging" VersionOverride="10.0.8" Condition="'$(TargetFramework)' == 'net9.0'" />
<PackageReference Include="Microsoft.Extensions.Logging" Condition="'$(TargetFramework)' != 'net9.0'" />
<PackageReference Include="Polly" />
</ItemGroup>

<ItemGroup>
Expand All @@ -34,18 +35,26 @@
<None Remove="Nitro\Operations\ResolveNitroApiName.graphql" />
<None Remove="Nitro\Operations\ValidateNitroSchema.graphql" />
<None Remove="Nitro\Operations\PollNitroSchemaValidation.graphql" />
<None Remove="Nitro\Operations\GetNitroStageVersion.graphql" />
<None Remove="Nitro\Operations\WatchNitroStage.graphql" />
<EmbeddedResource Include="Nitro\Operations\ResolveNitroApiName.graphql" />
<EmbeddedResource Include="Nitro\Operations\ValidateNitroSchema.graphql" />
<EmbeddedResource Include="Nitro\Operations\PollNitroSchemaValidation.graphql" />
<EmbeddedResource Include="Nitro\Operations\GetNitroStageVersion.graphql" />
<EmbeddedResource Include="Nitro\Operations\WatchNitroStage.graphql" />
</ItemGroup>

<ItemGroup Condition="'$(Configuration)' == 'Release'">
<None Remove="Nitro\Operations\ResolveNitroApiName.graphql.sha256" />
<None Remove="Nitro\Operations\ValidateNitroSchema.graphql.sha256" />
<None Remove="Nitro\Operations\PollNitroSchemaValidation.graphql.sha256" />
<None Remove="Nitro\Operations\GetNitroStageVersion.graphql.sha256" />
<None Remove="Nitro\Operations\WatchNitroStage.graphql.sha256" />
<EmbeddedResource Include="Nitro\Operations\ResolveNitroApiName.graphql.sha256" />
<EmbeddedResource Include="Nitro\Operations\ValidateNitroSchema.graphql.sha256" />
<EmbeddedResource Include="Nitro\Operations\PollNitroSchemaValidation.graphql.sha256" />
<EmbeddedResource Include="Nitro\Operations\GetNitroStageVersion.graphql.sha256" />
<EmbeddedResource Include="Nitro\Operations\WatchNitroStage.graphql.sha256" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace HotChocolate.Fusion.Aspire.Nitro;

internal interface INitroStageUpdateClient
{
Task<NitroStageSubscription> SubscribeAsync(
NitroConnection connection,
string apiId,
string stage,
CancellationToken cancellationToken);

Task<NitroStageSnapshot?> GetLatestSnapshotAsync(
NitroConnection connection,
string apiId,
string stage,
CancellationToken cancellationToken);
}

internal abstract class NitroStageSubscription : IAsyncDisposable
{
public abstract IAsyncEnumerable<NitroStageChange> ReadChangesAsync(
CancellationToken cancellationToken);

public abstract ValueTask DisposeAsync();
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,9 @@ internal sealed class NitroCompositionOptions
/// Gets or sets the caller-supplied Nitro portal URL.
/// </summary>
public Uri? PortalUrl { get; set; }

/// <summary>
/// Gets the options that control stage update detection and automatic adoption.
/// </summary>
public NitroSeedUpdateOptions SeedUpdates { get; } = new();
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,16 @@ namespace HotChocolate.Fusion.Aspire.Nitro;
/// <param name="IsFresh">
/// Whether the fusion configuration was downloaded for this run instead of taken from the cache.
/// </param>
/// <param name="SchemaHash">
/// The SHA-256 hash of the gateway schema carried by the configuration.
/// </param>
internal sealed record NitroGatewaySeed(
string ApiId,
string Stage,
string FilePath,
DateTimeOffset DownloadedAt,
bool IsFresh);
bool IsFresh,
string SchemaHash);

/// <summary>
/// The outcome of acquiring the fusion configuration of a gateway.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,26 @@ internal static class NitroOperationDocuments
private const string ResolveApiNameHashFile = "ResolveNitroApiName.graphql.sha256";
private const string ValidateSchemaHashFile = "ValidateNitroSchema.graphql.sha256";
private const string PollSchemaValidationHashFile = "PollNitroSchemaValidation.graphql.sha256";
private const string GetStageVersionHashFile = "GetNitroStageVersion.graphql.sha256";
private const string WatchStageHashFile = "WatchNitroStage.graphql.sha256";

private static string? s_resolveApiNameHash;
private static string? s_validateSchemaHash;
private static string? s_pollSchemaValidationHash;
private static string? s_getStageVersionHash;
private static string? s_watchStageHash;
#else
private const string ResolveApiNameFile = "ResolveNitroApiName.graphql";
private const string ValidateSchemaFile = "ValidateNitroSchema.graphql";
private const string PollSchemaValidationFile = "PollNitroSchemaValidation.graphql";
private const string GetStageVersionFile = "GetNitroStageVersion.graphql";
private const string WatchStageFile = "WatchNitroStage.graphql";

private static string? s_resolveApiName;
private static string? s_validateSchema;
private static string? s_pollSchemaValidation;
private static string? s_getStageVersion;
private static string? s_watchStage;
#endif

/// <summary>
Expand All @@ -34,6 +42,8 @@ internal static class NitroOperationDocuments
public const string ResolveApiNameOperationName = "ResolveNitroApiName";
public const string ValidateSchemaOperationName = "ValidateNitroSchema";
public const string PollSchemaValidationOperationName = "PollNitroSchemaValidation";
public const string GetStageVersionOperationName = "GetNitroStageVersion";
public const string WatchStageOperationName = "WatchNitroStage";

#if NITRO_PERSISTED_OPERATIONS
/// <summary>
Expand All @@ -47,6 +57,12 @@ public static string GetValidateSchemaOperationId()

public static string GetPollSchemaValidationOperationId()
=> s_pollSchemaValidationHash ??= ReadDocument(PollSchemaValidationHashFile).Trim();

public static string GetStageVersionOperationId()
=> s_getStageVersionHash ??= ReadDocument(GetStageVersionHashFile).Trim();

public static string GetWatchStageOperationId()
=> s_watchStageHash ??= ReadDocument(WatchStageHashFile).Trim();
#else
/// <summary>
/// Gets the document that resolves the name of an api by its id.
Expand All @@ -59,6 +75,12 @@ public static string GetValidateSchemaDocument()

public static string GetPollSchemaValidationDocument()
=> s_pollSchemaValidation ??= ReadDocument(PollSchemaValidationFile);

public static string GetStageVersionDocument()
=> s_getStageVersion ??= ReadDocument(GetStageVersionFile);

public static string GetWatchStageDocument()
=> s_watchStage ??= ReadDocument(WatchStageFile);
#endif

private static string ReadDocument(string fileName)
Expand Down
Loading
Loading