UNPKG

pusher-js

Version:

Pusher JavaScript library for browser, React Native, NodeJS and web workers

76 lines (70 loc) 2.23 kB
import PrivateChannel from './private_channel'; import Logger from '../logger'; import Members from './members'; import Pusher from '../pusher'; export default class PresenceChannel extends PrivateChannel { members: Members; /** Adds presence channel functionality to private channels. * * @param {String} name * @param {Pusher} pusher */ constructor(name : string, pusher : Pusher) { super(name, pusher); this.members = new Members(); } /** Authenticates the connection as a member of the channel. * * @param {String} socketId * @param {Function} callback */ authorize(socketId : string, callback : Function) { super.authorize(socketId, (error, authData) => { if (!error) { if (authData.channel_data === undefined) { Logger.warn( "Invalid auth response for channel '" + this.name + "', expected 'channel_data' field" ); callback("Invalid auth response"); return; } var channelData = JSON.parse(authData.channel_data); this.members.setMyID(channelData.user_id); } callback(error, authData); }); } /** Handles presence and subscription events. For internal use only. * * @param {String} event * @param {*} data */ handleEvent(event : string, data : any) { switch (event) { case "pusher_internal:subscription_succeeded": this.members.onSubscription(data); this.subscribed = true; this.emit("pusher:subscription_succeeded", this.members); break; case "pusher_internal:member_added": var addedMember = this.members.addMember(data); this.emit('pusher:member_added', addedMember); break; case "pusher_internal:member_removed": var removedMember = this.members.removeMember(data); if (removedMember) { this.emit('pusher:member_removed', removedMember); } break; default: PrivateChannel.prototype.handleEvent.call(this, event, data); } } /** Resets the channel state, including members map. For internal use only. */ disconnect() { this.members.reset(); super.disconnect(); } }