예제 #1
0
파일: Program.cs 프로젝트: y8x/AspNetCore
        public async Task ExecuteAsync(Uri uri)
        {
            string circuitId = await GetPrerenderedCircuitId(uri);

            var builder = new HubConnectionBuilder();

            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <IHubProtocol, IgnitorMessagePackHubProtocol>());
            builder.WithUrl(new Uri(uri, "_blazor/"));
            builder.ConfigureLogging(l => l.AddConsole().SetMinimumLevel(LogLevel.Trace));
            var hive = new ElementHive();

            await using var connection = builder.Build();
            await connection.StartAsync(CancellationToken);

            Console.WriteLine("Connected");

            connection.On <int, string, string>("JS.BeginInvokeJS", OnBeginInvokeJS);
            connection.On <int, int, byte[]>("JS.RenderBatch", OnRenderBatch);
            connection.On <Error>("JS.OnError", OnError);
            connection.Closed += OnClosedAsync;

            // Now everything is registered so we can start the circuit.
            var success = await connection.InvokeAsync <bool>("ConnectCircuit", circuitId);

            await TaskCompletionSource.Task;

            void OnBeginInvokeJS(int asyncHandle, string identifier, string argsJson)
            {
                Console.WriteLine("JS Invoke: " + identifier + " (" + argsJson + ")");
            }

            void OnRenderBatch(int browserRendererId, int batchId, byte[] batchData)
            {
                var batch = RenderBatchReader.Read(batchData);

                hive.Update(batch);

                // This will click the Counter component repeatedly resulting in infinite requests.
                _ = ClickAsync("thecounter", hive, connection);
            }

            void OnError(Error error)
            {
                Console.WriteLine("ERROR: " + error.Stack);
            }

            Task OnClosedAsync(Exception ex)
            {
                if (ex == null)
                {
                    TaskCompletionSource.TrySetResult(null);
                }
                else
                {
                    TaskCompletionSource.TrySetException(ex);
                }

                return(Task.CompletedTask);
            }
        }
예제 #2
0
        private void OnRenderBatch(int batchId, byte[] batchData)
        {
            RenderBatchReceived?.Invoke(batchId, batchData);

            var batch = RenderBatchReader.Read(batchData);

            Hive.Update(batch);

            if (ConfirmRenderBatch)
            {
                _ = ConfirmBatch(batchId);
            }

            NextBatchReceived?.Completion?.TrySetResult(null);
        }
예제 #3
0
        private void OnRenderBatch(int id, byte[] data)
        {
            var capturedBatch = new CapturedRenderBatch(id, data);

            Operations?.Batches.Enqueue(capturedBatch);
            RenderBatchReceived?.Invoke(capturedBatch);

            var batch = RenderBatchReader.Read(data);

            Hive.Update(batch);

            if (ConfirmRenderBatch)
            {
                _ = ConfirmBatch(id);
            }

            NextBatchReceived?.Completion?.TrySetResult(null);
        }
예제 #4
0
        private void OnRenderBatch(int browserRendererId, int batchId, byte[] batchData)
        {
            try
            {
                RenderBatchReceived?.Invoke(browserRendererId, batchId, batchData);

                var batch = RenderBatchReader.Read(batchData);

                Hive.Update(batch);

                if (ConfirmRenderBatch)
                {
                    _ = ConfirmBatch(batchId);
                }

                NextBatchReceived?.Completion?.TrySetResult(null);
            }
            catch (Exception e)
            {
                NextBatchReceived?.Completion?.TrySetResult(e);
            }
        }
예제 #5
0
        private void OnRenderBatch(int browserRendererId, int batchId, byte[] batchData)
        {
            try
            {
                RenderBatchReceived?.Invoke(browserRendererId, batchId, batchData);

                var batch = RenderBatchReader.Read(batchData);

                Hive.Update(batch);

                if (ConfirmRenderBatch)
                {
                    HubConnection.InvokeAsync("OnRenderCompleted", batchId, /* error */ null);
                }

                NextBatchReceived?.Completion?.TrySetResult(null);
            }
            catch (Exception e)
            {
                NextBatchReceived?.Completion?.TrySetResult(e);
            }
        }
예제 #6
0
        public async Task ExecuteAsync(Uri uri)
        {
            var httpClient = new HttpClient();
            var response   = await httpClient.GetAsync(uri);

            var content = await response.Content.ReadAsStringAsync();

            // <!-- M.A.C.Component:{"circuitId":"CfDJ8KZCIaqnXmdF...PVd6VVzfnmc1","rendererId":"0","componentId":"0"} -->
            var match     = Regex.Match(content, $"{Regex.Escape("<!-- M.A.C.Component:")}(.+?){Regex.Escape(" -->")}");
            var json      = JsonDocument.Parse(match.Groups[1].Value);
            var circuitId = json.RootElement.GetProperty("circuitId").GetString();

            var builder = new HubConnectionBuilder();

            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <IHubProtocol, IgnitorMessagePackHubProtocol>());
            builder.WithUrl(new Uri(uri, "_blazor/"));
            builder.ConfigureLogging(l => l.AddConsole().SetMinimumLevel(LogLevel.Trace));
            var hive = new ElementHive();

            await using var connection = builder.Build();
            await connection.StartAsync(CancellationToken);

            Console.WriteLine("Connected");

            connection.On <int, string, string>("JS.BeginInvokeJS", OnBeginInvokeJS);
            connection.On <int, int, byte[]>("JS.RenderBatch", OnRenderBatch);
            connection.On <Error>("JS.OnError", OnError);
            connection.Closed += OnClosedAsync;

            // Now everything is registered so we can start the circuit.
            var success = await connection.InvokeAsync <bool>("ConnectCircuit", circuitId);

            await TaskCompletionSource.Task;

            void OnBeginInvokeJS(int asyncHandle, string identifier, string argsJson)
            {
                Console.WriteLine("JS Invoke: " + identifier + " (" + argsJson + ")");
            }

            void OnRenderBatch(int browserRendererId, int batchId, byte[] batchData)
            {
                var batch = RenderBatchReader.Read(batchData);

                hive.Update(batch);

                // This will click the Counter component repeatedly resulting in infinite requests.
                _ = ClickAsync("thecounter", hive, connection);
            }

            void OnError(Error error)
            {
                Console.WriteLine("ERROR: " + error.Stack);
            }

            Task OnClosedAsync(Exception ex)
            {
                if (ex == null)
                {
                    TaskCompletionSource.TrySetResult(null);
                }
                else
                {
                    TaskCompletionSource.TrySetException(ex);
                }

                return(Task.CompletedTask);
            }
        }
예제 #7
0
        public async Task <bool> ConnectAsync(Uri uri, bool prerendered)
        {
            var builder = new HubConnectionBuilder();

            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton <IHubProtocol, IgnitorMessagePackHubProtocol>());
            builder.WithUrl(new Uri(uri, "_blazor/"));
            builder.ConfigureLogging(l => l.AddConsole().SetMinimumLevel(LogLevel.Trace));
            var hive = new ElementHive();

            HubConnection = builder.Build();
            await HubConnection.StartAsync(CancellationToken);

            Console.WriteLine("Connected");

            HubConnection.On <int, string, string>("JS.BeginInvokeJS", OnBeginInvokeJS);
            HubConnection.On <int, int, byte[]>("JS.RenderBatch", OnRenderBatch);
            HubConnection.On <Error>("JS.OnError", OnError);
            HubConnection.Closed += OnClosedAsync;

            // Now everything is registered so we can start the circuit.
            if (prerendered)
            {
                CircuitId = await GetPrerenderedCircuitIdAsync(uri);

                return(await HubConnection.InvokeAsync <bool>("ConnectCircuit", CircuitId));
            }
            else
            {
                CircuitId = await HubConnection.InvokeAsync <string>("StartCircuit", uri, uri);

                return(CircuitId != null);
            }

            void OnBeginInvokeJS(int asyncHandle, string identifier, string argsJson)
            {
                JSInterop?.Invoke(asyncHandle, identifier, argsJson);
            }

            void OnRenderBatch(int browserRendererId, int batchId, byte[] batchData)
            {
                var batch = RenderBatchReader.Read(batchData);

                hive.Update(batch);

                if (ConfirmRenderBatch)
                {
                    HubConnection.InvokeAsync("OnRenderCompleted", batchId, /* error */ null);
                }

                RenderBatchReceived?.Invoke(browserRendererId, batchId, batchData);
            }

            void OnError(Error error)
            {
                Console.WriteLine("ERROR: " + error.Stack);
            }

            Task OnClosedAsync(Exception ex)
            {
                if (ex == null)
                {
                    TaskCompletionSource.TrySetResult(null);
                }
                else
                {
                    TaskCompletionSource.TrySetException(ex);
                }

                return(Task.CompletedTask);
            }
        }