using System; using System.Diagnostics; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using Example.Frontend; using Example.Shared; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using mROA.Abstract; using mROA.Cbor; using mROA.Codegen; using mROA.Implementation; using mROA.Implementation.Backend; using mROA.Implementation.Frontend; class Program { public static async Task Main(string[] args) { new RemoteTypeBinder(); var builder = Host.CreateApplicationBuilder(new HostApplicationBuilderSettings { DisableDefaults = true }); builder.Services.AddLogging(l => l.SetMinimumLevel(LogLevel.Trace).AddConsole()); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(provider => { var repo = new InstanceRepository(provider.GetService()); repo.FillSingletons(typeof(Program).Assembly); return repo; }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 4567); builder.Services.AddSingleton(); builder.Services.AddOptions(); builder.Services.Configure(options => options.Endpoint = serverEndPoint); builder.Services.Configure(o => o.DistributionType = EDistributionType.Channeled); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(p => { var methodRepo = new CollectableMethodRepository(); methodRepo.AppendInvokers(new GeneratedInvokersCollection()); return methodRepo; }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); var app = builder.Build(); var frontendBridge = app.Services.GetService()!; await frontendBridge.Connect(); _ = app.Services.GetService()!.StartExtraction(); _ = app.Services.GetService().Start(serverEndPoint); Console.WriteLine(app.Services.GetService().HostId); var context = app.Services.GetService(); #if !JUST_LOAD var factory = context.GetSingletonObject( app.Services.GetService()); using (var disposingPrinter = factory.Create("Test")) { disposingPrinter.SetFingerPrint(new[] { 1, 2, 3 }).ContinueWith(r => { Console.WriteLine(r.Status); }); await disposingPrinter.IntTest(new MyData { Id = 5, Score = 7, Name = "Test" }); DemoCheck.CreatingPrinter = true; disposingPrinter.OnPrint += (_, _) => { Console.WriteLine("New page created. Called from event!!!"); DemoCheck.EventCallback = true; }; Console.WriteLine("Printer created"); frontendBridge.Obstacle(); var name = disposingPrinter.GetName(); DemoCheck.BasicNonParamsCall = true; Console.WriteLine("Printer name : {0}", name); disposingPrinter.SomeoneIsApproaching("Mikhail"); Console.WriteLine("Approaching detected"); factory.Register(new ClientBasedPrinter()); factory.Register(disposingPrinter); DemoCheck.ClientBasedImplementation = true; Console.WriteLine("Registered printer"); var registered = factory.GetFirstPrinter(); Console.WriteLine("First printer"); Console.WriteLine(registered); Console.WriteLine("Collecting all printers"); var names = factory.CollectAllNames(); Console.WriteLine("Names: " + string.Join(", ", names)); var page = await disposingPrinter.Print("Test Page", false, default, CancellationToken.None); Console.WriteLine("Page printed"); DemoCheck.TaskExecution = true; Console.WriteLine(page.ToString()); Console.WriteLine($"Printer resource : {disposingPrinter.Resource}"); DemoCheck.PropertyGet = true; Console.WriteLine("Restoring resource"); disposingPrinter.Resource = 100; DemoCheck.PropertySet = true; Console.WriteLine($"Printer resource again : {disposingPrinter.Resource}"); var data = page.GetData(); Console.WriteLine("Data : {0}", Encoding.UTF8.GetString(data)); Console.WriteLine("Dispose printer"); } DemoCheck.Dispose = true; #endif var loadSingleton = context.GetSingletonObject(app.Services.GetService()); #if !JUST_LOAD var cts = new CancellationTokenSource(); var token = cts.Token; var t = Task.Run(async () => await loadSingleton!.AsyncTest(token)); Thread.Sleep(5000); cts.Cancel(); Console.WriteLine($"Token state {cts.Token.IsCancellationRequested}"); DemoCheck.TaskCancelation = true; #endif const int iterations = 10_000; var timer = Stopwatch.StartNew(); var x = 0; for (int i = 0; i < iterations; i++) { x = await loadSingleton.Next(x); } timer.Stop(); Console.WriteLine("X is {0}", x); Console.WriteLine("Time : {0}", timer.Elapsed.TotalMilliseconds); Console.WriteLine($"Time per call: {timer.Elapsed.TotalMilliseconds / iterations} ms"); Console.WriteLine($"Serialization time: {CborSerializationToolkit.SerializationTime}"); frontendBridge.Disconnect(); DemoCheck.Show(); } }