11namespace SqlStreamStore . HAL . DevServer
22{
3+ using System ;
4+ using System . Linq ;
35 using System . Threading ;
46 using System . Threading . Tasks ;
57 using Microsoft . AspNetCore . Hosting ;
8+ using Microsoft . Extensions . Configuration ;
9+ using SqlStreamStore . Streams ;
610
7- internal static class Program
11+ internal class Program : IDisposable
812 {
13+ private static readonly Random s_random = new Random ( ) ;
14+ private readonly CancellationTokenSource _cts ;
15+ private readonly InMemoryStreamStore _streamStore ;
16+ private readonly IWebHost _host ;
17+ private readonly IConfigurationRoot _configuration ;
18+
19+ private bool Interactive => _configuration . GetValue < bool > ( "interactive" ) ;
20+
921 public static async Task < int > Main ( string [ ] args )
1022 {
11- using ( var cts = new CancellationTokenSource ( ) )
12- using ( var streamStore = new InMemoryStreamStore ( ) )
13- using ( var host = new WebHostBuilder ( )
23+ using ( var program = new Program ( args ) )
24+ {
25+ return await program . Run ( ) ;
26+ }
27+ }
28+
29+ private Program ( string [ ] args )
30+ {
31+ _cts = new CancellationTokenSource ( ) ;
32+ _streamStore = new InMemoryStreamStore ( ) ;
33+ _host = new WebHostBuilder ( )
1434 . UseKestrel ( )
15- . UseStartup ( new DevServerStartup ( streamStore ) )
16- . Build ( ) )
35+ . UseStartup ( new DevServerStartup ( _streamStore ) )
36+ . Build ( ) ;
37+ _configuration = new ConfigurationBuilder ( )
38+ . AddEnvironmentVariables ( )
39+ . AddCommandLine ( args )
40+ . Build ( ) ;
41+ }
42+
43+ private async Task < int > Run ( )
44+ {
45+ try
46+ {
47+ var serverTask = _host . RunAsync ( _cts . Token ) ;
48+
49+ if ( Interactive )
50+ {
51+ DisplayMenu ( _streamStore ) ;
52+ }
53+
54+ await serverTask ;
55+
56+ return 0 ;
57+ }
58+ catch ( Exception ex )
59+ {
60+ Console . Error . WriteLine ( ex . Message ) ;
61+ }
62+
63+ return 1 ;
64+ }
65+
66+ private static void DisplayMenu ( IStreamStore streamStore , string url = null )
67+ {
68+ while ( true )
1769 {
18- await host . RunAsync ( cts . Token ) ;
70+ Console . WriteLine ( "Using stream store: {0}" , streamStore . GetType ( ) . Name ) ;
71+ Console . WriteLine ( "Press w to write 10 messages each to 100 streams" ) ;
72+ Console . WriteLine ( "Press t to write 100 messages each to 10 streams" ) ;
73+ Console . WriteLine ( "Press ESC to exit" ) ;
74+
75+ var key = Console . ReadKey ( ) ;
76+
77+ switch ( key . Key )
78+ {
79+ case ConsoleKey . Escape :
80+ return ;
81+ case ConsoleKey . W :
82+ Write ( streamStore , url , 10 , 100 ) ;
83+ break ;
84+ case ConsoleKey . T :
85+ Write ( streamStore , url , 100 , 10 ) ;
86+ break ;
87+ default :
88+ Console . WriteLine ( "Computer says no" ) ;
89+ break ;
90+ }
1991 }
92+ }
93+
94+ private static void Write ( IStreamStore streamStore , string url , int messageCount , int streamCount )
95+ {
96+ var streams = Enumerable . Range ( 0 , streamCount ) . Select ( _ => $ "test-{ Guid . NewGuid ( ) : n} ") . ToList ( ) ;
2097
21- return 0 ;
98+ var streamIds = string . Join ( "\n " , streams . Select ( streamid => $ "{ url } streams/{ streamid } ") ) ;
99+
100+ Console . WriteLine ( "\n About to create the following streams: " ) ;
101+ Console . WriteLine ( streamIds ) ;
102+
103+ Task . Run ( ( ) => Task . WhenAll (
104+ from streamId in streams
105+ select streamStore . AppendToStream ( streamId ,
106+ ExpectedVersion . NoStream ,
107+ GenerateMessages ( messageCount ) ) ) ) ;
108+ }
109+
110+ private static NewStreamMessage [ ] GenerateMessages ( int messageCount )
111+ {
112+ return Enumerable . Range ( 0 , messageCount )
113+ . Select ( _ => new NewStreamMessage (
114+ Guid . NewGuid ( ) ,
115+ "test" ,
116+ $@ "{{ ""foo"": ""{ Guid . NewGuid ( ) } "", ""baz"": {{ }}, ""qux"": [ {
117+ string . Join ( ", " ,
118+ Enumerable
119+ . Range ( 0 , messageCount ) . Select ( max => s_random . Next ( max ) ) )
120+ } ] }}",
121+ "{}" ) )
122+ . ToArray ( ) ;
123+ }
124+
125+ public void Dispose ( )
126+ {
127+ _host ? . Dispose ( ) ;
128+ _streamStore ? . Dispose ( ) ;
129+ _cts ? . Dispose ( ) ;
22130 }
23131 }
24132}
0 commit comments