File: src\Shared\Components\PrerenderComponentApplicationStore.cs
Web Access
Project: src\src\Components\Endpoints\src\Microsoft.AspNetCore.Components.Endpoints.csproj (Microsoft.AspNetCore.Components.Endpoints)
// 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.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Components.Web;
 
namespace Microsoft.AspNetCore.Components;
 
#pragma warning disable CA1852 // Seal internal types
internal class PrerenderComponentApplicationStore : IPersistentComponentStateStore
#pragma warning restore CA1852 // Seal internal types
{
    private bool _stateIsPersisted;
 
    public PrerenderComponentApplicationStore()
    {
        ExistingState = new();
    }
 
    [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Simple deserialize of primitive types.")]
    public PrerenderComponentApplicationStore(string existingState)
    {
        ArgumentNullException.ThrowIfNull(existingState);
 
        DeserializeState(Convert.FromBase64String(existingState));
    }
 
    [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Simple deserialize of primitive types.")]
    protected void DeserializeState(byte[] existingState)
    {
        var state = JsonSerializer.Deserialize(
            existingState,
            PrerenderComponentApplicationStoreSerializerContext.Default.DictionaryStringByteArray)
            ?? throw new ArgumentException("Could not deserialize state correctly", nameof(existingState));
        ExistingState = state;
    }
 
#nullable enable
    public string? PersistedState { get; private set; }
#nullable disable
 
    public Dictionary<string, byte[]> ExistingState { get; protected set; }
 
    public Task<IDictionary<string, byte[]>> GetPersistedStateAsync()
    {
        return Task.FromResult((IDictionary<string, byte[]>)ExistingState);
    }
 
    [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Simple serialize of primitive types.")]
    protected virtual byte[] SerializeState(IReadOnlyDictionary<string, byte[]> state) =>
        JsonSerializer.SerializeToUtf8Bytes(state);
 
    public Task PersistStateAsync(IReadOnlyDictionary<string, byte[]> state)
    {
        if (_stateIsPersisted)
        {
            throw new InvalidOperationException("State already persisted.");
        }
 
        _stateIsPersisted = true;
 
        if (state is not null && state.Count > 0)
        {
            PersistedState = Convert.ToBase64String(SerializeState(state));
        }
 
        return Task.CompletedTask;
    }
 
    public virtual bool SupportsRenderMode(IComponentRenderMode renderMode) =>
        renderMode is null || renderMode is InteractiveWebAssemblyRenderMode || renderMode is InteractiveAutoRenderMode;
}
 
[JsonSerializable(typeof(Dictionary<string, byte[]>), GenerationMode = JsonSourceGenerationMode.Serialization)]
internal sealed partial class PrerenderComponentApplicationStoreSerializerContext : JsonSerializerContext;