public CircuitHost CreateCircuitHost( IReadOnlyList <ComponentDescriptor> components, CircuitClientProxy client, string baseUri, string uri, ClaimsPrincipal user) { var scope = _scopeFactory.CreateScope(); var jsRuntime = (RemoteJSRuntime)scope.ServiceProvider.GetRequiredService <IJSRuntime>(); jsRuntime.Initialize(client); var navigationManager = (RemoteNavigationManager)scope.ServiceProvider.GetRequiredService <NavigationManager>(); var navigationInterception = (RemoteNavigationInterception)scope.ServiceProvider.GetRequiredService <INavigationInterception>(); if (client.Connected) { navigationManager.AttachJsRuntime(jsRuntime); navigationManager.Initialize(baseUri, uri); navigationInterception.AttachJSRuntime(jsRuntime); } else { navigationManager.Initialize(baseUri, uri); } var renderer = new RemoteRenderer( scope.ServiceProvider, _loggerFactory, _options, client, _loggerFactory.CreateLogger <RemoteRenderer>()); var circuitHandlers = scope.ServiceProvider.GetServices <CircuitHandler>() .OrderBy(h => h.Order) .ToArray(); var circuitHost = new CircuitHost( _circuitIdFactory.CreateCircuitId(), scope, _options, client, renderer, components, jsRuntime, circuitHandlers, _loggerFactory.CreateLogger <CircuitHost>()); Log.CreatedCircuit(_logger, circuitHost); // Initialize per - circuit data that services need (circuitHost.Services.GetRequiredService <ICircuitAccessor>() as DefaultCircuitAccessor).Circuit = circuitHost.Circuit; circuitHost.SetCircuitUser(user); return(circuitHost); }
public virtual Task DisconnectAsync(CircuitHost circuitHost, string connectionId) { Log.CircuitDisconnectStarted(_logger, circuitHost.CircuitId, connectionId); Task circuitHandlerTask; lock (CircuitRegistryLock) { if (DisconnectCore(circuitHost, connectionId)) { circuitHandlerTask = circuitHost.Renderer.Dispatcher.InvokeAsync(() => circuitHost.OnConnectionDownAsync(default));
/// <summary> /// Registers an active <see cref="CircuitHost"/> with the register. /// </summary> public void Register(CircuitHost circuitHost) { if (!ConnectedCircuits.TryAdd(circuitHost.CircuitId, circuitHost)) { // This will likely never happen, except perhaps in unit tests, since CircuitIds are unique. throw new ArgumentException($"Circuit with identity {circuitHost.CircuitId} is already registered."); } // Register for unhandled exceptions from the circuit. The registry is responsible for tearing // down the circuit on errors. circuitHost.UnhandledException += CircuitHost_UnhandledException; }
internal static void CreatedCircuit(ILogger logger, CircuitHost circuitHost) => _createdCircuit(logger, circuitHost.CircuitId.Id, circuitHost.Client.ConnectionId, null);