Skip to content

Instantly share code, notes, and snippets.

@malcolm-s
Last active May 7, 2018 13:18
Show Gist options
  • Select an option

  • Save malcolm-s/a78abbbcadd3650f5edf1063b90f5509 to your computer and use it in GitHub Desktop.

Select an option

Save malcolm-s/a78abbbcadd3650f5edf1063b90f5509 to your computer and use it in GitHub Desktop.
import Pusher from "pusher-js";
import get from "lodash/get";
Pusher.logToConsole = true;
async function usage() {
const token = get({}, "authState.token");
const chatGroupId = get({}, "chatGroup.id");
await Messenger2.connect(token);
const channel = Messenger2.subscribe2(token, chatGroupId);
Messenger2.listenMessage2(channel, message => console.log(message));
}
class Messenger2 {
_pusher = null;
_token = null;
static _getPusher(token) {
if (token !== Messenger._token) {
Messenger._token = token;
Messenger._pusher = new Pusher(PUSHER_APP_KEY, {
cluster: PUSHER_APP_CLUSTER,
auth: {headers: {Authorization: `JWT ${token}`}},
authEndpoint: `${API_URL}/pusher/auth`,
encrypted: true,
});
}
return Messenger._pusher;
}
static connect(token) {
return new Promise((resolve, reject) => {
const pusher = Messenger._getPusher(token);
if (pusher.connection.state === "connected") {
resolve();
}
pusher.connection.bind("error", reject);
pusher.connection.bind("connected", resolve);
});
}
static subscribe(token, chatGroupId) {
return new Promise((resolve, reject) => {
const pusher = Messenger._getPusher(token);
if (pusher.connection.state !== "connected") {
reject("Connection must be established first.");
}
const channel = pusher.subscribe(`private-${chatGroupId}`);
channel.bind("pusher:subscription_error", reject);
channel.bind("pusher:subscription_succeeded", () => resolve(channel));
});
}
static unsubscribe(token, chatGroupId) {
const pusher = Messenger._getPusher(token);
pusher.unsubscribe(`private-${chatGroupId}`);
}
static listenMessage(channel, callback) {
channel.bind("ChatMessage", callback);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment