adding skeleton for cache hub proxy
This commit is contained in:
parent
933e8725c4
commit
3867ea8fad
41
Selector.Web/Pages/Now.cs
Normal file
41
Selector.Web/Pages/Now.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
||||||
|
using Selector.Web.Hubs;
|
||||||
|
using Selector.Web.Service;
|
||||||
|
using Selector.Model;
|
||||||
|
|
||||||
|
namespace Selector.Web.Pages
|
||||||
|
{
|
||||||
|
public class NowModel : PageModel
|
||||||
|
{
|
||||||
|
private readonly ILogger<NowModel> Logger;
|
||||||
|
private readonly INowPlayingMappingFactory MappingFactory;
|
||||||
|
private readonly CacheHubProxy HubProxy;
|
||||||
|
private readonly UserManager<ApplicationUser> UserManager;
|
||||||
|
|
||||||
|
public NowModel(ILogger<NowModel> logger,
|
||||||
|
INowPlayingMappingFactory mappingFactory,
|
||||||
|
CacheHubProxy hubProxy,
|
||||||
|
UserManager<ApplicationUser> userManager)
|
||||||
|
{
|
||||||
|
Logger = logger;
|
||||||
|
MappingFactory = mappingFactory;
|
||||||
|
HubProxy = hubProxy;
|
||||||
|
UserManager = userManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnGet()
|
||||||
|
{
|
||||||
|
HubProxy.FormMapping(MappingFactory.Get(UserManager.GetUserId(User)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
Selector.Web/Pages/Now.cshtml
Normal file
13
Selector.Web/Pages/Now.cshtml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
@page
|
||||||
|
@model NowModel
|
||||||
|
@{
|
||||||
|
ViewData["Title"] = "Now";
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<h1 class="display-4">Now</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@section Scripts {
|
||||||
|
<script type="module" src="~/js/now.bundle.js"></script>
|
||||||
|
}
|
71
Selector.Web/Services/CacheHubProxy.cs
Normal file
71
Selector.Web/Services/CacheHubProxy.cs
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
|
||||||
|
using StackExchange.Redis;
|
||||||
|
using Selector.Web.Hubs;
|
||||||
|
|
||||||
|
namespace Selector.Web.Service
|
||||||
|
{
|
||||||
|
public class CacheHubProxy
|
||||||
|
{
|
||||||
|
private readonly ILogger<CacheHubProxy> Logger;
|
||||||
|
private readonly ISubscriber Subscriber;
|
||||||
|
private readonly ServiceProvider Services;
|
||||||
|
|
||||||
|
public CacheHubProxy(ILogger<CacheHubProxy> logger,
|
||||||
|
ISubscriber subscriber,
|
||||||
|
ServiceProvider services
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Logger = logger;
|
||||||
|
Subscriber = subscriber;
|
||||||
|
Services = services;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void FormMapping<THub, T>(ICacheHubMapping<THub, T> mapping) where THub: Hub<T> where T: class
|
||||||
|
{
|
||||||
|
var context = Services.GetService<IHubContext<THub, T>>();
|
||||||
|
mapping.ConstructMapping(Subscriber, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// public class CacheHubProxy<THub, T>
|
||||||
|
// where THub: Hub<T>
|
||||||
|
// where T: class
|
||||||
|
// {
|
||||||
|
// private readonly ILogger<CacheHubProxy<THub, T>> Logger;
|
||||||
|
// private readonly ISubscriber Subscriber;
|
||||||
|
// private readonly IHubContext<THub, T> HubContext;
|
||||||
|
// private readonly List<ICacheHubMapping<THub, T>> Mappings;
|
||||||
|
|
||||||
|
// public CacheHubProxy(ILogger<CacheHubProxy<THub, T>> logger,
|
||||||
|
// ISubscriber subscriber,
|
||||||
|
// IHubContext<THub, T> hubContext,
|
||||||
|
// IEnumerable<ICacheHubMapping<THub, T>> mappings
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// Logger = logger;
|
||||||
|
// Subscriber = subscriber;
|
||||||
|
// HubContext = hubContext;
|
||||||
|
// Mappings = mappings.ToList();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public void FormMapping(ICacheHubMapping<THub, T> mapping)
|
||||||
|
// {
|
||||||
|
// mapping.ConstructMapping(Subscriber, HubContext);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public void AddMapping(ICacheHubMapping<THub, T> mapping)
|
||||||
|
// {
|
||||||
|
// Mappings.Add(mapping);
|
||||||
|
// FormMapping(mapping);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
35
Selector.Web/Services/CacheHubProxyService.cs
Normal file
35
Selector.Web/Services/CacheHubProxyService.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace Selector.Web.Service
|
||||||
|
{
|
||||||
|
public class CacheHubProxyService: IHostedService
|
||||||
|
{
|
||||||
|
private readonly ILogger<CacheHubProxyService> Logger;
|
||||||
|
private readonly CacheHubProxy Proxy;
|
||||||
|
|
||||||
|
public CacheHubProxyService(
|
||||||
|
ILogger<CacheHubProxyService> logger,
|
||||||
|
CacheHubProxy proxy
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Logger = logger;
|
||||||
|
Proxy = proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StartAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Logger.LogInformation("Starting cache hub proxy");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Logger.LogInformation("Stopping cache hub proxy");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
Selector.Web/Services/Mappings/ICacheHubMapping.cs
Normal file
16
Selector.Web/Services/Mappings/ICacheHubMapping.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
using StackExchange.Redis;
|
||||||
|
|
||||||
|
namespace Selector.Web.Service
|
||||||
|
{
|
||||||
|
public interface ICacheHubMapping<THub, T>
|
||||||
|
where THub : Hub<T>
|
||||||
|
where T : class
|
||||||
|
{
|
||||||
|
public Task ConstructMapping(ISubscriber subscriber, IHubContext<THub, T> hub);
|
||||||
|
// public Task RemoveMapping(ISubscriber subscriber, THub hub);
|
||||||
|
}
|
||||||
|
}
|
33
Selector.Web/Services/Mappings/MappingFactory.cs
Normal file
33
Selector.Web/Services/Mappings/MappingFactory.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
|
using SpotifyAPI.Web;
|
||||||
|
|
||||||
|
namespace Selector.Web.Service
|
||||||
|
{
|
||||||
|
public interface INowPlayingMappingFactory {
|
||||||
|
public NowPlayingMapping Get(string userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NowPlayingMappingFactory : INowPlayingMappingFactory {
|
||||||
|
|
||||||
|
private readonly ILoggerFactory LoggerFactory;
|
||||||
|
|
||||||
|
public NowPlayingMappingFactory(ILoggerFactory loggerFactory)
|
||||||
|
{
|
||||||
|
LoggerFactory = loggerFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NowPlayingMapping Get(string userId)
|
||||||
|
{
|
||||||
|
return new NowPlayingMapping(
|
||||||
|
LoggerFactory?.CreateLogger<NowPlayingMapping>(),
|
||||||
|
userId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
Selector.Web/Services/Mappings/NowPlayingMapping.cs
Normal file
33
Selector.Web/Services/Mappings/NowPlayingMapping.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
using StackExchange.Redis;
|
||||||
|
|
||||||
|
using Selector.Web.Hubs;
|
||||||
|
using Selector.Cache;
|
||||||
|
|
||||||
|
namespace Selector.Web.Service
|
||||||
|
{
|
||||||
|
public class NowPlayingMapping : ICacheHubMapping<NowPlayingHub, INowPlayingHubClient>
|
||||||
|
{
|
||||||
|
private readonly string UserId;
|
||||||
|
|
||||||
|
public NowPlayingMapping(ILogger<NowPlayingMapping> logger, string userId)
|
||||||
|
{
|
||||||
|
UserId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ConstructMapping(ISubscriber subscriber, IHubContext<NowPlayingHub, INowPlayingHubClient> hub)
|
||||||
|
{
|
||||||
|
(await subscriber.SubscribeAsync(Key.CurrentlyPlaying(UserId))).OnMessage(async message => {
|
||||||
|
|
||||||
|
var deserialised = JsonSerializer.Deserialize<CurrentlyPlayingDTO>(message.ToString());
|
||||||
|
await hub.Clients.User(UserId).OnNewPlaying(deserialised);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,7 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
|
|
||||||
using StackExchange.Redis;
|
using StackExchange.Redis;
|
||||||
|
|
||||||
|
using Selector.Web.Service;
|
||||||
using Selector.Web.Hubs;
|
using Selector.Web.Hubs;
|
||||||
using Selector.Model;
|
using Selector.Model;
|
||||||
using Selector.Model.Authorisation;
|
using Selector.Model.Authorisation;
|
||||||
@ -115,6 +116,10 @@ namespace Selector.Web
|
|||||||
services.AddTransient<IDatabaseAsync>(services => services.GetService<ConnectionMultiplexer>().GetDatabase());
|
services.AddTransient<IDatabaseAsync>(services => services.GetService<ConnectionMultiplexer>().GetDatabase());
|
||||||
services.AddTransient<ISubscriber>(services => services.GetService<ConnectionMultiplexer>().GetSubscriber());
|
services.AddTransient<ISubscriber>(services => services.GetService<ConnectionMultiplexer>().GetSubscriber());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HOSTED
|
||||||
|
services.AddSingleton<CacheHubProxy>();
|
||||||
|
services.AddSingleton<INowPlayingMappingFactory, NowPlayingMappingFactory>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||||
|
Loading…
Reference in New Issue
Block a user