Skip to content
This repository was archived by the owner on Feb 20, 2022. It is now read-only.

Commit 4e07e77

Browse files
committed
secure subscriptions and methodCalls from parallel access using lock
1 parent 6f4e40c commit 4e07e77

File tree

1 file changed

+58
-18
lines changed

1 file changed

+58
-18
lines changed

unity-project/Assets/Moulin/DDP/ddp/DdpConnection.cs

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ public enum ConnectionState {
107107
private ConnectionState ddpConnectionState;
108108
private string sessionId;
109109

110+
private object subscriptionsLock = new object();
111+
private object methodCallsLock = new object();
112+
110113
private Dictionary<string, Subscription> subscriptions = new Dictionary<string, Subscription>();
111114
private Dictionary<string, MethodCall> methodCalls = new Dictionary<string, MethodCall>();
112115

@@ -155,14 +158,18 @@ public void OnWebSocketOpen()
155158
{
156159
OnDebugMessage?.Invoke("Websocket open");
157160
Send(GetConnectMessage());
158-
foreach (Subscription subscription in subscriptions.Values)
159-
{
160-
Send(GetSubscriptionMessage(subscription));
161-
}
162-
foreach (MethodCall methodCall in methodCalls.Values)
163-
{
164-
Send(GetMethodCallMessage(methodCall));
165-
}
161+
lock (subscriptionsLock) {
162+
foreach (Subscription subscription in subscriptions.Values)
163+
{
164+
Send(GetSubscriptionMessage(subscription));
165+
}
166+
}
167+
lock (methodCallsLock) {
168+
foreach (MethodCall methodCall in methodCalls.Values)
169+
{
170+
Send(GetMethodCallMessage(methodCall));
171+
}
172+
}
166173
}
167174

168175
private void OnWebSocketError(string reason) {
@@ -177,8 +184,14 @@ private void OnWebSocketClose(bool wasClean) {
177184
if (wasClean) {
178185
ddpConnectionState = ConnectionState.CLOSED;
179186
sessionId = null;
180-
subscriptions.Clear();
181-
methodCalls.Clear();
187+
lock (subscriptionsLock)
188+
{
189+
subscriptions.Clear();
190+
}
191+
lock (methodCallsLock)
192+
{
193+
methodCalls.Clear();
194+
}
182195
OnDisconnected?.Invoke(this);
183196
} else {
184197
ddpConnectionState = ConnectionState.DISCONNECTED;
@@ -230,7 +243,10 @@ private void HandleMessage(JSONObject message) {
230243

231244
case MessageType.NOSUB: {
232245
string subscriptionId = message[Field.ID].str;
233-
subscriptions.Remove(subscriptionId);
246+
lock (subscriptionsLock)
247+
{
248+
subscriptions.Remove(subscriptionId);
249+
}
234250

235251
if (message.HasField(Field.ERROR)) {
236252
OnError?.Invoke(GetError(message[Field.ERROR]));
@@ -266,7 +282,11 @@ private void HandleMessage(JSONObject message) {
266282
string[] subscriptionIds = ToStringArray(message[Field.SUBS]);
267283

268284
foreach (string subscriptionId in subscriptionIds) {
269-
Subscription subscription = subscriptions[subscriptionId];
285+
Subscription subscription;
286+
lock (subscriptionsLock)
287+
{
288+
subscription = subscriptions[subscriptionId];
289+
}
270290
if (subscription != null) {
271291
subscription.isReady = true;
272292
subscription.OnReady?.Invoke(subscription);
@@ -294,14 +314,21 @@ private void HandleMessage(JSONObject message) {
294314

295315
case MessageType.RESULT: {
296316
string methodCallId = message[Field.ID].str;
297-
MethodCall methodCall = methodCalls[methodCallId];
317+
MethodCall methodCall;
318+
lock (methodCallsLock)
319+
{
320+
methodCall = methodCalls[methodCallId];
321+
}
298322
if (methodCall != null) {
299323
if (message.HasField(Field.ERROR)) {
300324
methodCall.error = GetError(message[Field.ERROR]);
301325
}
302326
methodCall.result = message[Field.RESULT];
303327
if (methodCall.hasUpdated) {
304-
methodCalls.Remove(methodCallId);
328+
lock (methodCallsLock)
329+
{
330+
methodCalls.Remove(methodCallId);
331+
}
305332
}
306333
methodCall.hasResult = true;
307334
methodCall.OnResult?.Invoke(methodCall);
@@ -312,10 +339,17 @@ private void HandleMessage(JSONObject message) {
312339
case MessageType.UPDATED: {
313340
string[] methodCallIds = ToStringArray(message[Field.METHODS]);
314341
foreach (string methodCallId in methodCallIds) {
315-
MethodCall methodCall = methodCalls[methodCallId];
342+
MethodCall methodCall;
343+
lock (methodCallsLock)
344+
{
345+
methodCall = methodCalls[methodCallId];
346+
}
316347
if (methodCall != null) {
317348
if (methodCall.hasResult) {
318-
methodCalls.Remove(methodCallId);
349+
lock (methodCallsLock)
350+
{
351+
methodCalls.Remove(methodCallId);
352+
}
319353
}
320354
methodCall.hasUpdated = true;
321355
methodCall.OnUpdated?.Invoke(methodCall);
@@ -503,7 +537,10 @@ public async Task<MethodCall> CallAsync(string methodName, params JSONObject[] i
503537
methodName = methodName,
504538
items = items
505539
};
506-
methodCalls[methodCall.id] = methodCall;
540+
lock (methodCallsLock)
541+
{
542+
methodCalls[methodCall.id] = methodCall;
543+
}
507544
await SendAsync(GetMethodCallMessage(methodCall));
508545
return methodCall;
509546
}
@@ -514,7 +551,10 @@ public MethodCall Call(string methodName, params JSONObject[] items) {
514551
methodName = methodName,
515552
items = items
516553
};
517-
methodCalls[methodCall.id] = methodCall;
554+
lock (methodCallsLock)
555+
{
556+
methodCalls[methodCall.id] = methodCall;
557+
}
518558
Send(GetMethodCallMessage(methodCall));
519559
return methodCall;
520560
}

0 commit comments

Comments
 (0)