public Presence(Channel channel, Options opts = null)
{
_channel = channel;
var options = opts ?? new Options();
channel.On(options.StateEvent, message =>
{
var serializer = channel.Socket.Opts.MessageSerializer;
var newState = serializer.MapPayload <State>(message.Payload);
_joinRef = channel.JoinRef;
State = SyncState(State, newState, OnJoin, OnLeave);
State = _pendingDiffs.Aggregate(
State,
(state, diff) => SyncDiff(new State(state), diff, OnJoin, OnLeave)
);
_pendingDiffs.Clear();
OnSync?.Invoke();
});
channel.On(options.DiffEvent, message =>
{
var diff = channel.Socket.Opts.MessageSerializer.MapPayload <Diff>(message.Payload);
if (InPendingSyncState())
{
_pendingDiffs.Add(diff);
}
else
{
State = SyncDiff(new State(State), diff, OnJoin, OnLeave);
OnSync?.Invoke();
}
});
}