Skip to content

Commit 93e3e54

Browse files
committed
Goodbye now returns a task
1 parent 0a40fcb commit 93e3e54

File tree

6 files changed

+36
-12
lines changed

6 files changed

+36
-12
lines changed

src/net45/WampSharp/WAMP2/V2/Api/Client/IWampChannel.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public interface IWampChannel
3131
/// </summary>
3232
/// <param name="reason">The close reason.</param>
3333
/// <param name="details">The close details.</param>
34-
void Close(string reason, GoodbyeDetails details);
34+
/// <returns>A task that completes upon a GOODBYE message from the router.</returns>
35+
Task<GoodbyeMessage> Close(string reason, GoodbyeDetails details);
3536
}
3637
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
using System.Runtime.Serialization;
3+
4+
namespace WampSharp.V2.Core.Contracts
5+
{
6+
[DataContract]
7+
[Serializable]
8+
public class GoodbyeMessage
9+
{
10+
public string Reason { get; internal set; }
11+
public GoodbyeDetails Details { get; internal set; }
12+
}
13+
}

src/net45/WampSharp/WAMP2/V2/Client/Session/IWampSessionClientExtended.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ internal interface IWampSessionClientExtended :
1414

1515
Task OpenTask { get; }
1616

17+
Task<GoodbyeMessage> CloseTask { get; }
18+
1719
void Close(string reason, GoodbyeDetails details);
1820

1921
void OnConnectionOpen();

src/net45/WampSharp/WAMP2/V2/Client/Session/WampSessionClient.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public class WampSessionClient<TMessage> : IWampSessionClientExtended,
1616
private static readonly AuthenticateExtraData EmptyAuthenticateDetails = new AuthenticateExtraData();
1717
private readonly IWampServerProxy mServerProxy;
1818
private TaskCompletionSource<bool> mOpenTask = new TaskCompletionSource<bool>();
19+
private TaskCompletionSource<GoodbyeMessage> mCloseTask = new TaskCompletionSource<GoodbyeMessage>();
1920
private readonly IWampFormatter<TMessage> mFormatter;
20-
private readonly object mLock = new object();
2121
private bool mGoodbyeSent;
2222
private readonly IWampClientAuthenticator mAuthenticator;
2323
private HelloDetails mSentDetails;
@@ -115,6 +115,11 @@ public void Goodbye(GoodbyeDetails details, string reason)
115115
{
116116
mServerProxy.Goodbye(new GoodbyeDetails(), WampErrors.GoodbyeAndOut);
117117
}
118+
else
119+
{
120+
GoodbyeMessage message = new GoodbyeMessage(){Details = details, Reason = reason};
121+
mCloseTask.SetResult(message);
122+
}
118123
}
119124

120125
TrySetCloseEventArgs(SessionCloseType.Goodbye, details, reason);
@@ -126,10 +131,11 @@ private void RaiseConnectionBroken()
126131

127132
WampSessionCloseEventArgs closeEventArgs = mCloseEventArgs;
128133

129-
SetOpenTaskErrorIfNeeded(new WampConnectionBrokenException(mCloseEventArgs));
134+
SetTasksErrorsIfNeeded(new WampConnectionBrokenException(mCloseEventArgs));
130135

131136
Interlocked.CompareExchange(ref mIsConnected, 0, 1);
132137
mOpenTask = new TaskCompletionSource<bool>();
138+
mCloseTask = new TaskCompletionSource<GoodbyeMessage>();
133139
mCloseEventArgs = null;
134140

135141
OnConnectionBroken(closeEventArgs);
@@ -154,6 +160,8 @@ private void TrySetCloseEventArgs(SessionCloseType sessionCloseType,
154160

155161
public Task OpenTask => mOpenTask.Task;
156162

163+
public Task<GoodbyeMessage> CloseTask => mCloseTask.Task;
164+
157165
public void Close(string reason, GoodbyeDetails details)
158166
{
159167
reason = reason ?? WampErrors.CloseNormal;
@@ -191,19 +199,15 @@ public void OnConnectionClosed()
191199

192200
public void OnConnectionError(Exception exception)
193201
{
194-
SetOpenTaskErrorIfNeeded(exception);
202+
SetTasksErrorsIfNeeded(exception);
195203

196204
OnConnectionError(new WampConnectionErrorEventArgs(exception));
197205
}
198206

199-
private void SetOpenTaskErrorIfNeeded(Exception exception)
207+
private void SetTasksErrorsIfNeeded(Exception exception)
200208
{
201-
TaskCompletionSource<bool> openTask = mOpenTask;
202-
203-
if (openTask != null)
204-
{
205-
openTask.TrySetException(exception);
206-
}
209+
mOpenTask?.TrySetException(exception);
210+
mCloseTask?.TrySetException(exception);
207211
}
208212

209213
public event EventHandler<WampSessionCreatedEventArgs> ConnectionEstablished;

src/net45/WampSharp/WAMP2/V2/Client/WampChannel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ public void Close()
7171
}
7272
}
7373

74-
public void Close(string reason, GoodbyeDetails details)
74+
public Task<GoodbyeMessage> Close(string reason, GoodbyeDetails details)
7575
{
76+
Task<GoodbyeMessage> task = mClient.CloseTask;
7677
mClient.Close(reason, details);
78+
return task;
7779
}
7880
}
7981
}

src/net45/WampSharp/WAMP2/V2/Client/WampClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public WampClient(IWampRealmProxyFactory<TMessage> realmFactory)
5757

5858
public Task OpenTask => SessionClient.OpenTask;
5959

60+
public Task<GoodbyeMessage> CloseTask => SessionClient.CloseTask;
61+
6062
public void Challenge(string authMethod, ChallengeDetails extra)
6163
{
6264
SessionClient.Challenge(authMethod, extra);

0 commit comments

Comments
 (0)