Skip to content

Commit

Permalink
Added consistent way to get a strongly typed representation of the co…
Browse files Browse the repository at this point in the history
…nnected clients.

- Added IClientProxy interface.
- Renamed *Agent classes to *Proxy
- Added test for interface that invokes a method based on the input.
  • Loading branch information
davidfowl committed Jun 27, 2012
1 parent 64d83d7 commit fa6d0b5
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 14 deletions.
22 changes: 22 additions & 0 deletions SignalR.Tests/HubFacts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,5 +230,27 @@ public void ComplexPersonState()

connection.Stop();
}

[Fact]
public void DynamicInvokeTest()
{
var host = new MemoryHost();
host.MapHubs();
var connection = new Client.Hubs.HubConnection("http://site/");
string callback = "!!!CallMeBack!!!";

var hub = connection.CreateProxy("demo");

var wh = new ManualResetEvent(false);

hub.On(callback, () => wh.Set());

connection.Start(host).Wait();

hub.Invoke("DynamicInvoke", callback).Wait();

Assert.True(wh.WaitOne(TimeSpan.FromSeconds(5)));
connection.Stop();
}
}
}
2 changes: 1 addition & 1 deletion SignalR/ConnectionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public IHubContext GetHubContext(string hubName)
var hubManager = _resolver.Resolve<IHubManager>();
HubDescriptor hubDescriptor = hubManager.EnsureHub(hubName);

return new HubContext(new ClientAgent(connection, hubDescriptor.Name),
return new HubContext(new ClientProxy(connection, hubDescriptor.Name),
new GroupManager(connection, hubName));
}

Expand Down
6 changes: 3 additions & 3 deletions SignalR/Hubs/ClientAgent.cs → SignalR/Hubs/ClientProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@

namespace SignalR.Hubs
{
public class ClientAgent : DynamicObject
public class ClientProxy : DynamicObject, IClientProxy
{
private readonly IConnection _connection;
private readonly string _hubName;

public ClientAgent(IConnection connection, string hubName)
public ClientProxy(IConnection connection, string hubName)
{
_connection = connection;
_hubName = hubName;
Expand All @@ -18,7 +18,7 @@ public dynamic this[string key]
{
get
{
return new SignalAgent(_connection, key, _hubName);
return new SignalProxy(_connection, key, _hubName);
}
}

Expand Down
4 changes: 2 additions & 2 deletions SignalR/Hubs/HubDispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,8 @@ private IHub CreateHub(IRequest request, HubDescriptor descriptor, string connec
{
state = state ?? new TrackingDictionary();
hub.Context = new HubCallerContext(request, connectionId);
hub.Caller = new StatefulSignalAgent(Connection, connectionId, descriptor.Name, state);
hub.Clients = new ClientAgent(Connection, descriptor.Name);
hub.Caller = new StatefulSignalProxy(Connection, connectionId, descriptor.Name, state);
hub.Clients = new ClientProxy(Connection, descriptor.Name);
hub.Groups = new GroupManager(Connection, descriptor.Name);
}

Expand Down
18 changes: 18 additions & 0 deletions SignalR/Hubs/IClientProxy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Threading.Tasks;

namespace SignalR.Hubs
{
/// <summary>
/// A server side proxy for the client side hub.
/// </summary>
public interface IClientProxy
{
/// <summary>
/// Invokes a method on the connection(s) represented by the <see cref="IClientProxy"/> instance.
/// </summary>
/// <param name="method">name of the method to invoke</param>
/// <param name="args">argumetns to pass to the client</param>
/// <returns>A task that represents when the data has been sent to the client.</returns>
Task Invoke(string method, params object[] args);
}
}
4 changes: 2 additions & 2 deletions SignalR/Hubs/SignalAgent.cs → SignalR/Hubs/SignalProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@

namespace SignalR.Hubs
{
public class SignalAgent : DynamicObject
public class SignalProxy : DynamicObject, IClientProxy
{
protected readonly IConnection _connection;
protected readonly string _signal;
protected readonly string _hubName;

public SignalAgent(IConnection connection, string signal, string hubName)
public SignalProxy(IConnection connection, string signal, string hubName)
{
_connection = connection;
_signal = signal;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace SignalR.Hubs
{
public class StatefulSignalAgent : SignalAgent
public class StatefulSignalProxy : SignalProxy
{
private readonly TrackingDictionary _state;

public StatefulSignalAgent(IConnection connection, string signal, string hubName, TrackingDictionary state)
public StatefulSignalProxy(IConnection connection, string signal, string hubName, TrackingDictionary state)
: base(connection, signal, hubName)
{
_state = state;
Expand Down
7 changes: 4 additions & 3 deletions SignalR/SignalR.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,12 @@
<Compile Include="Hubs\HubRequest.cs" />
<Compile Include="Hubs\HubRequestParser.cs" />
<Compile Include="Hubs\HubResponse.cs" />
<Compile Include="Hubs\IClientProxy.cs" />
<Compile Include="Hubs\IHubContext.cs" />
<Compile Include="Hubs\IHubRequestParser.cs" />
<Compile Include="Json\IJsonValue.cs" />
<Compile Include="Json\JTokenValue.cs" />
<Compile Include="Hubs\StatefulSignalAgent.cs" />
<Compile Include="Hubs\StatefulSignalProxy.cs" />
<Compile Include="Infrastructure\ConnectionExtensions.cs" />
<Compile Include="Hubs\Extensions\HubTypeExtensions.cs" />
<Compile Include="Hubs\Extensions\HubManagerExtensions.cs" />
Expand Down Expand Up @@ -116,11 +117,11 @@
<Compile Include="Hubs\DefaultJavaScriptProxyGenerator.cs" />
<Compile Include="Hubs\Lookup\ReflectedHubDescriptorProvider.cs" />
<Compile Include="Hubs\Hub.cs" />
<Compile Include="Hubs\ClientAgent.cs" />
<Compile Include="Hubs\ClientProxy.cs" />
<Compile Include="Hubs\HubCallerContext.cs" />
<Compile Include="Hubs\HubDispatcher.cs" />
<Compile Include="Hubs\Lookup\IHubDescriptorProvider.cs" />
<Compile Include="Hubs\SignalAgent.cs" />
<Compile Include="Hubs\SignalProxy.cs" />
<Compile Include="Hubs\NullJavaScriptMinifier.cs" />
<Compile Include="Infrastructure\IDependencyResolver.cs" />
<Compile Include="Hubs\IJavaScriptMinifier.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,12 @@ public void TestGuid()
Caller.TestGuid(new Guid());
}

public void DynamicInvoke(string method)
{
IClientProxy proxy = Caller;
proxy.Invoke(method);
}

public class Person
{
public string Name { get; set; }
Expand Down
6 changes: 5 additions & 1 deletion samples/SignalR.Hosting.AspNet.Samples/Scripts/hubs.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@
demo: {
_: {
hubName: 'demo',
ignoreMembers: ['addToGroups', 'complexArray', 'complexType', 'doSomethingAndCallError', 'dynamicTask', 'genericTaskTypedAsPlain', 'genericTaskWithException', 'getValue', 'multipleCalls', 'overload', 'passingDynamicComplex', 'plainTask', 'readStateValue', 'setStateValue', 'simpleArray', 'taskWithException', 'unsupportedOverload', 'namespace', 'ignoreMembers', 'callbacks'],
ignoreMembers: ['addToGroups', 'complexArray', 'complexType', 'doSomethingAndCallError', 'dynamicTask', 'genericTaskTypedAsPlain', 'genericTaskWithException', 'getValue', 'multipleCalls', 'overload', 'passingDynamicComplex', 'plainTask', 'readStateValue', 'setStateValue', 'simpleArray', 'taskWithException', 'testGuid', 'unsupportedOverload', 'namespace', 'ignoreMembers', 'callbacks'],
connection: function () { return signalR.hub; }
},

Expand Down Expand Up @@ -241,6 +241,10 @@

unsupportedOverload: function (x, callback) {
return serverCall(this, "UnsupportedOverload", $.makeArray(arguments));
},

testGuid: function (callback) {
return serverCall(this, "TestGuid", $.makeArray(arguments));
}
},
drawingPad: {
Expand Down

0 comments on commit fa6d0b5

Please sign in to comment.