private void InitializeRegisteredRootComponents(WebAssemblyJSRuntimeInvoker jsRuntimeInvoker) { var componentsCount = jsRuntimeInvoker.InvokeUnmarshalled <object, object, object, int>(RegisteredComponentsInterop.GetRegisteredComponentsCount, null, null, null); if (componentsCount == 0) { return; } var registeredComponents = new WebAssemblyComponentMarker[componentsCount]; for (var i = 0; i < componentsCount; i++) { var id = jsRuntimeInvoker.InvokeUnmarshalled <int, object, object, int>(RegisteredComponentsInterop.GetId, i, null, null); var assembly = jsRuntimeInvoker.InvokeUnmarshalled <int, object, object, string>(RegisteredComponentsInterop.GetAssembly, id, null, null); var typeName = jsRuntimeInvoker.InvokeUnmarshalled <int, object, object, string>(RegisteredComponentsInterop.GetTypeName, id, null, null); var serializedParameterDefinitions = jsRuntimeInvoker.InvokeUnmarshalled <int, object, object, string>(RegisteredComponentsInterop.GetParameterDefinitions, id, null, null); var serializedParameterValues = jsRuntimeInvoker.InvokeUnmarshalled <int, object, object, string>(RegisteredComponentsInterop.GetParameterValues, id, null, null); registeredComponents[i] = new WebAssemblyComponentMarker(WebAssemblyComponentMarker.ClientMarkerType, assembly, typeName, serializedParameterDefinitions, serializedParameterValues, id.ToString()); } var componentDeserializer = WebAssemblyComponentParameterDeserializer.Instance; foreach (var registeredComponent in registeredComponents) { _rootComponentCache = new RootComponentTypeCache(); var componentType = _rootComponentCache.GetRootComponent(registeredComponent.Assembly, registeredComponent.TypeName); var definitions = componentDeserializer.GetParameterDefinitions(registeredComponent.ParameterDefinitions); var values = componentDeserializer.GetParameterValues(registeredComponent.ParameterValues); var parameters = componentDeserializer.DeserializeParameters(definitions, values); RootComponents.Add(componentType, registeredComponent.PrerenderId, parameters); } }
internal static void AppendEpilogue(ViewBuffer viewBuffer, WebAssemblyComponentMarker record) { var endRecord = JsonSerializer.Serialize( record.GetEndRecord(), WebAssemblyComponentSerializationSettings.JsonSerializationOptions); viewBuffer.AppendHtml("<!--Blazor:"); viewBuffer.AppendHtml(endRecord); viewBuffer.AppendHtml("-->"); }
internal static void AppendPreamble(ViewBuffer viewBuffer, WebAssemblyComponentMarker record) { var serializedStartRecord = JsonSerializer.Serialize( record, WebAssemblyComponentSerializationSettings.JsonSerializationOptions); viewBuffer.AppendHtml("<!--Blazor:"); viewBuffer.AppendHtml(serializedStartRecord); viewBuffer.AppendHtml("-->"); }
internal IEnumerable <string> GetPreamble(WebAssemblyComponentMarker record) { var serializedStartRecord = JsonSerializer.Serialize( record, WebAssemblyComponentSerializationSettings.JsonSerializationOptions); if (record.PrerenderId != null) { return(PrerenderedStart(serializedStartRecord)); } else { return(NonPrerenderedSequence(serializedStartRecord)); }
public static WebAssemblyComponentMarker SerializeInvocation(Type type, ParameterView parameters, bool prerendered) { var assembly = type.Assembly.GetName().Name; var typeFullName = type.FullName; var(definitions, values) = ComponentParameter.FromParameterView(parameters); // We need to serialize and Base64 encode parameters separately since they can contain arbitrary data that might // cause the HTML comment to be invalid (like if you serialize a string that contains two consecutive dashes "--"). var serializedDefinitions = Convert.ToBase64String(JsonSerializer.SerializeToUtf8Bytes(definitions, WebAssemblyComponentSerializationSettings.JsonSerializationOptions)); var serializedValues = Convert.ToBase64String(JsonSerializer.SerializeToUtf8Bytes(values, WebAssemblyComponentSerializationSettings.JsonSerializationOptions)); return(prerendered ? WebAssemblyComponentMarker.Prerendered(assembly, typeFullName, serializedDefinitions, serializedValues) : WebAssemblyComponentMarker.NonPrerendered(assembly, typeFullName, serializedDefinitions, serializedValues)); }
private void InitializeRegisteredRootComponents(IJSUnmarshalledRuntime jsRuntime) { var componentsCount = jsRuntime.InvokeUnmarshalled <int>(RegisteredComponentsInterop.GetRegisteredComponentsCount); if (componentsCount == 0) { return; } var registeredComponents = new WebAssemblyComponentMarker[componentsCount]; for (var i = 0; i < componentsCount; i++) { var id = jsRuntime.InvokeUnmarshalled <int, int>(RegisteredComponentsInterop.GetId, i); var assembly = jsRuntime.InvokeUnmarshalled <int, string>(RegisteredComponentsInterop.GetAssembly, id); var typeName = jsRuntime.InvokeUnmarshalled <int, string>(RegisteredComponentsInterop.GetTypeName, id); var serializedParameterDefinitions = jsRuntime.InvokeUnmarshalled <int, object?, object?, string>(RegisteredComponentsInterop.GetParameterDefinitions, id, null, null); var serializedParameterValues = jsRuntime.InvokeUnmarshalled <int, object?, object?, string>(RegisteredComponentsInterop.GetParameterValues, id, null, null); registeredComponents[i] = new WebAssemblyComponentMarker(WebAssemblyComponentMarker.ClientMarkerType, assembly, typeName, serializedParameterDefinitions, serializedParameterValues, id.ToString(CultureInfo.InvariantCulture)); } var componentDeserializer = WebAssemblyComponentParameterDeserializer.Instance; foreach (var registeredComponent in registeredComponents) { _rootComponentCache = new RootComponentTypeCache(); var componentType = _rootComponentCache.GetRootComponent(registeredComponent.Assembly !, registeredComponent.TypeName !); if (componentType is null) { throw new InvalidOperationException( $"Root component type '{registeredComponent.TypeName}' could not be found in the assembly '{registeredComponent.Assembly}'. " + $"This is likely a result of trimming (tree shaking)."); } var definitions = componentDeserializer.GetParameterDefinitions(registeredComponent.ParameterDefinitions !); var values = componentDeserializer.GetParameterValues(registeredComponent.ParameterValues !); var parameters = componentDeserializer.DeserializeParameters(definitions, values); RootComponents.Add(componentType, registeredComponent.PrerenderId !, parameters); } }