Skip to content

Instantly share code, notes, and snippets.

@jmarnold
Created September 24, 2011 19:31
Show Gist options
  • Save jmarnold/1239745 to your computer and use it in GitHub Desktop.
Save jmarnold/1239745 to your computer and use it in GitHub Desktop.
Fleck Fun
public interface ICommandInvoker
{
void InvokeFor(SocketMessage message);
}
public class CommandInvoker : ICommandInvoker
{
public void InvokeFor(SocketMessage message)
{
//no-op..just an example
}
}
public interface IJsonService
{
T Deserialize<T>(string source) where T : class;
object Deserialize(Type type, string source);
string Serialize(object message);
}
public interface IMessageDispatcher
{
void Dispatch(object message);
}
public class MessageDispatcher : IMessageDispatcher
{
private readonly IJsonService _jsonService;
private readonly ISocketProvider _socketProvider;
public MessageDispatcher(IJsonService jsonService, ISocketProvider socketProvider)
{
_jsonService = jsonService;
_socketProvider = socketProvider;
}
public void Dispatch(object message)
{
var socketMsg = new SocketMessage
{
Type = message.GetType().Name,
Message = _jsonService.Serialize(message)
};
_socketProvider.Send(_jsonService.Serialize(socketMsg));
}
}
public interface ISocketMessageDeserializer
{
object Deserialize(SocketMessage message);
}
public class SocketMessageDeserializer : ISocketMessageDeserializer
{
private readonly DefaultSocketMessageParser _defaultParser;
private readonly IEnumerable<ISocketMessageParser> _parsers;
public SocketMessageDeserializer(DefaultSocketMessageParser defaultParser, IEnumerable<ISocketMessageParser> parsers)
{
_defaultParser = defaultParser;
_parsers = parsers;
}
public object Deserialize(SocketMessage message)
{
var type = message.Type;
if (!type.ToLower().EndsWith("command"))
{
type = "{0}Command".ToFormat(type);
}
var messageType = Type.GetType("{0}.{1}, {2}".ToFormat(typeof(CommandBase).Namespace, type,
typeof(CommandBase).Assembly.FullName), false, true);
var parser = _parsers.LastOrDefault(p => p.AppliesTo(message)) ?? _defaultParser;
return parser.Parse(messageType, message);
}
}
public interface ISocketMessageParser
{
bool AppliesTo(SocketMessage message);
object Parse(Type type, SocketMessage message);
}
public class DefaultSocketMessageParser : ISocketMessageParser
{
private readonly IJsonService _jsonService;
public DefaultSocketMessageParser(IJsonService jsonService)
{
_jsonService = jsonService;
}
public bool AppliesTo(SocketMessage message)
{
return true;
}
public object Parse(Type type, SocketMessage message)
{
return _jsonService.Deserialize(type, message.Message);
}
}
public interface ISocketProvider
{
void Send(string message);
void Listen();
}
public class SocketMessage
{
public string Type { get; set; }
public string Version { get; set; }
public string Message { get; set; }
}
public class SocketProvider : ISocketProvider
{
private readonly IJsonService _jsonService;
private readonly ICommandInvoker _commandInvoker;
private readonly IList<IWebSocketConnection> _connections = new List<IWebSocketConnection>();
public SocketProvider(WebSocketServer server, IJsonService jsonService, ICommandInvoker commandInvoker)
{
Configure(server);
_jsonService = jsonService;
_commandInvoker = commandInvoker;
}
public void Configure(WebSocketServer server)
{
server.Start(socket =>
{
socket.OnOpen = () => _connections.Add(socket);
socket.OnClose = () => _connections.Remove(socket);
socket.OnMessage = (m =>
{
var msg = _jsonService.Deserialize<SocketMessage>(m);
_commandInvoker.InvokeFor(msg);
});
});
}
public void Listen()
{
// this is here for semantics. We need to move the configure stuff into here
}
public void Send(string message)
{
_connections
.ToList()
.Each(socket => socket.Send(message));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment