add support for separating connection type in XPushConnectionDto by adding an abstract GetConnection method ...
This commit is contained in:
+130
-89
@@ -14,7 +14,8 @@ namespace xPushService.Base {
|
||||
/// <summary>
|
||||
/// a base class for implementing Hubs ...
|
||||
/// </summary>
|
||||
public abstract class XBaseHub : Hub, IXBaseHub {
|
||||
public abstract class XBaseHub : Hub, IXBaseHub
|
||||
{
|
||||
//
|
||||
#region Props ...
|
||||
protected readonly IXPushGroupStore groupStore;
|
||||
@@ -23,10 +24,11 @@ namespace xPushService.Base {
|
||||
|
||||
//
|
||||
#region Constructor ...
|
||||
public XBaseHub (
|
||||
public XBaseHub(
|
||||
IXPushGroupStore groupStore,
|
||||
IXPushConnectionStore connectionStore
|
||||
) : base () {
|
||||
) : base()
|
||||
{
|
||||
//
|
||||
this.groupStore = groupStore;
|
||||
this.connectionStore = connectionStore;
|
||||
@@ -35,6 +37,7 @@ namespace xPushService.Base {
|
||||
|
||||
//
|
||||
#region Abstract ...
|
||||
public abstract XPushConnectionDto GetConnection();
|
||||
#endregion
|
||||
|
||||
//
|
||||
@@ -43,48 +46,52 @@ namespace xPushService.Base {
|
||||
|
||||
//
|
||||
#region Overrides ...
|
||||
public override Task OnConnectedAsync () {
|
||||
public override Task OnConnectedAsync()
|
||||
{
|
||||
//
|
||||
var connection = GetConnection ();
|
||||
if (!connection.IsNull ()) {
|
||||
var connection = GetConnection();
|
||||
if (!connection.IsNull())
|
||||
{
|
||||
//
|
||||
connectionStore
|
||||
.Add (connection)
|
||||
.RunTask ();
|
||||
.Add(connection)
|
||||
.RunTask();
|
||||
|
||||
//
|
||||
var count = connectionStore
|
||||
.Count ()
|
||||
.RunTask ();
|
||||
.Count()
|
||||
.RunTask();
|
||||
|
||||
//
|
||||
Console.WriteLine ($"Count After Coonected: {count}");
|
||||
Console.WriteLine($"Count After Coonected: {count}");
|
||||
}
|
||||
|
||||
//
|
||||
return base.OnConnectedAsync ();
|
||||
return base.OnConnectedAsync();
|
||||
}
|
||||
|
||||
public override Task OnDisconnectedAsync (Exception exception) {
|
||||
public override Task OnDisconnectedAsync(Exception exception)
|
||||
{
|
||||
//
|
||||
var connection = GetConnection ();
|
||||
if (!connection.IsNull ()) {
|
||||
var connection = GetConnection();
|
||||
if (!connection.IsNull())
|
||||
{
|
||||
//
|
||||
connectionStore
|
||||
.RemoveByConnectionId (connection.Id)
|
||||
.RunTask ();
|
||||
.RemoveByConnectionId(connection.Id)
|
||||
.RunTask();
|
||||
|
||||
//
|
||||
var count = connectionStore
|
||||
.Count ()
|
||||
.RunTask ();
|
||||
.Count()
|
||||
.RunTask();
|
||||
|
||||
//
|
||||
Console.WriteLine ($"Count After DisCoonected: {count}");
|
||||
Console.WriteLine($"Count After DisCoonected: {count}");
|
||||
}
|
||||
|
||||
//
|
||||
return base.OnDisconnectedAsync (exception);
|
||||
return base.OnDisconnectedAsync(exception);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -94,32 +101,34 @@ namespace xPushService.Base {
|
||||
/// Notify to all Other Clients which a new Connection is established ...
|
||||
/// </summary>
|
||||
/// <param name="connectionId"></param>
|
||||
public Task NotifyNewConnection (string connectionId) {
|
||||
public Task NotifyNewConnection(string connectionId)
|
||||
{
|
||||
//
|
||||
var actor = Context.User.Identity.Name;
|
||||
var authType = Context.User.Identity.AuthenticationType;
|
||||
var actorRole = Context?.User?.FindFirst ("role")?.Value;
|
||||
var actorRole = Context?.User?.FindFirst("role")?.Value;
|
||||
|
||||
//
|
||||
var pushMessage = new XPushMessage {
|
||||
var pushMessage = new XPushMessage
|
||||
{
|
||||
//
|
||||
Actor = actor,
|
||||
Payload = connectionId,
|
||||
TimeStamp = DateTime.UtcNow,
|
||||
Type = XPushType.System.GetStringValue(),
|
||||
Topic = XPushType.System.GetStringValue(),
|
||||
Action = XBasePushAction.NotifyNewConnection.GetStringValue (),
|
||||
Topic = XPushType.System.GetStringValue(),
|
||||
Action = XBasePushAction.NotifyNewConnection.GetStringValue(),
|
||||
Message = $"a new connection stablished by {connectionId} ...",
|
||||
};
|
||||
|
||||
//
|
||||
Console.WriteLine ($"XPushServiceLog => ");
|
||||
Console.WriteLine ($"XPushServiceLog => NotifyNewConnection: User: {actor}/Role: {actorRole}/AuthType: {authType}/ConnectionId: {connectionId}/ConnectedAt: {DateTime.UtcNow}");
|
||||
Console.WriteLine ($"XPushServiceLog => ");
|
||||
Console.WriteLine($"XPushServiceLog => ");
|
||||
Console.WriteLine($"XPushServiceLog => NotifyNewConnection: User: {actor}/Role: {actorRole}/AuthType: {authType}/ConnectionId: {connectionId}/ConnectedAt: {DateTime.UtcNow}");
|
||||
Console.WriteLine($"XPushServiceLog => ");
|
||||
|
||||
//
|
||||
return Clients.Others.SendAsync (
|
||||
XBasePushAction.PushMessage.GetStringValue (),
|
||||
return Clients.Others.SendAsync(
|
||||
XBasePushAction.PushMessage.GetStringValue(),
|
||||
pushMessage
|
||||
);
|
||||
}
|
||||
@@ -127,27 +136,30 @@ namespace xPushService.Base {
|
||||
/// <summary>
|
||||
/// Update Last Seen ...
|
||||
/// </summary>
|
||||
public Task UpdateLastSeen () {
|
||||
public Task UpdateLastSeen()
|
||||
{
|
||||
var connectionId = Context.ConnectionId;
|
||||
return connectionStore
|
||||
.UpdateLastSeen (connectionId)
|
||||
.ContinueWith (updateLastSeenTask => {
|
||||
.UpdateLastSeen(connectionId)
|
||||
.ContinueWith(updateLastSeenTask =>
|
||||
{
|
||||
//
|
||||
var updateLastSeen = updateLastSeenTask
|
||||
.RunTask ();
|
||||
if (updateLastSeen) {
|
||||
.RunTask();
|
||||
if (updateLastSeen)
|
||||
{
|
||||
//
|
||||
var updatedConnection = connectionStore
|
||||
.GetByConnectionId (connectionId)
|
||||
.RunTask ();
|
||||
.GetByConnectionId(connectionId)
|
||||
.RunTask();
|
||||
|
||||
//
|
||||
var count = connectionStore
|
||||
.Count ()
|
||||
.RunTask ();
|
||||
.Count()
|
||||
.RunTask();
|
||||
|
||||
//
|
||||
Console.WriteLine ($"Connection Last Seen Updated: {connectionId}: {updatedConnection.LastSeen}, Connection Count: {count} ...");
|
||||
Console.WriteLine($"Connection Last Seen Updated: {connectionId}: {updatedConnection.LastSeen}, Connection Count: {count} ...");
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -157,16 +169,20 @@ namespace xPushService.Base {
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
public Task PushMessageAsync (XPushMessage message) {
|
||||
public Task PushMessageAsync(XPushMessage message)
|
||||
{
|
||||
//
|
||||
if (message.IsNull ()) {
|
||||
message = GetPushMessage ();
|
||||
} else {
|
||||
if (message.IsNull())
|
||||
{
|
||||
message = GetPushMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
message.TimeStamp = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
//
|
||||
return Clients.Others.SendAsync (XBasePushAction.PushMessage.GetStringValue (), message);
|
||||
return Clients.Others.SendAsync(XBasePushAction.PushMessage.GetStringValue(), message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -175,16 +191,20 @@ namespace xPushService.Base {
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
[Authorize]
|
||||
public Task AuthorizedMessageAsync (XPushMessage message) {
|
||||
public Task AuthorizedMessageAsync(XPushMessage message)
|
||||
{
|
||||
//
|
||||
if (message.IsNull ()) {
|
||||
message = GetPushMessage ();
|
||||
} else {
|
||||
if (message.IsNull())
|
||||
{
|
||||
message = GetPushMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
message.TimeStamp = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
//
|
||||
return Clients.Others.SendAsync (XBasePushAction.PushMessage.GetStringValue (), message);
|
||||
return Clients.Others.SendAsync(XBasePushAction.PushMessage.GetStringValue(), message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -192,20 +212,24 @@ namespace xPushService.Base {
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
public Task PushMessageToAll (XPushMessage message) {
|
||||
public Task PushMessageToAll(XPushMessage message)
|
||||
{
|
||||
//
|
||||
// Normalize Message ...
|
||||
if (message.IsNull ()) {
|
||||
message = GetPushMessage ();
|
||||
} else {
|
||||
if (message.IsNull())
|
||||
{
|
||||
message = GetPushMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
message.TimeStamp = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
//
|
||||
return Clients
|
||||
.All
|
||||
.SendAsync (
|
||||
XBasePushAction.PushMessage.GetStringValue (),
|
||||
.SendAsync(
|
||||
XBasePushAction.PushMessage.GetStringValue(),
|
||||
message
|
||||
);
|
||||
}
|
||||
@@ -216,29 +240,34 @@ namespace xPushService.Base {
|
||||
/// <param name="connectionId"></param>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
public Task PushMessageToConnection (
|
||||
public Task PushMessageToConnection(
|
||||
string connectionId,
|
||||
XPushMessage message
|
||||
) {
|
||||
)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (connectionId.IsNullOrEmpty ()) {
|
||||
if (connectionId.IsNullOrEmpty())
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
//
|
||||
// Normalize Message ...
|
||||
if (message.IsNull ()) {
|
||||
message = GetPushMessage ();
|
||||
} else {
|
||||
if (message.IsNull())
|
||||
{
|
||||
message = GetPushMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
message.TimeStamp = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
//
|
||||
return Clients
|
||||
.Client (connectionId)
|
||||
.SendAsync (
|
||||
XBasePushAction.PushMessage.GetStringValue (),
|
||||
.Client(connectionId)
|
||||
.SendAsync(
|
||||
XBasePushAction.PushMessage.GetStringValue(),
|
||||
message
|
||||
);
|
||||
}
|
||||
@@ -249,33 +278,38 @@ namespace xPushService.Base {
|
||||
/// <param name="connectionIds"></param>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
public Task PushMessageToConnections (
|
||||
public Task PushMessageToConnections(
|
||||
IEnumerable<string> connectionIds,
|
||||
XPushMessage message
|
||||
) {
|
||||
)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!connectionIds.HasChild ()) {
|
||||
if (!connectionIds.HasChild())
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
//
|
||||
// Normalize Message ...
|
||||
if (message.IsNull ()) {
|
||||
message = GetPushMessage ();
|
||||
} else {
|
||||
if (message.IsNull())
|
||||
{
|
||||
message = GetPushMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
message.TimeStamp = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
//
|
||||
return Clients
|
||||
.Clients (
|
||||
.Clients(
|
||||
connectionIds
|
||||
.ToList ()
|
||||
.AsReadOnly ()
|
||||
.ToList()
|
||||
.AsReadOnly()
|
||||
)
|
||||
.SendAsync (
|
||||
XBasePushAction.PushMessage.GetStringValue (),
|
||||
.SendAsync(
|
||||
XBasePushAction.PushMessage.GetStringValue(),
|
||||
message
|
||||
);
|
||||
}
|
||||
@@ -287,7 +321,8 @@ namespace xPushService.Base {
|
||||
/// retrieve connected user name ...
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected string GetUserName () {
|
||||
protected string GetUserName()
|
||||
{
|
||||
return Context?.User?.Identity?.Name;
|
||||
}
|
||||
|
||||
@@ -295,22 +330,25 @@ namespace xPushService.Base {
|
||||
/// retrieve connected user role ...
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected string GetUserRole () {
|
||||
return Context?.User?.FindFirst ("role")?.Value;
|
||||
protected string GetUserRole()
|
||||
{
|
||||
return Context?.User?.FindFirst("role")?.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve Empty Message ...
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected XPushMessage GetPushMessage () {
|
||||
protected XPushMessage GetPushMessage()
|
||||
{
|
||||
//
|
||||
var timeStamp = DateTime.UtcNow;
|
||||
var actor = Context.User.Identity.Name;
|
||||
var connectionId = Context.ConnectionId;
|
||||
|
||||
//
|
||||
var result = new XPushMessage {
|
||||
var result = new XPushMessage
|
||||
{
|
||||
Actor = actor,
|
||||
TimeStamp = timeStamp,
|
||||
Payload = connectionId,
|
||||
@@ -324,7 +362,8 @@ namespace xPushService.Base {
|
||||
/// retrieve current connection id ...
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected string GetConnectionId () {
|
||||
protected string GetConnectionId()
|
||||
{
|
||||
return Context.ConnectionId;
|
||||
}
|
||||
|
||||
@@ -332,19 +371,21 @@ namespace xPushService.Base {
|
||||
/// Retrieve Connection Model from Context ...
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected XPushConnectionDto GetConnection () {
|
||||
protected XPushConnectionDto GetBaseConnection()
|
||||
{
|
||||
//
|
||||
var connectionId = Context.ConnectionId;
|
||||
var userName = Context.User.Identity.Name;
|
||||
var authenticationType = Context.User.Identity.AuthenticationType;
|
||||
|
||||
//
|
||||
var httpContext = Context.GetHttpContext ();
|
||||
var deviceJson = httpContext.Request.Query["Option"].ToString ();
|
||||
var device = deviceJson.FromJSON<XDeviceDto> ();
|
||||
var httpContext = Context.GetHttpContext();
|
||||
var deviceJson = httpContext.Request.Query["Option"].ToString();
|
||||
var device = deviceJson.FromJSON<XDeviceDto>();
|
||||
|
||||
//
|
||||
var result = new XPushConnectionDto {
|
||||
var result = new XPushConnectionDto
|
||||
{
|
||||
User = userName,
|
||||
Device = device,
|
||||
Id = connectionId,
|
||||
@@ -353,7 +394,7 @@ namespace xPushService.Base {
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user