pubnub-vue
Version:
Publish & Subscribe Real-time Messaging with PubNub
77 lines (65 loc) • 1.99 kB
JavaScript
import { clean, getMessage, getPresence, getStatus, release } from './modules';
import Broadcast from './broadcast';
import Autoload from './autoload';
import config from '../config.json';
/**
* Wrap a PubNub's attributes
*
* @param {string} attributeName
*/
function wrapAttribute(originalInstance, wrappedInstance, attributeName) {
wrappedInstance[attributeName] = originalInstance[attributeName];
}
/**
* Wrap a PubNub's methods
*
* @param methodName
*/
function wrapMethod(OriginalInstance, wrappedInstance, methodName) {
wrappedInstance[methodName] = function () {
return OriginalInstance[methodName].apply(wrappedInstance, arguments);
};
}
/**
* Wrap the PubNubVue with PubNub
*
* @param originalInstance
* @param wrappedInstance
*/
export default class {
constructor(originalInstance) {
this._originInstance = originalInstance;
this._broadcast = new Broadcast();
this._autoload = new Autoload(originalInstance);
this._listener = {};
this._data = { messages: {}, presence: {}, status: {} };
this._keepMessages = {};
config.attributes_to_delegate.forEach((attribute) => {
wrapAttribute(originalInstance, this, attribute);
});
config.methods_to_delegate.forEach((method) => {
wrapMethod(originalInstance, this, method);
});
this.clean = clean.bind(this);
this.getMessage = getMessage.bind(this);
this.getPresence = getPresence.bind(this);
this.getStatus = getStatus.bind(this);
this.release = release.bind(this);
this.addListener(this._listener);
}
subscribe(args) {
this.getOriginalInstance().subscribe(args);
this._autoload.enableLoad(args);
}
unsubscribe(args) {
this.getOriginalInstance().unsubscribe(args);
this._autoload.disableLoad(args);
}
getOriginalInstance() {
if (this._originInstance) {
return this._originInstance;
} else {
throw new ReferenceError('Pubnub default instance is not initialized yet');
}
}
}