public static ServerFramingBuilder UseMessageEncoderWith <T>(this ServerFramingBuilder builder)
     where T : MessageAsFrameWriter
 {
     builder.MessageWriter  = builder.ApplicationServices.GetRequiredService <T>();
     builder.EncoderFactory = new MessageEncoderFactory(builder.Parser, builder.MessageWriter);
     return(builder);
 }
        public static ServerFramingBuilder UseDecoderPooling(this ServerFramingBuilder builder)
        {
            var poolProvider = builder.ApplicationServices.GetRequiredService <ObjectPoolProvider>();
            var pool         = poolProvider.Create(new PooledFrameDecoderPolicy(builder.Parser));

            builder.DecoderFactory = new PooledFrameDecoderFactory(pool);
            return(builder);
        }
        public static ServerFramingBuilder UseMessageEncoderPoolingWith <T>(this ServerFramingBuilder builder)
            where T : MessageAsFrameWriter
        {
            var poolProvider = builder.ApplicationServices.GetRequiredService <ObjectPoolProvider>();

            builder.MessageWriter = builder.ApplicationServices.GetRequiredService <T>();
            var pool = poolProvider.Create(new PooledMessageEncoderPolicy(builder.Parser, builder.MessageWriter));

            builder.EncoderFactory = new PooledMessageEncoderFactory(pool);
            return(builder);
        }
        public static async Task Main(string[] args)
        {
            // Manual wire up of the server
            var services = new ServiceCollection();

            services.AddLogging(builder =>
            {
                builder.SetMinimumLevel(LogLevel.Debug);
                builder.AddConsole();
            });

            services.AddScoped <MessageHandler <HelloServerMessage>, HelloServerMessageHandler>();
            services.Add <MessageMetadataParser, MessageMetadata>();
            services.AddSingleton(sp =>
            {
                var builder = new ServerFramingBuilder(sp);
                builder.Mappings.Add((HelloServerMessage.Id, typeof(HelloServerMessage)));
                builder.MessageWriter = new MessageWriter(builder.Parser);
                builder.MessageReader = new MessageReader();
                builder.UseMessageEncoder();

                return(builder.Build());
            });

            var serviceProvider = services.BuildServiceProvider();

            var server = new ServerBuilder(serviceProvider)
                         .UseSockets(sockets => sockets.Listen(IPAddress.Loopback, 5000,
                                                               builder => builder.UseConnectionHandler <ServerConnectionHandler>()))
                         .Build();

            var logger = serviceProvider.GetRequiredService <ILoggerFactory>().CreateLogger <Program>();
            await server.StartAsync();

            foreach (var ep in server.EndPoints)
            {
                logger.LogInformation("Listening on {EndPoint}", ep);
            }

            var tcs = new TaskCompletionSource <object>();

            Console.CancelKeyPress += (sender, e) => tcs.TrySetResult(null);

            await tcs.Task;
            await server.StopAsync();
        }
        static async Task Main(string[] args)
        {
            // Manual wire up of the client
            var services = new ServiceCollection().AddLogging(builder =>
            {
                builder.SetMinimumLevel(LogLevel.Debug);
                builder.AddConsole();
            });

            services.AddScoped <MessageHandler <HandshakeMessage>, HandshakeMessageHandler>();
            services.Add <MessageMetadataParser, MessageMetadata>();
            services.AddSingleton <ClientConnectionHandler>();
            services.AddSingleton(sp =>
            {
                var builder = new ServerFramingBuilder(sp);
                builder.Mappings.Add((HandshakeMessage.Id, typeof(HandshakeMessage)));
                builder.MessageWriter = new MessageWriter(builder.Parser);
                builder.MessageReader = new MessageReader();
                builder.UseMessageEncoder();

                return(builder.Build());
            });

            var serviceProvider   = services.BuildServiceProvider();
            var connectionHandler = serviceProvider
                                    .GetRequiredService <ClientConnectionHandler>();
            var clientFactory = new SocketConnectionFactory();

            Console.WriteLine("Press any key to start connection.");
            Console.ReadKey();

            await using var connection = await clientFactory.ConnectAsync(
                            new IPEndPoint (IPAddress.Loopback, 5000));

            await connectionHandler.OnConnectedAsync(connection).ConfigureAwait(false);
        }
 public static ServerFramingBuilder UseMessageEncoder(this ServerFramingBuilder builder)
 {
     builder.EncoderFactory = new MessageEncoderFactory(builder.Parser, builder.MessageWriter);
     return(builder);
 }