diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs b/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs index e2a174173..ff3688cce 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/Events/SubscriptionEvents.cs @@ -4,6 +4,7 @@ namespace PubnubApi.PubnubEventEngine.Subscribe.Events { public class SubscriptionChangedEvent : Core.IEvent { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; } public class SubscriptionRestoredEvent : Core.IEvent { @@ -24,6 +25,7 @@ public class HandshakeFailureEvent : Core.IEvent { public class HandshakeReconnectSuccessEvent : HandshakeSuccessEvent { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; } public class HandshakeReconnectFailureEvent : HandshakeFailureEvent { @@ -40,11 +42,16 @@ public class HandshakeReconnectGiveUpEvent : Core.IEvent { } public class ReceiveSuccessEvent : Core.IEvent { - public List> messages; - public SubscriptionCursor cursor; + public IEnumerable Channels; + public IEnumerable ChannelGroups; + public List> Messages; + public SubscriptionCursor Cursor; } public class ReceiveFailureEvent : Core.IEvent { + public IEnumerable Channels; + public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; // TODO status or reason? public PNStatus status; } @@ -59,6 +66,9 @@ public class ReceiveReconnectFailureEvent : ReceiveFailureEvent { } public class ReceiveReconnectGiveUpEvent : Core.IEvent { + public IEnumerable Channels; + public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; // TODO status or reason? public PNStatus status; } @@ -66,10 +76,12 @@ public class ReceiveReconnectGiveUpEvent : Core.IEvent { public class DisconnectEvent : Core.IEvent { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; } public class ReconnectEvent : Core.IEvent { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; } } \ No newline at end of file diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs b/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs index 39e615b2e..3ec6c133c 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/Invocations/SubscriptionInvocations.cs @@ -22,6 +22,7 @@ internal class ReceiveMessagesInvocation : Core.IEffectInvocation { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; } internal class CancelReceiveMessagesInvocation : ReceiveMessagesInvocation, Core.IEffectCancelInvocation { } @@ -37,7 +38,13 @@ internal class HandshakeReconnectInvocation: Core.IEffectInvocation internal class CancelHandshakeReconnectInvocation: HandshakeReconnectInvocation, Core.IEffectCancelInvocation { } - internal class ReceiveReconnectInvocation: Core.IEffectInvocation { } + internal class ReceiveReconnectInvocation: Core.IEffectInvocation + { + public IEnumerable Channels; + public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; + } + internal class CancelReceiveReconnectInvocation: ReceiveReconnectInvocation, Core.IEffectCancelInvocation { } //internal class CancelReconnectInvocation : ReconnectInvocation, Core.IEffectCancelInvocation { } } \ No newline at end of file diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs index 816d80fc2..8816c77db 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeFailedState.cs @@ -8,6 +8,7 @@ internal class HandshakeFailedState : Core.IState { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; public IEnumerable OnEntry { get; } public IEnumerable OnExit { get; } @@ -43,12 +44,14 @@ internal class HandshakeFailedState : Core.IState { return new Tuple>( new ReceivingState() { Channels = subscriptionRestored.Channels, - ChannelGroups = subscriptionRestored.ChannelGroups + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor }, new[] { new ReceiveMessagesInvocation() { Channels = subscriptionRestored.Channels, ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor }, } ); diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeReconnectingState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeReconnectingState.cs index 26aba2e9c..db5f59d88 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeReconnectingState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeReconnectingState.cs @@ -46,7 +46,8 @@ internal class HandshakeReconnectingState : Core.IState { return new Tuple>( new ReceivingState() { Channels = handshakeReconnectSuccess.Channels, - ChannelGroups = handshakeReconnectSuccess.ChannelGroups + ChannelGroups = handshakeReconnectSuccess.ChannelGroups, + Cursor = handshakeReconnectSuccess.Cursor }, new[] { new EmitStatusInvocation() { @@ -59,7 +60,8 @@ internal class HandshakeReconnectingState : Core.IState { return new Tuple>( new HandshakeFailedState() { Channels = subscriptionRestored.Channels, - ChannelGroups = subscriptionRestored.ChannelGroups + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor }, null ); diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeStoppedState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeStoppedState.cs index 9774bc6cb..885acc5a8 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeStoppedState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/HandshakeStoppedState.cs @@ -12,7 +12,50 @@ internal class HandshakeStoppedState : Core.IState { public IEnumerable OnEntry { get; } public IEnumerable OnExit { get; } public Tuple> Transition(IEvent e) { - throw new NotImplementedException(); + switch (e) { + case Events.SubscriptionChangedEvent subscriptionChanged: + return new Tuple>( + new HandshakingState() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + }, + new[] { + new HandshakeInvocation() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + }, + } + ); + case Events.ReconnectEvent reconnect: + return new Tuple>( + new HandshakingState() { + Channels = reconnect.Channels, + ChannelGroups = reconnect.ChannelGroups, + }, + new[] { + new HandshakeInvocation() { + Channels = reconnect.Channels, + ChannelGroups = reconnect.ChannelGroups, + }, + } + ); + case Events.SubscriptionRestoredEvent subscriptionRestored: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + }, + } + ); + + default: return null; + } } } } \ No newline at end of file diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveFailedState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveFailedState.cs index 41c4be2ee..8b3b68489 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveFailedState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveFailedState.cs @@ -8,11 +8,60 @@ internal class ReceiveFailedState : Core.IState { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; public IEnumerable OnEntry { get; } public IEnumerable OnExit { get; } public Tuple> Transition(IEvent e) { - throw new NotImplementedException(); + switch (e) { + case Events.SubscriptionChangedEvent subscriptionChanged: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor + }, + } + ); + case Events.ReconnectEvent reconnect: + return new Tuple>( + new ReceivingState() { + Channels = reconnect.Channels, + ChannelGroups = reconnect.ChannelGroups, + Cursor = reconnect.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = reconnect.Channels, + ChannelGroups = reconnect.ChannelGroups, + Cursor = reconnect.Cursor + }, + } + ); + case Events.SubscriptionRestoredEvent subscriptionRestored: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + } + ); + + default: return null; + } } } } diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveReconnectingState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveReconnectingState.cs index 2a16d3c02..d18036c5a 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveReconnectingState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveReconnectingState.cs @@ -8,11 +8,104 @@ internal class ReceiveReconnectingState : Core.IState { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; public IEnumerable OnEntry { get; } public IEnumerable OnExit { get; } public Tuple> Transition(IEvent e) { - throw new NotImplementedException(); + switch (e) { + case Events.SubscriptionChangedEvent subscriptionChanged: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor + }, + } + ); + case Events.DisconnectEvent disconnect: + return new Tuple>( + new ReceiveStoppedState() { + Channels = disconnect.Channels, + ChannelGroups = disconnect.ChannelGroups, + Cursor = disconnect.Cursor + }, + new[] { + new EmitStatusInvocation() { + Channels = disconnect.Channels, + ChannelGroups = disconnect.ChannelGroups, + }, + } + ); + case Events.SubscriptionRestoredEvent subscriptionRestored: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + } + ); + case Events.ReceiveReconnectSuccessEvent receiveReconnectSuccess: + return new Tuple>( + new ReceivingState() { + Channels = receiveReconnectSuccess.Channels, + ChannelGroups = receiveReconnectSuccess.ChannelGroups, + Cursor = receiveReconnectSuccess.Cursor + }, + new IEffectInvocation[] { + new EmitStatusInvocation() { + Channels = receiveReconnectSuccess.Channels, + ChannelGroups = receiveReconnectSuccess.ChannelGroups, + }, + new ReceiveMessagesInvocation() { + Channels = receiveReconnectSuccess.Channels, + ChannelGroups = receiveReconnectSuccess.ChannelGroups, + Cursor = receiveReconnectSuccess.Cursor + } + } + ); + case Events.ReceiveReconnectFailureEvent receiveReconnectFailure: + return new Tuple>( + new ReceiveReconnectingState() { + Channels = receiveReconnectFailure.Channels, + ChannelGroups = receiveReconnectFailure.ChannelGroups, + Cursor = receiveReconnectFailure.Cursor + }, + new[] + { + new ReceiveReconnectInvocation + { + Channels = receiveReconnectFailure.Channels, + ChannelGroups = receiveReconnectFailure.ChannelGroups, + Cursor = receiveReconnectFailure.Cursor + } + } + ); + case Events.ReceiveReconnectGiveUpEvent receiveReconnectGiveUp: + return new Tuple>( + new ReceiveFailedState() { + Channels = receiveReconnectGiveUp.Channels, + ChannelGroups = receiveReconnectGiveUp.ChannelGroups, + Cursor = receiveReconnectGiveUp.Cursor + }, + null + ); + + default: return null; + } } } } diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveStoppedState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveStoppedState.cs index 0d925e43e..a66411b36 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveStoppedState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceiveStoppedState.cs @@ -8,11 +8,61 @@ internal class ReceiveStoppedState : Core.IState { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; + public IEnumerable OnEntry { get; } public IEnumerable OnExit { get; } public Tuple> Transition(IEvent e) { - throw new NotImplementedException(); + switch (e) { + case Events.SubscriptionChangedEvent subscriptionChanged: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor, + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor, + }, + } + ); + case Events.ReconnectEvent reconnect: + return new Tuple>( + new ReceivingState() { + Channels = reconnect.Channels, + ChannelGroups = reconnect.ChannelGroups, + Cursor = reconnect.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = reconnect.Channels, + ChannelGroups = reconnect.ChannelGroups, + Cursor = reconnect.Cursor + }, + } + ); + case Events.SubscriptionRestoredEvent subscriptionRestored: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + } + ); + + default: return null; + } } } } diff --git a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceivingState.cs b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceivingState.cs index 2208f539a..06bee3d54 100644 --- a/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceivingState.cs +++ b/src/Api/PubnubApi/EventEngine/Subscribe/States/ReceivingState.cs @@ -8,11 +8,83 @@ internal class ReceivingState : Core.IState { public IEnumerable Channels; public IEnumerable ChannelGroups; + public SubscriptionCursor Cursor; public IEnumerable OnEntry { get; } public IEnumerable OnExit { get; } public Tuple> Transition(IEvent e) { - throw new NotImplementedException(); + switch (e) { + case Events.ReceiveSuccessEvent receiveSuccess: + return new Tuple>( + new ReceivingState() { + Channels = receiveSuccess.Channels, + ChannelGroups = receiveSuccess.ChannelGroups, + Cursor = receiveSuccess.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = receiveSuccess.Channels, + ChannelGroups = receiveSuccess.ChannelGroups, + Cursor = receiveSuccess.Cursor + }, + } + ); + case Events.SubscriptionChangedEvent subscriptionChanged: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionChanged.Channels, + ChannelGroups = subscriptionChanged.ChannelGroups, + Cursor = subscriptionChanged.Cursor + }, + } + ); + case Events.SubscriptionRestoredEvent subscriptionRestored: + return new Tuple>( + new ReceivingState() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + new[] { + new ReceiveMessagesInvocation() { + Channels = subscriptionRestored.Channels, + ChannelGroups = subscriptionRestored.ChannelGroups, + Cursor = subscriptionRestored.Cursor + }, + } + ); + case Events.DisconnectEvent disconnect: + return new Tuple>( + new ReceiveStoppedState() { + Channels = disconnect.Channels, + ChannelGroups = disconnect.ChannelGroups, + Cursor = disconnect.Cursor + }, + new[] { + new EmitStatusInvocation() { + Channels = disconnect.Channels, + ChannelGroups = disconnect.ChannelGroups, + }, + } + ); + case Events.ReceiveFailureEvent receiveFailure: + return new Tuple>( + new ReceiveReconnectingState() { + Channels = receiveFailure.Channels, + ChannelGroups = receiveFailure.ChannelGroups, + Cursor = receiveFailure.Cursor + }, + null + ); + + default: return null; + } } } }