Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit a16e9b0

Browse files
making interactive mode a env / cli option
1 parent 6226d9d commit a16e9b0

2 files changed

Lines changed: 118 additions & 8 deletions

File tree

Lines changed: 116 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,132 @@
11
namespace 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("\nAbout 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
}

src/SqlStreamStore.HAL.DevServer/SqlStreamStore.HAL.DevServer.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.2" />
99
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.0.2" />
1010
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.0.2" />
11+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.2" />
12+
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.0.2" />
1113
</ItemGroup>
1214
<ItemGroup>
1315
<ProjectReference Include="..\SqlStreamStore.HAL\SqlStreamStore.HAL.csproj" />

0 commit comments

Comments
 (0)