UNPKG

pubnub

Version:

Publish & Subscribe Real-time Messaging with PubNub

73 lines (62 loc) 2.26 kB
/** * Failed to receive real-time updates (disconnected) state. * * @internal */ import { State } from '../core/state'; import { Effects } from '../effects'; import { Events, reconnect, restore, subscriptionChange, unsubscribeAll } from '../events'; import { PubNubError } from '../../errors/pubnub-error'; import { HandshakingState } from './handshaking'; import { UnsubscribedState } from './unsubscribed'; import * as Subscription from '../../core/types/api/subscription'; /** * Context which represent current Subscription Event Engine data state. * * @internal */ export type ReceiveFailedStateContext = { channels: string[]; groups: string[]; cursor: Subscription.SubscriptionCursor; reason: PubNubError; }; /** * Failed to receive real-time updates (disconnected) state. * * State in which Subscription Event Engine waits for user to try to reconnect after all retry attempts has been * exhausted. * * @internal */ export const ReceiveFailedState = new State<ReceiveFailedStateContext, Events, Effects>('RECEIVE_FAILED'); ReceiveFailedState.on(reconnect.type, (context, { payload }) => HandshakingState.with({ channels: context.channels, groups: context.groups, cursor: { timetoken: !!payload.cursor.timetoken ? payload.cursor?.timetoken : context.cursor.timetoken, region: payload.cursor.region || context.cursor.region, }, onDemand: true, }), ); ReceiveFailedState.on(subscriptionChange.type, (context, { payload }) => { if (payload.channels.length === 0 && payload.groups.length === 0) return UnsubscribedState.with(undefined); return HandshakingState.with({ channels: payload.channels, groups: payload.groups, cursor: context.cursor, onDemand: true, }); }); ReceiveFailedState.on(restore.type, (context, { payload }) => { if (payload.channels.length === 0 && payload.groups.length === 0) return UnsubscribedState.with(undefined); return HandshakingState.with({ channels: payload.channels, groups: payload.groups, cursor: { timetoken: `${payload.cursor.timetoken}`, region: payload.cursor.region || context.cursor.region }, onDemand: true, }); }); ReceiveFailedState.on(unsubscribeAll.type, (_) => UnsubscribedState.with(undefined));