/// <summary> /// Registers <see cref="JsonConnectionFactory"/> that relies on /// <see cref="IMessageTypeCache"/>. <see cref="Serialization.RegistrationExtensions.AddSerializationCore(IServiceCollection)"/> /// should be called first. /// </summary> public static MessageTypeCacheBuilder AddJson(this MessageTypeCacheBuilder builder) { builder.Services.AddTransient <IJsonConnectionFactory, JsonConnectionFactory>(); builder.AddMessageType(typeof(JsonSerializedMessage)); return(builder); }
/// <summary> /// For self-hosted services without ASP.Net, like TCP real-time hosts /// based on messaging framework. /// </summary> public static MessageTypeCacheBuilder AddTyrServiceWithoutAspNetAuthentication(this MessageTypeCacheBuilder builder) { builder.Services.AddTyrCommonAuthentication(); builder.AddMessagingServiceAuthentication(); return(builder); }
public void ShouldAssignServiceCollectionToProperty() { var services = new ServiceCollection(); var sut = new MessageTypeCacheBuilder(services); Assert.Equal(services, sut.Services); }
public static MessageTypeCacheBuilder AddWorld(this MessageTypeCacheBuilder messageTypes) { var services = messageTypes.Services; // Should be transient or scoped since it needs IClientsService. services.AddTransient <ILocationRepository, LocationRepository>(); services.AddSingleton <LocationStore>(); services.AddTransient <IActivityStore>(x => (IActivityStore)x.GetRequiredService <ILocationRepository>()); services.AddTransient <ICharacterActivityStore, CharacterActivityStore>(); services.AddProfileApiClients(); services .AddTransient <IConnectHook, ConnectHook>() .UseUpdateFactory <WorldUpdateFactory>() .RegisterHandler <MoveToLocation, MoveToLocationHandler>() .RegisterHandler <JoinRopeWarContest, JoinRopeWarContestHandler>() .RegisterHandler <LeaveJoinedRopeWarContest, LeaveJoinedRopeWarContestHandler>() .RegisterHandler <ProposeRopeWarContest, ProposeRopeWarContestHandler>() .RegisterHandler <SwitchSides, SwitchSidesHandler>() .RegisterHandler <VoteToStartRopeWar, VoteToStartRopeWarHandler>(); services.RegisterClientMessagingForServer <SignalRClientConnectionFactoryFactory>(); messageTypes.AddWorldMessages(); return(messageTypes); }
private static MessageTypeCacheBuilder AddTyrAuthenticationMessagesAndHandlers(this MessageTypeCacheBuilder builder) { builder.AddMessageTypesFromAssembly(typeof(Authenticate).Assembly); builder.Services.RegisterHandler <Authenticate, AuthenticateHandler>(); return(builder); }
public void ShouldHaveNoMessagesByDefault() { var services = new ServiceCollection(); _ = new MessageTypeCacheBuilder(services); var cache = services.BuildServiceProvider().GetRequiredService <IMessageTypeCache>(); Assert.Empty(cache.GetAllTypes()); }
public void ShouldRegisterMessageTypeCacheAsSingleton() { var services = new ServiceCollection(); _ = new MessageTypeCacheBuilder(services); var provider = services.BuildServiceProvider(); provider.AssertRegisteredSingleton <IMessageTypeCache, MessageTypeCache>(); }
public static MessageTypeCacheBuilder AddTypingRealmAuthentication( this MessageTypeCacheBuilder builder, AuthenticationInformation profileAuthentication, AuthenticationInformation?serviceAuthentication = null) { builder.AddTyrAuthenticationMessages(); builder.Services.AddTypingRealmAuthentication(profileAuthentication, serviceAuthentication); return(builder); }
/// <summary> /// Scans the assembly for types marked with <see cref="MessageAttribute"/> /// attribute and adds them to the cache builder. /// </summary> /// <param name="builder">Cache builder where to add message types.</param> /// <param name="assembly">Assembly to scan for message types.</param> public static MessageTypeCacheBuilder AddMessageTypesFromAssembly( this MessageTypeCacheBuilder builder, Assembly assembly) { foreach (var type in assembly.GetTypes().Where(t => t.GetCustomAttribute <MessageAttribute>() != null)) { builder.AddMessageType(type); } return(builder); }
public static MessageTypeCacheBuilder AddTyrServiceAuthentication(this MessageTypeCacheBuilder builder) { var services = builder.Services; var authInfoProvider = services.AddTyrCommonAuthentication(); services.UseAspNetAuthentication(authInfoProvider); builder.AddMessagingServiceAuthentication(); return(builder); }
public static MessageTypeCacheBuilder AddChat(this MessageTypeCacheBuilder messageTypes) { var services = messageTypes.Services; services .AddSingleton <MessageLog>() .UseUpdateFactory <StateFactory>() .RegisterHandler <Say, SayHandler>(); messageTypes.AddChatMessages(); return(messageTypes); }
public static MessageTypeCacheBuilder AddTypingDuelsDomain(this MessageTypeCacheBuilder builder) { builder.AddTypingDuelsMessages(); builder.Services.AddSingleton <TypingDuelsState>(); builder.Services.RegisterHandler <Typed, TypeMessageHandler>(); builder.Services.AddSingleton <TypedDebouncer>(); builder.Services.UseUpdateFactory <UpdateFactory>(); builder.Services.AddTransient <IConnectionGroupProvider, ConnectionGroupProvider>(); builder.Services.AddTransient <IConnectedClientInitializer, ConnectedClientInitializer>(); return(builder); }
public void ShouldAddMessages() { var services = new ServiceCollection(); _ = new MessageTypeCacheBuilder(services) .AddMessageType(typeof(TestMessage)) .AddMessageType(typeof(string)) .AddMessageType(typeof(object)); var cache = services.BuildServiceProvider().GetRequiredService <IMessageTypeCache>(); Assert.Equal(3, cache.GetAllTypes().Count()); Assert.Contains(typeof(TestMessage), cache.GetAllTypes().Select(x => x.Value)); Assert.Contains(typeof(string), cache.GetAllTypes().Select(x => x.Value)); Assert.Contains(typeof(object), cache.GetAllTypes().Select(x => x.Value)); }
public static MessageTypeCacheBuilder AddRopeWar(this MessageTypeCacheBuilder messageTypes) { var services = messageTypes.Services; services.AddSingleton <IContestStore, InMemoryContestStore>(); services.AddTransient <ICharacterStateService, CharacterStateServiceAdapter>(); services.AddProfileApiClients(); services .AddTransient <IConnectHook, ConnectHook>() .UseUpdateFactory <ContestUpdateFactory>() .RegisterHandler <JoinContest, JoinContestHandler>() .RegisterHandler <StartContest, StartContestHandler>() .RegisterHandler <PullRope, PullRopeHandler>(); messageTypes.AddRopeWarMessages(); return(messageTypes); }
public static MessageTypeCacheBuilder AddTyrWebServiceAuthentication(this MessageTypeCacheBuilder builder) { var profileAuthentication = new AuthenticationInformationBuilder() .UseAuth0Provider() .Build(); var serviceAuthentication = new AuthenticationInformationBuilder() .UseIdentityServerProvider() .Build(); builder.AddTypingRealmAuthentication(profileAuthentication, serviceAuthentication) .Services .UseAspNetAuthentication(profileAuthentication, serviceAuthentication) .UseConnectedClientContextAuthentication() .UseCharacterAuthorizationOnConnect(); return(builder); }
public static MessageTypeCacheBuilder AddWorld(this MessageTypeCacheBuilder messageTypes) { var services = messageTypes.Services; services.AddSingleton <ILocationStore, LocationStore>(); services.AddProfileApiClients(); services .AddTransient <IConnectHook, ConnectHook>() .UseUpdateFactory <LocationUpdateFactory>() .RegisterHandler <JoinRopeWarContest, JoinRopeWarContestHandler>() .RegisterHandler <LeaveJoinedRopeWarContest, LeaveJoinedRopeWarContestHandler>() .RegisterHandler <MoveToLocation, MoveToLocationHandler>() .RegisterHandler <ProposeRopeWarContest, ProposeRopeWarContestHandler>() .RegisterHandler <VoteToStartRopeWar, VoteToStartRopeWarHandler>(); messageTypes.AddWorldMessages(); return(messageTypes); }
public void ShouldAddAllMessageTypesFromAssembly() { var services = new ServiceCollection(); var sut = new MessageTypeCacheBuilder(services); sut.AddMessageTypesFromAssembly(typeof(AMessage).Assembly); var cache = services.BuildServiceProvider() .GetRequiredService <IMessageTypeCache>(); var messages = cache.GetAllTypes().Select(x => x.Value).ToList(); Assert.True(messages.Count >= 2); Assert.Contains(typeof(AMessage), messages); Assert.Contains(typeof(BMessage), messages); foreach (var message in messages) { Assert.Equal(typeof(AMessage).Assembly, message.Assembly); Assert.NotNull(message.GetCustomAttribute <MessageAttribute>()); } }
public void AddDomainCore_ShouldAddAllMessagesFromDomainAssemblyAndOnlyThem() { var services = new ServiceCollection(); _ = new MessageTypeCacheBuilder(services) .AddDomainCore(); var messages = services.BuildServiceProvider() .GetRequiredService <IMessageTypeCache>() .GetAllTypes() .Select(x => x.Value) .ToList(); var asmMessages = typeof(Join).Assembly .GetTypes() .Where(x => x.GetCustomAttribute <MessageAttribute>() != null) .OrderBy(x => x.FullName) .ToList(); Assert.Equal(asmMessages, messages); }
internal static MessageTypeCacheBuilder AddMessagingServiceAuthentication(this MessageTypeCacheBuilder builder) { var services = builder.Services; builder.AddTyrAuthenticationMessagesAndHandlers(); // Adding ConnectedClient (realtime) token service for realtime servers // that takes data from IConnectedClientContext. // Scope is created per user connection, managed by Messaging project. // It's very important to register it as scoped here. services.AddScoped <IConnectedClientContext, ConnectedClientContext>(); services.AddTransient <IProfileTokenService, ConnectedClientProfileTokenService>(); // TODO: Make a possibility to switch to CharacterAuthentication (Connect message) here before AuthenticateConnectionInitializer decorator. // Wait for Authenticate message with valid token as the first message. services.AddTransient <IConnectionInitializer, UserProfileConnectionInitializer>(); services.Decorate <IConnectionInitializer, AuthenticateConnectionInitializer>(); // To query Characters API. services.AddProfileApiClients(); return(builder); }
public static MessageTypeCacheBuilder AddWorldMessages(this MessageTypeCacheBuilder builder) { return(builder.AddMessageTypesFromAssembly(typeof(JoinRopeWarContest).Assembly)); }
public static MessageTypeCacheBuilder AddChatMessages(this MessageTypeCacheBuilder builder) { return(builder.AddMessageTypesFromAssembly(typeof(Say).Assembly)); }
public static MessageTypeCacheBuilder AddTypingDuelsMessages(this MessageTypeCacheBuilder builder) { builder.AddMessageTypesFromAssembly(typeof(Typed).Assembly); return(builder); }
public static MessageTypeCacheBuilder AddTyrAuthenticationMessages(this MessageTypeCacheBuilder builder) { return(builder.AddMessageTypesFromAssembly(typeof(Authenticate).Assembly)); }
/// <summary> /// Adds all domain messages to <see cref="MessageTypeCacheBuilder"/>. /// </summary> public static MessageTypeCacheBuilder AddDomainCore(this MessageTypeCacheBuilder builder) => builder.AddMessageTypesFromAssembly(typeof(Join).Assembly);