UNPKG

backendless-rt-client

Version:

Backendless RT Client for connect to Backendless RT Server

205 lines (162 loc) 6.74 kB
import { RTSocketEvents, RTSubscriptionTypes } from './constants' import RTUtils from './utils' const subscription = type => function (options, callbacks) { return this.subscribe(type, options, callbacks) } export default class RTSubscriptions { constructor({ onMessage, emitMessage }) { this.onMessage = onMessage this.emitMessage = emitMessage this.subscriptions = {} } initialize() { this.onMessage(RTSocketEvents.SUB_READY, data => this.onSubscriptionReady(data)) this.onMessage(RTSocketEvents.SUB_RES, data => this.onSubscriptionResponse(data)) } stop() { Object .keys(this.subscriptions) .forEach(subscriptionId => { this.subscriptions[subscriptionId].ready = false }) } reset() { Object .keys(this.subscriptions) .forEach(subscriptionId => this.stopSubscription(subscriptionId)) } restore() { Object .keys(this.subscriptions) .forEach(subscriptionId => { this.startSubscription(subscriptionId) }) } hasActivity() { return !!Object.keys(this.subscriptions).length } subscribe(name, options, { parser, onData, onError, onStop, onReady }) { const subscriptionId = RTUtils.generateUID() this.subscriptions[subscriptionId] = { data : { id: subscriptionId, name, options }, ready: false, parser, onData, onError, onStop, onReady, } this.startSubscription(subscriptionId) return { isReady: () => { return !!this.subscriptions[subscriptionId] && this.subscriptions[subscriptionId].ready }, stop: () => { if (this.subscriptions[subscriptionId]) { this.offSubscription(subscriptionId) } }, } } startSubscription(subscriptionId) { const subscription = this.subscriptions[subscriptionId] this.emitMessage(RTSocketEvents.SUB_ON, subscription.data) } stopSubscription(subscriptionId) { const subscription = this.subscriptions[subscriptionId] if (subscription) { if (subscription.onStop) { subscription.onStop() } delete this.subscriptions[subscriptionId] } } offSubscription(subscriptionId) { const subscription = this.subscriptions[subscriptionId] if (subscription) { this.emitMessage(RTSocketEvents.SUB_OFF, { id: subscriptionId }) this.stopSubscription(subscriptionId) } } onSubscriptionReady({ id }) { const subscription = this.subscriptions[id] if (subscription && !subscription.ready) { subscription.ready = true if (subscription.onReady) { subscription.onReady() } } } onSubscriptionResponse({ id, data, error }) { const subscription = this.subscriptions[id] if (subscription) { if (error) { if (subscription.onError) { subscription.onError(error) } this.stopSubscription(id) } else { if (!subscription.ready) { subscription.ready = true if (subscription.onReady) { subscription.onReady() } } if (subscription.onData) { if (typeof subscription.parser === 'function') { data = subscription.parser(data) } subscription.onData(data) } } } } /******************************************************************************* **/ /******************************************************************************* **/ /** COMMON SUBSCRIPTIONS ******************************************************** **/ /***************************************** **/ /***** DATA SUBSCRIPTIONS **************** **/ /** */ onObjectsChanges = subscription(RTSubscriptionTypes.OBJECTS_CHANGES).bind(this) /** */ onRelationsChanges = subscription(RTSubscriptionTypes.RELATIONS_CHANGES).bind(this) /***** DATA SUBSCRIPTIONS **************** **/ /***************************************** **/ /***************************************** **/ /***** PUB_SUB SUBSCRIPTIONS ************* **/ /** */ connectToPubSub = subscription(RTSubscriptionTypes.PUB_SUB_CONNECT).bind(this) /** */ onPubSubMessage = subscription(RTSubscriptionTypes.PUB_SUB_MESSAGES).bind(this) /** */ onPubSubCommand = subscription(RTSubscriptionTypes.PUB_SUB_COMMANDS).bind(this) /** */ onPubSubUserStatus = subscription(RTSubscriptionTypes.PUB_SUB_USERS).bind(this) /***** PUB_SUB SUBSCRIPTIONS ************* **/ /***************************************** **/ /***************************************** **/ /***** RSO SUBSCRIPTIONS ***************** **/ /** */ connectToRSO = subscription(RTSubscriptionTypes.RSO_CONNECT).bind(this) /** */ onRSOChanges = subscription(RTSubscriptionTypes.RSO_CHANGES).bind(this) /** */ onRSOClear = subscription(RTSubscriptionTypes.RSO_CLEARED).bind(this) /** */ onRSOCommand = subscription(RTSubscriptionTypes.RSO_COMMANDS).bind(this) /** */ onRSOInvoke = subscription(RTSubscriptionTypes.RSO_INVOKE).bind(this) /** */ onRSOUserStatus = subscription(RTSubscriptionTypes.RSO_USERS).bind(this) /***** RSO SUBSCRIPTIONS ***************** **/ /***************************************** **/ /** COMMON SUBSCRIPTIONS ******************************************************** **/ /******************************************************************************* **/ /******************************************************************************* **/ /******************************************************************************* **/ /******************************************************************************* **/ /** CONSOLE's SUBSCRIPTIONS **************************************************** **/ /***************************************** **/ /***** LOGGING SUBSCRIPTIONS ****** **/ /** */ onLoggingMessages = subscription(RTSubscriptionTypes.LOGGING_MESSAGES).bind(this) /***** LOGGING SUBSCRIPTIONS ****** **/ /***************************************** **/ /***************************************** **/ /***** CONSOLE SUBSCRIPTIONS ****** **/ /** */ onConsoleMessages = subscription(RTSubscriptionTypes.CONSOLE_MESSAGES).bind(this) /** */ onDeveloperMessage = subscription(RTSubscriptionTypes.DEVELOPER_MESSAGES).bind(this) /** */ onAutomationLoggingMessages = subscription(RTSubscriptionTypes.AUTOMATION_MESSAGES).bind(this) /***** CONSOLE SUBSCRIPTIONS ****** **/ /***************************************** **/ /** CONSOLE's SUBSCRIPTIONS **************************************************** **/ /******************************************************************************* **/ /******************************************************************************* **/ }