Skip to content
22 changes: 11 additions & 11 deletions sdk/dotnet/csharp/src/DependencyInjection/Services.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@ namespace StarFederation.Datastar.DependencyInjection;

public interface IDatastarService
{
Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, StringValues>> additionalHeaders);
Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, string>> additionalHeaders);
Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, StringValues>>? additionalHeaders = null);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should these methods accept an optional CancellationToken?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR is closed. Please create a new issue if you’d like to discuss further.

Copy link
Contributor Author

@SpiralOSS SpiralOSS Jul 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should these methods accept an optional CancellationToken?

@wiserockryan, I can take care of this on the weekend.

Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, string>>? additionalHeaders = null);

Task PatchElementsAsync(string fragments, PatchElementsOptions? options = null);

Task RemoveElementAsync(string selector, RemoveFragmentOptions? options = null);
Task RemoveElementAsync(string selector, RemoveElementOptions? options = null);

/// <summary>
/// Note: If TType is string then it is assumed that it is an already serialized Signals, otherwise serialize with jsonSerializerOptions
/// </summary>
Task PatchSignalsAsync<TType>(TType signals, JsonSerializerOptions? jsonSerializerOptions = null, PatchSignalsOptions? patchSignalsOptions = null);

/// <summary>
/// Execute a JS script on the client. Note: Do NOT include "&lt;script&gt;" encapsulation
/// Execute a JS script on the client. Note: Do NOT include "&lt;script&gt;" encapsulation
/// </summary>
Task ExecuteScriptAsync(string script, ExecuteScriptOptions? options = null);

Expand All @@ -44,23 +44,23 @@ public interface IDatastarService

internal class DatastarService(Core.ServerSentEventGenerator serverSentEventGenerator) : IDatastarService
{
public Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, StringValues>> additionalHeaders) =>
public Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, StringValues>>? additionalHeaders) =>
serverSentEventGenerator.StartServerEventStreamAsync(additionalHeaders ?? []);

public Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, string>> additionalHeaders) =>
public Task StartServerEventStreamAsync(IEnumerable<KeyValuePair<string, string>>? additionalHeaders) =>
serverSentEventGenerator.StartServerEventStreamAsync(additionalHeaders?.Select(kvp => new KeyValuePair<string, StringValues>(kvp.Key, new StringValues(kvp.Value))) ?? []);

public Task PatchElementsAsync(string fragments, PatchElementsOptions? options = null) =>
serverSentEventGenerator.PatchElementsAsync(fragments, options ?? new());
serverSentEventGenerator.PatchElementsAsync(fragments, options ?? Core.PatchElementsOptions.Defaults);

public Task RemoveElementAsync(string selector, RemoveFragmentOptions? options = null) =>
serverSentEventGenerator.RemoveElementAsync(selector, options ?? new());
public Task RemoveElementAsync(string selector, RemoveElementOptions? options = null) =>
serverSentEventGenerator.RemoveElementAsync(selector, options ?? Core.RemoveElementOptions.Defaults);

public Task PatchSignalsAsync<TType>(TType signals, JsonSerializerOptions? jsonSerializerOptions = null, PatchSignalsOptions? patchSignalsOptions = null) =>
serverSentEventGenerator.PatchSignalsAsync(signals as string ?? JsonSerializer.Serialize(signals, jsonSerializerOptions), patchSignalsOptions ?? new());
serverSentEventGenerator.PatchSignalsAsync(signals as string ?? JsonSerializer.Serialize(signals, jsonSerializerOptions), patchSignalsOptions ?? Core.PatchSignalsOptions.Defaults);

public Task ExecuteScriptAsync(string script, ExecuteScriptOptions? options = null) =>
serverSentEventGenerator.ExecuteScriptAsync(script, options ?? new());
serverSentEventGenerator.ExecuteScriptAsync(script, options ?? Core.ExecuteScriptOptions.Defaults);

public Stream GetSignalsStream() => serverSentEventGenerator.GetSignalsStream();

Expand Down
8 changes: 4 additions & 4 deletions sdk/dotnet/csharp/src/DependencyInjection/Types.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,16 +54,16 @@ public class PatchSignalsOptions
options.Retry);
}

public class RemoveFragmentOptions
public class RemoveElementOptions
{
public bool UseViewTransition { get; init; } = Consts.DefaultElementsUseViewTransitions;
public string? EventId { get; init; } = null;
public TimeSpan Retry { get; init; } = Consts.DefaultSseRetryDuration;

public static implicit operator Core.RemoveElementOptions(RemoveFragmentOptions options) => ToFSharp(options);
public static implicit operator FSharpValueOption<Core.RemoveElementOptions>(RemoveFragmentOptions options) => ToFSharp(options);
public static implicit operator Core.RemoveElementOptions(RemoveElementOptions options) => ToFSharp(options);
public static implicit operator FSharpValueOption<Core.RemoveElementOptions>(RemoveElementOptions options) => ToFSharp(options);

private static Core.RemoveElementOptions ToFSharp(RemoveFragmentOptions options) => new(
private static Core.RemoveElementOptions ToFSharp(RemoveElementOptions options) => new(
options.UseViewTransition,
options.EventId ?? FSharpValueOption<string>.ValueNone,
options.Retry);
Expand Down
Loading