-
Notifications
You must be signed in to change notification settings - Fork 389
/
Copy pathFunctions.cs
169 lines (149 loc) · 6.75 KB
/
Functions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System.IO;
using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
namespace IsolatedModel_BidirectionChat
{
public class Functions
{
private readonly ILogger _logger;
public Functions(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<Functions>();
}
[Function("index")]
public HttpResponseData GetWebPage([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req)
{
var response = req.CreateResponse(HttpStatusCode.OK);
response.WriteString(File.ReadAllText("content/index.html"));
response.Headers.Add("Content-Type", "text/html");
return response;
}
[Function("Negotiate")]
public SignalRConnectionInfo Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
[SignalRConnectionInfoInput(HubName = "Hub", UserId = "{query.userid}")] SignalRConnectionInfo signalRConnectionInfo)
{
_logger.LogInformation("Executing negotiation.");
return signalRConnectionInfo;
}
[Function("OnConnected")]
[SignalROutput(HubName = "Hub")]
public SignalRMessageAction OnConnected([SignalRTrigger("Hub", "connections", "connected")] SignalRInvocationContext invocationContext)
{
invocationContext.Headers.TryGetValue("Authorization", out var auth);
_logger.LogInformation($"{invocationContext.ConnectionId} has connected");
return new SignalRMessageAction("newConnection")
{
Arguments = new object[] { new NewConnection(invocationContext.ConnectionId, auth) },
};
}
[Function("Broadcast")]
[SignalROutput(HubName = "Hub")]
public SignalRMessageAction Broadcast([SignalRTrigger("Hub", "messages", "Broadcast", "message")] SignalRInvocationContext invocationContext, string message)
{
return new SignalRMessageAction("newMessage")
{
Arguments = new object[] { new NewMessage(invocationContext, message) }
};
}
[Function("SendToGroup")]
[SignalROutput(HubName = "Hub")]
public SignalRMessageAction SendToGroup([SignalRTrigger("Hub", "messages", "SendToGroup", "groupName", "message")] SignalRInvocationContext invocationContext, string groupName, string message)
{
return new SignalRMessageAction("newMessage")
{
GroupName = groupName,
Arguments = new object[] { new NewMessage(invocationContext, message) }
};
}
[Function("SendToUser")]
[SignalROutput(HubName = "Hub")]
public SignalRMessageAction SendToUser([SignalRTrigger("Hub", "messages", "SendToUser", "userName", "message")] SignalRInvocationContext invocationContext, string userName, string message)
{
return new SignalRMessageAction("newMessage")
{
UserId = userName,
Arguments = new object[] { new NewMessage(invocationContext, message) }
};
}
[Function("SendToConnection")]
[SignalROutput(HubName = "Hub")]
public SignalRMessageAction SendToConnection([SignalRTrigger("Hub", "messages", "SendToConnection", "connectionId", "message")] SignalRInvocationContext invocationContext, string connectionId, string message)
{
return new SignalRMessageAction("newMessage")
{
ConnectionId = connectionId,
Arguments = new object[] { new NewMessage(invocationContext, message) }
};
}
[Function("JoinGroup")]
[SignalROutput(HubName = "Hub")]
public SignalRGroupAction JoinGroup([SignalRTrigger("Hub", "messages", "JoinGroup", "connectionId", "groupName")] SignalRInvocationContext invocationContext, string connectionId, string groupName)
{
return new SignalRGroupAction(SignalRGroupActionType.Add)
{
GroupName = groupName,
ConnectionId = connectionId
};
}
[Function("LeaveGroup")]
[SignalROutput(HubName = "Hub")]
public SignalRGroupAction LeaveGroup([SignalRTrigger("Hub", "messages", "LeaveGroup", "connectionId", "groupName")] SignalRInvocationContext invocationContext, string connectionId, string groupName)
{
return new SignalRGroupAction(SignalRGroupActionType.Remove)
{
GroupName = groupName,
ConnectionId = connectionId
};
}
[Function("JoinUserToGroup")]
[SignalROutput(HubName = "Hub")]
public SignalRGroupAction JoinUserToGroup([SignalRTrigger("Hub", "messages", "JoinUserToGroup", "userName", "groupName")] SignalRInvocationContext invocationContext, string userName, string groupName)
{
return new SignalRGroupAction(SignalRGroupActionType.Add)
{
GroupName = groupName,
UserId = userName
};
}
[Function("LeaveUserFromGroup")]
[SignalROutput(HubName = "Hub")]
public SignalRGroupAction LeaveUserFromGroup([SignalRTrigger("Hub", "messages", "LeaveUserFromGroup", "userName", "groupName")] SignalRInvocationContext invocationContext, string userName, string groupName)
{
return new SignalRGroupAction(SignalRGroupActionType.Remove)
{
GroupName = groupName,
UserId = userName
};
}
[Function("OnDisconnected")]
[SignalROutput(HubName = "Hub")]
public void OnDisconnected([SignalRTrigger("Hub", "connections", "disconnected")] SignalRInvocationContext invocationContext)
{
_logger.LogInformation($"{invocationContext.ConnectionId} has disconnected");
}
public class NewConnection
{
public string ConnectionId { get; }
public string Authentication { get; }
public NewConnection(string connectionId, string auth)
{
ConnectionId = connectionId;
Authentication = auth;
}
}
public class NewMessage
{
public string ConnectionId { get; }
public string Sender { get; }
public string Text { get; }
public NewMessage(SignalRInvocationContext invocationContext, string message)
{
Sender = string.IsNullOrEmpty(invocationContext.UserId) ? string.Empty : invocationContext.UserId;
ConnectionId = invocationContext.ConnectionId;
Text = message;
}
}
}
}