UNPKG

teletype-client-modified

Version:

I have modified the library developed by Atom to make it compatible with non-browser facility. I am using it only for experimentation purposes. I will remove this package post my experiment and raise a PR at Atom to finally merge this package so that this

78 lines (65 loc) 2.39 kB
const Pusher = require('pusher-js') // const Pusher = require('pusher-js/dist/web/pusher') const {Disposable} = require('event-kit') const Errors = require('./errors') module.exports = class PusherPubSubGateway { constructor ({key, options}) { this.channelsByName = new Map() this.subscriptionsCount = 0 this.pusherClient = createDisconnectedPusherClient(key, options) } async subscribe (channelName, eventName, callback) { if (this.subscriptionsCount === 0) await this.connect() channelName = channelName.replace(/\//g, '.') let channel = this.channelsByName.get(channelName) if (!channel) { channel = this.pusherClient.subscribe(channelName) await new Promise((resolve, reject) => { channel.bind('pusher:subscription_succeeded', resolve) channel.bind('pusher:subscription_error', reject) }) this.channelsByName.set(channelName, channel) } channel.bind(eventName, callback) this.subscriptionsCount++ return new Disposable(() => { channel.unbind(eventName, callback) this.subscriptionsCount-- if (this.subscriptionsCount === 0) this.disconnect() }) } connect () { const error = new Errors.PubSubConnectionError('Error establishing web socket connection to signaling server') this.pusherClient.connect() return new Promise((resolve, reject) => { const handleConnection = () => { this.pusherClient.connection.unbind('connected', handleConnection) this.pusherClient.connection.unbind('error', handleError) resolve() } const handleError = () => { this.pusherClient.connection.unbind('connected', handleConnection) this.pusherClient.connection.unbind('error', handleError) reject(error) } this.pusherClient.connection.bind('connected', handleConnection) this.pusherClient.connection.bind('error', handleError) }) } disconnect () { this.channelsByName.forEach((channel) => { this.pusherClient.unsubscribe(channel) }) this.channelsByName.clear() this.pusherClient.disconnect() } } function createDisconnectedPusherClient (key, options) { const connectOptions = Object.assign({ encrypted: true, }, options) const client = new Pusher(key, connectOptions) // automatically connects to pusher client.disconnect() return client }