Skip to content

Commit 7d2d20e

Browse files
committed
Fixing Issue #263
1 parent 095b85e commit 7d2d20e

File tree

10 files changed

+79
-29
lines changed

10 files changed

+79
-29
lines changed

src/net45/WampSharp/WAMP2/V2/Api/Server/InMemoryWampHost.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,17 @@ internal class InMemoryWampHost : WampHostBase
1515
private readonly WampChannelFactory mChannelFactory =
1616
new WampChannelFactory();
1717

18-
/// <summary>
19-
/// Initializes a new instance of <see cref="InMemoryWampHost"/>.
20-
/// </summary>
21-
public InMemoryWampHost() : this(new WampRealmContainer(), new LooseUriValidator())
22-
{
23-
}
24-
2518
/// <summary>
2619
/// Initializes a new instance of <see cref="InMemoryWampHost"/> given the
2720
/// <see cref="IWampRealmContainer"/> associated with this host.
2821
/// </summary>
2922
/// <param name="realmContainer"></param>
3023
/// <param name="uriValidator"></param>
24+
/// <param name="sessionIdMap"></param>
3125
public InMemoryWampHost(IWampRealmContainer realmContainer,
32-
IWampUriValidator uriValidator) :
33-
base(realmContainer, uriValidator)
26+
IWampUriValidator uriValidator,
27+
IWampSessionMapper sessionIdMap) :
28+
base(realmContainer, uriValidator, sessionIdMap)
3429
{
3530
mInternalBinding = new InMemoryBinding();
3631

src/net45/WampSharp/WAMP2/V2/Api/Server/WampBindingHost.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using WampSharp.Core.Proxy;
66
using WampSharp.Core.Serialization;
77
using WampSharp.V2.Binding;
8+
using WampSharp.V2.Core;
89
using WampSharp.V2.Core.Contracts;
910
using WampSharp.V2.Core.Dispatch;
1011
using WampSharp.V2.Core.Listener;
@@ -32,7 +33,8 @@ public class WampBindingHost<TMessage> : IWampBindingHost
3233
/// <param name="connectionListener">The <see cref="IWampConnectionListener{TMessage}"/> this
3334
/// binding host listens to.</param>
3435
/// <param name="binding">The <see cref="IWampBinding{TMessage}"/> associated with this binding host.</param>
35-
public WampBindingHost(IWampHostedRealmContainer realmContainer, IWampRouterBuilder builder, IWampConnectionListener<TMessage> connectionListener, IWampBinding<TMessage> binding)
36+
/// <param name="sessionIdMap"></param>
37+
public WampBindingHost(IWampHostedRealmContainer realmContainer, IWampRouterBuilder builder, IWampConnectionListener<TMessage> connectionListener, IWampBinding<TMessage> binding, IWampSessionMapper sessionIdMap)
3638
{
3739
IWampOutgoingRequestSerializer outgoingRequestSerializer =
3840
new WampOutgoingRequestSerializer<TMessage>(binding.Formatter);
@@ -44,7 +46,7 @@ public WampBindingHost(IWampHostedRealmContainer realmContainer, IWampRouterBuil
4446

4547
mSession = session;
4648

47-
mListener = GetWampListener(connectionListener, binding, outgoingRequestSerializer);
49+
mListener = GetWampListener(connectionListener, binding, outgoingRequestSerializer, sessionIdMap);
4850
}
4951

5052
private static IWampEventSerializer GetEventSerializer(
@@ -56,13 +58,13 @@ private static IWampEventSerializer GetEventSerializer(
5658
return serializerGenerator.GetSerializer<IWampEventSerializer>();
5759
}
5860

59-
private WampListener<TMessage> GetWampListener(IWampConnectionListener<TMessage> connectionListener, IWampBinding<TMessage> binding, IWampOutgoingRequestSerializer outgoingRequestSerializer)
61+
private WampListener<TMessage> GetWampListener(IWampConnectionListener<TMessage> connectionListener, IWampBinding<TMessage> binding, IWampOutgoingRequestSerializer outgoingRequestSerializer, IWampSessionMapper sessionIdMap)
6062
{
6163
IWampClientBuilderFactory<TMessage, IWampClientProxy<TMessage>> clientBuilderFactory =
6264
GetWampClientBuilder(binding, outgoingRequestSerializer);
6365

6466
IWampClientContainer<TMessage, IWampClientProxy<TMessage>> clientContainer =
65-
new WampClientContainer<TMessage>(clientBuilderFactory);
67+
new WampClientContainer<TMessage>(clientBuilderFactory, sessionIdMap);
6668

6769
IWampRequestMapper<TMessage> requestMapper =
6870
new WampRequestMapper<TMessage>(typeof(WampServer<TMessage>),

src/net45/WampSharp/WAMP2/V2/Api/Server/WampHost.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using WampSharp.V2.Binding;
55
using WampSharp.V2.Binding.Transports;
66
using WampSharp.V2.Core;
7+
using WampSharp.V2.Core.Listener;
78
using WampSharp.V2.Realm;
89

910
namespace WampSharp.V2
@@ -29,10 +30,12 @@ public WampHost(IWampRealmContainer realmContainer = null, IWampUriValidator uri
2930

3031
UriValidator = uriValidator ?? new LooseUriValidator();
3132

32-
mInternalHost = new InMemoryWampHost(realmContainer, UriValidator);
33+
WampSessionMapper sessionIdMap = new WampSessionMapper();
34+
35+
mInternalHost = new InMemoryWampHost(realmContainer, UriValidator, sessionIdMap);
3336
mInternalHost.Open();
3437

35-
mExternalHost = new WampHostBase(realmContainer, UriValidator);
38+
mExternalHost = new WampHostBase(realmContainer, UriValidator, sessionIdMap);
3639

3740
mRealmContainer =
3841
new ServiceHostedRealmContainer(mExternalHost.RealmContainer,

src/net45/WampSharp/WAMP2/V2/Api/Server/WampHostBase.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using WampSharp.V2.Binding;
66
using WampSharp.V2.Binding.Transports;
77
using WampSharp.V2.Core;
8+
using WampSharp.V2.Core.Listener;
89
using WampSharp.V2.Realm;
910

1011
namespace WampSharp.V2
@@ -20,12 +21,13 @@ internal class WampHostBase : IWampHost
2021
new List<WampTransportDefinition>();
2122

2223
private readonly IWampUriValidator mUriValidator;
24+
private readonly IWampSessionMapper mSessionIdMap;
2325

2426
/// <summary>
2527
/// Initializes a new instance of <see cref="WampHostBase"/>.
2628
/// </summary>
27-
public WampHostBase() :
28-
this(new WampRealmContainer(), new LooseUriValidator())
29+
public WampHostBase() :
30+
this(new WampRealmContainer(), new LooseUriValidator(), new WampSessionMapper())
2931
{
3032
}
3133

@@ -35,10 +37,12 @@ public WampHostBase() :
3537
/// </summary>
3638
/// <param name="realmContainer"></param>
3739
/// <param name="uriValidator"></param>
38-
public WampHostBase(IWampRealmContainer realmContainer, IWampUriValidator uriValidator)
40+
/// <param name="sessionIdMap"></param>
41+
public WampHostBase(IWampRealmContainer realmContainer, IWampUriValidator uriValidator, IWampSessionMapper sessionIdMap)
3942
{
4043
mUriValidator = uriValidator;
4144
RealmContainer = new HostedRealmContainer(realmContainer);
45+
mSessionIdMap = sessionIdMap;
4246
}
4347

4448
public IWampHostedRealmContainer RealmContainer { get; }
@@ -98,7 +102,7 @@ private IWampBindingHost GetBindingHost<TMessage>
98102
new CompositeListener<TMessage>(listeners);
99103

100104
IWampBindingHost host =
101-
binding.CreateHost(RealmContainer, compositeListener, mUriValidator);
105+
binding.CreateHost(RealmContainer, compositeListener, mUriValidator, mSessionIdMap);
102106

103107
return host;
104108
}

src/net45/WampSharp/WAMP2/V2/Authentication/Host/WampAuthenticationBinding.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using WampSharp.Core.Serialization;
44
using WampSharp.V2.Binding;
55
using WampSharp.V2.Core;
6+
using WampSharp.V2.Core.Contracts;
67
using WampSharp.V2.Realm;
78

89
namespace WampSharp.V2.Authentication
@@ -24,14 +25,17 @@ public WampAuthenticationBinding(IWampBinding<TMessage> binding,
2425
new RestrictedSessionAuthenticationFactory(sessionAuthenticationFactory);
2526
}
2627

27-
public IWampBindingHost CreateHost(IWampHostedRealmContainer realmContainer, IWampConnectionListener<TMessage> connectionListener)
28+
public IWampBindingHost CreateHost(IWampHostedRealmContainer realmContainer,
29+
IWampConnectionListener<TMessage> connectionListener,
30+
IWampSessionMapper sessionIdMap)
2831
{
2932
IWampRouterBuilder wampRouterBuilder = new WampAuthenticationRouterBuilder(mSessionAuthenticationFactory, mUriValidator);
3033

3134
return new WampBindingHost<TMessage>(realmContainer,
3235
wampRouterBuilder,
3336
connectionListener,
34-
mBinding);
37+
mBinding,
38+
sessionIdMap);
3539
}
3640

3741
public string Name => mBinding.Name;

src/net45/WampSharp/WAMP2/V2/Binding/IWampRouterBinding.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using WampSharp.Core.Listener;
2+
using WampSharp.V2.Core;
3+
using WampSharp.V2.Core.Contracts;
24
using WampSharp.V2.Realm;
35

46
namespace WampSharp.V2.Binding
@@ -14,8 +16,10 @@ public interface IWampRouterBinding<TMessage> : IWampBinding<TMessage>
1416
/// </summary>
1517
/// <param name="realmContainer"></param>
1618
/// <param name="connectionListener"></param>
19+
/// <param name="sessionIdMap"></param>
1720
/// <returns></returns>
1821
IWampBindingHost CreateHost(IWampHostedRealmContainer realmContainer,
19-
IWampConnectionListener<TMessage> connectionListener);
22+
IWampConnectionListener<TMessage> connectionListener,
23+
IWampSessionMapper sessionIdMap);
2024
}
2125
}

src/net45/WampSharp/WAMP2/V2/Binding/WampRouterBindingExtensions.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using WampSharp.Core.Listener;
22
using WampSharp.V2.Core;
3+
using WampSharp.V2.Core.Contracts;
34
using WampSharp.V2.Realm;
45

56
namespace WampSharp.V2.Binding
@@ -10,12 +11,13 @@ public static IWampBindingHost CreateHost<TMessage>
1011
(this IWampBinding<TMessage> binding,
1112
IWampHostedRealmContainer realmContainer,
1213
IWampConnectionListener<TMessage> connectionListener,
13-
IWampUriValidator uriValidator)
14+
IWampUriValidator uriValidator,
15+
IWampSessionMapper sessionIdMap)
1416
{
1517

1618
if (binding is IWampRouterBinding<TMessage> routerBinding)
1719
{
18-
return routerBinding.CreateHost(realmContainer, connectionListener);
20+
return routerBinding.CreateHost(realmContainer, connectionListener, sessionIdMap);
1921
}
2022
else
2123
{
@@ -25,7 +27,8 @@ public static IWampBindingHost CreateHost<TMessage>
2527
new WampBindingHost<TMessage>(realmContainer,
2628
routerBuilder,
2729
connectionListener,
28-
binding);
30+
binding,
31+
sessionIdMap);
2932

3033
return result;
3134
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using WampSharp.V2.Core.Contracts;
2+
3+
namespace WampSharp.V2.Core
4+
{
5+
public interface IWampSessionMapper
6+
{
7+
long AllocateSession(IWampClientProxy proxy);
8+
9+
void ReleaseSession(long session);
10+
}
11+
}

src/net45/WampSharp/WAMP2/V2/Core/Listener/WampClientContainer.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,34 @@ namespace WampSharp.V2.Core.Listener
55
{
66
public class WampClientContainer<TMessage> : WampClientContainer<TMessage, IWampClientProxy<TMessage>>
77
{
8-
private readonly WampIdMapper<IWampClientProxy<TMessage>> mSessionIdToClientProxy = new WampIdMapper<IWampClientProxy<TMessage>>();
8+
private IWampSessionMapper mSessionIdMap;
99

1010
public WampClientContainer(IWampClientBuilderFactory<TMessage, IWampClientProxy<TMessage>> clientBuilderFactory) :
11+
this(clientBuilderFactory, new WampSessionMapper())
12+
{
13+
}
14+
15+
public WampClientContainer(IWampClientBuilderFactory<TMessage, IWampClientProxy<TMessage>> clientBuilderFactory, IWampSessionMapper sessionIdMap) :
1116
base(clientBuilderFactory)
1217
{
18+
mSessionIdMap = sessionIdMap;
1319
}
1420

1521
public override void RemoveClient(IWampConnection<TMessage> connection)
1622
{
17-
1823
bool clientProxyFound = TryGetClient(connection, out IWampClientProxy<TMessage> clientProxy);
1924

2025
base.RemoveClient(connection);
2126

2227
if (clientProxyFound)
2328
{
24-
mSessionIdToClientProxy.TryRemove(clientProxy.Session, out clientProxy);
29+
mSessionIdMap.ReleaseSession(clientProxy.Session);
2530
}
2631
}
2732

2833
public override object GenerateClientId(IWampClientProxy<TMessage> client)
2934
{
30-
return mSessionIdToClientProxy.Add(client);
35+
return mSessionIdMap.AllocateSession(client);
3136
}
3237
}
3338
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using WampSharp.V2.Core.Contracts;
2+
3+
namespace WampSharp.V2.Core.Listener
4+
{
5+
public class WampSessionMapper : IWampSessionMapper
6+
{
7+
private readonly WampIdMapper<IWampClientProxy> mSessionIdMap = new WampIdMapper<IWampClientProxy>();
8+
9+
public long AllocateSession(IWampClientProxy proxy)
10+
{
11+
return mSessionIdMap.Add(proxy);
12+
}
13+
14+
public void ReleaseSession(long session)
15+
{
16+
mSessionIdMap.TryRemove(session, out var removed);
17+
}
18+
}
19+
}

0 commit comments

Comments
 (0)